提交 4b367915 authored 作者: 艾庆国's avatar 艾庆国

Merge branch 'refs/heads/v17.5_order_child_sync_broker_20240617' into release

# Conflicts: # performance-api/src/main/java/com/clx/performance/feign/PerformanceFeign.java # performance-api/src/main/java/com/clx/performance/vo/pc/OrderGoodsVO.java # performance-web/src/main/java/com/clx/performance/controller/feign/OrderGoodsFeignController.java # performance-web/src/main/java/com/clx/performance/service/OrderGoodsService.java
package com.clx.performance.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Optional;
public enum OrderChildSyncTransportRecordEnum {
;
@Getter
@AllArgsConstructor
public enum Status {
INIT(0, "未同步"),
SYNC(1, "已同步"),
SUC(2, "回调成功"),
FAIL(3, "回调失败"),
;
private final Integer code;
private final String msg;
public static Optional<Status> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(Status::getMsg).orElse(null);
}
}
}
......@@ -37,7 +37,7 @@ public enum PerformanceResultEnum implements ResultEnum {
ORDER_WEIGHT_LACK(1201, "剩余吨数不足,请联系客服"),
ORDER_INVALID(1202, "无效的货单"),
ORDER_INVALID1(1203, "当前运单的货源已完成或取消,请查看其他货源"),
ORDER_DRIVER_LIMIT(1204, "该货单不支持车主抢单"),
ORDER_CHILD_NO_FOUND(1301, "运单不存在"),
ORDER_CHILD_STATUS_CHANGED(1302, "运单状态已变更,请重新刷新页面"),
......@@ -97,6 +97,10 @@ public enum PerformanceResultEnum implements ResultEnum {
INTEGRAL_RULE_NAME_EXIST(1703, "层级名称已存在"),
APP_POP_UP_ERROR(-1000, "app弹窗提示"),
/**司机提示语 **/
APP_POP_UP_DRIVER_RESIDUE_ERROR(-500, "app弹窗提示"),
/**车主提示语 **/
APP_POP_UP_OWNER_RESIDUE_ERROR(-499, "app弹窗提示"),
WALLET_CODE_IS_NULL(1704, "用户钱包不存在"),
ORDER_GOODS_SAVE_FAIL(1801, "保存货单失败,请稍后再试"),
......
package com.clx.performance.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;
/**
* @author yangqifa
*/
@Getter
@AllArgsConstructor
public enum PlatformServiceFeeConfigEnum {
/**
* 未税
*/
TAX_EXCLUDED(0, "未税"),
/**
* 含税
*/
TAX_INCLUDED(1, "含税");
private final Integer code;
private final String msg;
public static Optional<PlatformServiceFeeConfigEnum> getByCode(int code) {
return Arrays.stream(values()).filter(e -> Objects.equals(e.getCode(), code)).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(PlatformServiceFeeConfigEnum::getMsg).orElse(null);
}
}
......@@ -16,6 +16,7 @@ public enum TransportSyncTypeEnum {
NO_PASS(1, "未通过风控异常"),
EXCEPTION(2, "同步异常"),
RESULT(3, "查询状态"),
;
......
package com.clx.performance.enums.payment;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author huningning
* Date 2024-06-18
* Time 14:01
*/
public enum PayOperationStatusEnum {
FREEZE(1, "冻结"),
ADJUSTMENT(2, "调整"),
UNFREEZE(3, "解冻"),
PART_UNFREEZE(4, "部分解冻"),
PART_PAY(5, "部分支付"),
PAY(6, "支付"),
COMPLETE(7, "完成")
;
private static Map<Integer, String> map = new ConcurrentHashMap<>();
static {
for(PayOperationStatusEnum payOperationStatusEnum : PayOperationStatusEnum.values()){
map.put(payOperationStatusEnum.getValue(), payOperationStatusEnum.getDisplayValue());
}
}
private int value;
private String displayValue;
public void setValue(int value) {
this.value = value;
}
public String getDisplayValue() {
return displayValue;
}
public void setDisplayValue(String displayValue) {
this.displayValue = displayValue;
}
private PayOperationStatusEnum(int value, String displayValue){
this.value = value;
this.displayValue = displayValue;
}
public int getValue(){
return value;
}
public static String toString(int value){
return map.get(value);
}
}
package com.clx.performance.enums.payment;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Optional;
public enum PaymentActionEnum {
;
/** 操作类型 1撤销 2完成 3修改*/
@Getter
@AllArgsConstructor
public enum Type {
CANCEL(1, "撤销"),
COMPLETE(2, "完成"),
ADJUST(3, "修改"),
;
private final Integer code;
private final String msg;
public static Optional<Type> getByCode(int code) {
return Arrays.stream(values()).filter(e -> e.code == code).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(Type::getMsg).orElse(null);
}
}
}
package com.clx.performance.enums.payment;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author huningning
* Date 2024-06-18
* Time 14:01
* 支付状态
*/
public enum PaymentStatusEnum {
CREATE(0, "发起"),
SUCCESS(1, "成功"),
FAIL(2, "失败")
;
private static Map<Integer, String> map = new ConcurrentHashMap<>();
static {
for(PaymentStatusEnum paymentStatusEnum : PaymentStatusEnum.values()){
map.put(paymentStatusEnum.getValue(), paymentStatusEnum.getDisplayValue());
}
}
private int value;
private String displayValue;
public void setValue(int value) {
this.value = value;
}
public String getDisplayValue() {
return displayValue;
}
public void setDisplayValue(String displayValue) {
this.displayValue = displayValue;
}
private PaymentStatusEnum(int value, String displayValue){
this.value = value;
this.displayValue = displayValue;
}
public int getValue(){
return value;
}
public static String toString(int value){
return map.get(value);
}
}
......@@ -49,6 +49,39 @@ public enum SettlementOwnerDetailEnum {
return getByCode(code).map(FinalPaymentStatus::getMsg).orElse(null);
}
}
@Getter
@AllArgsConstructor
public enum InvoiceChannel {
BROKER(1, "无车承运"),
;
private final Integer code;
private final String msg;
public static Optional<InvoiceChannel> getByCode(int code) {
return Arrays.stream(values()).filter(e -> Objects.equals(e.getCode(), code)).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(InvoiceChannel::getMsg).orElse(null);
}
}
@Getter
@AllArgsConstructor
public enum PayStatus {
NO(0, "否"),
YES(1, "是"),
;
private final Integer code;
private final String msg;
public static Optional<PayStatus> getByCode(int code) {
return Arrays.stream(values()).filter(e -> Objects.equals(e.getCode(), code)).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(PayStatus::getMsg).orElse(null);
}
}
}
......@@ -100,6 +100,7 @@ public enum SettlementOwnerEnum {
IMMEDIATE(1, "拉运完成结算"),
MONTH(2, "月结"),
DAILY(3, "日结"),
;
......
......@@ -13,7 +13,9 @@ public enum SettlementWayEnum {
@AllArgsConstructor
public enum WayType {
LOAD(1, "装车净重"),
UNLOAD(2, "卸车净重");
UNLOAD(2, "卸车净重"),
UNLOAD_LOSS(3, "卸车净重(减货损)"),
;
private final Integer code;
private final String msg;
......
......@@ -11,6 +11,7 @@ import com.clx.performance.param.pc.owner.UpdateStatusParam;
import com.clx.performance.vo.app.collect.AppCollectTruckVO;
import com.clx.performance.vo.feign.FreightEstimateVO;
import com.clx.performance.vo.feign.OrderGoodsFeignVO;
import com.clx.performance.vo.feign.PlatformServiceFeeConfigFeignVO;
import com.clx.performance.vo.pc.OwnerAccountAllVO;
import com.clx.performance.vo.pc.OwnerAccountArrearsVO;
import com.clx.performance.vo.pc.OwnerLoanAccountVO;
......@@ -132,4 +133,15 @@ public interface PerformanceFeign {
@PostMapping(value = {"clx-performance/feign/orderGoods/saveBindTruck"})
Result<Object> saveBindTruck(@RequestBody @Validated DistributionTruckParam param);
/**
* 更新挂单运费
*/
@PostMapping(value = {"clx-performance/feign/orderGoods/updatePendingOrderFright"})
Result<Void> updatePendingOrderFright(@RequestParam("orderGoodsNo") String orderGoodsNo,@RequestParam("pendingOrderFreight") BigDecimal pendingOrderFreight);
/**
* 获取平台服务费配置
*/
@GetMapping(value = {"clx-performance/feign/platformServiceFee/getPlatformServiceFeeConfig"})
Result<PlatformServiceFeeConfigFeignVO> getPlatformServiceFeeConfig();
}
......@@ -25,4 +25,7 @@ public class OrderChildSaveParam extends PositionParam {
@NotNull(message = "司机用户编号空")
private Long driverUserNo;
@ApiModelProperty(value = "支付方密码", example = "2356", dataType = "String")
private String pwd;
}
......@@ -9,6 +9,7 @@ import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import javax.validation.constraints.DecimalMax;
import java.math.BigDecimal;
......@@ -24,6 +25,7 @@ public class OpenOwnerTopUpParam {
@ApiModelProperty(value = "充值金额(元)", example = "1.23")
@MoneyInConvert
@DecimalMax(value = "9999999999.99",message = "金额不得大于9999999999.99元")
private BigDecimal topUpBalance;
@ApiModelProperty(value = "账户类型: 1:保证金 2:预付运费", example = "1")
......
package com.clx.performance.param.pc.carrier;
import com.msl.common.convertor.type.MoneyInConvert;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
/**
* @author yangqifa
*/
@Getter
@Setter
public class SavePlatformServiceFeeConfigParam {
@ApiModelProperty(value = "id")
private Integer id;
@ApiModelProperty(value = "订单报价方式,0:未税,1:含税")
private Integer orderQuotationType;
@ApiModelProperty(value = "接单保证金")
@MoneyInConvert
private BigDecimal deposit;
@ApiModelProperty(value = "平台服务费费率")
private BigDecimal serviceFeeRate;
}
......@@ -28,10 +28,16 @@ public class PageCarrierSettlementOwnerParam extends PageParam {
@ApiModelProperty(value="货主姓名",example = "张三")
private String ownerUserName;
@ApiModelProperty("结算方式 1装车净重 2卸车净重")
@ApiModelProperty("结算方式 1装车净重 2卸车净重 3卸车净重(减货损)")
private Integer settlementWay;
@ApiModelProperty("订单编号")
private String orderNo;
@ApiModelProperty(value = "开始时间")
private String beginTime;
@ApiModelProperty(value = "结束时间")
private String endTime;
}
package com.clx.performance.param.pc.owner;
import com.msl.common.base.PageParam;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* @ClassName PageCarrierSettlementOwnerParam
* @Description
* @Author
* @Date 2023/10/17 13:25
* @Version 1.0
*/
@Getter
@Setter
public class PageCarrierSettlementPlatformServiceFeeParam extends PageParam {
@ApiModelProperty(value = "运单编号", example = "JS415")
private String childNo;
@ApiModelProperty(value="司机编码",example = "201457878")
private Long driverUserNo;
@ApiModelProperty(value="司机姓名",example = "张三")
private String driverName;
@ApiModelProperty(value="司机手机",example = "13000000000")
private String driverMobile;
@ApiModelProperty(value = "开始时间")
private String beginTime;
@ApiModelProperty(value = "结束时间")
private String endTime;
}
package com.clx.performance.param.pc.payment;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
*
* @author xujianke
* @date 2017年4月22日
* @description
*/
@Getter
@Setter
@ToString
@NoArgsConstructor
public class CallServiceDTO {
/** 业务系统编码 参考<SystemCodeEnum> */
Integer system;
/** 支付结果通知回调地址 */
String notifyUrl;
/** 操作唯一标识 UUID */
String uuid;
/** 关联单号 */
String orderNo;
}
package com.clx.performance.param.pc.payment;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.util.List;
/**
*
* @author xujianke
* @date 2017年5月31日
* @description 批量处理冻结
*/
@Getter
@Setter
@ToString
@NoArgsConstructor
public class FreezeBatchDTO extends CallServiceDTO{
/** 处理冻结 */
private List<FreezeUnitDTO> FreezeUnitList;
/** 增加支付单元的处理,为了在解冻的时候额外增加赔偿 add by cuiwanzhe 20200430 */
private PayBatchDTO payBatchDTO;
}
package com.clx.performance.param.pc.payment;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.util.List;
/**
*
* @author xujianke
* @date 2017年4月18日
* @description 同一个订单的批量支付操作类 不能跨订单支付
*/
@Getter
@Setter
@ToString
@NoArgsConstructor
public class PayBatchDTO extends CallServiceDTO{
/**支付操作*/
private List<PayUnitDTO> payUnitList;
/**主钱包*/
private Integer walletCode;
/**子钱包*/
private Integer walletSubCode;
/**主钱包的交易密码*/
private String pwd;
}
package com.clx.performance.param.pc.payment;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Accessors(chain = true)
public class PayPlatformFeeParam {
@ApiModelProperty(value = "支付来源", example = "2234", dataType = "int")
Integer from;
@ApiModelProperty(value = "支付方密码", example = "2356", dataType = "String")
String pwd;
@ApiModelProperty(value = "金额", example = "2356", dataType = "int")
Integer figure;
@ApiModelProperty(value = "最新冻结金额金额", example = "2356", dataType = "int")
Integer figureNew;
@NotBlank(message = "交易单号不能为空")
@ApiModelProperty(value = "交易单号", example = "2356", dataType = "String")
String tradeNo;
}
package com.clx.performance.param.pc.payment;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@ApiModel(description = "钱包查询")
@Getter
@Setter
@ToString
@NoArgsConstructor
public class WalletParam {
/**
* 用户编号从10000001开始
*/
@ApiModelProperty(value = "主钱包账号", dataType = "int", example = "1")
private Integer userCode;
}
package com.clx.performance.param.pc.payment;
import com.fasterxml.jackson.annotation.JsonGetter;
import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal;
public class WalletResidueDTO {
//余额
@ApiModelProperty(value = "余额", dataType = "double", example = "11.10")
private Long residue;
//冻结的资金
@ApiModelProperty(value = "冻结的资金", dataType = "double", example = "11.10")
private Long frozen;
//保证金
@ApiModelProperty(value = "保证金", dataType = "double", example = "11.10")
private Double deposit;
//状态0锁定1正常2异常
@ApiModelProperty(value = "状态0锁定1正常2异常", dataType = "int", example = "1")
private Integer status;
//是否设置交易密码0没有1有
@ApiModelProperty(value = "是否设置交易密码0没有1有", dataType = "String", example = "1")
private String pwd;
public Long getResidue() {
return residue;
}
public void setResidue(Long residue) {
this.residue = residue;
}
public Long getFrozen() {
return frozen;
}
public void setFrozen(Long frozen) {
this.frozen = frozen;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@JsonGetter(value="frozen")
public BigDecimal frozenFormat() {
return new BigDecimal(new Double(this.frozen)/100);
}
@JsonGetter(value="residue")
public Double residueFormat() {
return new Double(this.residue)/100;
}
@JsonGetter(value="deposit")
public Double depositFormat() {
return new Double(this.deposit)/100;
}
public Double getDeposit() {
return deposit;
}
public void setDeposit(Double deposit) {
this.deposit = deposit;
}
@Override
public String toString() {
return "WalletDTO [residue=" + residue + ", frozen=" + frozen
+ ", status=" + status + "]";
}
}
......@@ -181,6 +181,14 @@ public class OrderChildVO {
@ApiModelProperty("最晚装货时间")
private String lastLoadTime;
@MoneyOutConvert
@ApiModelProperty("平台服务费")
private BigDecimal platformServiceFee;
@ApiModelProperty("平台服务费费率%")
private BigDecimal platformServiceFeeRate;
@MoneyOutConvert
@ApiModelProperty("接单保证金(元/车)")
private BigDecimal deposit;
//结算信息
@ApiModelProperty(value = "实际运费", example = "1.23")
......@@ -219,5 +227,7 @@ public class OrderChildVO {
@ApiModelProperty(value = "车辆未开启中交兴路的提示信息")
private String notOpenZJXLMsg;
@ApiModelProperty("接单保证金 平台服务费费率 弹窗和文案显示 0 不显示 1 显示")
private Integer goodsOrderDetailShow = 0;
}
\ No newline at end of file
package com.clx.performance.vo.feign;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.math.BigDecimal;
@Getter
@Setter
@NoArgsConstructor
public class PlatformServiceFeeConfigFeignVO {
@ApiModelProperty(value = "订单报价方式,1:未税,2:含税")
private Integer orderQuotationType;
@ApiModelProperty(value = "结算方式")
private Integer settlementType;
@ApiModelProperty(value = "接单保证金")
private BigDecimal deposit;
@ApiModelProperty(value = "平台服务费费率")
private BigDecimal serviceFeeRate;
}
package com.clx.performance.vo.mq;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
* @Author: aiqingguo
* @Description: 结算
* @Date: 2023-10-19 15:45:25
* @Version: 1.0
*/
@Setter
@Getter
@ToString
@NoArgsConstructor
public class SettlementInvoiceStatusSyncMqParam {
private String childNo; //运单编号
}
package com.clx.performance.vo.mq;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
* @Author: aiqingguo
* @Description: 结算
* @Date: 2023-10-19 15:45:25
* @Version: 1.0
*/
@Setter
@Getter
@ToString
@NoArgsConstructor
public class SettlementInvoiceTypeSyncMqParam {
private String childNo; //运单编号
}
package com.clx.performance.vo.mq;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
* @Author: aiqingguo
* @Description: 结算
* @Date: 2023-10-19 15:45:25
* @Version: 1.0
*/
@Setter
@Getter
@ToString
@NoArgsConstructor
public class SettlementPayStatusSyncMqParam {
private String childNo; //运单编号
}
package com.clx.performance.vo.mq;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
* @Author: aiqingguo
* @Description: 结算
* @Date: 2023-10-19 15:45:25
* @Version: 1.0
*/
@Setter
@Getter
@ToString
@NoArgsConstructor
public class SettlementSettleMqParam {
private String childNo; //运单编号
private Integer InvoiceType; //开票类型
private String remark; //备注
}
......@@ -7,7 +7,7 @@ import lombok.ToString;
/**
* @Author: aiqingguo
* @Description: 开票标识同步
* @Description: 结算统计
* @Date: 2023-10-19 15:45:25
* @Version: 1.0
*/
......@@ -15,7 +15,7 @@ import lombok.ToString;
@Getter
@ToString
@NoArgsConstructor
public class SettlementDetailInvoiceTypeSyncMqParam {
public class SettlementStatisticsMqParam {
private String childNo; //运单编号
private Integer InvoiceType; //司机计费明细id
......
......@@ -146,4 +146,24 @@ public class OrderGoodsVO {
@ApiModelProperty("已派单数")
private Integer dispatchedOrders;
@ApiModelProperty("平台运费报价税类型:0未税 1含税")
private Integer platformFreightQuotationTaxType;
@ApiModelProperty("平台服务费费率%")
private BigDecimal platformServiceFeeRate;
@MoneyOutConvert
@ApiModelProperty("接单保证金(分/车)")
private BigDecimal deposit;
@ApiModelProperty("是否支持借款:0:否 1:是")
private Integer supportLoan;
@ApiModelProperty("结算方式 1装车净重 2卸车净重")
private Integer settlementWay;
@ApiModelProperty("接单保证金 平台服务费费率 弹窗和文案显示 0 不显示 1 显示")
private Integer goodsOrderDetailShow = 0;
}
\ No newline at end of file
package com.clx.performance.vo.pc.broker;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.math.BigDecimal;
@Getter
@Setter
@ToString
@NoArgsConstructor
public class OpenOrderChildDTO {
private String sourceChildNo;
@ApiModelProperty(value = "源货单编号", example = "1234", required = true, dataType = "String")
private String sourceGoodsNo;
@ApiModelProperty(value = "源订单编号", example = "1234", required = true, dataType = "String")
private String sourceOrderNo;
@ApiModelProperty(value = "源结算单编号", example = "1234", required = true, dataType = "String")
private String sourceSettlementNo;
@ApiModelProperty(value = "运费单价(分/吨)", example = "162", required = true, dataType = "Integer")
private Integer freightPrice;
@ApiModelProperty(value = "运费(分)", example = "162", required = true, dataType = "Integer")
private Integer freight;
@ApiModelProperty(value = "司机运费(分)", example = "123", dataType = "Integer")
private Integer driverFreight;
@ApiModelProperty(value = "司机运费单价(分/吨)", example = "123", dataType = "Integer")
private Integer driverFreightPrice;
@ApiModelProperty(value = "开票金额(分)", example = "162", required = true, dataType = "Integer")
private Integer invoiceFreight;
@ApiModelProperty(value = "亏吨扣款(分)", example = "123", dataType = "Integer")
private Integer lossFee;
@ApiModelProperty(value = "货损单价(分/吨)", example = "123", dataType = "Integer")
private Integer lossFeePrice;
@ApiModelProperty(value = "发货皮重(吨)")
private BigDecimal sendTare;
@ApiModelProperty(value = "发货毛重(吨)")
private BigDecimal sendRough;
@ApiModelProperty(value = "发货净重(吨)")
private BigDecimal sendNet;
@ApiModelProperty(value = "接单时间")
private String payTime;
@ApiModelProperty(value = "装车时间")
private String loadTime;
@ApiModelProperty(value = "卸车时间")
private String unloadTime;
@ApiModelProperty(value = "运单完成时间", example = "2020-02-02 10:10:10", required = true, dataType = "String")
private String payFinishedTime;
@ApiModelProperty(value = "收货皮重(吨)")
private BigDecimal receiveTare;
@ApiModelProperty(value = "收货毛重(吨)")
private BigDecimal receiveRough;
@ApiModelProperty(value = "收货净重(吨)")
private BigDecimal receiveNet;
@ApiModelProperty(value = "备注", example = "", required = true, dataType = "String")
private String remark;
}
package com.clx.performance.vo.pc.broker;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@NoArgsConstructor
public class OpenOrderChildDriverDTO {
@ApiModelProperty(value = "手机号", dataType="String")
private String mobile;
@ApiModelProperty(value = "姓名", dataType="String")
private String name;
@ApiModelProperty(value = "性别1男2女", dataType="Integer")
private Integer sex;
@ApiModelProperty(value = "头像相对地址", dataType="String")
private String headImg;
@ApiModelProperty(value = "身份证号", dataType="String")
private String cardNo;
@ApiModelProperty(value = "身份证住址")
private String idCardAddress;
@ApiModelProperty(value = "身份证有效期起始时间", dataType="String")
private String cardStartTime;
@ApiModelProperty(value = "身份证有效期终止时间", dataType="String")
private String cardEndTime;
@ApiModelProperty(value = "是否是长期 0-非长期 1-长期", dataType="Integer")
private Integer cardLongTerm;
@ApiModelProperty(value = "身份证正面图片地址", dataType="String")
private String cardFrontImg;
@ApiModelProperty(value = "身份证背面图片地址", dataType="String")
private String cardBackImg;
@ApiModelProperty(value = "手持身份证照片地址", dataType="String")
private String faceCardImg;
@ApiModelProperty(value = "驾驶证号码", dataType="String")
private String licenceNo;
@ApiModelProperty(value = "驾驶证发证机关")
private String licenceIssueOrganization;
@ApiModelProperty(value = "初次领证日期", dataType="String")
private String licenseTime;
@ApiModelProperty(value = "驾照类型", dataType="String")
private String licenceClass;
@ApiModelProperty(value = "驾驶证正面图片", dataType="String")
private String licenceImg;
@ApiModelProperty(value = "驾驶证背面图片", dataType="String")
private String licenceBackImg;
@ApiModelProperty(value = "驾驶证有效期起始时间", dataType="String")
private String licenceStartTime;
@ApiModelProperty(value = "驾驶证有效期终止时间", dataType="String")
private String licenceEndTime;
@ApiModelProperty(value = "道路运输许可证图片地址", dataType="String")
private String transportLicenceImg;
@ApiModelProperty(value = "道路运输从业资格证号", dataType="String")
private String occupationalLicenceNo;
@ApiModelProperty(value = "道路运输从业资格证图片地址", dataType="String")
private String occupationalLicenceImg;
@ApiModelProperty(value = "从业资格证有效期起始时间", dataType="String")
private String occupationalStartTime;
@ApiModelProperty(value = "从业资格证有效期终止时间", dataType="String")
private String occupationalEndTime;
@ApiModelProperty(value = "银行卡卡号", example = "", required = true, dataType = "String")
private String bankCardNo;
@ApiModelProperty(value = "银行预留手机号", example = "", required = true, dataType = "String")
private String bankMobile;
@ApiModelProperty(value = "银行名称", example = "", required = true, dataType = "String")
private String bankName;
}
package com.clx.performance.vo.pc.broker;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@NoArgsConstructor
public class OpenOrderChildImageDTO {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "图片类型", example = "2: 装车磅单照片 21:收货过磅单", required = true, dataType = "Integer")
private Integer type;
@ApiModelProperty(value = "图片相对地址", example = "", required = true, dataType = "String")
private String image;
public OpenOrderChildImageDTO(Integer type, String image) {
this.type = type;
this.image = image;
}
}
package com.clx.performance.vo.pc.broker;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@NoArgsConstructor
public class OpenOrderChildTruckDTO {
@ApiModelProperty(value = "车牌号", dataType="String")
private String truckNo;
@ApiModelProperty(value = "车头车牌颜色代码", dataType="Integer")
private Integer truckNoColorCode;
@ApiModelProperty(value = "车头车牌颜色", dataType="String")
private String truckNoColor;
@ApiModelProperty(value = "型号", dataType="String")
private String model;
@ApiModelProperty(value = "载重单位吨", dataType="Integer")
private Integer load;
@ApiModelProperty(value = "吨位 单位吨", dataType="Integer")
private Integer grossMass;
@ApiModelProperty(value = "车辆识别代码")
private String identifyCode;
@ApiModelProperty(value = "使用性质")
private String useNature;
@ApiModelProperty(value = "注册日期")
private String registerDate;
@ApiModelProperty(value = "行驶证发证机关")
private String licenceIssueOrganization;
@ApiModelProperty(value = "行驶证发证日期")
private String licenceIssueDate;
@ApiModelProperty(value = "业户名称")
private String businessName;
@ApiModelProperty(value = "道路运输经营许可证号")
private String roadTransportPermitNumber;
@ApiModelProperty(value = "挂车第二个车牌号")
private String truckNo2;
@ApiModelProperty(value = "车头道路运输许可证编号", dataType="String")
private String roadTransportCertificateNo;
@ApiModelProperty(value = "行驶证主页照片", dataType="String")
private String licenceImgMain;
@ApiModelProperty(value = "行驶证副业正面照片", dataType="String")
private String licenceImgSecond;
@ApiModelProperty(value = "行驶证副业背面照片", dataType="String")
private String licenceImgSecondBack;
@ApiModelProperty(value = "道路运输许可证图片地址", dataType="String")
private String transportLicenceImg;
@ApiModelProperty(value = "挂车行驶证主页照片", dataType="String")
private String licenceImgMain2;
@ApiModelProperty(value = "挂车行驶证副业正面照片", dataType="String")
private String licenceImgSecond2;
@ApiModelProperty(value = "挂车道路运输许可证图片地址", dataType="String")
private String transportLicenceImg2;
@ApiModelProperty(value = "车辆燃料类型 1:柴油 2 天然气 3其他 4新能源/电", dataType="Integer")
private Integer powerType;
}
package com.clx.performance.vo.pc.broker;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@NoArgsConstructor
public class OpenOrderChildTruckOwnerDTO {
@ApiModelProperty(value = "手机号", dataType="String")
private String mobile;
@ApiModelProperty(value = "姓名", dataType="String")
private String name;
@ApiModelProperty(value = "性别1男2女", dataType="Integer")
private Integer sex;
@ApiModelProperty(value = "头像相对地址", dataType="String")
private String headImg;
@ApiModelProperty(value = "身份证号", dataType="String")
private String cardNo;
@ApiModelProperty(value = "身份证住址")
private String idCardAddress;
@ApiModelProperty(value = "身份证有效期起始时间", dataType="String")
private String cardStartTime;
@ApiModelProperty(value = "身份证有效期终止时间", dataType="String")
private String cardEndTime;
@ApiModelProperty(value = "是否是长期 0-非长期 1-长期", dataType="Integer")
private Integer cardLongTerm;
@ApiModelProperty(value = "身份证正面图片地址", dataType="String")
private String cardFrontImg;
@ApiModelProperty(value = "身份证背面图片地址", dataType="String")
private String cardBackImg;
@ApiModelProperty(value = "手持身份证照片地址", dataType="String")
private String faceCardImg;
@ApiModelProperty(value = "银行卡卡号", example = "", required = true, dataType = "String")
private String bankCardNo;
@ApiModelProperty(value = "银行预留手机号", example = "", required = true, dataType = "String")
private String bankMobile;
@ApiModelProperty(value = "银行名称", example = "", required = true, dataType = "String")
private String bankName;
}
package com.clx.performance.vo.pc.broker;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
import java.math.BigDecimal;
@Getter
@Setter
@ToString
@NoArgsConstructor
public class OpenOrderDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "货单编号", example = "12020083116861267", required = true, dataType = "String")
private String sourceOrderNo;
@ApiModelProperty(value = "发布货源时间", example = "2023-01-01 00:00:00", required = true, dataType = "String")
private String publishTime;
@ApiModelProperty(value = "最晚装货时间", example = "2023-01-01 00:00:00", required = true, dataType = "String")
private String extractTime;
@ApiModelProperty(value = "司机最晚到达时间", example = "2023-01-01 00:00:00", required = true, dataType = "String")
private String arriveTime;
@ApiModelProperty(value = "总货物数量", example = "32.12", required = true, dataType = "String")
private BigDecimal goodsAmount;
@ApiModelProperty(value = "货物名称", example = "原煤", required = true, dataType = "String")
private String goodsName;
@ApiModelProperty(value = "货物运费单价(分)", example = "3212", required = true, dataType = "Integer")
private Integer transPrice;
@ApiModelProperty(value = "货物价值(分)", example = "3212", required = true, dataType = "Integer")
private Integer goodsPrice;
@ApiModelProperty(value = "发货单位", example = "发货单位", required = true, dataType = "String")
private String sendCompany;
@ApiModelProperty(value = "货源所在详细地址", example = "货源所在详细地址", required = true, dataType = "String")
private String sendAddress;
@ApiModelProperty(value = "发货人姓名", example = "张三", required = true, dataType = "String")
private String sendName;
@ApiModelProperty(value = "收货人所在详细地址", example = "收货人所在详细地址", required = true, dataType = "String")
private String receiveAddress;
@ApiModelProperty(value = "收货单位", example = "收货单位", required = true, dataType = "String")
private String receiveCompany;
@ApiModelProperty(value = "收货人姓名", example = "张三", required = true, dataType = "String")
private String receiveName;
@ApiModelProperty(value = "发货所在省份", required = true)
private String sendProvince;
@ApiModelProperty(value = "发货所在城市", required = true)
private String sendCity;
@ApiModelProperty(value = "发货所在区县", required = true)
private String sendCounty;
@ApiModelProperty(value = "发货所在乡镇", required = true)
private String sendTown;
@ApiModelProperty(value = "发货联系人手机号", required = true)
private String sendMobile;
@ApiModelProperty(value = "发货地址经度", required = true)
private String loadLongitude;
@ApiModelProperty(value = "发货地址纬度", required = true)
private String loadLatitude;
@ApiModelProperty(value = "收货人所在省", required = true)
private String receiveProvince;
@ApiModelProperty(value = "收货人所在城市", required = true)
private String receiveCity;
@ApiModelProperty(value = "收货人所在区县", required = true)
private String receiveCounty;
@ApiModelProperty(value = "收货人所在乡镇", required = true)
private String receiveTown;
@ApiModelProperty(value = "收货联系人手机号", required = true)
private String receiveMobile;
@ApiModelProperty(value = "收货地址经度", required = true)
private String unloadLongitude;
@ApiModelProperty(value = "收货地址纬度", required = true)
private String unloadLatitude;
}
package com.clx.performance.vo.pc.broker;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
@Getter
@Setter
@ToString
@NoArgsConstructor
public class TransportParam {
@ApiModelProperty(value = "用户编号", required = true)
@NotNull(message = "用户编号不能为空")
private String userCode;
@ApiModelProperty(value = "网络货运平台编码", example = "123", required = true, dataType = "String")
@NotBlank(message = "网络货运平台编码不能为空")
private String transportPlatformCode;
@ApiModelProperty(value = "货主手机号(货主账号)", example = "", required = true, dataType = "String")
@NotBlank(message = "货主手机号(货主账号)不能为空")
private String ownerMobile;
@ApiModelProperty(value = "运单编号", required = true)
@NotBlank(message = "运单编号不能为空")
private String orderCode;
@ApiModelProperty(value = "货单", required = true)
@NotNull(message = "货单不能为空")
private OpenOrderDTO order;
@ApiModelProperty(value = "图片", required = true)
@NotEmpty(message = "运单图片不能为空")
private List<OpenOrderChildImageDTO> orderChildImage;
@ApiModelProperty(value = "司机", required = true)
@NotNull(message = "司机不能为空")
private OpenOrderChildDriverDTO orderChildDriver;
@ApiModelProperty(value = "车主", required = true)
@NotNull(message = "车主不能为空")
private OpenOrderChildTruckOwnerDTO orderChildTruckOwner;
@ApiModelProperty(value = "车辆", required = true)
@NotNull(message = "车辆不能为空")
private OpenOrderChildTruckDTO orderChildTruck;
@ApiModelProperty(value = "运单", required = true)
@NotNull(message = "运单不能为空")
private OpenOrderChildDTO orderChild;
}
package com.clx.performance.vo.pc.broker;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@NoArgsConstructor
public class TransportVO {
@ApiModelProperty(value = "源运单编号", example = "1234", required = true, dataType = "String")
private String sourceChildNo;
@ApiModelProperty(value = "运单编号", example = "1234", required = true, dataType = "String")
private String childNo;
@ApiModelProperty(value = "风控状态 0-正常,1-单项异常,2-多项异常", example = "1", dataType = "Integer")
private Integer riskStatus;
@ApiModelProperty(value = "风控异常原因", example = "1", dataType = "String")
private String riskReason;
@ApiModelProperty(value = "同步状态 0-未同步,1-已同步,2-同步失败", example = "1", dataType = "Integer")
private Integer syncStatus;
@ApiModelProperty(value = "同步失败原因", example = "1", dataType = "String")
private String syncMsg;
@ApiModelProperty(value = "结算状态 0 未结算 1 已结算 2结算中 ", example = "1234124", dataType = "String")
private Integer settleStatus;
@ApiModelProperty(value = "结算方", example = "1", dataType = "String")
private Integer settleOrg;
@ApiModelProperty(value = "结算失败原因", example = "1", dataType = "String")
private String settleMsg;
@ApiModelProperty(value = "开票状态 0 未开票 1 已开票 ", example = "1234124", dataType = "String")
private Integer invoiceStatus;
}
package com.clx.performance.vo.pc.carrier.settle;
import com.msl.common.convertor.type.MoneyOutConvert;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.math.BigDecimal;
/**
* @author yangqifa
*/
@Getter
@Setter
@ToString
public class CarrierPagePlatformServiceFeeConfigVO {
@ApiModelProperty(value = "id")
private Integer id;
@ApiModelProperty(value = "订单报价方式,0:未税,1:含税")
private Integer orderQuotationType;
@ApiModelProperty(value = "订单报价方式")
private String orderQuotationTypeMsg;
@ApiModelProperty(value = "接单保证金")
@MoneyOutConvert
private BigDecimal deposit;
@ApiModelProperty(value = "平台服务费费率")
private BigDecimal serviceFeeRate;
}
......@@ -73,6 +73,17 @@ public class CarrierPageSettlementDriverDetailVO {
@MoneyOutConvert
@ApiModelProperty(value = "开票金额")
private BigDecimal invoiceFreight;
@ApiModelProperty(value = "开票公司id")
private Integer invoicingCompanyId;
@ApiModelProperty(value = "开票公司简称")
private String invoicingCompanyShorterName;
@MoneyOutConvert
@ApiModelProperty(value = "平台服务费")
private BigDecimal platformServiceFee;
@ApiModelProperty(value = "平台服务费费率%")
private BigDecimal platformServiceFeeRate;
@ApiModelProperty(value = "创建时间")
private String createTime;
......
......@@ -66,6 +66,16 @@ public class CarrierPageSettlementDriverVO {
@ApiModelProperty(value = "借款标示 0:未借款 1:已借款 2:已还款")
private String loanFlagMsg;
@ApiModelProperty(value = "开票公司id")
private Integer invoicingCompanyId;
@ApiModelProperty(value = "开票公司简称")
private String invoicingCompanyShorterName;
@MoneyOutConvert
@ApiModelProperty(value = "平台服务费")
private BigDecimal platformServiceFee;
@ApiModelProperty(value = "平台服务费费率%")
private BigDecimal platformServiceFeeRate;
@MoneyOutConvert
@ApiModelProperty(value = "结算金额")
private BigDecimal settlementFreight;
......
......@@ -70,10 +70,19 @@ public class CarrierPageSettlementOwnerDetailVO {
@ApiModelProperty(value = "开票标识:1网运单 2普通单")
private Integer invoiceType;
@MoneyOutConvert
@ApiModelProperty(value = "开票服务费")
private BigDecimal invoiceServiceFee;
@ApiModelProperty(value = "开票服务率")
private BigDecimal invoiceServiceFeeRate;
@MoneyOutConvert
@ApiModelProperty(value = "借款抵扣金额")
private BigDecimal loanFreight;
@ApiModelProperty("结算方式 1装车净重 2卸车净重")
private Integer settlementWay;
@ApiModelProperty("开票公司id")
private Integer invoicingCompanyId;
@ApiModelProperty("开票公司简称")
private String invoicingCompanyShorterName;
@ApiModelProperty(value = "创建时间")
private String createTime;
......
......@@ -51,6 +51,10 @@ public class CarrierPageSettlementOwnerVO {
@MoneyOutConvert
@ApiModelProperty(value = "开票金额")
private BigDecimal invoiceFreight;
@MoneyOutConvert
@ApiModelProperty(value = "开票服务费")
private BigDecimal invoiceServiceFee;
@ApiModelProperty(value = "创建时间")
private String createTime;
@ApiModelProperty(value = "状态 10:待锁定 20:待对账 30:待货主确认 40:待货主付款 50:待平台确认付款 60:待平台付款 70:待货主确认付款 80:待邮寄发票 90:已完结")
......
......@@ -82,6 +82,10 @@ public class CarrierSettlementOwnerDetailVO {
@ApiModelProperty(value = "结算凭证", example = "/a.png")
private String invoiceImg;
@ApiModelProperty(value = "开票服务费", example = "1.23")
@MoneyOutConvert
private BigDecimal invoiceServiceFee;
@ApiModelProperty(value = "收款人", example = "收款人")
private String payee;
......
package com.clx.performance.vo.pc.carrier.settle;
import com.msl.common.convertor.type.MoneyOutConvert;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import io.swagger.annotations.ApiModelProperty;
import java.time.LocalDateTime;
import java.math.BigDecimal;
/**
* @Author: aiqinguo
* @Description: 平台服务费
* @Date: 2024/06/18 15:10:40
* @Version: 1.0
*/
@Getter
@Setter
@ToString
@NoArgsConstructor
public class SettlementPlatformServiceFeeVO {
@ApiModelProperty(value = "id", example = "")
private Integer id;
@ApiModelProperty(value = "运单编号", example = "")
private String childNo;
@ApiModelProperty(value = "车主用户编号", example = "")
private Long driverUserNo;
@ApiModelProperty(value = "车主名称", example = "")
private String driverName;
@ApiModelProperty(value = "司机手机号", example = "")
private String driverMobile;
@ApiModelProperty(value = "发货地址id", example = "")
private Integer sendAddressId;
@ApiModelProperty(value = "发货地址", example = "")
private String sendAddress;
@ApiModelProperty(value = "收货地址id", example = "")
private Integer receiveAddressId;
@ApiModelProperty(value = "收货地址", example = "")
private String receiveAddress;
@ApiModelProperty(value = "车牌号", example = "")
private String truckNo;
@MoneyOutConvert
@ApiModelProperty(value = "结算金额(分)", example = "")
private BigDecimal settlementFreight;
@MoneyOutConvert
@ApiModelProperty(value = "开票服务费(分)", example = "")
private BigDecimal invoiceServiceFee;
@ApiModelProperty(value = "开票服务率%", example = "")
private BigDecimal invoiceServiceFeeRate;
@ApiModelProperty(value = "创建时间", example = "")
private String createTime;
}
\ No newline at end of file
......@@ -51,6 +51,9 @@ public class OwnerPageSettlementOwnerVO {
@MoneyOutConvert
@ApiModelProperty(value = "开票金额")
private BigDecimal invoiceFreight;
@MoneyOutConvert
@ApiModelProperty(value = "开票服务费")
private BigDecimal invoiceServiceFee;
@ApiModelProperty(value = "创建时间")
private String createTime;
@ApiModelProperty(value = "状态 10:待锁定 20:待对账 30:待货主确认 40:待货主付款 50:待平台确认付款 60:待平台付款 70:待货主确认付款 80:待邮寄发票 90:已完结")
......
......@@ -80,13 +80,19 @@ public class PageOwnerSettlementOwnerDetailVO {
@ApiModelProperty(value="开票标识:1网运单 2普通单",example = "普通单")
private String invoiceTypeMsg;
@MoneyOutConvert
@ApiModelProperty(value="开票服务费",example = "2.1")
private BigDecimal invoiceServiceFee;
@ApiModelProperty(value="开票费率%",example = "12.34")
private BigDecimal invoiceServiceFeeRate;
@ApiModelProperty(value="尾款状态 0-否,1-是,2-无需支付",example = "无需支付")
private String finalPaymentStatusMsg;
@ApiModelProperty(value="开票状态 0-否,1-是",example = "是")
private String invoiceStatusMsg;
@ApiModelProperty(value="结算方式 1装车净重 2卸车净重",example = "1")
@ApiModelProperty(value="结算方式 1装车净重 2卸车净重 3卸车净重(减货损)",example = "1")
private Integer settlementWay;
......
......@@ -25,20 +25,21 @@ public class NetworkSyncComponent {
public void ownerSettlementSync(SettlementOwner settlementOwner, List<SettlementOwnerDetail> settlementOwnerDetailList){
//TODO 通知网络货运做货主计费开票标识通知
OwnerSettlementSyncParam param = new OwnerSettlementSyncParam();
String mobile = ownerFeign.getOwnerInfo(settlementOwner.getOwnerUserNo()).getData().getMobile();
param.setOwnerMobile(mobile);
List<OwnerSettlementSyncParam.SettlementItem> settlementList = new LinkedList<>();
for (SettlementOwnerDetail settlementOwnerDetail : settlementOwnerDetailList) {
String childNo = settlementOwnerDetail.getChildNo();
OwnerSettlementSyncParam.SettlementItem item = new OwnerSettlementSyncParam.SettlementItem();
item.setChildNo(childNo);
item.setSettlementNo(settlementOwnerDetail.getSettlementNo());
settlementList.add(item);
}
param.setSettlementList(settlementList);
HttpDTO httpDTO = transportFeignService.ownerSettlementSync(param);
String decrypt = ThirdComponent.decrypt(httpDTO.getData());
log.info("通知网络货运做货主计费开票标识通知请求解密后:{}", decrypt);
// 禁用网络货运同步
// OwnerSettlementSyncParam param = new OwnerSettlementSyncParam();
// String mobile = ownerFeign.getOwnerInfo(settlementOwner.getOwnerUserNo()).getData().getMobile();
// param.setOwnerMobile(mobile);
// List<OwnerSettlementSyncParam.SettlementItem> settlementList = new LinkedList<>();
// for (SettlementOwnerDetail settlementOwnerDetail : settlementOwnerDetailList) {
// String childNo = settlementOwnerDetail.getChildNo();
// OwnerSettlementSyncParam.SettlementItem item = new OwnerSettlementSyncParam.SettlementItem();
// item.setChildNo(childNo);
// item.setSettlementNo(settlementOwnerDetail.getSettlementNo());
// settlementList.add(item);
// }
// param.setSettlementList(settlementList);
// HttpDTO httpDTO = transportFeignService.ownerSettlementSync(param);
// String decrypt = ThirdComponent.decrypt(httpDTO.getData());
// log.info("通知网络货运做货主计费开票标识通知请求解密后:{}", decrypt);
}
}
......@@ -3,6 +3,8 @@ package com.clx.performance.component;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.json.JSONUtil;
import com.clx.order.enums.QuotationEnum;
import com.clx.order.enums.StatusEnum;
import com.clx.order.feign.OrderFeign;
import com.clx.order.vo.feign.FeignOrderInfoVO;
import com.clx.order.vo.pc.owner.OwnerQuotationDetailVO;
......@@ -25,6 +27,7 @@ import com.clx.performance.enums.settle.SettlementOwnerEnum;
import com.clx.performance.enums.settle.SettlementWayEnum;
import com.clx.performance.event.OwnerLoanThawEvent;
import com.clx.performance.event.OwnerRepaymentUpdateEvent;
import com.clx.performance.extranal.user.OrderService;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.OwnerRunningWaterRecord;
......@@ -34,14 +37,18 @@ import com.clx.performance.model.loan.OwnerLoanAccountRunningWaterRecord;
import com.clx.performance.model.loan.OwnerRepayment;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.param.pc.payment.PayPlatformFeeParam;
import com.clx.performance.service.PaymentService;
import com.clx.performance.service.loan.OwnerLoanRecordService;
import com.clx.performance.service.settle.NetworkDriverRunningWaterRecordService;
import com.clx.performance.service.settle.SettlementCommonService;
import com.clx.user.vo.feign.OwnerInfoFeignVO;
import com.msl.common.exception.ServiceSystemException;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
......@@ -84,7 +91,11 @@ public class OrderChildLoanComponent {
private final NetworkDriverRunningWaterRecordService networkDriverRunningWaterRecordService;
private final PaymentService paymentService;
private final OrderService orderService;
private final SettlementCommonService settlementCommonService;
/**
* 接单校验判断
......@@ -105,6 +116,19 @@ public class OrderChildLoanComponent {
log.info("2.百分百预付不需要考虑借款账户");
return;
}
if (!Objects.equals(orderInfoVO.getSupportLoan(), StatusEnum.YES.getCode())){
log.info("3.2当前运单不支持货主借款");
return;
}
if (Objects.equals(orderGoods.getPlatformFreightQuotationTaxType(),
QuotationEnum.PlatformFreightQuotationTaxType.NO.getCode())
&& Objects.equals(orderGoods.getSettlementWay(), SettlementWayEnum.WayType.UNLOAD_LOSS.getCode())) {
log.info("3.2当前运单不支持货主借款");
return;
}
List<OrderChildLoanRetryRecord> orderChildLoanRetryRecordList = orderChildLoanRetryRecordDao.listByField(OrderChildLoanRetryRecord::getOwnerUserNo, ownerInfoFeignVO.getUserNo());
if (CollectionUtil.isNotEmpty(orderChildLoanRetryRecordList)) {
......@@ -198,10 +222,11 @@ public class OrderChildLoanComponent {
*/
@Transactional(rollbackFor = Exception.class)
public void childLoanConfirmAfterProcess(SettlementDriverDetail settlementDriverDetail, SettlementOwnerDetail settlementOwnerDetail, OrderChild orderChild) {
FeignOrderInfoVO orderInfo = orderService.getOrderInfo(settlementDriverDetail.getOrderNo()).orElseThrow(PerformanceResultEnum.ORDER_INVALID);
log.info("1.运单确认收货后借款相关处理执行");
//临时结算金额,借款抵扣后需要重新赋值结算金额为0,如果不需要借款相关逻辑,正常设置结算金额
settlementOwnerDetail.setSettlementFreight(settlementFreightCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
settlementOwnerDetail.setSettlementFreight(settlementCommonService.settlementFreightCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
OwnerQuotationDetailVO quotationDetailVO = orderFeign.getQuotationByOrderNo(settlementDriverDetail.getOrderNo()).getData();
BigDecimal freightFreezeRate = quotationDetailVO.getFreightFreezeRate();
......@@ -221,6 +246,20 @@ public class OrderChildLoanComponent {
log.info("3.当前是网运单,但预付运费不为0,说明已经处理");
return;
}
if (!Objects.equals(orderInfo.getSupportLoan(), StatusEnum.YES.getCode())){
log.info("3.2当前运单不支持货主借款");
return;
}
if (Objects.equals(orderInfo.getPlatformFreightQuotationTaxType(),
QuotationEnum.PlatformFreightQuotationTaxType.NO.getCode())){
log.info("3.3当前运单未税不支持借款");
return;
}
Integer loanTypeFlag = null;
String childNo = settlementDriverDetail.getChildNo();
......@@ -338,6 +377,45 @@ public class OrderChildLoanComponent {
networkDriverRunningWaterRecordService.generateNetworkCaseOutRecord(settlementDriverDetail);
}
@Transactional(rollbackFor = Exception.class)
public void orderChildCancelAfter(String childNo){
//运单取消
OrderChild orderChild = orderChildDao.getByChildNo(childNo).orElseThrow(
PerformanceResultEnum.ORDER_CHILD_NO_FOUND);
BigDecimal platformServiceFee = orderChild.getPlatformServiceFee(); //平台服务费
List<OwnerLoanAccountRunningWaterRecord> runningWaterRecordList = ownerLoanAccountRunningWaterRecordDao.getListByChildNoAndRunningWaterType(childNo, OwnerLoanAccountRunningWaterRecordEnum.RunWaterType.APPROVE_FROZEN.getCode());
if (CollectionUtil.isEmpty(runningWaterRecordList)) {
if( Objects.nonNull(platformServiceFee) && platformServiceFee.compareTo(BigDecimal.ZERO) != 0){
PayPlatformFeeParam payPlatformFeeParam = new PayPlatformFeeParam();
payPlatformFeeParam.setTradeNo(childNo);
payPlatformFeeParam.setFigure(platformServiceFee.intValue());
paymentService.paymentCancelPlatformFee(payPlatformFeeParam);
}
return;
}
Long ownerUserNo = runningWaterRecordList.get(0).getOwnerUserNo();
log.info("当前解冻货主:{},流水记录长度{},流水记录{}", ownerUserNo, runningWaterRecordList.size(), JSONUtil.parse(runningWaterRecordList));
for (OwnerLoanAccountRunningWaterRecord record : runningWaterRecordList) {
Long loanNo = record.getLoanNo();
Integer loanType = record.getLoanType();
String ownerUserName = record.getOwnerUserName();
BigDecimal balance = record.getAlterationBalance();
//解冻借款
thawOwnerLoanAccount(loanNo, loanType, ownerUserNo, ownerUserName, record.getMobile(), childNo, balance);
}
if( Objects.nonNull(platformServiceFee) && platformServiceFee.compareTo(BigDecimal.ZERO) != 0){
PayPlatformFeeParam payPlatformFeeParam = new PayPlatformFeeParam();
payPlatformFeeParam.setTradeNo(childNo);
payPlatformFeeParam.setFigure(platformServiceFee.intValue());
paymentService.paymentCancelPlatformFee(payPlatformFeeParam);
}
}
//归还借款单的剩余金额+解冻流水
public void thawOwnerLoanAccount(Long loanNo, Integer loanType, Long userNo, String userName, String mobile, String childNo, BigDecimal balance) {
log.info("归还借款单的剩余金额+解冻流水,loanNo:{},loanType:{},userNo:{},childNo:{}, balance:{}", loanNo, loanType, userNo, childNo, balance);
......@@ -490,19 +568,6 @@ public class OrderChildLoanComponent {
return false;
}
/**
* 抵扣金额
*/
private BigDecimal settlementFreightCalc(Integer settlementWay, SettlementOwnerDetail settlementOwnerDetail) {
if (Objects.equals(settlementWay, SettlementWayEnum.WayType.LOAD.getCode())) { //订单结算方式为“装车净重”时,结算金额=实际净重*平台运费报价-预付运费-货损金额。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice())
.subtract(settlementOwnerDetail.getPrepayFreight()).subtract(settlementOwnerDetail.getLossFreight());
} else { //订单结算方式为“卸车净重”时,结算金额=实际净重*平台运费报价-预付运费
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice()).subtract(settlementOwnerDetail.getPrepayFreight());
}
}
public Integer loanFlagTypeProcess(List<OwnerLoanAccountRunningWaterRecord> runningWaterRecordList) {
Map<Integer, List<OwnerLoanAccountRunningWaterRecord>> listMap = runningWaterRecordList.stream().collect(Collectors.groupingBy(OwnerLoanAccountRunningWaterRecord::getLoanType));
List<OwnerLoanAccountRunningWaterRecord> vList = listMap.get(OwnerLoanRecordEnum.LoanType.VIRTUAL_CURRENCY.getCode());
......
......@@ -17,4 +17,6 @@ public class MslPaymentConfig {
private String notifyhost;
@Value("${msl.payment.transport.walletCode}")
private Integer transportWalletCode;
@Value("${msl.payment.system.walletCode}")
private Integer systemWalletCode;
}
......@@ -73,5 +73,55 @@ public class RabbitSettlementConfig {
return BindingBuilder.bind(settlementDetailInvoiceTypeSyncQueue()).to(settlementDefaultExchange()).with(RabbitKeySettlementConstants.SETTLEMENT_DETAIL_INVOICE_TYPE_SYC_ROUTING_KEY);
}
/**
* 开票方式同步
*/
@Bean
public Queue settlementInvoiceTypeSyncQueue() {
return new Queue(RabbitKeySettlementConstants.SETTLEMENT_INVOICE_TYPE_SYNC_QUEUE);
}
@Bean
public Binding settlementInvoiceTypeSyncQueueBinding() {
return BindingBuilder.bind(settlementInvoiceTypeSyncQueue()).to(settlementDefaultExchange())
.with(RabbitKeySettlementConstants.SETTLEMENT_INVOICE_TYPE_SYNC_ROUTING_KEY);
}
/**
* 结算
*/
@Bean
public Queue settlementSettleQueue() {
return new Queue(RabbitKeySettlementConstants.SETTLEMENT_SETTLE_QUEUE);
}
@Bean
public Binding settlementSettleQueueBinding() {
return BindingBuilder.bind(settlementSettleQueue()).to(settlementDefaultExchange())
.with(RabbitKeySettlementConstants.SETTLEMENT_SETTLE_ROUTING_KEY);
}
/**
* 支付状态
*/
@Bean
public Queue settlementPayStatusSyncQueue() {
return new Queue(RabbitKeySettlementConstants.SETTLEMENT_PAY_STATUS_SYNC_QUEUE);
}
@Bean
public Binding settlementPayStatusSyncQueueBinding() {
return BindingBuilder.bind(settlementPayStatusSyncQueue()).to(settlementDefaultExchange())
.with(RabbitKeySettlementConstants.SETTLEMENT_PAY_STATUS_SYNC_ROUTING_KEY);
}
/**
* 开票状态
*/
@Bean
public Queue settlementInvoiceSyncQueue() {
return new Queue(RabbitKeySettlementConstants.SETTLEMENT_INVOICE_STATUS_SYNC_QUEUE);
}
@Bean
public Binding settlementInvoiceSyncQueueBinding() {
return BindingBuilder.bind(settlementInvoiceSyncQueue()).to(settlementDefaultExchange())
.with(RabbitKeySettlementConstants.SETTLEMENT_INVOICE_STATUS_SYNC_ROUTING_KEY);
}
}
package com.clx.performance.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "settlement")
@Data
@Component
public class SettlementConfig {
// broker host
private String brokerHost;
// broker用户编号
private String brokerUserCode;
// 普通单开票公司编号
private String ordinaryInvoiceCompanyGroupCode;
}
......@@ -40,9 +40,32 @@ public class RabbitKeySettlementConstants {
public static final String SETTLEMENT_DETAIL_ADD_ROUTING_KEY = PREFIX +"settlementDetail.add"+QUEUE_ROUTING_KEY;
/**
* 同步开票标识
* 计费统计
*/
public static final String SETTLEMENT_DETAIL_INVOICE_TYPE_SYC_QUEUE = PREFIX +"settlementDetailInvoiceType.sync"+QUEUE;
public static final String SETTLEMENT_DETAIL_INVOICE_TYPE_SYC_ROUTING_KEY = PREFIX +"settlementDetailInvoiceType.sync"+QUEUE_ROUTING_KEY;
/**
* 同步开票标识
*/
public static final String SETTLEMENT_INVOICE_TYPE_SYNC_QUEUE = PREFIX +"settlementInvoiceType.sync"+QUEUE;
public static final String SETTLEMENT_INVOICE_TYPE_SYNC_ROUTING_KEY = PREFIX +"settlementInvoiceType.sync"+QUEUE_ROUTING_KEY;
/**
* 结算
*/
public static final String SETTLEMENT_SETTLE_QUEUE = PREFIX +"settlement.settle"+QUEUE;
public static final String SETTLEMENT_SETTLE_ROUTING_KEY = PREFIX +"settlement.settle"+QUEUE_ROUTING_KEY;
/**
* 开票状态同步
*/
public static final String SETTLEMENT_INVOICE_STATUS_SYNC_QUEUE = PREFIX +"settlementInvoiceStatus.sync"+QUEUE;
public static final String SETTLEMENT_INVOICE_STATUS_SYNC_ROUTING_KEY = PREFIX +"settlementInvoiceStatus.sync"+QUEUE_ROUTING_KEY;
/**
* 支付状态同步
*/
public static final String SETTLEMENT_PAY_STATUS_SYNC_QUEUE = PREFIX +"settlementPayStatus.sync"+QUEUE;
public static final String SETTLEMENT_PAY_STATUS_SYNC_ROUTING_KEY = PREFIX +"settlementPayStatus.sync"+QUEUE_ROUTING_KEY;
}
......@@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
@RestController
......@@ -56,4 +57,13 @@ public class OrderGoodsFeignController {
}
@ApiOperation(value = "更新挂单运费", notes = "<br>By:艾庆国")
@PostMapping(value = {"/updatePendingOrderFright"})
Result<Void> updatePendingOrderFright(@RequestParam("orderGoodsNo") String orderGoodsNo,
@RequestParam("pendingOrderFreight") BigDecimal pendingOrderFreight){
orderGoodsService.updateFrightPrice(orderGoodsNo, pendingOrderFreight);
return Result.ok();
}
}
package com.clx.performance.controller.feign;
import com.clx.performance.service.PlatformServiceFeeConfigService;
import com.clx.performance.vo.feign.PlatformServiceFeeConfigFeignVO;
import com.msl.common.result.Result;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/feign/platformServiceFee")
@Validated
@Api(tags = "平台服务费Feign")
public class PlatformServiceFeeFeignController {
@Autowired
private PlatformServiceFeeConfigService platformServiceFeeConfigService;
@GetMapping(value = {"/getPlatformServiceFeeConfig"})
Result<PlatformServiceFeeConfigFeignVO> getPlatformServiceFeeConfig(){
return Result.ok(platformServiceFeeConfigService.getConfig());
}
}
......@@ -44,7 +44,7 @@ public class OpenOwnerAccountController {
@ApiOperation(value = "账户充值", notes = "<br>By:胡宇帆")
@PostMapping("/accountTopUp")
@UnitCovert(param = false)
public Result<Long> openAccountTopUp(@RequestBody OpenOwnerTopUpParam param) {
public Result<Long> openAccountTopUp(@RequestBody @Validated OpenOwnerTopUpParam param) {
Long id = ownerAccountService.openAccountTopUp(param);
return Result.ok(id);
}
......
package com.clx.performance.controller.payment;
import com.clx.performance.enums.PayUnitTypeEnum;
import com.clx.performance.enums.payment.PayOperationStatusEnum;
import com.clx.performance.enums.payment.PaymentStatusEnum;
import com.clx.performance.model.payment.OrderPayment;
import com.clx.performance.param.pay.NotifyString;
import com.clx.performance.service.PaymentService;
import com.clx.performance.service.breakcontract.BreakContractMqHandlerService;
import com.clx.performance.service.settle.SettlementMqHandlerService;
import com.msl.common.result.Result;
......@@ -27,6 +32,12 @@ public class PayNotifyController {
@Autowired
private BreakContractMqHandlerService breakContractMqHandlerService;
@Autowired
private PaymentService paymentService;
@ApiOperation(value = "用户支付完成回调接口", notes = " <br>By:胡宁宁")
@RequestMapping(value = "/userPayNotify", method = RequestMethod.POST)
public Result<Object> userPayNotify(@RequestBody NotifyString notify) {
......@@ -70,4 +81,132 @@ public class PayNotifyController {
Result<Object> ret = new Result<>();
return ret;
}
@ApiOperation(value = "司机冻结保证金回调接口", notes = " <br>By:胡宁宁")
@RequestMapping(value = "/userPayDriverFreezeNotify", method = RequestMethod.POST)
public Result<Object> userPayDriverFreezeNotify(@RequestBody NotifyString notify) {
log.info("司机冻结保证金回调接口 传参 {}", notify);
if (Objects.isNull(notify) || Objects.isNull(notify.getCode()) || Objects.isNull(notify.getAction())) {
return new Result<>();
}
String paymentItem = PayUnitTypeEnum.FREEZE_PLATFORM_FEE.getCode()+"";
int operation = PayOperationStatusEnum.FREEZE.getValue();
if (notify.getCode() != 0) {
paymentService.updateOrderPaymentFail(notify.getOrderNo(), notify.getMsg(),
operation,
paymentItem
);
// 支付失败处理
log.info("支付失败处理 唯一id {}", notify.getOrderNo());
} else {
analysisSuccess(notify.getData().toString(), operation, paymentItem);
paymentService.updateOrderPaymentSuccess(notify.getOrderNo(), operation,
paymentItem);
// 支付支付成功处理
log.info(" 支付支付成功处理 唯一id {}", notify.getOrderNo());
}
Result<Object> ret = new Result<>();
return ret;
}
@ApiOperation(value = "司机调整保证金回调接口", notes = " <br>By:胡宁宁")
@RequestMapping(value = "/userPayAdjustDriverFreezeNotify", method = RequestMethod.POST)
public Result<Object> userPayAdjustDriverFreezeNotify(@RequestBody NotifyString notify) {
log.info("司机调整保证金回调接口 传参 {}", notify);
if (Objects.isNull(notify) || Objects.isNull(notify.getCode()) || Objects.isNull(notify.getAction())) {
return new Result<>();
}
if (notify.getCode() != 0) {
paymentService.updateOrderPaymentStatusById(notify.getOrderNo(),PaymentStatusEnum.FAIL.getValue());
// 支付失败处理
log.info("支付失败处理 唯一id {}", notify.getOrderNo());
// 支付失败处理
} else {
paymentService.updateOrderPaymentStatusById(notify.getOrderNo(),PaymentStatusEnum.SUCCESS.getValue());
// 支付支付成功处理
log.info(" 支付支付成功处理 唯一id {}", notify.getOrderNo());
}
Result<Object> ret = new Result<>();
return ret;
}
@ApiOperation(value = "司机取消运单退还保证金回调接口", notes = " <br>By:胡宁宁")
@RequestMapping(value = "/userPayCancelDriverFreezeNotify", method = RequestMethod.POST)
public Result<Object> userPayCancelDriverFreezeNotify(@RequestBody NotifyString notify) {
log.info("司机取消运单退还保证金回调接口 传参 {}", notify);
if (Objects.isNull(notify) || Objects.isNull(notify.getCode()) || Objects.isNull(notify.getAction())) {
return new Result<>();
}
String paymentItem = PayUnitTypeEnum.FREEZE_PLATFORM_FEE.getCode()+"";
int operation = PayOperationStatusEnum.UNFREEZE.getValue();
if (notify.getCode() != 0) {
paymentService.updateOrderPaymentFail(notify.getOrderNo(), notify.getMsg(),
operation,
paymentItem
);
// 支付失败处理
log.info("支付失败处理 唯一id {}", notify.getOrderNo());
} else {
paymentService.updateOrderPaymentSuccess(notify.getOrderNo(), operation,
paymentItem);
// 支付支付成功处理
log.info(" 支付支付成功处理 唯一id {}", notify.getOrderNo());
}
Result<Object> ret = new Result<>();
return ret;
}
@ApiOperation(value = "运单完成 保证金回调接口", notes = " <br>By:胡宁宁")
@RequestMapping(value = "/userPayCompleteDriverFreezeNotify", method = RequestMethod.POST)
public Result<Object> userPayCompleteDriverFreezeNotify(@RequestBody NotifyString notify) {
log.info("运单完成 保证金回调接口 传参 {}", notify);
if (Objects.isNull(notify) || Objects.isNull(notify.getCode()) || Objects.isNull(notify.getAction())) {
return new Result<>();
}
String paymentItem = PayUnitTypeEnum.FREEZE_PLATFORM_FEE.getCode()+"";
int operation = PayOperationStatusEnum.UNFREEZE.getValue();
if (notify.getCode() != 0) {
paymentService.updateOrderPaymentFail(notify.getOrderNo(), notify.getMsg(),
operation,
paymentItem
);
// 支付失败处理
log.info("支付失败处理 唯一id {}", notify.getOrderNo());
} else {
paymentService.updateOrderPaymentSuccess(notify.getOrderNo(), operation,
paymentItem);
// 支付支付成功处理
log.info(" 支付支付成功处理 唯一id {}", notify.getOrderNo());
}
Result<Object> ret = new Result<>();
return ret;
}
private void analysisSuccess(String result,Integer operation, String paymentItem){
if(result.contains(",")){
String[] stringFlag = result.split(",");
if(stringFlag.length>0){
//最多四笔,直接循环修改
for(int i=0;i<stringFlag.length;i++){
String [] ress = stringFlag[i].split("=");
if(ress.length==2){//例如 id=serialNo
paymentService.updateOrderPaymentSerialNoSuccess(ress[0],ress[1],operation,paymentItem);
}
}
}
}else{
String[] ress = result.split("=");
if(ress.length==2){//例如 id=serialNo
paymentService.updateOrderPaymentSerialNoSuccess(ress[0],ress[1],operation,paymentItem);
}
}
}
}
package com.clx.performance.controller.pc.carrier;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.param.pc.owner.PageCarrierSettlementPlatformServiceFeeParam;
import com.clx.performance.service.settle.SettlementPlatformServiceFeeExportService;
import com.clx.performance.service.settle.SettlementPlatformServiceFeeService;
import com.clx.performance.vo.pc.carrier.settle.SettlementPlatformServiceFeeVO;
import com.msl.common.base.PageData;
import com.msl.common.convertor.aspect.UnitCovert;
import com.msl.common.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping(value="/pc/carrier/settlement/platformServiceFee")
@Validated
@Api(tags = "承运端-平台服务费统计-平台服务费")
public class CarrierSettlementPlatformServiceFeeController {
@Autowired
private SettlementPlatformServiceFeeService settlementPlatformServiceFeeService;
@Autowired
private SettlementPlatformServiceFeeExportService settlementPlatformServiceFeeExportService;
@ApiOperation(value = "平台服务费统计",notes = "<br>By:艾庆国")
@PostMapping("/pagePlatformServiceFee")
@UnitCovert(param = false)
public Result<PageData<SettlementPlatformServiceFeeVO>> pagePlatformServiceFee(
@RequestBody @Validated PageCarrierSettlementPlatformServiceFeeParam param) {
IPage<SettlementPlatformServiceFeeVO> page = settlementPlatformServiceFeeService
.pagePlatformServiceFee(param);
return Result.page(page.getRecords(),page.getTotal(),page.getPages());
}
@ApiOperation(value = "导出平台服务费统计",notes = "<br>By:艾庆国")
@PostMapping("/exportPlatformServiceFee")
public void exportPlatformServiceFee(@RequestBody @Validated PageCarrierSettlementPlatformServiceFeeParam param) {
settlementPlatformServiceFeeExportService.exportPlatformServiceFee(param);
}
}
package com.clx.performance.controller.pc.carrier;
import com.clx.performance.param.pc.carrier.SavePlatformServiceFeeConfigParam;
import com.clx.performance.service.PlatformServiceFeeConfigService;
import com.clx.performance.vo.pc.carrier.settle.CarrierPagePlatformServiceFeeConfigVO;
import com.msl.common.convertor.aspect.UnitCovert;
import com.msl.common.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
/**
* @author yangqifa
*/
@Slf4j
@RestController
@RequestMapping(value = "/pc/carrier/platformServiceFeeConfig")
@Validated
@Api(tags = "承运端-平台费率配置")
@AllArgsConstructor
public class PlatformServiceFeeConfigController {
private final PlatformServiceFeeConfigService platformServiceFeeConfigService;
@ApiOperation(value = "平台费率配置列表", notes = "<br>By:杨启发")
@GetMapping("/listPlatformServiceFeeConfig")
@UnitCovert(param = false)
public Result<CarrierPagePlatformServiceFeeConfigVO> listPlatformServiceFeeConfig() {
return Result.ok(platformServiceFeeConfigService.listPlatformServiceFeeConfig());
}
@ApiOperation(value = "平台费率配置详情", notes = "<br>By:杨启发")
@GetMapping("/getPlatformServiceFeeConfigDetail")
@UnitCovert(param = false)
public Result<CarrierPagePlatformServiceFeeConfigVO> getPlatformServiceFeeConfigDetail(@NotNull(message = "id不能为空") Integer id) {
return Result.ok(platformServiceFeeConfigService.getPlatformServiceFeeConfigDetail(id));
}
@ApiOperation(value = "编辑平台费率配置", notes = "<br>By:杨启发")
@PostMapping("/updatePlatformServiceFeeConfig")
@UnitCovert
public Result updatePlatformServiceFeeConfig(@RequestBody @Validated SavePlatformServiceFeeConfigParam param) {
platformServiceFeeConfigService.updatePlatformServiceFeeConfig(param);
return Result.ok();
}
}
......@@ -12,8 +12,11 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotBlank;
/**
* @Author: aiqingguo
......@@ -48,6 +51,18 @@ public class TempController {
return Result.ok();
}
@ApiOperation(value = "测试支付划账 (临时接口)", notes = "<br>By:胡宁宁")
@RequestMapping(value = "/paymentTest", method = RequestMethod.GET)
public Result<Void> paymentTest(@RequestParam("fromUser") @NotBlank(message = "扣款方") String fromUser,
@RequestParam("pwd") @NotBlank(message = "收款方") String pwd,
@RequestParam("tradeNo") @NotBlank(message = "金额") String tradeNo,
@RequestParam("type") @NotBlank(message = "类型") int type) {
tempService.paymentTest(fromUser,pwd,tradeNo,type);
return Result.ok();
}
// @ApiOperation(value = "更新网运标识", notes = "<br>By:艾庆国")
// @RequestMapping(value = "/updateInvoiceType", method = RequestMethod.POST)
// public Result<Void> updateInvoiceType(String childNo, Integer invoiceType) {
......
package com.clx.performance.controller.temp;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.listener.OrderChildSyncTransportListener;
import com.clx.performance.model.OrderChild;
import com.clx.performance.service.settle.SettlementMqHandlerService;
import com.clx.performance.service.settle.SettlementMqService;
import com.clx.performance.vo.mq.SettlementStatisticsMqParam;
import com.msl.common.result.Result;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: aiqingguo
* @Description: 临时接口
* @Date: 2023-8-21 12:10:16
* @Version: 1.0
*/
@Slf4j
@RestController
@RequestMapping(value="/temp/settlement")
public class TempSettlementController {
@Autowired
private OrderChildDao orderChildDao;
@Autowired
private SettlementMqService settlementMqService;
@Autowired
private OrderChildSyncTransportListener orderChildSyncTransportListener;
@Autowired
private SettlementMqHandlerService settlementMqHandlerService;
@ApiOperation(value = "settlementStatistics", notes = "<br>By:艾庆国")
@RequestMapping(value = "/settlementStatistics", method = RequestMethod.GET)
public Result settlementStatistics(String childNo) {
SettlementStatisticsMqParam mq = new SettlementStatisticsMqParam();
mq.setChildNo(childNo);
mq.setInvoiceType(1);
settlementMqHandlerService.settlementStatistics(mq);
return Result.ok();
}
@ApiOperation(value = "运单同步broker", notes = "<br>By:艾庆国")
@RequestMapping(value = "/orderChildSync", method = RequestMethod.GET)
public Result orderChildSync(String childNo) {
OrderChild orderChild = orderChildDao.getByChildNo(childNo).get();
// 同步broker
orderChildSyncTransportListener.transportOrderChildProcess(orderChild);
return Result.ok();
}
@ApiOperation(value = "开票类型同步", notes = "<br>By:艾庆国")
@RequestMapping(value = "/invoiceTypeSync", method = RequestMethod.GET)
public Result invoiceTypeSync(String childNo) {
settlementMqService.invoiceTypeSync(childNo);
return Result.ok();
}
@ApiOperation(value = "开票状态同步", notes = "<br>By:艾庆国")
@RequestMapping(value = "/invoiceStatusSync", method = RequestMethod.GET)
public Result invoiceStatusSync(String childNo) {
settlementMqService.invoiceStatusSync(childNo);
return Result.ok();
}
@ApiOperation(value = "支付状态同步", notes = "<br>By:艾庆国")
@RequestMapping(value = "/payStatusSync", method = RequestMethod.GET)
public Result payStatusSync(String childNo) {
settlementMqService.payStatusSync(childNo);
return Result.ok();
}
}
......@@ -42,6 +42,7 @@ public interface OrderChildDao extends BaseDao<OrderChildMapper, OrderChild, Int
boolean updateSettlement(OrderChild item);
boolean updateCancel(OrderChild item);
boolean updatePlatformServiceFee(OrderChild item);
Optional<OrderChild> getByChildNo(String childNo);
......
......@@ -14,4 +14,5 @@ import java.util.List;
public interface OrderChildSyncTransportInvoiceRecordDao extends BaseDao<OrderChildSyncTransportInvoiceRecordMapper, OrderChildSyncTransportInvoiceRecord, Integer> {
List<OrderChildSyncTransportInvoiceRecord> selectListForJob();
List<OrderChildSyncTransportInvoiceRecord> selectListForJobOfFirst();
}
......@@ -61,6 +61,7 @@ public interface OrderGoodsDao extends BaseDao<OrderGoodsMapper, OrderGoods, Int
List<OrderGoods> listIntegralOrderGoodsSync();
boolean updatePendingOrderFreightById(Integer id, BigDecimal pendingOrderFreight);
boolean updatePendingOrderFreightByIdList(BigDecimal pendingOrderFreight, List<Integer>idList);
Boolean updateStopFlagByOrderNo(String orderNo, Integer stopFlag);
......
package com.clx.performance.dao;
import com.clx.performance.mapper.PlatformServiceFeeConfigMapper;
import com.clx.performance.model.PlatformServiceFeeConfig;
import com.msl.common.dao.BaseDao;
/**
* @author yangqifa
*/
public interface PlatformServiceFeeConfigDao extends BaseDao<PlatformServiceFeeConfigMapper, PlatformServiceFeeConfig, Integer> {
PlatformServiceFeeConfig listPlatformServiceFeeConfig();
boolean updatePlatformServiceFeeConfig(PlatformServiceFeeConfig config);
}
......@@ -68,6 +68,8 @@ public class OrderChildDaoImpl extends BaseDaoImpl<OrderChildMapper, OrderChild,
.set(OrderChild::getWeight, item.getWeight())
.set(OrderChild::getFreight, item.getFreight())
.set(OrderChild::getStatus, item.getStatus())
.set(OrderChild::getDeposit, item.getDeposit())
.set(OrderChild::getPlatformServiceFee, item.getPlatformServiceFee())
);
}
......@@ -85,6 +87,8 @@ public class OrderChildDaoImpl extends BaseDaoImpl<OrderChildMapper, OrderChild,
.set(OrderChild::getWeight, item.getWeight())
.set(OrderChild::getFreight, item.getFreight())
.set(OrderChild::getStatus, item.getStatus())
.set(OrderChild::getDeposit, item.getDeposit())
.set(OrderChild::getPlatformServiceFee, item.getPlatformServiceFee())
);
}
......@@ -105,6 +109,8 @@ public class OrderChildDaoImpl extends BaseDaoImpl<OrderChildMapper, OrderChild,
.set(OrderChild::getWeight, item.getWeight())
.set(OrderChild::getFreight, item.getFreight())
.set(OrderChild::getPoundStatus, item.getPoundStatus())
.set(OrderChild::getDeposit, item.getDeposit())
.set(OrderChild::getPlatformServiceFee, item.getPlatformServiceFee())
);
}
......@@ -121,6 +127,7 @@ public class OrderChildDaoImpl extends BaseDaoImpl<OrderChildMapper, OrderChild,
.set(OrderChild::getUnloadTare, item.getUnloadTare())
.set(OrderChild::getWeight, item.getWeight())
.set(OrderChild::getFreight, item.getFreight())
.set(OrderChild::getPlatformServiceFee, item.getPlatformServiceFee())
);
}
......@@ -156,6 +163,14 @@ public class OrderChildDaoImpl extends BaseDaoImpl<OrderChildMapper, OrderChild,
);
}
@Override
public boolean updatePlatformServiceFee(OrderChild item) {
return update(lUdWrapper()
.eq(OrderChild::getId, item.getId())
.set(OrderChild::getPlatformServiceFee, item.getPlatformServiceFee())
);
}
@Override
public Optional<OrderChild> getByChildNo(String childNo) {
......
package com.clx.performance.dao.impl;
import com.clx.performance.enums.TransportSyncTypeEnum;
import com.msl.common.dao.impl.BaseDaoImpl;
import com.clx.performance.dao.OrderChildSyncTransportInvoiceRecordDao;
import com.clx.performance.enums.TransportSyncTypeEnum;
import com.clx.performance.mapper.OrderChildSyncTransportInvoiceRecordMapper;
import com.clx.performance.model.OrderChildSyncTransportInvoiceRecord;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import java.util.List;
/**
......@@ -19,6 +20,16 @@ public class OrderChildSyncTransportInvoiceRecordDaoImpl extends BaseDaoImpl<Ord
@Override
public List<OrderChildSyncTransportInvoiceRecord> selectListForJob() {
return baseMapper.selectList(null);
return list(lUdWrapper()
.le(OrderChildSyncTransportInvoiceRecord::getCreateTime, LocalDateTime.now().minusMinutes(10))
);
}
@Override
public List<OrderChildSyncTransportInvoiceRecord> selectListForJobOfFirst() {
return list(lUdWrapper()
.eq(OrderChildSyncTransportInvoiceRecord::getType, TransportSyncTypeEnum.Type.RESULT.getCode())
.le(OrderChildSyncTransportInvoiceRecord::getCreateTime, LocalDateTime.now().minusMinutes(3))
);
}
}
......@@ -158,6 +158,15 @@ public class OrderGoodsDaoImpl extends BaseDaoImpl<OrderGoodsMapper, OrderGoods,
return update(lUdWrapper().eq(OrderGoods :: getId,id).set(OrderGoods :: getPendingOrderFreight,pendingOrderFreight));
}
@Override
public boolean updatePendingOrderFreightByIdList(BigDecimal pendingOrderFreight, List<Integer> idList) {
return update(lUdWrapper()
.in(OrderGoods::getId,idList)
.set(OrderGoods::getPendingOrderFreight,pendingOrderFreight)
);
}
@Override
public Boolean updateStopFlagByOrderNo(String orderNo, Integer stopFlag) {
return update(lUdWrapper().eq(OrderGoods :: getOrderNo,orderNo).set(OrderGoods :: getStopFlag,stopFlag));
......
package com.clx.performance.dao.impl;
import com.clx.performance.dao.PlatformServiceFeeConfigDao;
import com.clx.performance.mapper.PlatformServiceFeeConfigMapper;
import com.clx.performance.model.PlatformServiceFeeConfig;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.springframework.stereotype.Repository;
/**
* @author yangqifa
*/
@Repository
public class PlatformServiceFeeConfigImpl extends BaseDaoImpl<PlatformServiceFeeConfigMapper, PlatformServiceFeeConfig, Integer> implements PlatformServiceFeeConfigDao {
@Override
public PlatformServiceFeeConfig listPlatformServiceFeeConfig() {
return list().get(0);
}
@Override
public boolean updatePlatformServiceFeeConfig(PlatformServiceFeeConfig config) {
return update(lUdWrapper()
.eq(PlatformServiceFeeConfig::getId, config.getId())
.set(PlatformServiceFeeConfig::getOrderQuotationType, config.getOrderQuotationType())
.set(PlatformServiceFeeConfig::getDeposit, config.getDeposit())
.set(PlatformServiceFeeConfig::getServiceFeeRate, config.getServiceFeeRate())
);
}
}
package com.clx.performance.dao.impl.payment;
import com.clx.performance.dao.payment.OrderPaymentDao;
import com.clx.performance.mapper.payment.OrderPaymentMapper;
import com.clx.performance.model.payment.OrderPayment;
import com.msl.common.base.Optional;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author huningning
* Date 2024-06-18
* Time 14:01
*/
@Repository
public class OrderPaymentDaoImpl extends BaseDaoImpl<OrderPaymentMapper, OrderPayment, Integer> implements OrderPaymentDao {
@Override
public Optional<OrderPayment> selectByOrderNoAndItemId(String orderNo, String paymentItem) {
return Optional.of(orderNo)
.map(item -> lQrWrapper()
.eq(OrderPayment::getOrderNo, item)
.eq(OrderPayment::getPaymentItem, paymentItem)
)
.map(super::getOne);
}
@Override
public Optional<OrderPayment> selectByRelationNo(String relationNo, Integer operation, String paymentItem) {
return Optional.of(relationNo)
.map(item -> lQrWrapper()
.eq(OrderPayment::getRelationNo, item)
.eq(OrderPayment::getOperation, operation)
.eq(OrderPayment::getPaymentItem, paymentItem)
)
.map(super::getOne);
}
@Override
public Optional<OrderPayment> selectByOrderNoAndItemIdAndOperation(String orderNo, String paymentItem,
Integer operation) {
return Optional.of(orderNo)
.map(item -> lQrWrapper()
.eq(OrderPayment::getOrderNo, item)
.eq(OrderPayment::getPaymentItem, paymentItem)
.eq(OrderPayment::getOperation, operation)
)
.map(super::getOne);
}
@Override
public List<OrderPayment> listByOrderNo(String orderNo, String paymentItem) {
return list(lQrWrapper()
.eq(OrderPayment::getOrderNo, orderNo)
.eq(OrderPayment::getPaymentItem, paymentItem)
);
}
}
......@@ -4,9 +4,11 @@ package com.clx.performance.dao.impl.settle;
import com.clx.performance.dao.settle.OrderChildSyncTransportRecordDao;
import com.clx.performance.mapper.settle.OrderChildSyncTransportRecordMapper;
import com.clx.performance.model.settle.OrderChildSyncTransportRecord;
import com.msl.common.base.Optional;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import java.util.List;
/**
......@@ -19,7 +21,11 @@ public class OrderChildSyncTransportRecordDaoImpl extends BaseDaoImpl<OrderChild
@Override
public List<OrderChildSyncTransportRecord> selectListForJob() {
return baseMapper.selectList(lQrWrapper().eq(OrderChildSyncTransportRecord::getStatus, 0));
return baseMapper.selectList(lQrWrapper()
.gt(OrderChildSyncTransportRecord::getCreateTime, LocalDateTime.now().minusMonths(3))
.le(OrderChildSyncTransportRecord::getCreateTime, LocalDateTime.now().minusMinutes(6))
.eq(OrderChildSyncTransportRecord::getStatus, 0)
);
}
@Override
......@@ -28,4 +34,13 @@ public class OrderChildSyncTransportRecordDaoImpl extends BaseDaoImpl<OrderChild
.set(OrderChildSyncTransportRecord::getStatus, 2)
);
}
@Override
public Optional<OrderChildSyncTransportRecord> getByChildNo(String childNo) {
return Optional.of(childNo)
.map(item -> lQrWrapper()
.eq(OrderChildSyncTransportRecord::getChildNo, item)
)
.map(super::getOne);
}
}
......@@ -18,7 +18,6 @@ import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.Set;
/**
* @Author: aiqinguo
......@@ -37,6 +36,10 @@ public class SettlementDriverDetailDaoImpl extends BaseDaoImpl<SettlementDriverD
.set(SettlementDriverDetail::getPrepayFreightFlag, item.getPrepayFreightFlag())
.set(SettlementDriverDetail::getLoanFlag, item.getLoanFlag())
.set(SettlementDriverDetail::getLoanTypeFlag, item.getLoanTypeFlag())
.set(SettlementDriverDetail::getInvoicingCompanyId, item.getInvoicingCompanyId())
.set(SettlementDriverDetail::getInvoicingCompanyShorterName, item.getInvoicingCompanyShorterName())
.set(SettlementDriverDetail::getInvoicingCompanyGroupCode, item.getInvoicingCompanyGroupCode())
);
}
......
......@@ -40,6 +40,7 @@ public class SettlementOwnerDaoImpl extends BaseDaoImpl<SettlementOwnerMapper, S
.set(SettlementOwner::getInvoiceFreight, item.getInvoiceFreight())
.set(SettlementOwner::getLoanFreight, item.getLoanFreight())
.set(SettlementOwner::getPrepayFreight, item.getPrepayFreight())
.set(SettlementOwner::getInvoiceServiceFee, item.getInvoiceServiceFee())
);
}
......@@ -118,6 +119,13 @@ public class SettlementOwnerDaoImpl extends BaseDaoImpl<SettlementOwnerMapper, S
if(StringUtils.isNotBlank(param.getOrderNo())){
query.eq(SettlementOwner :: getOrderNo,param.getOrderNo());
}
if(StringUtils.isNotBlank(param.getBeginTime())){
query.ge(SettlementOwner :: getCreateTime,param.getBeginTime());
}
if(StringUtils.isNotBlank(param.getEndTime())){
query.le(SettlementOwner :: getCreateTime,param.getEndTime());
}
query.orderByDesc(SettlementOwner :: getCreateTime);
return baseMapper.selectPage(Page.of(param.getPage(),param.getPageSize()),query);
......@@ -165,10 +173,29 @@ public class SettlementOwnerDaoImpl extends BaseDaoImpl<SettlementOwnerMapper, S
}
@Override
public Optional<SettlementOwner> selectUnlockOfSettlementPeriodMonth(String orderNo, LocalDateTime settlementPeriodTime, Integer invoiceType) {
public Optional<SettlementOwner> selectUnlockOfSettlementPeriodMonth(String orderNo, Integer invoicingCompanyId,
LocalDateTime settlementPeriodTime, Integer invoiceType) {
return Optional.of(lQrWrapper()
.eq(SettlementOwner::getOrderNo, orderNo)
.eq(SettlementOwner::getSettlementPeriodType, SettlementOwnerEnum.SettlementPeriodType.MONTH.getCode())
.eq(SettlementOwner::getInvoicingCompanyId, invoicingCompanyId)
.eq(SettlementOwner::getSettlementPeriodType,
SettlementOwnerEnum.SettlementPeriodType.MONTH.getCode())
.eq(SettlementOwner::getSettlementPeriodTime, settlementPeriodTime)
.eq(SettlementOwner::getInvoiceType, invoiceType)
.eq(SettlementOwner::getStatus, SettlementOwnerEnum.Status.TO_BE_LOCKED.getCode())
)
.map(super::getOne);
}
@Override
public Optional<SettlementOwner> selectUnlockOfSettlementPeriodDaily(String orderNo,
Integer invoicingCompanyId,
LocalDateTime settlementPeriodTime,
Integer invoiceType) {
return Optional.of(lQrWrapper()
.eq(SettlementOwner::getOrderNo, orderNo)
.eq(SettlementOwner::getInvoicingCompanyId, invoicingCompanyId)
.eq(SettlementOwner::getSettlementPeriodType,
SettlementOwnerEnum.SettlementPeriodType.DAILY.getCode())
.eq(SettlementOwner::getSettlementPeriodTime, settlementPeriodTime)
.eq(SettlementOwner::getInvoiceType, invoiceType)
.eq(SettlementOwner::getStatus, SettlementOwnerEnum.Status.TO_BE_LOCKED.getCode())
......@@ -177,9 +204,12 @@ public class SettlementOwnerDaoImpl extends BaseDaoImpl<SettlementOwnerMapper, S
}
@Override
public Optional<SettlementOwner> selectUnlockOfSettlementPeriodImmediate(String orderNo, Integer invoiceType) {
public Optional<SettlementOwner> selectUnlockOfSettlementPeriodImmediate(String orderNo,
Integer invoicingCompanyId,
Integer invoiceType) {
return Optional.of(lQrWrapper()
.eq(SettlementOwner::getOrderNo, orderNo)
.eq(SettlementOwner::getInvoicingCompanyId, invoicingCompanyId)
.eq(SettlementOwner::getSettlementPeriodType, SettlementOwnerEnum.SettlementPeriodType.IMMEDIATE.getCode())
.eq(SettlementOwner::getInvoiceType, invoiceType)
.eq(SettlementOwner::getStatus, SettlementOwnerEnum.Status.TO_BE_LOCKED.getCode())
......@@ -243,6 +273,15 @@ public class SettlementOwnerDaoImpl extends BaseDaoImpl<SettlementOwnerMapper, S
.set(SettlementOwner::getStatus, toStatus)
);
}
@Override
public boolean updateDailyLock(Integer settlementPeriodType, LocalDateTime settlementPeriodTime, Integer fromStatus,Integer toStatus){
return update(lUdWrapper()
.eq(SettlementOwner::getSettlementPeriodType, settlementPeriodType)
.eq(SettlementOwner::getSettlementPeriodTime, settlementPeriodTime)
.eq(SettlementOwner::getStatus, fromStatus)
.set(SettlementOwner::getStatus, toStatus)
);
}
@Override
public void updateSettlementMerge(@Param("settlementNo")String settlementNo,
......
......@@ -15,6 +15,7 @@ import com.msl.common.dao.impl.BaseDaoImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
......@@ -37,6 +38,21 @@ public class SettlementOwnerDetailDaoImpl extends BaseDaoImpl<SettlementOwnerDet
.set(SettlementOwnerDetail::getFinalPaymentStatus, item.getFinalPaymentStatus())
.set(SettlementOwnerDetail::getPrepayFreight, item.getPrepayFreight())
.set(SettlementOwnerDetail::getLoanFreight, item.getLoanFreight())
.set(SettlementOwnerDetail::getInvoicingCompanyId, item.getInvoicingCompanyId())
.set(SettlementOwnerDetail::getInvoicingCompanyShorterName, item.getInvoicingCompanyShorterName())
.set(SettlementOwnerDetail::getInvoicingCompanyGroupCode, item.getInvoicingCompanyGroupCode())
.set(SettlementOwnerDetail::getInvoiceServiceFeeRate, item.getInvoiceServiceFeeRate())
.set(SettlementOwnerDetail::getInvoiceServiceFee, item.getInvoiceServiceFee())
.set(SettlementOwnerDetail::getRemark, item.getRemark())
);
}
@Override
public boolean updatePayStatus(SettlementOwnerDetail item) {
return update(lUdWrapper()
.eq(SettlementOwnerDetail::getId, item.getId())
.set(SettlementOwnerDetail::getPayStatus, item.getPayStatus())
);
}
......@@ -155,4 +171,34 @@ public class SettlementOwnerDetailDaoImpl extends BaseDaoImpl<SettlementOwnerDet
);
}
@Override
public List<SettlementOwnerDetail> listInvoiceStatusSync() {
return list(lUdWrapper()
.gt(SettlementOwnerDetail::getCreateTime, LocalDateTime.now().minusMonths(1))
.eq(SettlementOwnerDetail::getInvoiceChannel, SettlementOwnerDetailEnum.InvoiceChannel.BROKER.getCode())
.eq(SettlementOwnerDetail::getInvoiceStatus, SettlementOwnerDetailEnum.InvoiceStatus.NO.getCode())
.eq(SettlementOwnerDetail::getPayStatus, SettlementOwnerDetailEnum.PayStatus.YES.getCode())
.eq(SettlementOwnerDetail::getInvoiceType, SettlementOwnerEnum.InvoiceType.ONLINE.getCode())
);
}
@Override
public List<SettlementOwnerDetail> listPayStatusSync() {
return list(lUdWrapper()
.gt(SettlementOwnerDetail::getCreateTime, LocalDateTime.now().minusMonths(1))
.eq(SettlementOwnerDetail::getInvoiceChannel, SettlementOwnerDetailEnum.InvoiceChannel.BROKER.getCode())
.eq(SettlementOwnerDetail::getPayStatus, SettlementOwnerDetailEnum.PayStatus.NO.getCode())
.eq(SettlementOwnerDetail::getInvoiceType, SettlementOwnerEnum.InvoiceType.ONLINE.getCode())
);
}
@Override
public List<SettlementOwnerDetail> listInvoiceTypeSync() {
return list(lUdWrapper()
.gt(SettlementOwnerDetail::getCreateTime, LocalDateTime.now().minusMonths(1))
.le(SettlementOwnerDetail::getCreateTime, LocalDateTime.now().minusMinutes(3))
.eq(SettlementOwnerDetail::getInvoiceChannel, SettlementOwnerDetailEnum.InvoiceChannel.BROKER.getCode())
.isNull(SettlementOwnerDetail::getInvoiceType)
);
}
}
package com.clx.performance.dao.impl.settle;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.dao.settle.SettlementPlatformServiceFeeDao;
import com.clx.performance.mapper.settle.SettlementPlatformServiceFeeMapper;
import com.clx.performance.model.settle.SettlementPlatformServiceFee;
import com.clx.performance.param.pc.owner.PageCarrierSettlementPlatformServiceFeeParam;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.springframework.stereotype.Repository;
/**
* @Author: aiqinguo
* @Description:
* @Date: 2023-10-11 18:04:09
* @Version: 1.0
*/
@Repository
public class SettlementPlatformServiceFeeDaoImpl extends BaseDaoImpl<SettlementPlatformServiceFeeMapper,
SettlementPlatformServiceFee, Integer> implements SettlementPlatformServiceFeeDao {
@Override
public IPage<SettlementPlatformServiceFee> pageByParam(PageCarrierSettlementPlatformServiceFeeParam param) {
Page<SettlementPlatformServiceFee> page = Page.of(param.getPage(), param.getPageSize());
return baseMapper.pageByParam(page,param);
}
}
package com.clx.performance.dao.payment;
import com.clx.performance.mapper.payment.OrderPaymentMapper;
import com.clx.performance.model.payment.OrderPayment;
import com.msl.common.base.Optional;
import com.msl.common.dao.BaseDao;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author huningning
* Date 2024-06-18
* Time 14:01
*/
public interface OrderPaymentDao extends BaseDao<OrderPaymentMapper, OrderPayment, Integer> {
Optional<OrderPayment> selectByOrderNoAndItemId(@Param("orderNo")String orderNo,
@Param("paymentItem")String paymentItem);
Optional<OrderPayment> selectByRelationNo(@Param("relationNo")String relationNo,
@Param("operation")Integer operation,
@Param("paymentItem")String paymentItem);
Optional<OrderPayment> selectByOrderNoAndItemIdAndOperation(@Param("orderNo")String orderNo,
@Param("paymentItem")String paymentItem,
@Param("operation")Integer operation);
List<OrderPayment> listByOrderNo(@Param("orderNo")String orderNo, @Param("paymentItem")String paymentItem);
}
......@@ -3,6 +3,7 @@ package com.clx.performance.dao.settle;
import com.clx.performance.mapper.settle.OrderChildSyncTransportRecordMapper;
import com.clx.performance.model.settle.OrderChildSyncTransportRecord;
import com.msl.common.base.Optional;
import com.msl.common.dao.BaseDao;
import java.util.List;
......@@ -18,4 +19,7 @@ public interface OrderChildSyncTransportRecordDao extends BaseDao<OrderChildSync
List<OrderChildSyncTransportRecord> selectListForJob();
void updateStatus(String childNo);
Optional<OrderChildSyncTransportRecord> getByChildNo(String childNo);
}
......@@ -36,9 +36,17 @@ public interface SettlementOwnerDao extends BaseDao<SettlementOwnerMapper, Settl
IPage<SettlementOwner> pageSettlementOwner(Long userNo,PageOwnerSettlementParam param);
Optional<SettlementOwner> selectUnlockOfSettlementPeriodMonth(@Param("orderNo")String orderNo,
@Param("invoicingCompanyId") Integer invoicingCompanyId,
@Param("settlementPeriodTime") LocalDateTime settlementPeriodTime,
@Param("invoiceType")Integer invoiceType);
Optional<SettlementOwner> selectUnlockOfSettlementPeriodDaily(String orderNo,
Integer invoicingCompanyId,
LocalDateTime settlementPeriodTime,
Integer invoiceType);
Optional<SettlementOwner> selectUnlockOfSettlementPeriodImmediate(@Param("orderNo")String orderNo,
@Param("invoicingCompanyId") Integer invoicingCompanyId,
@Param("invoiceType")Integer invoiceType);
List<SettlementOwner> listToBeLockOfSettlementPeriodMonth(@Param("settlementPeriodTime") LocalDateTime settlementPeriodTime);
......@@ -61,6 +69,9 @@ public interface SettlementOwnerDao extends BaseDao<SettlementOwnerMapper, Settl
@Param("fromStatus")Integer fromStatus,
@Param("toStatus")Integer toStatus);
boolean updateDailyLock(Integer settlementPeriodType, LocalDateTime settlementPeriodTime,
Integer fromStatus, Integer toStatus);
void updateSettlementMerge(@Param("settlementNo")String settlementNo,
@Param("settlementNos")List<String> settlementNos,
@Param("mergedBy") String mergedBy,
......
......@@ -22,6 +22,7 @@ import java.util.Set;
public interface SettlementOwnerDetailDao extends BaseDao<SettlementOwnerDetailMapper, SettlementOwnerDetail, Integer> {
boolean updateInvoiceType(SettlementOwnerDetail item);
boolean updatePayStatus(SettlementOwnerDetail item);
boolean updateSettlementNo(SettlementOwnerDetail item);
boolean updateInvoiceStatusBySettlementNo(@Param("settlementNo")String settlementNo, @Param("invoiceStatus")Integer invoiceStatus);
......@@ -48,4 +49,8 @@ public interface SettlementOwnerDetailDao extends BaseDao<SettlementOwnerDetailM
void updateSettlementMerge(String settlementNo, List<String> settlementNos);
List<SettlementOwnerDetail>listInvoiceStatusSync();
List<SettlementOwnerDetail> listPayStatusSync();
List<SettlementOwnerDetail> listInvoiceTypeSync();
}
package com.clx.performance.dao.settle;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.mapper.settle.SettlementPlatformServiceFeeMapper;
import com.clx.performance.model.settle.SettlementPlatformServiceFee;
import com.clx.performance.param.pc.owner.PageCarrierSettlementPlatformServiceFeeParam;
import com.msl.common.dao.BaseDao;
/**
* @Author: aiqinguo
* @Description:
* @Date: 2023-10-11 18:00:53
* @Version: 1.0
*/
public interface SettlementPlatformServiceFeeDao extends BaseDao<SettlementPlatformServiceFeeMapper,
SettlementPlatformServiceFee, Integer> {
IPage<SettlementPlatformServiceFee> pageByParam(PageCarrierSettlementPlatformServiceFeeParam param);
}
package com.clx.performance.dto.payment;
import com.fasterxml.jackson.annotation.JsonGetter;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import java.math.BigDecimal;
/**
*
* @author 胡宁宁
* @date 2024年06
* @description
*/
@Data
@Builder
public class PaymentDTO {
/** 本次调整金额 **/
BigDecimal changeDeposit ;
/** 最新的保证金**/
BigDecimal platformServiceFeeNew;
}
......@@ -9,7 +9,7 @@ import java.math.BigDecimal;
/**
*
* @author 胡宁宁
* @date 2023年11月12日
* @date 2024年06
* @description
*/
public class WalletResidueCardDTO extends WalletResidueDTO{
......
......@@ -9,10 +9,9 @@ import java.math.BigDecimal;
/**
*
* @author 胡宁宁
* @date 2023年11月12日
* @date 2024年06
* @description
*/
public class WalletResidueDTO {
@ApiModelProperty(value = "余额", dataType = "double", example = "11.10")
......
......@@ -7,7 +7,17 @@ import lombok.Getter;
@AllArgsConstructor
public enum HttpEnum {
PERFORMANCE_PAY_CLX_PAYMENT(10000, "履约服务向老马上来发起钱包转账","/payment-service/performance/payUserWalletTransfer"),
PERFORMANCE_PAY_CLX_PAYMENT(10000, "履约服务向老马上来发起钱包转账",
"/payment-service/performance/payUserWalletTransfer"),
PERFORMANCE_PAY_CLX_DRIVER_FREEZE(10001, "履约服务向老马上来发起司机押金冻结",
"/payment-service/performance/freezeUserMQ"),
PERFORMANCE_PAY_CLX_ADJUST_DRIVER_FREEZE(10002, "履约服务向老马上来发起司机押金冻结调整",
"/payment-service/performance/completeFreezeBatchMQ"),
PERFORMANCE_PAY_CLX_WALLET(10003, "履约服务向老马上来发起司机余额查询",
"/payment-service/performance/getWalletAndCard"),
;
private final int code;
......
......@@ -26,6 +26,7 @@ public enum PayRemarkEnum {
//v78 解冻保险
OWNER_PAY_DRIVER_INSURANCE(15, "货主取消订单赔偿金"),
DRIVER_PAY_OWNER_DRIVER_INSURANCE(16, "司机取消订单赔偿金"),
UPDATE_DRIVER_FREEZE(17, "修正司机押金"),
;
......
......@@ -8,21 +8,17 @@ import com.clx.performance.constant.RabbitKeyConstants;
import com.clx.performance.constant.RedissonConstants;
import com.clx.performance.dao.loan.OrderChildLoanRetryRecordDao;
import com.clx.performance.dao.loan.OwnerLoanAccountRunningWaterRecordDao;
import com.clx.performance.dao.loan.OwnerLoanRecordDao;
import com.clx.performance.dao.loan.OwnerRepaymentDao;
import com.clx.performance.dao.settle.SettlementDriverDao;
import com.clx.performance.dao.settle.SettlementDriverDetailDao;
import com.clx.performance.dao.settle.SettlementOwnerDetailDao;
import com.clx.performance.dto.LoanBalanceDTO;
import com.clx.performance.dto.OwnerLoanMqDTO;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.enums.loan.OwnerLoanAccountRunningWaterRecordEnum;
import com.clx.performance.enums.loan.OwnerLoanRecordEnum;
import com.clx.performance.enums.loan.OwnerRePaymentEnum;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.loan.OrderChildLoanRetryRecord;
import com.clx.performance.model.loan.OwnerLoanAccountRunningWaterRecord;
import com.clx.performance.model.loan.OwnerLoanRecord;
import com.clx.performance.model.loan.OwnerRepayment;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail;
......@@ -43,7 +39,6 @@ import org.springframework.stereotype.Component;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;
import java.math.BigDecimal;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
......@@ -140,11 +135,12 @@ public class EventListenerComponent {
throw e;
}
log.info("处理货主借款监听器执行成功");
settlementOwnerDetailDao.updateInvoiceType(settlementOwnerDetail);
settlementDriverDetailDao.updateInvoiceTypeAndPrepayFreightFlag(settlementDriverDetail);
// 发送mq 通过开票标识
settlementMqService.invoiceTypeSync(settlementDriverDetail.getChildNo(), settlementDriverDetail.getInvoiceType());
// 发送mq 结算统计
settlementMqService.settlementStatistics(settlementDriverDetail.getChildNo(), settlementDriverDetail.getInvoiceType());
} catch (Exception e) {
throw new ServiceSystemException(PerformanceResultEnum.GET_LOAN_RECORD, e.getMessage());
} finally {
......@@ -210,24 +206,7 @@ public class EventListenerComponent {
String childNo = event.getChildNo();
log.info("需要解冻借款的的运单号:{}", childNo);
List<OwnerLoanAccountRunningWaterRecord> runningWaterRecordList = ownerLoanAccountRunningWaterRecordDao.getListByChildNoAndRunningWaterType(childNo, OwnerLoanAccountRunningWaterRecordEnum.RunWaterType.APPROVE_FROZEN.getCode());
if (CollectionUtil.isEmpty(runningWaterRecordList)) {
return;
}
Long ownerUserNo = runningWaterRecordList.get(0).getOwnerUserNo();
log.info("当前解冻货主:{},流水记录长度{},流水记录{}", ownerUserNo, runningWaterRecordList.size(), JSONUtil.parse(runningWaterRecordList));
for (OwnerLoanAccountRunningWaterRecord record : runningWaterRecordList) {
Long loanNo = record.getLoanNo();
Integer loanType = record.getLoanType();
String ownerUserName = record.getOwnerUserName();
BigDecimal balance = record.getAlterationBalance();
//解冻借款
orderChildLoanComponent.thawOwnerLoanAccount(loanNo, loanType, ownerUserNo, ownerUserName, record.getMobile(), childNo, balance);
}
orderChildLoanComponent.orderChildCancelAfter(childNo);
}
@EventListener(classes = {OwnerLoanThawEvent.class})
......
package com.clx.performance.extranal.broker;
import com.clx.performance.vo.pc.broker.TransportParam;
import com.clx.performance.vo.pc.broker.TransportVO;
public interface BrokerService {
void orderChildSync(TransportParam param);
TransportVO getOrderChildStatus(String childNo);
}
package com.clx.performance.extranal.broker.impl;
import com.alibaba.fastjson.JSON;
import com.clx.performance.config.SettlementConfig;
import com.clx.performance.enums.ResultEnum;
import com.clx.performance.extranal.broker.BrokerService;
import com.clx.performance.feign.BrokerFeign;
import com.clx.performance.vo.pc.broker.TransportParam;
import com.clx.performance.vo.pc.broker.TransportVO;
import com.msl.common.exception.ServiceSystemException;
import com.msl.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class BrokerServiceImpl implements BrokerService {
@Autowired
public BrokerFeign brokerFeign;
@Autowired
private SettlementConfig settlementConfig;
@Override
public void orderChildSync(TransportParam param) {
param.setUserCode(settlementConfig.getBrokerUserCode());
Result<Object> result = brokerFeign.saveTransport(param);
if (result.getCode() != 0) {
log.info("运单同步网络货运失败, msg:{}", result.getMsg());
throw new ServiceSystemException(ResultEnum.FEIGN_ERROR, result.getMsg());
}
log.info("运单同步网络货运, result:{}", JSON.toJSONString(result));
}
@Override
public TransportVO getOrderChildStatus(String childNo) {
Result<TransportVO> result = brokerFeign.getTransportByChildNo(childNo, settlementConfig.getBrokerUserCode());
if (result.getCode() != 0) {
log.info("运单同步网络货运失败, msg:{}", result.getMsg());
}
log.info("运单同步网络货运, result:{}", JSON.toJSONString(result));
return result.getData();
}
}
package com.clx.performance.extranal.order;
import com.clx.order.vo.pc.carrier.InvoicingCompanyVO;
import com.msl.common.base.Optional;
public interface InvoicingCompanyService {
Optional<InvoicingCompanyVO> getInvoicingCompany(int id);
InvoicingCompanyVO getInvoicingCompanyByGroupCode(String companyGroupCode);
}
package com.clx.performance.extranal.order.impl;
import com.clx.order.feign.InvoicingCompanyFeign;
import com.clx.order.vo.pc.carrier.InvoicingCompanyVO;
import com.clx.performance.extranal.order.InvoicingCompanyService;
import com.msl.common.base.Optional;
import com.msl.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class InvoicingCompanyServiceImpl implements InvoicingCompanyService {
@Autowired
private InvoicingCompanyFeign invoicingCompanyFeign;
@Override
public Optional<InvoicingCompanyVO> getInvoicingCompany(int id) {
return Optional.ofNullable(invoicingCompanyFeign.getInvoicingCompany(id))
.filter(Result::succeed)
.map(Result::getData);
}
@Override
public InvoicingCompanyVO getInvoicingCompanyByGroupCode(String companyGroupCode) {
return Optional.of(invoicingCompanyFeign.getInvoicingCompanyByGroupCode(companyGroupCode))
.filter(Result::succeed)
.map(Result::getData)
.orNull();
}
}
package com.clx.performance.feign;
import com.clx.performance.vo.pc.broker.TransportParam;
import com.clx.performance.vo.pc.broker.TransportVO;
import com.msl.common.result.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@FeignClient(name = "broker-service",configuration = PerformanceClientConfiguration.class,url = "${settlement.brokerHost}")
public interface BrokerFeign {
/**
* 运单同步
*/
@RequestMapping(method = RequestMethod.POST, value = "/broker-service/open/transport/saveTransport")
Result<Object> saveTransport(@RequestBody TransportParam param);
@RequestMapping(value = "/broker-service/open/transport/getTransportByChildNo", method = RequestMethod.GET)
Result<TransportVO> getTransportByChildNo(@RequestParam @NotBlank(message = "运单编号不能为空") String orderCode,
@RequestParam @NotNull(message = "userCode不能为空") String userCode);
}
......@@ -6,27 +6,17 @@ import com.clx.performance.component.ThirdComponent;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.dao.settle.OrderChildSyncTransportRecordDao;
import com.clx.performance.dao.settle.SettlementDriverDetailDao;
import com.clx.performance.dto.OrderChildSyncDTO;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.enums.settle.SettlementDriverEnum;
import com.clx.performance.enums.settle.SettlementOwnerEnum;
import com.clx.performance.extranal.user.OwnerInfoService;
import com.clx.performance.feign.TransportFeignService;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.settle.OrderChildSyncTransportRecord;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwner;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.param.feign.transport.OrderChildPaySyncParam;
import com.clx.performance.service.settle.SettlementDriverDetailService;
import com.clx.performance.service.settle.SettlementMqHandlerService;
import com.clx.performance.service.settle.SettlementMqService;
import com.clx.performance.service.settle.SettlementOwnerDetailService;
import com.clx.performance.utils.LocalDateTimeUtils;
import com.clx.performance.vo.mq.SettlementDetailInvoiceTypeSyncMqParam;
import com.clx.user.vo.feign.OwnerInfoFeignVO;
import com.clx.performance.vo.mq.SettlementStatisticsMqParam;
import com.msl.common.dto.HttpDTO;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
......@@ -34,10 +24,7 @@ import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Slf4j
......@@ -62,31 +49,31 @@ public class OrderChildPaySyncTransportJob {
private final OrderGoodsDao orderGoodsDao;
/**
* 同步网络货运
* 同步网络货运运单支付(禁用网络货运同步)
*/
@XxlJob("orderChildPaySyncTransportJob")
public void orderChildPaySyncTransportJob() {
List<OrderChildSyncTransportRecord> recordList = orderChildSyncTransportRecordDao.selectListForJob();
if (CollectionUtil.isEmpty(recordList)) {
return;
}
List<String> orderChilList = recordList.stream().map(OrderChildSyncTransportRecord::getChildNo).collect(Collectors.toList());
OrderChildPaySyncParam param = new OrderChildPaySyncParam();
param.setChildNoList(orderChilList);
HttpDTO httpDTO = transportFeignService.orderChildPaySync(param);
String decrypt = ThirdComponent.decrypt(httpDTO.getData());
OrderChildSyncDTO bean = JSONUtil.toBean(decrypt, OrderChildSyncDTO.class);
if (bean.getCode() == 0) {
for (OrderChildSyncTransportRecord record : recordList) {
OrderChildSyncTransportRecord update = new OrderChildSyncTransportRecord();
update.setId(record.getId());
update.setStatus(1);
orderChildSyncTransportRecordDao.updateEntityByKey(update);
}
}
}
// @XxlJob("orderChildPaySyncTransportJob")
// public void orderChildPaySyncTransportJob() {
// List<OrderChildSyncTransportRecord> recordList = orderChildSyncTransportRecordDao.selectListForJob();
// if (CollectionUtil.isEmpty(recordList)) {
// return;
// }
//
// List<String> orderChilList = recordList.stream().map(OrderChildSyncTransportRecord::getChildNo).collect(Collectors.toList());
// OrderChildPaySyncParam param = new OrderChildPaySyncParam();
// param.setChildNoList(orderChilList);
// HttpDTO httpDTO = transportFeignService.orderChildPaySync(param);
// String decrypt = ThirdComponent.decrypt(httpDTO.getData());
// OrderChildSyncDTO bean = JSONUtil.toBean(decrypt, OrderChildSyncDTO.class);
// if (bean.getCode() == 0) {
// for (OrderChildSyncTransportRecord record : recordList) {
// OrderChildSyncTransportRecord update = new OrderChildSyncTransportRecord();
// update.setId(record.getId());
// update.setStatus(1);
// orderChildSyncTransportRecordDao.updateEntityByKey(update);
// }
// }
//
// }
/**
......@@ -96,9 +83,9 @@ public class OrderChildPaySyncTransportJob {
public void settlementDetailInvoiceTypeSyncJob() {
String jobParam = XxlJobHelper.getJobParam();
log.info("XxlJobHelper jobParam:{}", jobParam);
SettlementDetailInvoiceTypeSyncMqParam mqParam = new SettlementDetailInvoiceTypeSyncMqParam();
SettlementStatisticsMqParam mqParam = new SettlementStatisticsMqParam();
mqParam.setChildNo(jobParam);
settlementMqHandlerService.settlementDetailInvoiceTypeSync(mqParam);
settlementMqHandlerService.settlementStatistics(mqParam);
}
......
......@@ -49,68 +49,68 @@ public class OrderChildSyncTransportInvoiceExceptionJob {
private final SettlementDriverDetailDao settlementDriverDetailDao;
/**
* 同步网络货运
* 同步网络货运(禁用网络货运同步)
*/
@XxlJob("orderChildSyncTransportInvoiceExceptionJob")
@Transactional(rollbackFor = Exception.class)
public void orderChildSyncTransportInvoiceExceptionJob() {
//只查询同步异常的网络货运任务
List<OrderChildSyncTransportInvoiceRecord> recordList = orderChildSyncTransportInvoiceRecordDao.selectListForJob();
if (CollectionUtil.isEmpty(recordList)) {
return;
}
List<Integer> ids = new LinkedList<>();
for (OrderChildSyncTransportInvoiceRecord record : recordList) {
log.info("orderChildSyncTransportInvoiceExceptionJob执行:{}", JSONUtil.parse(record));
if (record.getCreateTime().plusMinutes(10).isBefore(LocalDateTime.now())) {
log.info("当前记录运单号:{},生成不足10分钟,先不执行", record.getChildNo());
continue;
}
String data = transportFeignService.getRiskStatus(ThirdOrderChildRiskStatusParam.builder().childNo(record.getChildNo()).build()).getData();
String decrypt = ThirdComponent.decrypt(data);
Result result = JSONUtil.toBean(decrypt, Result.class);
if (result.succeed()) {
SettlementOwnerDetail settlementOwnerDetail = settlementOwnerDetailDao.getByChildNo(record.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
SettlementDriverDetail settlementDriverDetail = settlementDriverDetailDao.getByChildNo(record.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
JSON json = JSONUtil.parse(result.getData());
Object status = json.getByPath("status");
ids.add(record.getId());
OrderChildSyncDTO bean = new OrderChildSyncDTO();
bean.setCode(0);
OrderChildSyncResultDTO dto = new OrderChildSyncResultDTO();
OrderChild orderChild = orderChildDao.getByChildNo(record.getChildNo()).get();
log.info("查询网络货运结果数据:{}", JSONUtil.parse(result));
if (ObjectUtil.equal(status, 1)) {
dto.setStatus(1);
bean.setData(dto);
orderChildPaySync.extracted(orderChild, bean, "", settlementOwnerDetail,
SettlementOwnerEnum.InvoiceType.ONLINE.getCode(), settlementDriverDetail);
} else if (ObjectUtil.equal(status, 0)){
dto.setStatus(2);
bean.setData(dto);
orderChildPaySync.extracted(orderChild, bean, "", settlementOwnerDetail,
SettlementOwnerEnum.InvoiceType.ORDINARY.getCode(), settlementDriverDetail);
}else if (ObjectUtil.equal(status, 2)){
// orderChildPaySync.transportOrderChildProcess(orderChild);
dto.setStatus(2);
bean.setData(dto);
orderChildPaySync.extracted(orderChild, bean, "", settlementOwnerDetail,
SettlementOwnerEnum.InvoiceType.ORDINARY.getCode(), settlementDriverDetail);
} else {
Object riskReason = json.getByPath("riskReason");
OrderChildSyncTransportInvoiceRecord entity = new OrderChildSyncTransportInvoiceRecord();
entity.setChildNo(json.getByPath("childNo").toString());
entity.setType(TransportSyncTypeEnum.Type.NO_PASS.getCode());
entity.setRemark(riskReason == null ? "" : riskReason.toString());
orderChildSyncTransportInvoiceRecordDao.saveEntity(entity);
}
}
}
orderChildSyncTransportInvoiceRecordDao.deleteByKeys(ids);
}
// @XxlJob("orderChildSyncTransportInvoiceExceptionJob")
// @Transactional(rollbackFor = Exception.class)
// public void orderChildSyncTransportInvoiceExceptionJob() {
// //只查询同步异常的网络货运任务
// List<OrderChildSyncTransportInvoiceRecord> recordList = orderChildSyncTransportInvoiceRecordDao.selectListForJob();
// if (CollectionUtil.isEmpty(recordList)) {
// return;
// }
// List<Integer> ids = new LinkedList<>();
//
// for (OrderChildSyncTransportInvoiceRecord record : recordList) {
// log.info("orderChildSyncTransportInvoiceExceptionJob执行:{}", JSONUtil.parse(record));
// if (record.getCreateTime().plusMinutes(10).isBefore(LocalDateTime.now())) {
// log.info("当前记录运单号:{},生成不足10分钟,先不执行", record.getChildNo());
// continue;
// }
//
// String data = transportFeignService.getRiskStatus(ThirdOrderChildRiskStatusParam.builder().childNo(record.getChildNo()).build()).getData();
// String decrypt = ThirdComponent.decrypt(data);
// Result result = JSONUtil.toBean(decrypt, Result.class);
// if (result.succeed()) {
// SettlementOwnerDetail settlementOwnerDetail = settlementOwnerDetailDao.getByChildNo(record.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
// SettlementDriverDetail settlementDriverDetail = settlementDriverDetailDao.getByChildNo(record.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
//
// JSON json = JSONUtil.parse(result.getData());
// Object status = json.getByPath("status");
// ids.add(record.getId());
// OrderChildSyncDTO bean = new OrderChildSyncDTO();
// bean.setCode(0);
// OrderChildSyncResultDTO dto = new OrderChildSyncResultDTO();
// OrderChild orderChild = orderChildDao.getByChildNo(record.getChildNo()).get();
// log.info("查询网络货运结果数据:{}", JSONUtil.parse(result));
// if (ObjectUtil.equal(status, 1)) {
// dto.setStatus(1);
// bean.setData(dto);
// orderChildPaySync.extracted(orderChild, bean, "", settlementOwnerDetail,
// SettlementOwnerEnum.InvoiceType.ONLINE.getCode(), settlementDriverDetail);
// } else if (ObjectUtil.equal(status, 0)){
// dto.setStatus(2);
// bean.setData(dto);
// orderChildPaySync.extracted(orderChild, bean, "", settlementOwnerDetail,
// SettlementOwnerEnum.InvoiceType.ORDINARY.getCode(), settlementDriverDetail);
//
// }else if (ObjectUtil.equal(status, 2)){
//// orderChildPaySync.transportOrderChildProcess(orderChild);
// dto.setStatus(2);
// bean.setData(dto);
// orderChildPaySync.extracted(orderChild, bean, "", settlementOwnerDetail,
// SettlementOwnerEnum.InvoiceType.ORDINARY.getCode(), settlementDriverDetail);
// } else {
// Object riskReason = json.getByPath("riskReason");
// OrderChildSyncTransportInvoiceRecord entity = new OrderChildSyncTransportInvoiceRecord();
// entity.setChildNo(json.getByPath("childNo").toString());
// entity.setType(TransportSyncTypeEnum.Type.NO_PASS.getCode());
// entity.setRemark(riskReason == null ? "" : riskReason.toString());
// orderChildSyncTransportInvoiceRecordDao.saveEntity(entity);
// }
// }
// }
//
// orderChildSyncTransportInvoiceRecordDao.deleteByKeys(ids);
// }
}
package com.clx.performance.job;
package com.clx.performance.job.settlement;
import com.clx.performance.dao.settle.SettlementDriverDetailDao;
import com.clx.performance.model.settle.SettlementDriverDetail;
......
package com.clx.performance.job.settlement;
import com.clx.performance.dao.OrderChildSyncTransportInvoiceRecordDao;
import com.clx.performance.dao.settle.OrderChildSyncTransportRecordDao;
import com.clx.performance.dao.settle.SettlementOwnerDetailDao;
import com.clx.performance.model.OrderChildSyncTransportInvoiceRecord;
import com.clx.performance.model.settle.OrderChildSyncTransportRecord;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.service.settle.SettlementMqService;
import com.msl.common.job.JobLog;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
@AllArgsConstructor
public class SettlementJob {
private final OrderChildSyncTransportInvoiceRecordDao orderChildSyncTransportInvoiceRecordDao;
private final SettlementMqService settlementMqService;
private final SettlementOwnerDetailDao settlementOwnerDetailDao;
private final OrderChildSyncTransportRecordDao orderChildSyncTransportRecordDao;
/**
* 同步无车承运运单开票类型
*/
@XxlJob("settlementInvoiceTypeSync")
public void settlementInvoiceTypeSync() {
// 首次
List<SettlementOwnerDetail> recordList = settlementOwnerDetailDao
.listInvoiceTypeSync();
log.info("待同步无车承运运单状态,size:{}", recordList.size());
if (recordList.isEmpty()) {return;}
for (SettlementOwnerDetail item : recordList) {
settlementMqService.invoiceTypeSync(item.getChildNo());
}
}
/**
* 同步无车承运运单开票状态
*/
@XxlJob("settlementInvoiceStatusSync")
public void settlementInvoiceStatusSync() {
try {
List<SettlementOwnerDetail> list = settlementOwnerDetailDao.listInvoiceStatusSync();
log.info("待同步无车承运运单开票状态, size:{}", list.size());
if (list.isEmpty()) {return;}
for (SettlementOwnerDetail item : list) {
settlementMqService.invoiceStatusSync(item.getChildNo());
}
} catch (Exception e) {
log.warn("同步无车承运运单开票状态失败,异常原因:{}", ExceptionUtils.getStackTrace(e));
JobLog.error("同步无车承运运单开票状态失败,异常原因=====================", e);
}
}
/**
* 同步无车承运运单支付状态
*/
@XxlJob("settlementPayStatusSync")
public void settlementPayStatusSync() {
try {
List<OrderChildSyncTransportRecord> list = orderChildSyncTransportRecordDao.selectListForJob();
log.info("待同步无车承运运单支付状态, size:{}", list.size());
if (list.isEmpty()) {return;}
for (OrderChildSyncTransportRecord item : list) {
settlementMqService.payStatusSync(item.getChildNo());
}
} catch (Exception e) {
log.warn("同步无车承运运单支付状态失败,异常原因:{}", ExceptionUtils.getStackTrace(e));
JobLog.error("同步无车承运运单支付状态失败,异常原因=====================", e);
}
}
}
package com.clx.performance.job;
package com.clx.performance.job.settlement;
import com.clx.performance.dao.settle.SettlementOwnerDao;
import com.clx.performance.enums.settle.SettlementOwnerEnum;
import com.clx.performance.service.settle.SettlementOwnerService;
import com.clx.performance.utils.LocalDateTimeUtils;
import com.msl.common.job.JobLog;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Slf4j
@Component
public class SettlementOwnerMontnJob {
@Autowired
SettlementOwnerService settlementOwnerService;
@Autowired
private SettlementOwnerDao settlementOwnerDao;
/**
* 月结货主结算单状态变更为锁定
......@@ -32,7 +38,25 @@ public class SettlementOwnerMontnJob {
}
}
/**
* 日结货主结算单状态变更为锁定
*/
@XxlJob("settlementOwnerDailyInit")
public void settlementOwnerDailyInit() {
try {
// 锁定前一天数据
LocalDateTime settlementPeriodTime = LocalDateTimeUtils.getDayStart().minusDays(1);
//所有日结的待锁定的货主结算单修改状态为锁定
settlementOwnerDao.updateDailyLock(
SettlementOwnerEnum.SettlementPeriodType.DAILY.getCode(),
settlementPeriodTime,
SettlementOwnerEnum.Status.TO_BE_LOCKED.getCode(),
SettlementOwnerEnum.Status.TO_BE_ACCOUNT.getCode());
} catch (Exception e) {
log.warn("日结货主结算单状态变更为锁定,异常原因:{}",e);
JobLog.error("日结货主结算单状态变更为锁定,异常原因=====================", e);
}
}
}
package com.clx.performance.listener;
import cn.hutool.json.JSONUtil;
import com.clx.order.enums.InvoicingCompanyEnum;
import com.clx.order.enums.OrderEnum;
import com.clx.order.enums.QuotationEnum;
import com.clx.order.vo.pc.carrier.InvoicingCompanyVO;
import com.clx.performance.component.IdGenerateSnowFlake;
import com.clx.performance.component.OrderChildLoanComponent;
import com.clx.performance.component.ThirdComponent;
import com.clx.performance.config.SettlementConfig;
import com.clx.performance.constant.RabbitKeyConstants;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OrderChildSyncTransportInvoiceRecordDao;
import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.dao.OwnerAccountDao;
......@@ -19,27 +23,24 @@ import com.clx.performance.enums.settle.SettlementOwnerDetailEnum;
import com.clx.performance.enums.settle.SettlementOwnerEnum;
import com.clx.performance.enums.settle.SettlementWayEnum;
import com.clx.performance.event.OwnerLoanEvent;
import com.clx.performance.event.SettlementUpdateEvent;
import com.clx.performance.extranal.order.InvoicingCompanyService;
import com.clx.performance.feign.TransportFeignService;
import com.clx.performance.model.*;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.param.feign.transport.ThirdOrderChildBrokerParam;
import com.clx.performance.service.TransportSyncService;
import com.clx.performance.service.broker.OrderChildBrokerService;
import com.clx.performance.service.settle.NetworkDriverRunningWaterRecordService;
import com.clx.performance.service.settle.SettlementMqService;
import com.msl.common.dto.HttpDTO;
import com.clx.performance.service.settle.SettlementCommonService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.Objects;
......@@ -72,48 +73,94 @@ public class OrderChildSyncTransportListener {
private final OrderChildSyncTransportInvoiceRecordDao orderChildSyncTransportInvoiceRecordDao;
private final ApplicationEventPublisher applicationEventPublisher;
private final InvoicingCompanyService invoicingCompanyService;
private final SettlementConfig settlementConfig;
private final OrderChildBrokerService orderChildBrokerService;
private final OrderChildDao orderChildDao;
private final SettlementCommonService settlementCommonService;
/**
* 承运同步网络货运运单
*/
@RabbitListener(queues = RabbitKeyConstants.ORDER_CHILD_SYNC_TRANSPORT_QUEUE)
public void onMessage(String message) {
OrderChild orderChild = JSONUtil.toBean(message, OrderChild.class);
//是否通过风控,调用网络货运
try {
transportOrderChildProcess(orderChild);
OrderChild orderChildBase = orderChildDao.getByChildNo(orderChild.getChildNo()).orElseThrow(PerformanceResultEnum.ORDER_CHILD_NO_FOUND);
log.info("当前OrderChildSyncTransportListener监听同步网络货运,运单{}", JSONUtil.parse(orderChildBase).toString());
transportOrderChildProcess(orderChildBase);
} catch (Exception e) {
log.info("当前OrderChildSyncTransportListener监听同步网络货运失败,运单号{}, 错误信息{}", orderChild.getChildNo(), ExceptionUtils.getStackTrace(e));
OrderChildSyncTransportInvoiceRecord entity = new OrderChildSyncTransportInvoiceRecord();
entity.setChildNo(orderChild.getChildNo());
entity.setType(TransportSyncTypeEnum.Type.EXCEPTION.getCode());
entity.setRemark(e.getMessage());
orderChildSyncTransportInvoiceRecordDao.saveEntity(entity);
}
}
public void transportOrderChildProcess(OrderChild orderChild) {
Integer invoiceType = SettlementOwnerEnum.InvoiceType.ORDINARY.getCode();
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).get();
SettlementOwnerDetail settlementOwnerDetail = settlementOwnerDetailDao.getByChildNo(orderChild.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
SettlementDriverDetail settlementDriverDetail = settlementDriverDetailDao.getByChildNo(orderChild.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
settlementOwnerDetail.setInvoiceFreight(invoiceFreightCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).get();
ThirdOrderChildBrokerParam param = transportSyncService.generateOrderChildSync(orderChild, orderGoods, settlementOwnerDetail, settlementDriverDetail);
HttpDTO httpDTOResult = transportFeignService.orderChildSync(param);
String decrypt = ThirdComponent.decrypt(httpDTOResult.getData());
OrderChildSyncDTO bean = JSONUtil.toBean(decrypt, OrderChildSyncDTO.class);
// // 同步网络货运(禁用网络货运同步)
// ThirdOrderChildBrokerParam param = transportSyncService.generateOrderChildSync(orderChild, orderGoods, settlementOwnerDetail, settlementDriverDetail);
// HttpDTO httpDTOResult = transportFeignService.orderChildSync(param);
// String decrypt = ThirdComponent.decrypt(httpDTOResult.getData());
// OrderChildSyncDTO bean = JSONUtil.toBean(decrypt, OrderChildSyncDTO.class);
// extracted(orderChild, bean, JSONUtil.parse(bean).toString(), settlementOwnerDetail, invoiceType, settlementDriverDetail);
if (Objects.equals(settlementOwnerDetail.getReportFlag(), OrderEnum.ReportFlag.NO.getCode())){
// 不上报走普通单
extracted(orderChild, settlementOwnerDetail, settlementDriverDetail, invoiceType, null);
}
else{
try{
// 同步broker
orderChildBrokerService.orderChildSync(orderChild, orderGoods, settlementOwnerDetail, settlementDriverDetail);
} catch (Exception e) {
log.info("当前OrderChildSyncTransportListener监听同步网络货运失败,运单号{}, 错误信息{}", orderChild.getChildNo(), ExceptionUtils.getStackTrace(e));
}
}
extracted(orderChild, bean, JSONUtil.parse(bean).toString(), settlementOwnerDetail, invoiceType, settlementDriverDetail);
}
public void extracted(OrderChild orderChild, OrderChildSyncDTO bean, String remark,
SettlementOwnerDetail settlementOwnerDetail,
Integer invoiceType, SettlementDriverDetail settlementDriverDetail) {
settlementOwnerDetail.setInvoiceFreight(invoiceFreightCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
if (null != bean && bean.getCode() == 0) {
log.info("当前OrderChildSyncTransportListener监听同步网络货运成功,运单号为{}", orderChild.getChildNo());
if (null != bean.getData() && bean.getData().getStatus() == 1) {
if (null != bean && bean.getCode() == 0 && null != bean.getData() && bean.getData().getStatus() == 1){
invoiceType = SettlementOwnerEnum.InvoiceType.ONLINE.getCode();
}
extracted(orderChild, settlementOwnerDetail, settlementDriverDetail, invoiceType, remark);
}
public void extracted(OrderChild orderChild,
SettlementOwnerDetail settlementOwnerDetail,
SettlementDriverDetail settlementDriverDetail,
Integer invoiceType,
String remark) {
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).get();
// 未税 卸车减货损不用生成扣除相关流水逻辑
if (Objects.equals(invoiceType, SettlementOwnerEnum.InvoiceType.ONLINE.getCode())
&& Objects.equals(orderGoods.getPlatformFreightQuotationTaxType(),QuotationEnum.PlatformFreightQuotationTaxType.NO.getCode())
&& Objects.equals(orderGoods.getSettlementWay(), SettlementWayEnum.WayType.UNLOAD_LOSS.getCode())) {
settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
settlementDriverDetail.setPrepayFreightFlag(SettlementDriverEnum.PrepayFreightFlag.NO_PAY.getCode());
settlementOwnerDetail.setFinalPaymentStatus(SettlementOwnerDetailEnum.FinalPaymentStatus.NO.getCode());
//生成提现记录
networkDriverRunningWaterRecordService.generateNetworkCaseOutRecord(settlementDriverDetail);
}
else if (Objects.equals(invoiceType, SettlementOwnerEnum.InvoiceType.ONLINE.getCode())) {
//通过风控
List<OwnerRunningWaterRecord> runningWaterRecordList = ownerRunningWaterRecordDao.getOwnerRunningWaterRecord(orderChild.getOrderNo());
BigDecimal frozen = runningWaterRecordList.stream().filter(item -> {
......@@ -131,13 +178,12 @@ public class OrderChildSyncTransportListener {
BigDecimal ans = getPrepayFreightPay(orderChild.getSettlementWay(), settlementOwnerDetail, frozen);
BigDecimal subtract = frozen.subtract(takeOut);
log.info("冻结预付运费:{}, 扣除的流水总和:{}", frozen, takeOut);
invoiceType = SettlementOwnerEnum.InvoiceType.ONLINE.getCode();
settlementDriverDetail.setPrepayFreight(ans);
//冻结的预付运费为0 或者 此刻预付运费也可能为0,那么就不用生成扣除相关流水逻辑
if (subtract.compareTo(BigDecimal.ZERO) <= 0 || ans.compareTo(BigDecimal.ZERO) == 0) {
settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
settlementDriverDetail.setPrepayFreightFlag(SettlementDriverEnum.PrepayFreightFlag.NO_PAY.getCode());
} else {
if (subtract.subtract(ans).compareTo(BigDecimal.ZERO) >= 0) {
//账户扣钱并生成扣除流水
......@@ -159,32 +205,53 @@ public class OrderChildSyncTransportListener {
settlementDriverDetail.setPrepayFreightFlag(SettlementDriverEnum.PrepayFreightFlag.NO_PAY.getCode());
}
}
} else {
settlementDriverDetail.setPrepayFreightFlag(SettlementDriverEnum.PrepayFreightFlag.NO_PAY.getCode());
settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
settlementOwnerDetail.setFinalPaymentStatus(SettlementOwnerDetailEnum.FinalPaymentStatus.NO.getCode());
}
} else {
log.info("当前OrderChildSyncTransportListener监听同步网络货运失败,变为普通单,运单号{}, 错误信息{}", orderChild.getChildNo(), remark);
else {
settlementDriverDetail.setPrepayFreightFlag(SettlementDriverEnum.PrepayFreightFlag.NO_PAY.getCode());
settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
settlementOwnerDetail.setFinalPaymentStatus(SettlementOwnerDetailEnum.FinalPaymentStatus.NO.getCode());
}
settlementOwnerDetail.setSettlementFreight(settlementFreightCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
if (SettlementOwnerEnum.InvoiceType.ORDINARY.getCode().equals(invoiceType)) {
if (settlementOwnerDetail.getSettlementFreight().compareTo(BigDecimal.ZERO) == 0) {
settlementOwnerDetail.setFinalPaymentStatus(SettlementOwnerDetailEnum.FinalPaymentStatus.NO_REQUIRE.getCode());
}
// 如果开票标识为“普通单”时,开票费率从开票公司“五寨华祥”中获取
InvoicingCompanyVO invoiceCompany = invoicingCompanyService.getInvoicingCompanyByGroupCode(
settlementConfig.getOrdinaryInvoiceCompanyGroupCode());
//设置开票公司信息
settlementOwnerDetail.setInvoicingCompanyId(invoiceCompany.getId());
settlementOwnerDetail.setInvoicingCompanyShorterName(invoiceCompany.getCompanyShorterName());
settlementOwnerDetail.setInvoicingCompanyGroupCode(invoiceCompany.getCompanyGroupCode());
settlementOwnerDetail.setInvoiceServiceFeeRate(BigDecimal.ZERO);
if (Objects.equals(invoiceCompany.getQuotationType(), InvoicingCompanyEnum.TaxType.TAX_EXCLUDED.getCode())) {
settlementOwnerDetail.setInvoiceServiceFeeRate(
invoiceCompany.getServiceFeeRate() == null ? BigDecimal.ZERO : invoiceCompany.getServiceFeeRate());
}
settlementDriverDetail.setInvoicingCompanyId(invoiceCompany.getId());
settlementDriverDetail.setInvoicingCompanyShorterName(invoiceCompany.getCompanyShorterName());
settlementDriverDetail.setInvoicingCompanyGroupCode(invoiceCompany.getCompanyGroupCode());
} else {
if (settlementDriverDetail.getSettlementFreight().compareTo(BigDecimal.ZERO) == 0) {
settlementOwnerDetail.setFinalPaymentStatus(SettlementOwnerDetailEnum.FinalPaymentStatus.NO_REQUIRE.getCode());
}
}
settlementOwnerDetail.setInvoiceType(invoiceType);
settlementOwnerDetail.setRemark(remark);
settlementDriverDetail.setInvoiceType(invoiceType);
// 开票服务费
settlementOwnerDetail.setInvoiceServiceFee(settlementCommonService.invoiceServiceFeeCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
// 开票金额
settlementOwnerDetail.setInvoiceFreight(settlementCommonService.invoiceFreightCalc(orderChild.getSettlementWay(),
orderGoods.getInvoiceServiceFeeRate(), settlementOwnerDetail));
// 结算金额
settlementOwnerDetail.setSettlementFreight(settlementCommonService.settlementFreightCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
//货主借款事件处理
OwnerLoanMqDTO dto = new OwnerLoanMqDTO();
dto.setSettlementOwnerDetail(settlementOwnerDetail);
......@@ -256,27 +323,4 @@ public class OrderChildSyncTransportListener {
}
}
/**
* 开票金额
*/
private BigDecimal invoiceFreightCalc(Integer settlementWay, SettlementOwnerDetail settlementOwnerDetail) {
if (Objects.equals(settlementWay, SettlementWayEnum.WayType.LOAD.getCode())) { //订单结算方式为“装车净重”时,开票金额=实际净重*平台运费报价-货损金额。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice())
.subtract(settlementOwnerDetail.getLossFreight());
} else { //订单结算方式为“卸车净重”时,开票金额=实际净重*平台运费报价。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice());
}
}
private BigDecimal settlementFreightCalc(Integer settlementWay, SettlementOwnerDetail settlementOwnerDetail) {
if (Objects.equals(settlementWay, SettlementWayEnum.WayType.LOAD.getCode())) { //订单结算方式为“装车净重”时,结算金额=实际净重*平台运费报价-预付运费-货损金额。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice())
.subtract(settlementOwnerDetail.getPrepayFreight()).subtract(settlementOwnerDetail.getLossFreight());
} else { //订单结算方式为“卸车净重”时,结算金额=实际净重*平台运费报价-预付运费
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice()).subtract(settlementOwnerDetail.getPrepayFreight());
}
}
}
package com.clx.performance.listener.settle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeySettlementConstants;
import com.clx.performance.service.settle.SettlementMqHandlerService;
import com.clx.performance.vo.mq.SettlementInvoiceStatusSyncMqParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Author: 艾庆国
* @Description: 开票标识同步 mq
* @Date: 2023-10-20 11:45:08
* @Version: 1.0
*/
@Slf4j
@Component
public class SettlementInvoiceStatusSyncListener {
@Autowired
private SettlementMqHandlerService settlementMqHandlerService;
@RabbitListener(queues = RabbitKeySettlementConstants.SETTLEMENT_INVOICE_STATUS_SYNC_QUEUE)
public void process(Message message) {
try{
log.info("结算-开票状态同步, message:{}", new String(message.getBody()));
process(JSON.parseObject(new String(message.getBody()), new TypeReference<MqWrapper<SettlementInvoiceStatusSyncMqParam>>(){}).getData());
}catch (Exception e){
log.info("结算-开票状态同步 失败",e);
}
}
private void process(SettlementInvoiceStatusSyncMqParam mq){
settlementMqHandlerService.invoiceStatusSync(mq);
}
}
......@@ -5,7 +5,7 @@ import com.alibaba.fastjson.TypeReference;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeySettlementConstants;
import com.clx.performance.service.settle.SettlementMqHandlerService;
import com.clx.performance.vo.mq.SettlementDetailInvoiceTypeSyncMqParam;
import com.clx.performance.vo.mq.SettlementInvoiceTypeSyncMqParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
......@@ -14,7 +14,7 @@ import org.springframework.stereotype.Component;
/**
* @Author: 艾庆国
* @Description: 开票标识同步 mq
* @Description: 开票类型同步 mq
* @Date: 2023-10-20 11:45:08
* @Version: 1.0
*/
......@@ -25,19 +25,19 @@ public class SettlementInvoiceTypeSyncListener {
@Autowired
private SettlementMqHandlerService settlementMqHandlerService;
@RabbitListener(queues = RabbitKeySettlementConstants.SETTLEMENT_DETAIL_INVOICE_TYPE_SYC_QUEUE)
@RabbitListener(queues = RabbitKeySettlementConstants.SETTLEMENT_INVOICE_TYPE_SYNC_QUEUE)
public void process(Message message) {
try{
log.info("结算-开票标识同步, message:{}", new String(message.getBody()));
process(JSON.parseObject(new String(message.getBody()), new TypeReference<MqWrapper<SettlementDetailInvoiceTypeSyncMqParam>>(){}).getData());
log.info("结算-开票类型同步, message:{}", new String(message.getBody()));
process(JSON.parseObject(new String(message.getBody()), new TypeReference<MqWrapper<SettlementInvoiceTypeSyncMqParam>>(){}).getData());
}catch (Exception e){
log.info("结算-开票标识同步 失败",e);
log.info("结算-开票类型同步 失败",e);
}
}
private void process(SettlementDetailInvoiceTypeSyncMqParam mq){
private void process(SettlementInvoiceTypeSyncMqParam mq){
settlementMqHandlerService.settlementDetailInvoiceTypeSync(mq);
settlementMqHandlerService.invoiceTypeSync(mq);
}
}
package com.clx.performance.listener.settle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeySettlementConstants;
import com.clx.performance.service.settle.SettlementMqHandlerService;
import com.clx.performance.vo.mq.SettlementPayStatusSyncMqParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Author: 艾庆国
* @Description: 开票标识同步 mq
* @Date: 2023-10-20 11:45:08
* @Version: 1.0
*/
@Slf4j
@Component
public class SettlementPayStatusSyncListener {
@Autowired
private SettlementMqHandlerService settlementMqHandlerService;
@RabbitListener(queues = RabbitKeySettlementConstants.SETTLEMENT_PAY_STATUS_SYNC_QUEUE)
public void process(Message message) {
try{
log.info("结算-支付状态同步, message:{}", new String(message.getBody()));
process(JSON.parseObject(new String(message.getBody()), new TypeReference<MqWrapper<SettlementPayStatusSyncMqParam>>(){}).getData());
}catch (Exception e){
log.info("结算-支付状态同步 失败",e);
}
}
private void process(SettlementPayStatusSyncMqParam mq){
settlementMqHandlerService.payStatusSync(mq);
}
}
package com.clx.performance.listener.settle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeySettlementConstants;
import com.clx.performance.service.settle.SettlementMqHandlerService;
import com.clx.performance.vo.mq.SettlementSettleMqParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Author: 艾庆国
* @Description: 结算 mq
* @Date: 2023-10-20 11:45:08
* @Version: 1.0
*/
@Slf4j
@Component
public class SettlementSettleListener {
@Autowired
private SettlementMqHandlerService settlementMqHandlerService;
@RabbitListener(queues = RabbitKeySettlementConstants.SETTLEMENT_SETTLE_QUEUE)
public void process(Message message) {
try{
log.info("结算-结算, message:{}", new String(message.getBody()));
process(JSON.parseObject(new String(message.getBody()), new TypeReference<MqWrapper<SettlementSettleMqParam>>(){}).getData());
}catch (Exception e){
log.info("结算-结算 失败",e);
}
}
private void process(SettlementSettleMqParam mq){
settlementMqHandlerService.settle(mq);
}
}
package com.clx.performance.listener.settle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeySettlementConstants;
import com.clx.performance.service.settle.SettlementMqHandlerService;
import com.clx.performance.vo.mq.SettlementStatisticsMqParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Author: 艾庆国
* @Description: 统计 mq
* @Date: 2023-10-20 11:45:08
* @Version: 1.0
*/
@Slf4j
@Component
public class SettlementStatisticsListener {
@Autowired
private SettlementMqHandlerService settlementMqHandlerService;
@RabbitListener(queues = RabbitKeySettlementConstants.SETTLEMENT_DETAIL_INVOICE_TYPE_SYC_QUEUE)
public void process(Message message) {
try{
log.info("结算-统计, message:{}", new String(message.getBody()));
process(JSON.parseObject(new String(message.getBody()), new TypeReference<MqWrapper<SettlementStatisticsMqParam>>(){}).getData());
}catch (Exception e){
log.info("结算-统计 失败",e);
}
}
private void process(SettlementStatisticsMqParam mq){
settlementMqHandlerService.settlementStatistics(mq);
}
}
package com.clx.performance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.clx.performance.model.PlatformServiceFeeConfig;
/**
* @author yangqifa
*/
public interface PlatformServiceFeeConfigMapper extends BaseMapper<PlatformServiceFeeConfig> {
}
\ No newline at end of file
package com.clx.performance.mapper.payment;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.clx.performance.model.payment.OrderPayment;
/**
* @author huningning
* Date 2024-06-18
* Time 14:01
*/
public interface OrderPaymentMapper extends BaseMapper<OrderPayment> {
}
package com.clx.performance.mapper.settle;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.model.settle.SettlementPlatformServiceFee;
import com.clx.performance.param.pc.owner.PageCarrierSettlementPlatformServiceFeeParam;
import com.clx.performance.sqlProvider.settle.SettlementPlatformServiceFeeSqlProvider;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
@Mapper
public interface SettlementPlatformServiceFeeMapper extends BaseMapper<SettlementPlatformServiceFee> {
/**
* @see SettlementPlatformServiceFeeSqlProvider#pageByParam(Page, PageCarrierSettlementPlatformServiceFeeParam)
*/
@SelectProvider(type = SettlementPlatformServiceFeeSqlProvider.class, method = "pageByParam")
IPage<SettlementPlatformServiceFee> pageByParam(@Param("page") Page page, @Param("param") PageCarrierSettlementPlatformServiceFeeParam param);
}
\ No newline at end of file
......@@ -93,12 +93,15 @@ public class OrderChild implements HasKey<Integer> {
private Integer settlementAccountPeriod; //结算账期 1拉运完成结 2月结
private Integer settlementWay; //结算方式 1装车净重
private Integer settlementWay; //结算方式 1装车净重 2卸车净重 3卸车净重(减货损)
private Integer invoicingCompanyId; //开票公司id
private String invoicingCompanyShorterName; //开票公司简称
private String invoicingCompanyGroupCode; //开票公司统一社会信用代码
private Integer reportFlag; //是否上报 0-否;1-是
private BigDecimal platformServiceFee; //平台服务费(分)
private BigDecimal platformServiceFeeRate; //平台服务费费率%
private BigDecimal deposit; //接单保证金(分/车)
private LocalDateTime createTime; //创建时间
private LocalDateTime modifiedTime; //修改时间
......
......@@ -189,6 +189,21 @@ public class OrderGoods implements HasKey<Integer> {
@ApiModelProperty("批次号")
private Long batchNumber;
@ApiModelProperty("平台运费报价税类型:0未税 1含税")
private Integer platformFreightQuotationTaxType;
@ApiModelProperty("开票服务率%")
private BigDecimal invoiceServiceFeeRate;
@TableField("platform_service_fee_rate")
@ApiModelProperty("平台服务费费率%")
private BigDecimal platformServiceFeeRate;
@TableField("deposit")
@ApiModelProperty("接单保证金(分/车)")
private BigDecimal deposit;
@ApiModelProperty("是否支持借款:0:否 1:是")
private Integer supportLoan;
@TableField("create_time")
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
......
package com.clx.performance.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.msl.common.config.KeyColumn;
import com.msl.common.model.HasKey;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.util.Date;
/**
* 平台服务费配置表
*
* @author yangqifa
*/
@Setter
@Getter
public class PlatformServiceFeeConfig implements HasKey<Integer> {
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 订单报价方式,0:未税,1:含税
*/
private Integer orderQuotationType;
/**
* 接单保证金,单位分
*/
private BigDecimal deposit;
/**
* 平台服务费费率
*/
private BigDecimal serviceFeeRate;
/**
* 创建时间
*/
private Date createdTime;
/**
* 更新时间
*/
private Date modifiedTime;
@KeyColumn("id")
@Override
public Integer gainKey() {
return id;
}
}
\ No newline at end of file
package com.clx.performance.model.payment;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.msl.common.config.KeyColumn;
import com.msl.common.model.HasKey;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
/**
* @author huningning
* Date 2024-06-18
* Time 14:01
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("order_payment")
public class OrderPayment implements HasKey<Integer> {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField("order_no")
@ApiModelProperty("主订单号")
private String orderNo;
@TableField("relation_no")
@ApiModelProperty("业务关联单号")
private String relationNo;
@TableField("payment_item")
@ApiModelProperty("交易名目")
private String paymentItem;
@TableField("serial_no")
@ApiModelProperty("流水号")
private String serialNo;
@TableField("amount")
@ApiModelProperty("金额")
private Integer amount;
@TableField("operation")
@ApiModelProperty("1:冻结 2:调整 3:解冻 4:部分解冻 5:部分支付 6:支付")
private Integer operation;
@TableField("status")
@ApiModelProperty("0: 发起,1: 成功,2:失败")
private Integer status;
@TableField("reason")
@ApiModelProperty("")
private String reason;
@TableField("create_time")
@ApiModelProperty("")
private LocalDateTime createTime;
@TableField("modified_time")
@ApiModelProperty("")
private LocalDateTime modifiedTime;
@Override
@KeyColumn("id")
public Integer gainKey() {
return this.id;
}
}
......@@ -48,6 +48,11 @@ public class SettlementDriver implements HasKey<Integer> {
private String settlementPlatform; //结算平台
private Integer prepayFreightFlag; //预付运费标示 0:未预付 1:已预付
private String payErrorMsg; //支付失败原因
private Integer invoicingCompanyId; //开票公司id
private String invoicingCompanyShorterName; //开票公司简称
private String invoicingCompanyGroupCode; //开票公司统一社会信用代码
private BigDecimal platformServiceFee; //平台服务费(分)
private BigDecimal platformServiceFeeRate; //平台服务费费率%
private Integer status; //状态
private LocalDateTime createTime; //创建时间
private LocalDateTime modifiedTime; //修改时间
......
......@@ -48,6 +48,11 @@ public class SettlementDriverDetail implements HasKey<Integer> {
private Integer loanTypeFlag; //借款类型标示 0:虚拟货币+资金 1:虚拟货币 2:资金
private BigDecimal settlementFreight; //结算金额(分)
private Integer invoiceType; //开票标识:1网运单 2普通单
private Integer invoicingCompanyId; //开票公司id
private String invoicingCompanyShorterName; //开票公司简称
private String invoicingCompanyGroupCode; //开票公司统一社会信用代码
private BigDecimal platformServiceFee; //平台服务费(分)
private BigDecimal platformServiceFeeRate; //平台服务费费率%
private Integer status; //状态
private LocalDateTime createTime; //创建时间
private LocalDateTime modifiedTime; //修改时间
......
......@@ -29,10 +29,10 @@ public class SettlementOwner implements HasKey<Integer> {
private Integer id; //id
private Long ownerUserNo; //货主用户编号
private String ownerName; //货主名称
private Integer settlementWay; //结算方式 1装车净重 2卸车净重
private Integer settlementWay; //结算方式 1装车净重 2卸车净重 3卸车净重(减货损)
private String settlementNo; //结算单编号
private String settlementSubNo; //结算子单号
private Integer settlementPeriodType; //结算周期类型:1拉运完成结 2月结
private Integer settlementPeriodType; //结算周期类型:1拉运完成结 2月结 3日结
private LocalDateTime settlementPeriodTime; //结算周期时间(月结)
private String orderNo; //订单编号
private BigDecimal weight; //实际净重(吨)
......@@ -45,6 +45,7 @@ public class SettlementOwner implements HasKey<Integer> {
private Integer invoiceType; //开票标识:1网运单 2普通单
private BigDecimal invoiceFreight; //开票金额(分)
private String invoiceImg; //结算凭证
private BigDecimal invoiceServiceFee; //开票服务费(分)
private String payee; //收款人
private String payeeBankName; //收款银行
private String payeeBankCardNo; //收款银行卡卡号
......
......@@ -52,12 +52,17 @@ public class SettlementOwnerDetail implements HasKey<Integer> {
private BigDecimal loanFreight; //借款抵扣金额(分)
private BigDecimal invoiceFreight; //开票金额(分)
private Integer invoiceType; //开票标识:1网运单 2普通单
private BigDecimal invoiceServiceFee; //开票服务费(分)
private BigDecimal invoiceServiceFeeRate; //开票服务率
private Integer finalPaymentStatus; //尾款状态 0-否,1-是,2-无需支付
private Integer invoiceStatus; //开票状态 0-否,1-是,2-无需开票
private Integer invoicingCompanyId; //开票公司id
private String invoicingCompanyShorterName; //开票公司简称
private String invoicingCompanyGroupCode; //开票公司统一社会信用代码
private Integer reportFlag; //是否上报 0-否;1-是
private Integer invoiceChannel; //开票渠道:1无车承运
private String remark; //备注
private Integer payStatus; //支付状态:0未支付 1已支付(网络货运是否支付)
private Integer status; //状态
private LocalDateTime createTime; //创建时间
private LocalDateTime modifiedTime; //修改时间
......
package com.clx.performance.model.settle;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.msl.common.config.KeyColumn;
import com.msl.common.model.HasKey;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.time.LocalDateTime;
import java.math.BigDecimal;
/**
* @Author: aiqinguo
* @Description: 平台服务费
* @Date: 2024/06/18 15:10:40
* @Version: 1.0
*/
@Getter
@Setter
@NoArgsConstructor
@TableName(autoResultMap = true)
public class SettlementPlatformServiceFee implements HasKey<Integer> {
@TableId(value = "id", type = IdType.AUTO)
private Integer id; //id
private String childNo; //运单编号
private Long driverUserNo; //司机用户编号
private String driverName; //司机名称
private String driverMobile; //司机手机号
private Integer sendAddressId; //发货地址id
private String sendAddress; //发货地址
private Integer receiveAddressId; //收货地址id
private String receiveAddress; //收货地址
private String truckNo; //车牌号
private BigDecimal settlementFreight; //结算金额(分)
private BigDecimal invoiceServiceFee; //开票服务费(分)
private BigDecimal invoiceServiceFeeRate; //开票服务率%
private LocalDateTime createTime; //创建时间
private LocalDateTime modifiedTime; //修改时间
@KeyColumn("id")
@Override
public Integer gainKey() {
return id;
}
}
......@@ -102,4 +102,6 @@ public interface OrderGoodsService {
void batchUpdateResidueWeight(List<OrderGoods> list);
void saveBindTruck(DistributionTruckParam param);
void updateFrightPrice(String orderGoodsNo,BigDecimal pendingOrderFreight);
}
......@@ -2,6 +2,8 @@ package com.clx.performance.service;
import com.clx.performance.param.pc.payment.PayParam;
import com.clx.performance.param.pc.payment.PayPlatformFeeParam;
import com.clx.performance.param.pc.payment.WalletResidueDTO;
import com.msl.common.result.Result;
public interface PaymentService {
......@@ -9,4 +11,24 @@ public interface PaymentService {
Result paymentWallet( PayParam noCheckPwd);
Result paymentBreakContractWallet( PayParam noCheckPwd);
Result paymentPlatformFee(PayPlatformFeeParam param);
Result paymentChangePlatformFee(PayPlatformFeeParam param);
Result paymentCompletePlatformFee(PayPlatformFeeParam param);
Result paymentCancelPlatformFee(PayPlatformFeeParam param);
void updateOrderPaymentFail(String orderNo,String msg,Integer operation, String paymentItem);
void updateOrderPaymentSuccess(String orderNo,Integer operation, String paymentItem);
void updateOrderPaymentStatusById(String id,int status);
void updateOrderPaymentSerialNoSuccess(String orderNo,String serialNo,Integer operation, String paymentItem);
WalletResidueDTO getWalletAndCard(Integer userCode);
}
package com.clx.performance.service;
import com.clx.performance.param.pc.carrier.SavePlatformServiceFeeConfigParam;
import com.clx.performance.vo.feign.PlatformServiceFeeConfigFeignVO;
import com.clx.performance.vo.pc.carrier.settle.CarrierPagePlatformServiceFeeConfigVO;
/**
* @author yangqifa
*/
public interface PlatformServiceFeeConfigService {
CarrierPagePlatformServiceFeeConfigVO listPlatformServiceFeeConfig();
CarrierPagePlatformServiceFeeConfigVO getPlatformServiceFeeConfigDetail(int id);
void updatePlatformServiceFeeConfig(SavePlatformServiceFeeConfigParam config);
PlatformServiceFeeConfigFeignVO getConfig();
}
......@@ -6,6 +6,6 @@ public interface TempService {
void updateBreakContractDriverSettlementFinish(String settlementNo);
void paymentTest(String fromUser,String toUser,String figure);
void paymentTest(String fromUser,String toUser,String figure,int type);
}
package com.clx.performance.service.broker;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail;
public interface OrderChildBrokerService {
void orderChildSync(OrderChild orderChild, OrderGoods orderGoods, SettlementOwnerDetail settlementOwnerDetail,
SettlementDriverDetail settlementDriverDetail);
}
package com.clx.performance.service.impl;
import com.clx.order.enums.QuotationEnum;
import com.clx.performance.dao.*;
import com.clx.performance.dto.payment.PaymentDTO;
import com.clx.performance.enums.*;
import com.clx.performance.enums.settle.SettlementWayEnum;
import com.clx.performance.model.*;
import com.clx.performance.param.pc.PoundAuditParam;
import com.clx.performance.service.OrderChildLogService;
import com.clx.performance.service.OrderChildPoundAuditService;
import com.clx.performance.service.OrderChildService;
import com.clx.performance.service.OrderGoodsService;
import com.clx.performance.param.pc.payment.PayPlatformFeeParam;
import com.clx.performance.service.*;
import com.clx.performance.vo.pc.OrderChildPoundAuditDetailVO;
import com.msl.common.exception.ServiceSystemException;
import com.msl.user.data.UserSessionData;
import com.msl.user.utils.TokenUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -48,7 +50,7 @@ public class OrderChildPoundAuditServiceImpl implements OrderChildPoundAuditSer
private final OrderChildLogService orderChildLogService;
private final OrderChildService orderChildService;
private final PaymentService paymentService;
@Override
public OrderChildPoundAuditDetailVO getPoundAuditDetail(String childNo) {
......@@ -128,6 +130,21 @@ public class OrderChildPoundAuditServiceImpl implements OrderChildPoundAuditSer
orderChild.setWeight(orderChildWeightCalc(orderChild));
orderChild.setFreight(orderChildFreightCalc(orderChild));
//计算司机保证金
PaymentDTO paymentDTO = getPaymentDTO(orderChild);
if (Objects.nonNull(paymentDTO.getPlatformServiceFeeNew())) {
if(paymentDTO.getPlatformServiceFeeNew().compareTo(BigDecimal.ZERO) != 0){
orderChild.setPlatformServiceFee(paymentDTO.getPlatformServiceFeeNew());
}
//因为可能服务费为 0
if(orderChild.getFreight().compareTo(BigDecimal.ZERO)<=0){
orderChild.setPlatformServiceFee(paymentDTO.getPlatformServiceFeeNew());
}
}
// 更新装车净重
updateOrderGoodsAmountLoad(orderGoods,orderChild.getChildNo(), dif);
......@@ -144,13 +161,30 @@ public class OrderChildPoundAuditServiceImpl implements OrderChildPoundAuditSer
//保存磅单审核日志数据
orderChildPoundLogDao.saveEntity(poundLog);
//判断是否平衡冻结金额
if(Objects.nonNull(paymentDTO.getChangeDeposit()) &&
paymentDTO.getChangeDeposit().compareTo(BigDecimal.ZERO) !=0){
paymentChangePlatformFee(orderChild.getChildNo(),paymentDTO.getChangeDeposit(),paymentDTO.getPlatformServiceFeeNew());
}
//保存运单日志数据
orderChildLogService.saveOrderChildLog(param.getChildNo(),type,OrderChildLogEnum.Type.getByCode(type).isPresent() ? OrderChildLogEnum.Type.getByCode(type).get().getMsg() :"",
OrderChildLogEnum.CreateType.PLATFORM.getCode(), loginUserInfo.getUserNo(),loginUserInfo.getUserName());
}
/***
* 平衡司机冻结保证金
*/
public void paymentChangePlatformFee(String childNo,BigDecimal changeDeposite,BigDecimal figureNew){
if(changeDeposite.compareTo(BigDecimal.ZERO) !=0){
PayPlatformFeeParam payPlatformFeeParam = new PayPlatformFeeParam();
payPlatformFeeParam.setTradeNo(childNo);
payPlatformFeeParam.setFigure(changeDeposite.intValue());
payPlatformFeeParam.setFigureNew(figureNew.intValue());
//冻结司机押金
paymentService.paymentChangePlatformFee(payPlatformFeeParam);
}
}
/**
* 装车补偿
*/
......@@ -185,4 +219,46 @@ public class OrderChildPoundAuditServiceImpl implements OrderChildPoundAuditSer
return totalFreight.setScale(0, RoundingMode.HALF_UP);
}
/***
* 获取最新的保证金金额和本次调增的金额
*/
public PaymentDTO getPaymentDTO(OrderChild orderChild){
//计算司机保证金
BigDecimal freightPrice = orderChild.getFreightPrice();
BigDecimal deposit = orderChild.getDeposit();
BigDecimal platformServiceFeeRate = orderChild.getPlatformServiceFeeRate();
BigDecimal platformServiceFee = orderChild.getPlatformServiceFee(); //平台服务费
BigDecimal freight = orderChild.getFreight();
//本次调整金额
BigDecimal changeDeposit = BigDecimal.ZERO;
//本次调整金额
BigDecimal platformServiceFeeNew = BigDecimal.ZERO;
log.info("运单号 {} ,原始冻结金额 {} ",orderChild.getChildNo(),platformServiceFee);
if(freight.compareTo(BigDecimal.ZERO)<=0){
return PaymentDTO.builder().changeDeposit(platformServiceFee.multiply(new BigDecimal("-1"))).platformServiceFeeNew(platformServiceFeeNew).build();
}
/**
* 如果之前未冻结保证金,本次不调整
* 如果 平台服务费率 为0 本次不处理
* 如果 本次吨数为 0 本次不处理
* 如果 本次调整金额为 0 本次不处理
* **/
if(Objects.nonNull(deposit) && deposit.compareTo(BigDecimal.ZERO) != 0 &&
Objects.nonNull(platformServiceFee) && platformServiceFee.compareTo(BigDecimal.ZERO) != 0 &&
Objects.nonNull(platformServiceFeeRate) && platformServiceFeeRate.compareTo(BigDecimal.ZERO) != 0 &&
Objects.nonNull(freight) && freight.compareTo(BigDecimal.ZERO) != 0
)
{
platformServiceFeeNew = freight
//平台服务费率 * 100
.multiply(platformServiceFeeRate).movePointLeft(2).setScale(0, RoundingMode.HALF_UP);
changeDeposit = platformServiceFeeNew.subtract(platformServiceFee);
log.info("运单号 {} ,原始冻结金额 {} ,最新冻结金额 {},运费差 {} 运费价格{},费率 {}",orderChild.getChildNo(),
platformServiceFee,platformServiceFeeNew,changeDeposit,freightPrice,platformServiceFeeRate
);
}
return PaymentDTO.builder().changeDeposit(changeDeposit).platformServiceFeeNew(platformServiceFeeNew).build();
}
}
......@@ -3,12 +3,16 @@ package com.clx.performance.service.impl;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.order.enums.InvoicingCompanyEnum;
import com.clx.order.enums.OrderEnum;
import com.clx.order.enums.QuotationEnum;
import com.clx.order.enums.VehicleUsageEnum;
import com.clx.order.feign.OrderFeign;
import com.clx.order.vo.feign.FeignAddressVO;
import com.clx.order.vo.feign.FeignOrderInfoVO;
import com.clx.order.vo.feign.FeignOrderVO;
import com.clx.order.vo.pc.carrier.InvoicingCompanyVO;
import com.clx.order.vo.pc.owner.OwnerQuotationDetailVO;
import com.clx.performance.component.GoodsOrderTruckRecordComponent;
import com.clx.performance.component.OrderChildLoanComponent;
import com.clx.performance.constant.RedisConstants;
......@@ -18,10 +22,14 @@ import com.clx.performance.dao.breakcontract.BreakContractDriverRecordDao;
import com.clx.performance.dao.settle.SettlementOwnerDetailDao;
import com.clx.performance.dto.OrderChildExpectDTO;
import com.clx.performance.dto.gd.GdRouteDTO;
import com.clx.performance.dto.payment.PaymentDTO;
import com.clx.performance.dto.payment.WalletResidueCardDTO;
import com.clx.performance.dto.zjxl.TruckLocationDTO;
import com.clx.performance.dto.zjxl.TruckTraceDTO;
import com.clx.performance.enums.*;
import com.clx.performance.enums.settle.SettlementWayEnum;
import com.clx.performance.extranal.order.InvoicingCompanyService;
import com.clx.performance.extranal.order.QuotationService;
import com.clx.performance.extranal.user.*;
import com.clx.performance.feign.FeignPaymentService;
import com.clx.performance.model.*;
......@@ -33,6 +41,7 @@ import com.clx.performance.param.pc.OrderChildCarrierCancelParam;
import com.clx.performance.param.pc.PageCarrierOrderChildParam;
import com.clx.performance.param.pc.PageMonitorOrderChildQCParam;
import com.clx.performance.param.pc.PagePoundAuditParam;
import com.clx.performance.param.pc.payment.PayPlatformFeeParam;
import com.clx.performance.service.*;
import com.clx.performance.service.breakcontract.BreakContractDriverRecordService;
import com.clx.performance.service.child.OrderChildPostService;
......@@ -47,6 +56,7 @@ import com.clx.performance.utils.zjxl.ZjxlGpsService;
import com.clx.performance.vo.app.*;
import com.clx.performance.vo.app.owner.OwnerOrderChildVO;
import com.clx.performance.vo.pc.*;
import com.clx.performance.vo.pc.carrier.settle.CarrierPagePlatformServiceFeeConfigVO;
import com.clx.user.enums.driver.DriverInfoEnum;
import com.clx.user.vo.feign.DriverTruckInfoFeignVo;
import com.clx.user.vo.feign.OwnerInfoFeignVO;
......@@ -186,8 +196,15 @@ public class OrderChildServiceImpl implements OrderChildService {
@Autowired
private TruckTraceService truckTraceService;
@Autowired
private PlatformServiceFeeConfigService platformServiceFeeConfigService;
@Autowired
private InvoicingCompanyService invoicingCompanyService;
@Autowired
private PaymentService paymentService;
@Autowired
private QuotationService quotationService;
@Override
public SaveOrderChildVO saveOrderChild(OrderChildSaveParam param) {
......@@ -267,8 +284,10 @@ public class OrderChildServiceImpl implements OrderChildService {
// 司机接单限制
driverTakeOrderLimit(driverTruckInfo.getUserNo());
//接单钱包限制
driverTakeOrderPaymentLimit(driverTruckInfo.getWalletCode(),driverTruckInfo.getTruckOwnWalletCode());
/** 判断当前用户是否为车主 true 车主 */
boolean truckOwnerFlag = Objects.equals(driverTruckInfo.getWalletCode(), driverTruckInfo.getTruckOwnWalletCode());
/** 冻结的钱包账户**/
Integer checkWalletCode = truckOwnerFlag ? driverTruckInfo.getWalletCode() : driverTruckInfo.getTruckOwnWalletCode();
LocalDateTime now = LocalDateTime.now();
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(param.getOrderGoodsNo()).orElseThrow(
......@@ -278,6 +297,13 @@ public class OrderChildServiceImpl implements OrderChildService {
log.warn("货单已暂停");
throw new ServiceSystemException(PerformanceResultEnum.ORDER_INVALID,"当前货单无效");
}
//获取平台 接单保证金 和服务费率
BigDecimal deposit = BigDecimal.ZERO;
if(Objects.nonNull(orderGoods.getDeposit())){
deposit = orderGoods.getDeposit();//接单保证金
}
//接单钱包限制
driverTakeOrderPaymentLimit(driverTruckInfo.getWalletCode(),driverTruckInfo.getTruckOwnWalletCode(),deposit);
// 状态验证
if (!Objects.equals(orderGoods.getOrderGoodsStatus(), OrderGoodsStatusEnum.Status.PAYING.getCode()) &&
......@@ -286,6 +312,24 @@ public class OrderChildServiceImpl implements OrderChildService {
}
FeignOrderInfoVO orderInfo = orderService.getOrderInfo(orderGoods.getOrderNo()).orElseThrow(PerformanceResultEnum.ORDER_INVALID);
log.info("开票公司id {} " ,orderInfo.getInvoicingCompanyId());
/** 存在开票公司 **/
if (Objects.nonNull(orderInfo.getInvoicingCompanyId())
&& orderInfo.getInvoicingCompanyId() > 0) {
InvoicingCompanyVO invoicingCompanyVO = invoicingCompanyService.
getInvoicingCompany(orderInfo.getInvoicingCompanyId()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
/** 是否支持车主接单,0:否,1:是,默认是
* 逻辑:如果结算方式是 卸车净重(减货损),开票公司支持车主模式 , 那么都可以接单 如果不支持车主模式 ,只能车主接单**/
log.info("是否支持车主模式 {} " ,invoicingCompanyVO.getSupportOwnerOrder());
log.info("结算方式 {} " ,orderGoods.getSettlementWay());
log.info("是否是车主 {} " ,truckOwnerFlag);
if (Objects.equals(invoicingCompanyVO.getSupportOwnerOrder(), 0) &&
Objects.equals(orderGoods.getSettlementWay(), SettlementWayEnum.WayType.UNLOAD_LOSS.getCode())) {
if (!truckOwnerFlag) {
throw new ServiceSystemException(PerformanceResultEnum.ORDER_DRIVER_LIMIT);
}
}
}
OwnerInfoFeignVO ownerInfo = ownerInfoService.getOwnerInfo(orderInfo.getOwnerUserNo());
// // 车型限制
......@@ -416,6 +460,15 @@ public class OrderChildServiceImpl implements OrderChildService {
orderChild.setInvoicingCompanyGroupCode(orderInfo.getInvoicingCompanyGroupCode());
orderChild.setReportFlag(orderInfo.getReportFlag());
// 平台服务费 (订单运费报价为“未税”订单结算方式为“卸车净重(减货损))
if (Objects.equals(orderGoods.getPlatformFreightQuotationTaxType(),
QuotationEnum.PlatformFreightQuotationTaxType.NO.getCode())
&& Objects.equals(orderChild.getSettlementWay(), SettlementWayEnum.WayType.UNLOAD_LOSS.getCode())) {
orderChild.setPlatformServiceFeeRate(orderGoods.getPlatformServiceFeeRate());
orderChild.setPlatformServiceFee(orderGoods.getDeposit());
orderChild.setDeposit(orderGoods.getDeposit());
}
// 更新货单数据
updateOrderGoodsAmount(orderGoods, orderChild);
......@@ -425,7 +478,16 @@ public class OrderChildServiceImpl implements OrderChildService {
// 新增运单
orderChildDao.saveEntity(orderChild);
// 冻结司机保证金
if(deposit.compareTo(BigDecimal.ZERO) ==1){
PayPlatformFeeParam payPlatformFeeParam = new PayPlatformFeeParam();
payPlatformFeeParam.setTradeNo(childNo);
payPlatformFeeParam.setFrom(checkWalletCode);
payPlatformFeeParam.setFigure(orderGoods.getDeposit().intValue());
payPlatformFeeParam.setPwd(param.getPwd());
//冻结司机押金
paymentService.paymentPlatformFee(payPlatformFeeParam);
}
// 更新出车状态
updateDriverOrderStatusLock(orderChild.getDriverUserNo(), orderChild.getTruckId());
......@@ -742,17 +804,82 @@ public class OrderChildServiceImpl implements OrderChildService {
if (orderChild.getLoadTime() == null &&
Objects.equals(orderChild.getStatus(), OrderChildEnum.Status.ARRIVE_SEND.getCode())) {
//计算司机保证金
BigDecimal net = param.getLoadRough().subtract(param.getLoadTare());
PaymentDTO paymentDTO = getPaymentDTO(net, orderChild);
if (Objects.nonNull(paymentDTO.getPlatformServiceFeeNew()) &&
paymentDTO.getPlatformServiceFeeNew().compareTo(BigDecimal.ZERO) != 0) {
orderChild.setPlatformServiceFee(paymentDTO.getPlatformServiceFeeNew());
}
updateLoadFirst(param, orderChild, orderGoods);
// 日志
orderChildLogService.saveDriverOrderChildLog(childNo, OrderChildLogEnum.Type.LOAD.getCode(),
OrderChildLogEnum.Type.LOAD.getMsg(), loginUserInfo.getUserNo(), loginUserInfo.getUserName());
//判断是否平衡冻结金额
if(Objects.nonNull(paymentDTO.getChangeDeposit()) &&
paymentDTO.getChangeDeposit().compareTo(BigDecimal.ZERO) !=0){
paymentChangePlatformFee(childNo,paymentDTO.getChangeDeposit(),paymentDTO.getPlatformServiceFeeNew());
}
} else {
//计算司机保证金
BigDecimal net =param.getLoadRough().subtract(param.getLoadTare());
PaymentDTO paymentDTO = getPaymentDTO(net, orderChild);
if (Objects.nonNull(paymentDTO.getPlatformServiceFeeNew()) &&
paymentDTO.getPlatformServiceFeeNew().compareTo(BigDecimal.ZERO) != 0) {
orderChild.setPlatformServiceFee(paymentDTO.getPlatformServiceFeeNew());
}
updateReload(param, orderChild, orderGoods);
// 日志
orderChildLogService.saveDriverOrderChildLog(childNo, OrderChildLogEnum.Type.RELOAD.getCode(),
OrderChildLogEnum.Type.RELOAD.getMsg(), loginUserInfo.getUserNo(), loginUserInfo.getUserName());
//判断是否平衡冻结金额
if(Objects.nonNull(paymentDTO.getChangeDeposit()) &&
paymentDTO.getChangeDeposit().compareTo(BigDecimal.ZERO) !=0){
paymentChangePlatformFee(childNo,paymentDTO.getChangeDeposit(),paymentDTO.getPlatformServiceFeeNew());
}
}
}
/***
* 获取最新的保证金金额和本次调增的金额
*/
public PaymentDTO getPaymentDTO(BigDecimal net , OrderChild orderChild){
//计算司机保证金
BigDecimal freightPrice = orderChild.getFreightPrice();
BigDecimal deposit = orderChild.getDeposit();
BigDecimal platformServiceFeeRate = orderChild.getPlatformServiceFeeRate();
BigDecimal platformServiceFee = orderChild.getPlatformServiceFee(); //平台服务费
//本次调整金额
BigDecimal changeDeposit = BigDecimal.ZERO;
//本次调整金额
BigDecimal platformServiceFeeNew = BigDecimal.ZERO;
log.info("运单号 {} ,原始冻结金额 {} ",orderChild.getChildNo(),platformServiceFee);
/**
* 如果之前未冻结保证金,本次不调整
* 如果 平台服务费率 为0 本次不处理
* 如果 本次吨数为 0 本次不处理
* 如果 本次调整金额为 0 本次不处理
* **/
if(Objects.nonNull(deposit) && deposit.compareTo(BigDecimal.ZERO) != 0 &&
Objects.nonNull(platformServiceFee) && platformServiceFee.compareTo(BigDecimal.ZERO) != 0 &&
Objects.nonNull(platformServiceFeeRate) && platformServiceFeeRate.compareTo(BigDecimal.ZERO) != 0 &&
Objects.nonNull(net) && net.compareTo(BigDecimal.ZERO) != 0
)
{
platformServiceFeeNew = net.multiply(freightPrice).setScale(2, RoundingMode.HALF_UP)
//平台服务费率 * 100
.multiply(platformServiceFeeRate).movePointLeft(2).setScale(0, RoundingMode.HALF_UP);
changeDeposit = platformServiceFeeNew.subtract(platformServiceFee);
log.info("运单号 {} ,原始冻结金额 {} ,最新冻结金额 {},运费差 {} 吨数{} 运费价格{},费率 {}",orderChild.getChildNo(),
platformServiceFee,platformServiceFeeNew,changeDeposit,net,freightPrice,platformServiceFeeRate
);
}
return PaymentDTO.builder().changeDeposit(changeDeposit).platformServiceFeeNew(platformServiceFeeNew).build();
}
private void updateLoadFirst(OrderChildLoadParam param, OrderChild orderChild, OrderGoods orderGoods) {
String childNo = param.getChildNo();
......@@ -870,16 +997,38 @@ public class OrderChildServiceImpl implements OrderChildService {
// throw new ServiceSystemException(PerformanceResultEnum.ORDER_CHILD_UNLOAD_WEIGHT_ERROR);
// }
if (orderChild.getUnloadTime() == null &&
Objects.equals(orderChild.getStatus(), OrderChildEnum.Status.ARRIVE_RECEIVE.getCode())) {
//计算司机保证金
BigDecimal net = orderChild.getLoadNet();
PaymentDTO paymentDTO = getPaymentDTO(net, orderChild);
if (Objects.nonNull(paymentDTO.getPlatformServiceFeeNew()) &&
paymentDTO.getPlatformServiceFeeNew().compareTo(BigDecimal.ZERO) != 0) {
orderChild.setPlatformServiceFee(paymentDTO.getPlatformServiceFeeNew());
}
updateUnloadFirst(param, orderChild);
// 日志
orderChildLogService.saveDriverOrderChildLog(childNo, OrderChildLogEnum.Type.UNLOAD.getCode(),
OrderChildLogEnum.Type.UNLOAD.getMsg(), loginUserInfo.getUserNo(), loginUserInfo.getUserName());
orderChildPoundLogService.saveDriverOrderChildLog(childNo, OrderChildPoundAuditEnum.Status.AUDIT.getCode(),
OrderChildPoundAuditEnum.Status.AUDIT.getMsg(), OrderChildLogEnum.CreateType.DRIVER.getCode(),
loginUserInfo.getUserNo(), loginUserInfo.getUserName());
//判断是否平衡冻结金额
if(Objects.nonNull(paymentDTO.getChangeDeposit()) &&
paymentDTO.getChangeDeposit().compareTo(BigDecimal.ZERO) !=0){
paymentChangePlatformFee(childNo,paymentDTO.getChangeDeposit(),paymentDTO.getPlatformServiceFeeNew());
}
} else {
//计算司机保证金
BigDecimal net = orderChild.getLoadNet();
PaymentDTO paymentDTO = getPaymentDTO(net, orderChild);
if (Objects.nonNull(paymentDTO.getPlatformServiceFeeNew()) &&
paymentDTO.getPlatformServiceFeeNew().compareTo(BigDecimal.ZERO) != 0) {
orderChild.setPlatformServiceFee(paymentDTO.getPlatformServiceFeeNew());
}
updateReUnload(param, orderChild);
// 日志
orderChildLogService.saveDriverOrderChildLog(childNo, OrderChildLogEnum.Type.REUNLOAD.getCode(),
......@@ -887,6 +1036,25 @@ public class OrderChildServiceImpl implements OrderChildService {
orderChildPoundLogService.saveDriverOrderChildLog(childNo, OrderChildPoundAuditEnum.Status.AUDIT.getCode(),
OrderChildPoundAuditEnum.Status.AUDIT.getMsg(), OrderChildLogEnum.CreateType.DRIVER.getCode(),
loginUserInfo.getUserNo(), loginUserInfo.getUserName());
//判断是否平衡冻结金额
if(Objects.nonNull(paymentDTO.getChangeDeposit()) &&
paymentDTO.getChangeDeposit().compareTo(BigDecimal.ZERO) !=0){
paymentChangePlatformFee(childNo,paymentDTO.getChangeDeposit(),paymentDTO.getPlatformServiceFeeNew());
}
}
}
/***
* 平衡司机冻结保证金
*/
public void paymentChangePlatformFee(String childNo,BigDecimal changeDeposite,BigDecimal deposite){
if(changeDeposite.compareTo(BigDecimal.ZERO) !=0){
PayPlatformFeeParam payPlatformFeeParam = new PayPlatformFeeParam();
payPlatformFeeParam.setTradeNo(childNo);
payPlatformFeeParam.setFigure(changeDeposite.intValue());
payPlatformFeeParam.setFigureNew(deposite.intValue());
//冻结司机押金
paymentService.paymentChangePlatformFee(payPlatformFeeParam);
}
}
......@@ -1103,6 +1271,13 @@ public class OrderChildServiceImpl implements OrderChildService {
audit.setLoadRough(orderChild.getLoadRough());
audit.setLoadTare(orderChild.getLoadTare());
//计算司机保证金
BigDecimal net =param.getLoadRough().subtract(param.getLoadTare());
PaymentDTO paymentDTO = getPaymentDTO(net, orderChild);
if (Objects.nonNull(paymentDTO.getPlatformServiceFeeNew()) &&
paymentDTO.getPlatformServiceFeeNew().compareTo(BigDecimal.ZERO) != 0) {
orderChild.setPlatformServiceFee(paymentDTO.getPlatformServiceFeeNew());
}
// 更新装车净重
updateOrderGoodsAmountLoad(orderGoods, childNo,dif,OrderGoodsStatusEnum.Status.GO_TO_SEND.getCode());
......@@ -1121,6 +1296,12 @@ public class OrderChildServiceImpl implements OrderChildService {
orderChildPoundLogService.saveDriverOrderChildLog(childNo, OrderChildPoundAuditEnum.Status.AUDIT.getCode(),
OrderChildPoundAuditEnum.Status.AUDIT.getMsg(), OrderChildLogEnum.CreateType.DRIVER.getCode(),
loginUserInfo.getUserNo(), loginUserInfo.getUserName());
//判断是否平衡冻结金额
if(Objects.nonNull(paymentDTO.getChangeDeposit()) &&
paymentDTO.getChangeDeposit().compareTo(BigDecimal.ZERO) !=0){
paymentChangePlatformFee(childNo,paymentDTO.getChangeDeposit(),paymentDTO.getPlatformServiceFeeNew());
}
}
@Override
......@@ -1161,7 +1342,6 @@ public class OrderChildServiceImpl implements OrderChildService {
orderChild.setStatus(OrderChildEnum.Status.UNSETTLE.getCode());
orderChild.setConfirmTime(LocalDateTime.now());
orderChildDao.updateDriverConfirm(orderChild);
// 更新车辆状态
......@@ -1376,7 +1556,7 @@ public class OrderChildServiceImpl implements OrderChildService {
Integer settlementDriverDetailId = settlementDriverDetailService.saveSettlementDetail(orderChild);
Integer settlementOwnerDetailId = settlementOwnerDetailService.saveSettlementDetail(orderChild,orderGoods);
log.info("生成计费单 {} ",orderChild.getChildNo());
settlementMqService.settlementDetailAdd(settlementDriverDetailId, settlementOwnerDetailId);
}
......@@ -1446,7 +1626,20 @@ public class OrderChildServiceImpl implements OrderChildService {
result.setPrepayFreight(settlementOwnerDetail.getPrepayFreight());
result.setSettlementFreight(settlementOwnerDetail.getSettlementFreight());
}
//获取订单配置的违约金方案
OwnerQuotationDetailVO quotationDetailVO = quotationService.getQuotationByOrderNo(orderChild.getOrderNo())
.orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
if(Objects.isNull(quotationDetailVO.getLiquidatedDamagesPlanId())){
throw new ServiceSystemException(PerformanceResultEnum.DATA_NOT_FIND);
}
//货源详情页面 是否显示弹窗和显示平台服务费率
/** 订单结算方式为“卸车净重(减货损)”且平台运费报价为“未税”时 显示平台服务费率和弹窗提示司机平台服务费率**/
if (Objects.equals(orderGoods.getSettlementWay(),
SettlementWayEnum.WayType.UNLOAD_LOSS.getCode())
&& Objects.equals(quotationDetailVO.getPlatformFreightQuotationTaxType(),
InvoicingCompanyEnum.TaxType.TAX_EXCLUDED.getCode())) {
result.setGoodsOrderDetailShow(1);
}
//查询进行中的运单车辆是否开启了中交兴路
result.setNotOpenZJXLMsg(isOpenZJXL(orderChild.getStatus(),orderChild.getTruckNo()));
return result;
......@@ -1804,7 +1997,7 @@ public class OrderChildServiceImpl implements OrderChildService {
/**
* 司机接单支付校验
*/
private void driverTakeOrderPaymentLimit(Integer driverWallCode, Integer truckWalletCode) {
private void driverTakeOrderPaymentLimit(Integer driverWallCode, Integer truckWalletCode,BigDecimal deposit) {
//判断是司机还是车主 接单校验 必须两个都有钱包
if (Objects.isNull(driverWallCode) || Objects.isNull(truckWalletCode)) {
throw new ServiceSystemException(PerformanceResultEnum.WALLET_CODE_IS_NULL);
......@@ -1816,10 +2009,25 @@ public class OrderChildServiceImpl implements OrderChildService {
if (result != null && Objects.equals(result.getCode(), 0) && result.getData() != null) {
WalletResidueCardDTO data = result.getData();
//钱包不能为负
if (Objects.isNull(data.getResidue()) || data.getResidue() < 0L) {
if(Objects.isNull(data.getResidue())){
String remark = truckOwnerFlag ? "钱包余额不足" : "车主钱包余额不足";
throw new ServiceSystemException(PerformanceResultEnum.APP_POP_UP_ERROR, remark);
}
//目前支付返回的是元 所以乘以100
data.setResidue(data.getResidue()*100);
if (data.getResidue() < 0L) {
String remark = truckOwnerFlag ? "钱包余额不足" : "车主钱包余额不足";
throw new ServiceSystemException(PerformanceResultEnum.APP_POP_UP_ERROR, remark);
}
//判断余额是否能够缴纳保证金
if (data.getResidue() < deposit.longValue()) {
String remark = truckOwnerFlag ? "账户可用余额不足,接单保证金冻结失败,请尽快充值,本次需充值"+deposit.movePointLeft(2) +"元" : "车主钱包余额不足,保证金冻结失败请联系车主充值";
if(truckOwnerFlag){
throw new ServiceSystemException(PerformanceResultEnum.APP_POP_UP_OWNER_RESIDUE_ERROR, remark);
}else{
throw new ServiceSystemException(PerformanceResultEnum.APP_POP_UP_DRIVER_RESIDUE_ERROR, remark);
}
}
//有效银行卡数量 不能为空
if (Objects.isNull(data.getCardCount()) || data.getCardCount() <= 0) {
......
......@@ -5,12 +5,14 @@ import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.order.enums.InvoicingCompanyEnum;
import com.clx.order.enums.UpdateEnum;
import com.clx.order.enums.VehicleUsageEnum;
import com.clx.order.feign.OrderFeign;
import com.clx.order.param.feign.OrderCancelReasonParam;
import com.clx.order.param.feign.RollbackOrderWeightParam;
import com.clx.order.vo.feign.FeignOrderVO;
import com.clx.order.vo.pc.owner.OwnerQuotationDetailVO;
import com.clx.performance.component.GoodsOrderTruckRecordComponent;
import com.clx.performance.component.OrderCancelComponent;
import com.clx.performance.component.OrderGoodsStatusLazyComponent;
......@@ -19,6 +21,8 @@ import com.clx.performance.dao.*;
import com.clx.performance.dto.OrderGoodsBindTruckNumDTO;
import com.clx.performance.dto.OrderGoodsCancelDTO;
import com.clx.performance.enums.*;
import com.clx.performance.enums.settle.SettlementWayEnum;
import com.clx.performance.extranal.order.QuotationService;
import com.clx.performance.extranal.user.DriverService;
import com.clx.performance.model.*;
import com.clx.performance.param.app.AppGoodsOrderSearchParam;
......@@ -39,6 +43,7 @@ import com.clx.performance.vo.pc.OrderGoodsEditVO;
import com.clx.performance.vo.pc.OrderGoodsVO;
import com.clx.user.enums.driver.DriverInfoEnum;
import com.clx.user.feign.UserClxFeign;
import com.github.mustachejava.ObjectHandler;
import com.msl.common.base.Optional;
import com.msl.common.enums.ResultCodeEnum;
import com.msl.common.exception.ServiceSystemException;
......@@ -111,6 +116,8 @@ public class OrderGoodsServiceImpl implements OrderGoodsService, InitializingBea
private OrderChildPostService orderChildPostService;
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private QuotationService quotationService;
@Autowired
private OrderGoodsFleetOpenTruckDao orderGoodsFleetOpenTruckDao;
......@@ -154,6 +161,21 @@ public class OrderGoodsServiceImpl implements OrderGoodsService, InitializingBea
orderGoodsVO.setLoadBeginTime(orderInfoFeign.getLoadBeginTime());
orderGoodsVO.setLoadEndTime(orderInfoFeign.getLoadEndTime());
orderGoodsVO.setResidueTransportWeight(BigDecimal.ZERO.compareTo(orderGoodsVO.getResidueTransportWeight()) > 0 ? BigDecimal.ZERO : orderGoodsVO.getResidueTransportWeight());
//获取订单配置的违约金方案
OwnerQuotationDetailVO quotationDetailVO = quotationService.getQuotationByOrderNo(orderNo).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
if(Objects.isNull(quotationDetailVO.getLiquidatedDamagesPlanId())){
throw new ServiceSystemException(PerformanceResultEnum.DATA_NOT_FIND);
}
//货源详情页面 是否显示弹窗和显示平台服务费率
/** 订单结算方式为“卸车净重(减货损)”且平台运费报价为“未税”时 显示平台服务费率和弹窗提示司机平台服务费率**/
if (Objects.equals(orderGoodsVO.getSettlementWay(),
SettlementWayEnum.WayType.UNLOAD_LOSS.getCode())
&& Objects.equals(quotationDetailVO.getPlatformFreightQuotationTaxType(),
InvoicingCompanyEnum.TaxType.TAX_EXCLUDED.getCode())) {
orderGoodsVO.setGoodsOrderDetailShow(1);
}
return orderGoodsVO;
}
......@@ -923,6 +945,14 @@ public class OrderGoodsServiceImpl implements OrderGoodsService, InitializingBea
orderGoodsDao.batchUpdateResidueWeight(collect,BigDecimal.ZERO);
}
@Override
public void updateFrightPrice(String orderNo, BigDecimal pendingOrderFreight) {
List<OrderGoods> list = orderGoodsDao.getOrderGoodsListByOrderNo(orderNo);
if (list.isEmpty()) {return;}
log.info("更新货单运费, orderNo:{}, pendingOrderFreight:{}", orderNo, pendingOrderFreight);
orderGoodsDao.updatePendingOrderFreightByIdList(pendingOrderFreight, list.stream().map(item->item.getId()).collect(Collectors.toList()));
}
@Override
public void afterPropertiesSet() throws Exception {
orderGoodsCancelMap.put(1, this::cancelOperateOneTypeStrategy);
......
......@@ -2,36 +2,50 @@ package com.clx.performance.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.clx.performance.config.MslPaymentConfig;
import com.clx.performance.constant.ActionConstants;
import com.clx.performance.dao.ThirdPartRequestLogDao;
import com.clx.performance.dao.payment.OrderPaymentDao;
import com.clx.performance.encryption.oldmsl.PayEncryptTools;
import com.clx.performance.encryption.oldmsl.PrivateKeyConfig;
import com.clx.performance.encryption.oldmsl.SystemCodeEnum;
import com.clx.performance.enums.PayUnitTypeEnum;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.enums.ThirdRequestTypeEnum;
import com.clx.performance.enums.*;
import com.clx.performance.enums.payment.PayOperationStatusEnum;
import com.clx.performance.enums.payment.PaymentActionEnum;
import com.clx.performance.enums.payment.PaymentStatusEnum;
import com.clx.performance.model.OrderGoodsTruckBind;
import com.clx.performance.model.ThirdPartRequestLog;
import com.clx.performance.param.pc.payment.PayParam;
import com.clx.performance.param.pc.payment.PayUnitDTO;
import com.clx.performance.param.pc.payment.PayUserDTO;
import com.clx.performance.model.payment.OrderPayment;
import com.clx.performance.param.pc.payment.*;
import com.clx.performance.service.PaymentService;
import com.clx.performance.service.ThirdPartRequestLogService;
import com.google.gson.Gson;
import com.msl.common.base.Optional;
import com.msl.common.dto.HttpDTO;
import com.msl.common.exception.ServiceSystemException;
import com.msl.common.result.Result;
import com.msl.common.utils.EncryptUtil;
import com.msl.common.utils.HttpUtil;
import com.msl.common.utils.LocalDateTimeUtils;
import io.swagger.models.auth.In;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.math.BigDecimal;
import java.security.GeneralSecurityException;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
import static com.clx.performance.enums.HttpEnum.PERFORMANCE_PAY_CLX_PAYMENT;
......@@ -48,6 +62,18 @@ public class PaymentServiceImpl implements PaymentService {
/** 违约回调地址 **/
public static final String NOTIFY_BROKER_URL = "/clx-performance/payment/notify/userPayBrokerContractNotify";
/** 司机平台押金冻结回调地址 **/
public static final String NOTIFY_PLATFORM_FEE_URL = "/clx-performance/payment/notify/userPayDriverFreezeNotify";
/** 司机平台押金冻结调整回调地址 **/
public static final String NOTIFY_ADJUST_PLATFORM_FEE_URL = "/clx-performance/payment/notify/userPayAdjustDriverFreezeNotify";
/** 司机平台押金冻结取消回调地址 **/
public static final String NOTIFY_CANCEL_PLATFORM_FEE_URL = "/clx-performance/payment/notify/userPayCancelDriverFreezeNotify";
/** 司机平台押金冻结完成回调地址 **/
public static final String NOTIFY_COMPLETE_PLATFORM_FEE_URL = "/clx-performance/payment/notify/userPayCompleteDriverFreezeNotify";
@Autowired
private final MslPaymentConfig mslPaymentConfig;
......@@ -57,6 +83,12 @@ public class PaymentServiceImpl implements PaymentService {
@Autowired
ThirdPartRequestLogService thirdPartRequestLogService;
@Autowired
OrderPaymentDao orderPaymentDao;
@Autowired
UniqueOrderNumService uniqueOrderNumService;
/**
* 钱包直接划账给钱包
*
......@@ -102,7 +134,6 @@ public class PaymentServiceImpl implements PaymentService {
/**
* 钱包直接划账给钱包(违约)
*
* @param payDTO
* @return
*/
......@@ -141,6 +172,261 @@ public class PaymentServiceImpl implements PaymentService {
return notify;
}
/**
* 创建支付流水记录
* @param orderPayment
*/
public void saveOrderPayment( OrderPayment orderPayment){
orderPaymentDao.saveEntity(orderPayment);
}
/**
* 冻结司机平台押金
* @param
* @return
*/
@Transactional(rollbackFor = Exception.class)
@Override
public Result paymentPlatformFee(PayPlatformFeeParam payDTO) {
/** 创建记录 默认冻结 **/
OrderPayment orderPayment = new OrderPayment()
.setAmount(payDTO.getFigure())
.setOrderNo(payDTO.getTradeNo())
.setRelationNo(payDTO.getTradeNo())
.setPaymentItem(PayUnitTypeEnum.FREEZE_PLATFORM_FEE.getCode() + "")
.setStatus(PaymentStatusEnum.CREATE.getValue())
.setOperation(PayOperationStatusEnum.FREEZE.getValue());
saveOrderPayment(orderPayment);
/** 构建司机冻结单元 **/
PayUserDTO payUserDTO = buildDriverFreezeBatchDTO(payDTO, orderPayment);
log.info("发起司机押金冻结支付请求日志 {}", payUserDTO);
Result<Object> notify = (Result<Object>) postRequest(mslPaymentConfig.getHost()
+ HttpEnum.PERFORMANCE_PAY_CLX_DRIVER_FREEZE.getUrl(), JSON.toJSONString(payUserDTO));
log.info("支付司机押金冻结支付请求 返回日志 {}", notify);
if (notify == null) {
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR);
}
if (notify.getCode() != 0) {
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, notify.getMsg());
}
return notify;
}
/**
* 调整司机平台押金
* @param
* @return
*/
@Transactional(rollbackFor = Exception.class)
@Override
public Result paymentChangePlatformFee(PayPlatformFeeParam param) {
//查询冻结记录
OrderPayment orderPaymentOptional =
orderPaymentDao.selectByOrderNoAndItemIdAndOperation(param.getTradeNo(),
PayUnitTypeEnum.FREEZE_PLATFORM_FEE.getCode() + "",
PayOperationStatusEnum.FREEZE.getValue()).orNull();
if (null == orderPaymentOptional){
throw new ServiceSystemException(PerformanceResultEnum.DATA_NOT_FIND,"数据不存在") ;
}
/** 创建记录 新的调整记录 **/
OrderPayment orderPayment = new OrderPayment()
.setAmount(param.getFigure())
.setOrderNo(param.getTradeNo())
.setRelationNo(payOrderNoGenerate())
.setSerialNo(orderPaymentOptional.getSerialNo())
.setPaymentItem(PayUnitTypeEnum.FREEZE_PLATFORM_FEE.getCode() + "")
.setStatus(PaymentStatusEnum.CREATE.getValue())
.setOperation(PayOperationStatusEnum.ADJUSTMENT.getValue());
saveOrderPayment(orderPayment);
/** 调整冻结记录 **/
FreezeBatchDTO freezeBatchDTO = buildChangeFreezeBatchDTO(orderPaymentOptional,orderPayment.getId() ,param.getFigure());
log.info("发起支付请求日志 {}", freezeBatchDTO);
Result<Object> notify = (Result<Object>) postRequest(mslPaymentConfig.getHost() +
HttpEnum.PERFORMANCE_PAY_CLX_ADJUST_DRIVER_FREEZE.getUrl(), JSON.toJSONString(freezeBatchDTO));
log.info("支付返回日志 {}", notify);
if (notify == null) {
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR);
}
if (notify.getCode() != 0) {
if(Objects.equals(notify.getCode(),1005)){
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR,
"预估接单保证金"+new BigDecimal(param.getFigureNew()).movePointLeft(2)+"元,车主钱包余额不足,请先充值");
}else if(Objects.equals(notify.getCode(),6104)){
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR,
"预估接单保证金"+new BigDecimal(param.getFigureNew()).movePointLeft(2)+"元,车主钱包余额不足,请先充值");
}
else{
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, notify.getMsg());
}
}
return notify;
}
@Override
public Result paymentCompletePlatformFee(PayPlatformFeeParam param) {
List<OrderPayment> orderPaymentList = checkOrderPaymentExit(param);
//如果没有冻结记录
List<OrderPayment> orderPaymentFreezeList = orderPaymentList.stream()
.filter(i -> i.getOperation().equals(PayOperationStatusEnum.FREEZE.getValue()))
.filter(i -> i.getStatus().equals(PaymentStatusEnum.SUCCESS.getValue()))
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(orderPaymentFreezeList)){
throw new ServiceSystemException(PerformanceResultEnum.DATA_NOT_FIND,"数据不存在") ;
}
//冻结记录是否已经处理
List<OrderPayment> orderPaymentUnFreezeList = orderPaymentList.stream()
.filter(i -> i.getOperation().equals(PayOperationStatusEnum.UNFREEZE.getValue()))
.filter(i -> i.getStatus().equals(PaymentStatusEnum.SUCCESS.getValue()))
.collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(orderPaymentUnFreezeList)){
throw new ServiceSystemException(PerformanceResultEnum.DATA_NOT_FIND,"冻结记录已处理") ;
}
OrderPayment orderPaymentOptional = orderPaymentFreezeList.get(0);
/** 创建记录 新的调整记录 **/
OrderPayment orderPayment = new OrderPayment()
.setAmount(param.getFigure())
.setOrderNo(param.getTradeNo())
.setRelationNo(orderPaymentOptional.getRelationNo())
.setSerialNo(orderPaymentOptional.getSerialNo())
.setPaymentItem(PayUnitTypeEnum.FREEZE_PLATFORM_FEE.getCode() + "")
.setStatus(PaymentStatusEnum.CREATE.getValue())
.setOperation(PayOperationStatusEnum.UNFREEZE.getValue());
saveOrderPayment(orderPayment);
/** 调整冻结记录 **/
FreezeBatchDTO freezeBatchDTO = buildCompleteFreezeBatchDTO(orderPaymentOptional,
orderPayment.getRelationNo());
log.info("发起支付请求日志 {}", freezeBatchDTO);
Result<Object> notify = (Result<Object>) postRequest(mslPaymentConfig.getHost() +
HttpEnum.PERFORMANCE_PAY_CLX_ADJUST_DRIVER_FREEZE.getUrl(), JSON.toJSONString(freezeBatchDTO));
log.info("支付返回日志 {}", notify);
if (notify == null) {
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR);
}
if (notify.getCode() != 0) {
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, notify.getMsg());
}
return notify;
}
public List<OrderPayment> checkOrderPaymentExit(PayPlatformFeeParam param){
//查询冻结记录
List<OrderPayment> orderPaymentList= orderPaymentDao.listByOrderNo(param.getTradeNo(),
PayUnitTypeEnum.FREEZE_PLATFORM_FEE.getCode() + "");
if (CollectionUtils.isEmpty(orderPaymentList)){
throw new ServiceSystemException(PerformanceResultEnum.DATA_NOT_FIND,"数据不存在") ;
}
return orderPaymentList;
}
@Override
public Result paymentCancelPlatformFee(PayPlatformFeeParam param) {
List<OrderPayment> orderPaymentList = checkOrderPaymentExit(param);
//如果没有冻结记录
List<OrderPayment> orderPaymentFreezeList = orderPaymentList.stream()
.filter(i -> i.getOperation().equals(PayOperationStatusEnum.FREEZE.getValue()))
.filter(i -> i.getStatus().equals(PaymentStatusEnum.SUCCESS.getValue()))
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(orderPaymentFreezeList)){
throw new ServiceSystemException(PerformanceResultEnum.DATA_NOT_FIND,"数据不存在") ;
}
//冻结记录是否已经处理
List<OrderPayment> orderPaymentUnFreezeList = orderPaymentList.stream()
.filter(i -> i.getOperation().equals(PayOperationStatusEnum.UNFREEZE.getValue()))
.filter(i -> i.getStatus().equals(PaymentStatusEnum.SUCCESS.getValue()))
.collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(orderPaymentUnFreezeList)){
throw new ServiceSystemException(PerformanceResultEnum.DATA_NOT_FIND,"冻结记录已处理") ;
}
OrderPayment orderPaymentOptional = orderPaymentFreezeList.get(0);
/** 创建记录 新的调整记录 **/
OrderPayment orderPayment = new OrderPayment()
.setAmount(param.getFigure())
.setOrderNo(param.getTradeNo())
.setRelationNo(orderPaymentOptional.getRelationNo())
.setSerialNo(orderPaymentOptional.getSerialNo())
.setPaymentItem(PayUnitTypeEnum.FREEZE_PLATFORM_FEE.getCode() + "")
.setStatus(PaymentStatusEnum.CREATE.getValue())
.setOperation(PayOperationStatusEnum.UNFREEZE.getValue());
saveOrderPayment(orderPayment);
/** 调整冻结记录 **/
FreezeBatchDTO freezeBatchDTO = buildCanCelFreezeBatchDTO(orderPaymentOptional,
orderPayment.getRelationNo());
log.info("发起支付请求日志 {}", freezeBatchDTO);
Result<Object> notify = (Result<Object>) postRequest(mslPaymentConfig.getHost() +
HttpEnum.PERFORMANCE_PAY_CLX_ADJUST_DRIVER_FREEZE.getUrl(), JSON.toJSONString(freezeBatchDTO));
log.info("支付返回日志 {}", notify);
if (notify == null) {
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR);
}
if (notify.getCode() != 0) {
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, notify.getMsg());
}
return notify;
}
@Override
public void updateOrderPaymentFail(String orderNo, String msg,Integer operation, String paymentItem) {
//查询冻结记录
OrderPayment orderPaymentOptional =
orderPaymentDao.selectByRelationNo(orderNo,operation,paymentItem).orNull();
if (null == orderPaymentOptional){
log.error("数据不存在 {}, {}" ,orderNo,msg);
}
orderPaymentOptional.setStatus(PaymentStatusEnum.FAIL.getValue());
orderPaymentOptional.setReason(msg);
orderPaymentDao.updateEntityByKey(orderPaymentOptional);
}
@Override
public void updateOrderPaymentSuccess(String orderNo,Integer operation, String paymentItem) {
//查询冻结记录
OrderPayment orderPaymentOptional =
orderPaymentDao.selectByRelationNo(orderNo,operation,paymentItem).orNull();
if (null == orderPaymentOptional){
log.error("数据不存在 {}, {}" ,orderNo);
}
orderPaymentOptional.setStatus(PaymentStatusEnum.SUCCESS.getValue());
orderPaymentDao.updateEntityByKey(orderPaymentOptional);
}
@Override
public void updateOrderPaymentStatusById(String id,int status) {
//查询冻结记录
OrderPayment orderPaymentOptional = orderPaymentDao.getEntityByKey(Integer.valueOf(id)).orNull();
if (null == orderPaymentOptional){
log.error("数据不存在 {}, {}" ,id);
}
orderPaymentOptional.setStatus(status);
orderPaymentDao.updateEntityByKey(orderPaymentOptional);
}
@Override
public void updateOrderPaymentSerialNoSuccess(String orderNo, String serialNo, Integer operation, String paymentItem) {
OrderPayment orderPaymentOptional =
orderPaymentDao.selectByRelationNo(orderNo,operation,paymentItem).orNull();
if (null == orderPaymentOptional){
log.error("数据不存在 {}, {}" ,orderNo);
}
orderPaymentOptional.setStatus(PaymentStatusEnum.SUCCESS.getValue());
orderPaymentOptional.setSerialNo(serialNo);
orderPaymentDao.updateEntityByKey(orderPaymentOptional);
}
/**
* post请求
......@@ -187,7 +473,150 @@ public class PaymentServiceImpl implements PaymentService {
}
/**
* 创建支付流水号
*/
private String payOrderNoGenerate() {
return "5" + uniqueOrderNumService.getUniqueOrderNum(
LocalDateTimeUtils.convertLocalDateTimeToString(LocalDateTime.now(), LocalDateTimeUtils.DATE_DAY));
}
/**
* 构建司机冻结押金支付单元
* @param payDTO
* @param orderPayment
* @return
*/
public PayUserDTO buildDriverFreezeBatchDTO(PayPlatformFeeParam payDTO,OrderPayment orderPayment){
/** 构建支付单元 **/
PayUnitDTO payUnitDTO = PayUnitDTO.builder()
.id(orderPayment.getRelationNo())
.from(payDTO.getFrom())
.to(mslPaymentConfig.getSystemWalletCode())
.figure(payDTO.getFigure())
.type(PayUnitTypeEnum.FREEZE_PLATFORM_FEE.getCode())
.timestamp(System.currentTimeMillis() / 1000)
.remark(PayRemarkEnum.toString(PayRemarkEnum.DRIVER_CREDIT.getValue())).build();
/** 生成签名**/
PayEncryptTools.sign(payUnitDTO, PrivateKeyConfig.privateKeyByte);
/** 构建支付支付 ***/
PayUserDTO payUserDTO = PayUserDTO.builder()
.pwd("noCheckPwd") // 暂时不校验用户密码
.system(SystemCodeEnum.PERFORMANCE_SERVICE.getCode())
.userCode(payDTO.getFrom())
.orderNo(orderPayment.getRelationNo())
.uuid(UUID.randomUUID().toString().replaceAll("-", ""))
.notifyUrl(mslPaymentConfig.getNotifyhost() + NOTIFY_PLATFORM_FEE_URL)
.payUnitDTO(payUnitDTO).build();
return payUserDTO;
}
/**
* 构建 司机平台服务费冻结实体
*/
public FreezeBatchDTO buildChangeFreezeBatchDTO(OrderPayment orderPaymentOptional,Integer orderNo,Integer figure){
FreezeBatchDTO freezeBatchDTO = new FreezeBatchDTO();
List<FreezeUnitDTO> FreezeUnitList = new ArrayList<FreezeUnitDTO>();
FreezeUnitDTO freightPayUnitDTO = new FreezeUnitDTO();
/** 操作类型 1撤销 2完成 3修改*/
freightPayUnitDTO.setAction(PaymentActionEnum.Type.ADJUST.getCode());
/** 赔偿金额(单位分)0全部返回 */
freightPayUnitDTO.setFigure(Long.valueOf(figure));
/** 冻结序列号 (流水号)*/
freightPayUnitDTO.setFreezeNo(orderPaymentOptional.getSerialNo());
freightPayUnitDTO.setRemark(PayRemarkEnum.toString(PayRemarkEnum.UPDATE_DRIVER_FREEZE.getValue()));
freightPayUnitDTO.setTimestamp(System.currentTimeMillis() / 1000);
PayEncryptTools.sign(freightPayUnitDTO, PrivateKeyConfig.privateKeyByte);
FreezeUnitList.add(freightPayUnitDTO);
freezeBatchDTO.setFreezeUnitList(FreezeUnitList);
freezeBatchDTO.setOrderNo(orderNo+"");
freezeBatchDTO.setSystem(SystemCodeEnum.PERFORMANCE_SERVICE.getCode());
//回调地址
freezeBatchDTO.setNotifyUrl(mslPaymentConfig.getNotifyhost() + NOTIFY_ADJUST_PLATFORM_FEE_URL);
freezeBatchDTO.setUuid(UUID.randomUUID().toString().replaceAll("-", ""));
log.info("平衡司机冻结保证金支付调去参数==" + freezeBatchDTO.toString());
return freezeBatchDTO;
}
/**
* 构建 司机平台服务费取消实体
*/
public FreezeBatchDTO buildCanCelFreezeBatchDTO(OrderPayment orderPaymentOptional,String orderNo){
FreezeBatchDTO freezeBatchDTO = new FreezeBatchDTO();
List<FreezeUnitDTO> FreezeUnitList = new ArrayList<FreezeUnitDTO>();
FreezeUnitDTO payUnitDTO = new FreezeUnitDTO();
/** 操作类型 1撤销 2完成 3修改*/
payUnitDTO.setAction(PaymentActionEnum.Type.CANCEL.getCode());
/** 赔偿金额(单位分)0全部返回 */
payUnitDTO.setFigure(0L);
/** 冻结序列号 (流水号)*/
payUnitDTO.setFreezeNo(orderPaymentOptional.getSerialNo());
payUnitDTO.setFee(0L);
payUnitDTO.setRemark(PayRemarkEnum.toString(PayRemarkEnum.DRIVER_UNFREEZE.getValue()));
payUnitDTO.setTimestamp(System.currentTimeMillis() / 1000);
PayEncryptTools.sign(payUnitDTO, PrivateKeyConfig.privateKeyByte);
FreezeUnitList.add(payUnitDTO);
freezeBatchDTO.setFreezeUnitList(FreezeUnitList);
freezeBatchDTO.setOrderNo(orderNo);
freezeBatchDTO.setSystem(SystemCodeEnum.PERFORMANCE_SERVICE.getCode());
//回调地址
freezeBatchDTO.setNotifyUrl(mslPaymentConfig.getNotifyhost() + NOTIFY_CANCEL_PLATFORM_FEE_URL);
freezeBatchDTO.setUuid(UUID.randomUUID().toString().replaceAll("-", ""));
log.info("运单取消 退还司机保证金 ==" + freezeBatchDTO.toString());
return freezeBatchDTO;
}
/**
* 构建 司机平台服务费完成实体
*/
public FreezeBatchDTO buildCompleteFreezeBatchDTO(OrderPayment orderPaymentOptional,String String){
FreezeBatchDTO freezeBatchDTO = new FreezeBatchDTO();
List<FreezeUnitDTO> FreezeUnitList = new ArrayList<FreezeUnitDTO>();
FreezeUnitDTO payUnitDTO = new FreezeUnitDTO();
/** 操作类型 1撤销 2完成 3修改*/
payUnitDTO.setAction(PaymentActionEnum.Type.COMPLETE.getCode());
/** 赔偿金额(单位分)0全部返回 */
payUnitDTO.setFigure(0L);
/** 冻结序列号 (流水号)*/
payUnitDTO.setFreezeNo(orderPaymentOptional.getSerialNo());
payUnitDTO.setFee(0L);
payUnitDTO.setRemark(PayRemarkEnum.toString(PayRemarkEnum.DRIVER_UNFREEZE.getValue()));
payUnitDTO.setTimestamp(System.currentTimeMillis() / 1000);
PayEncryptTools.sign(payUnitDTO, PrivateKeyConfig.privateKeyByte);
FreezeUnitList.add(payUnitDTO);
freezeBatchDTO.setFreezeUnitList(FreezeUnitList);
freezeBatchDTO.setOrderNo(orderPaymentOptional.getRelationNo());
freezeBatchDTO.setSystem(SystemCodeEnum.PERFORMANCE_SERVICE.getCode());
//回调地址
freezeBatchDTO.setNotifyUrl(mslPaymentConfig.getNotifyhost() + NOTIFY_COMPLETE_PLATFORM_FEE_URL);
freezeBatchDTO.setUuid(UUID.randomUUID().toString().replaceAll("-", ""));
log.info("运单 完成 支付 司机保证金 ==" + freezeBatchDTO.toString());
return freezeBatchDTO;
}
/***
* 获取用户的钱包
* @param userCode
* @return
*/
@Override
public WalletResidueDTO getWalletAndCard(Integer userCode) {
WalletParam walletParam = new WalletParam();
walletParam.setUserCode(userCode);
Result<Object> notify = (Result<Object>) postRequest(mslPaymentConfig.getHost()
+ HttpEnum.PERFORMANCE_PAY_CLX_WALLET.getUrl(), JSON.toJSONString(walletParam));
log.info("获取司机钱包 {} 返回日志 {}",userCode, notify);
if (notify == null) {
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR);
}
if (notify.getCode() != 0) {
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, notify.getMsg());
}
return JSON.parseObject(notify.getData().toString(), WalletResidueDTO.class);
}
}
package com.clx.performance.service.impl;
import com.clx.performance.dao.PlatformServiceFeeConfigDao;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.model.PlatformServiceFeeConfig;
import com.clx.performance.param.pc.carrier.SavePlatformServiceFeeConfigParam;
import com.clx.performance.service.PlatformServiceFeeConfigService;
import com.clx.performance.struct.PlatformServiceFeeConfigStruct;
import com.clx.performance.vo.feign.PlatformServiceFeeConfigFeignVO;
import com.clx.performance.vo.pc.carrier.settle.CarrierPagePlatformServiceFeeConfigVO;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author yangqifa
*/
@Slf4j
@Service
@AllArgsConstructor
public class PlatformServiceFeeConfigServiceImpl implements PlatformServiceFeeConfigService {
private final PlatformServiceFeeConfigDao platformServiceFeeConfigDao;
private final PlatformServiceFeeConfigStruct platformServiceFeeConfigStruct;
@Override
public CarrierPagePlatformServiceFeeConfigVO listPlatformServiceFeeConfig() {
PlatformServiceFeeConfig config = platformServiceFeeConfigDao.listPlatformServiceFeeConfig();
return platformServiceFeeConfigStruct.convertToDetail(config);
}
@Override
public CarrierPagePlatformServiceFeeConfigVO getPlatformServiceFeeConfigDetail(int id) {
PlatformServiceFeeConfig config = platformServiceFeeConfigDao.getEntityByKey(id).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
return platformServiceFeeConfigStruct.convertToDetail(config);
}
@Override
public void updatePlatformServiceFeeConfig(SavePlatformServiceFeeConfigParam param) {
PlatformServiceFeeConfig config = new PlatformServiceFeeConfig();
config.setId(param.getId());
config.setOrderQuotationType(param.getOrderQuotationType());
config.setDeposit(param.getDeposit());
config.setServiceFeeRate(param.getServiceFeeRate());
platformServiceFeeConfigDao.updatePlatformServiceFeeConfig(config);
}
@Override
public PlatformServiceFeeConfigFeignVO getConfig() {
return platformServiceFeeConfigStruct
.convertPlatformServiceFeeConfigFeignVO(platformServiceFeeConfigDao.listPlatformServiceFeeConfig());
}
}
......@@ -5,14 +5,17 @@ import com.clx.performance.enums.BreakContractSettlementDriverEnum;
import com.clx.performance.enums.PayRemarkEnum;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.param.pc.payment.PayParam;
import com.clx.performance.param.pc.payment.PayPlatformFeeParam;
import com.clx.performance.service.PaymentService;
import com.clx.performance.model.breakcontract.BreakContractSettlementDriver;
import com.clx.performance.service.TempService;
import com.clx.performance.service.settle.SettlementService;
import com.msl.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Objects;
import java.util.UUID;
@Slf4j
......@@ -40,19 +43,38 @@ public class TempServiceImpl implements TempService {
}
@Override
public void paymentTest(String fromUser, String toUser, String figure) {
PayParam noCheckPwd = PayParam.builder().from(
Integer.valueOf(fromUser))
.to(Integer.valueOf(toUser))
.figure(Integer.valueOf(figure))
.tradeNo(UUID.randomUUID().toString().replaceAll("-", ""))
.tradeId("12345")
.pwd("noCheckPwd")
.remark(PayRemarkEnum.toString(PayRemarkEnum.FREIGHT_TO_OWNER.getValue()))
.build();
paymentService.paymentWallet(noCheckPwd);
public void paymentTest(String fromUser, String pwd, String tradeNo,int type) {
// PayParam noCheckPwd = PayParam.builder().from(
// Integer.valueOf(fromUser))
// .to(Integer.valueOf(toUser))
// .figure(Integer.valueOf(figure))
// .tradeNo(UUID.randomUUID().toString().replaceAll("-", ""))
// .tradeId("12345")
// .pwd("noCheckPwd")
// .remark(PayRemarkEnum.toString(PayRemarkEnum.FREIGHT_TO_OWNER.getValue()))
// .build();
//
//
// paymentService.paymentWallet(noCheckPwd);
PayPlatformFeeParam payPlatformFeeParam = new PayPlatformFeeParam();
payPlatformFeeParam.setFigure(678);
payPlatformFeeParam.setFrom(Integer.valueOf(fromUser));
payPlatformFeeParam.setPwd(pwd);
payPlatformFeeParam.setTradeNo(tradeNo);
if(Objects.equals(type,1)){
paymentService.paymentPlatformFee(payPlatformFeeParam);
}
if(Objects.equals(type,2)){
paymentService.paymentChangePlatformFee(payPlatformFeeParam);
}
if(Objects.equals(type,3)){
paymentService.paymentCompletePlatformFee(payPlatformFeeParam);
}
if(Objects.equals(type,4)){
paymentService.paymentCancelPlatformFee(payPlatformFeeParam);
}
}
}
package com.clx.performance.service.impl.broker;
import com.clx.order.feign.AddressFeign;
import com.clx.order.feign.OrderFeign;
import com.clx.order.vo.feign.FeignAddressVO;
import com.clx.order.vo.feign.FeignOrderVO;
import com.clx.order.vo.pc.carrier.InvoicingCompanyVO;
import com.clx.performance.dao.OrderChildImageDao;
import com.clx.performance.enums.PowerTypeEnum;
import com.clx.performance.extranal.broker.BrokerService;
import com.clx.performance.extranal.order.InvoicingCompanyService;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderChildImage;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.service.broker.OrderChildBrokerService;
import com.clx.performance.vo.pc.broker.*;
import com.clx.user.feign.DocumentFeign;
import com.clx.user.feign.DriverFeign;
import com.clx.user.feign.OwnerFeign;
import com.clx.user.feign.TruckFeign;
import com.clx.user.vo.feign.*;
import com.msl.common.utils.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Slf4j
@Service
public class OrderChildBrokerServiceImpl implements OrderChildBrokerService {
private static final String LONG_TERM_TIME = "2099-01-01 00:00:00";
@Autowired
private BrokerService brokerService;
@Autowired
private OwnerFeign ownerFeign;
@Autowired
private OrderFeign orderFeign;
@Autowired
private AddressFeign addressFeign;
@Autowired
private DriverFeign driverFeign;
@Autowired
private DocumentFeign documentFeign;
@Autowired
private TruckFeign truckFeign;
@Autowired
private OrderChildImageDao orderChildImageDao;
@Autowired
private InvoicingCompanyService invoicingCompanyService;
@Override
public void orderChildSync(OrderChild orderChild, OrderGoods orderGoods, SettlementOwnerDetail settlementOwnerDetail,
SettlementDriverDetail settlementDriverDetail) {
String host = documentFeign.getHost().getData();
FeignOrderVO orderInfoFeign = orderFeign.getOrderInfoFeign(orderGoods.getOrderNo());
String ownerMobile = ownerFeign.getOwnerInfo(orderInfoFeign.getOwnerUserNo()).getData().getMobile();
FeignAddressVO data = addressFeign.getSendAndReceiveAddress(orderChild.getSendAddressId(), orderChild.getReceiveAddressId()).getData();
FeignAddressVO.Address receiveAddress = data.getReceiveAddress();
FeignAddressVO.Address sendAddress = data.getSendAddress();
SyncOrderChildVO syncOrderChildVO = driverFeign.getSyncOrderChild(orderChild.getDriverUserNo(), orderChild.getTruckOwnUserNo()).getData();
DriverInfoFeignVo truckOwnerInfo = syncOrderChildVO.getTruckOwnerInfo();
DriverInfoFeignVo diverInfo = syncOrderChildVO.getDiverInfo();
BankCardVO driverBankCard = syncOrderChildVO.getDriverBankCard();
UserIdCardVO driverUserIdCardVO = syncOrderChildVO.getDriverUserIdCardVO();
BankCardVO truckOwnerBankCard = syncOrderChildVO.getTruckOwnerBankCard();
UserIdCardVO truckOwnerUserIdCardVO = syncOrderChildVO.getTruckOwnerUserIdCardVO();
DriverLicenceFeignVO driverLicenceFeignVO = syncOrderChildVO.getDriverLicenceFeignVO();
TruckInfoFeignVo truckInfoFeignVo = truckFeign.getTruckInfoWithTransport(orderChild.getTruckId()).getData();
InvoicingCompanyVO invoicingCompanyByGroupCode = invoicingCompanyService.getInvoicingCompanyByGroupCode(orderChild.getInvoicingCompanyGroupCode());
// 参数组装
TransportParam transportParam = new TransportParam();
transportParam.setTransportPlatformCode(invoicingCompanyByGroupCode.getNetworkCargoCompanyCode());
transportParam.setOrderCode(orderChild.getChildNo());
transportParam.setOwnerMobile(ownerMobile);
// 货单
OpenOrderDTO orderInfo = new OpenOrderDTO();
orderInfo.setSourceOrderNo(orderChild.getOrderGoodsNo());
orderInfo.setPublishTime(DateUtils.formatDateTime(orderGoods.getPendingOrderTime()).get());
orderInfo.setExtractTime(DateUtils.formatDateTime(orderGoods.getLastLoadTime()).get());
orderInfo.setArriveTime(DateUtils.formatDateTime(orderGoods.getLastArriveSendTime()).get());
orderInfo.setGoodsAmount(orderGoods.getExtractWeight());
orderInfo.setGoodsName(orderGoods.getGoodsName());
orderInfo.setTransPrice(Integer.valueOf(orderChild.getFreightPrice().toString()));
orderInfo.setGoodsPrice(Integer.valueOf(orderChild.getOrderFreightPrice().toString()));
// orderInfo.setSendCompany();
orderInfo.setSendAddress(sendAddress.getAddress());
orderInfo.setSendName(sendAddress.getContact());
// orderInfo.setReceiveCompany();
orderInfo.setReceiveAddress(receiveAddress.getAddress());
orderInfo.setReceiveName(receiveAddress.getContact());
orderInfo.setSendProvince(sendAddress.getProvince());
orderInfo.setSendCity(sendAddress.getCity());
orderInfo.setSendCounty(sendAddress.getCounty());
orderInfo.setSendTown(sendAddress.getTown());
orderInfo.setSendMobile(sendAddress.getContactPhone());
orderInfo.setLoadLongitude(sendAddress.getLongitude().toString());
orderInfo.setLoadLatitude(sendAddress.getLatitude().toString());
orderInfo.setReceiveProvince(receiveAddress.getProvince());
orderInfo.setReceiveCity(receiveAddress.getCity());
orderInfo.setReceiveCounty(receiveAddress.getCounty());
orderInfo.setReceiveTown(receiveAddress.getTown());
orderInfo.setReceiveMobile(receiveAddress.getContactPhone());
orderInfo.setUnloadLongitude(receiveAddress.getLongitude().toString());
orderInfo.setUnloadLatitude(receiveAddress.getLatitude().toString());
// 图片
List<OpenOrderChildImageDTO> imageList = new ArrayList<>();
List<OrderChildImage> orderChildImages = orderChildImageDao.listLoadAndUnload(orderChild.getChildNo()).get();
for (OrderChildImage image : orderChildImages) {
if (image.getType().equals(OrderChildImage.Type.LOAD.getCode())) {
imageList.add(new OpenOrderChildImageDTO(2, host + image.getImage()));
} else if (image.getType().equals(OrderChildImage.Type.UNLOAD.getCode())) {
imageList.add(new OpenOrderChildImageDTO(21, host + image.getImage()));
}
}
// 司机
OpenOrderChildDriverDTO driverInfo = new OpenOrderChildDriverDTO();
driverInfo.setMobile(diverInfo.getMobile());
driverInfo.setName(diverInfo.getName());
driverInfo.setSex(driverUserIdCardVO.getSex());
driverInfo.setCardNo(driverUserIdCardVO.getCardNo());
driverInfo.setIdCardAddress(driverUserIdCardVO.getAddress());
driverInfo.setCardStartTime(driverUserIdCardVO.getCardStartTime());
driverInfo.setCardEndTime(Objects.equals(driverUserIdCardVO.getCardLongTerm(), 1)
? LONG_TERM_TIME
: driverUserIdCardVO.getCardEndTime());
driverInfo.setCardLongTerm(driverUserIdCardVO.getCardLongTerm());
driverInfo.setCardFrontImg(host + driverUserIdCardVO.getCardFaceImg());
driverInfo.setCardBackImg(host + driverUserIdCardVO.getCardBackImg());
driverInfo.setFaceCardImg(host + driverUserIdCardVO.getCardInHandImg());
driverInfo.setLicenceNo(driverLicenceFeignVO.getLicenceNo());
driverInfo.setLicenceIssueOrganization(driverLicenceFeignVO.getLicenceIssueOrganization());
driverInfo.setLicenseTime(DateUtils.formatDateTime(driverLicenceFeignVO.getLicenceTime()).get());
driverInfo.setLicenceClass(driverLicenceFeignVO.getLicenceClass());
driverInfo.setLicenceImg(host + driverLicenceFeignVO.getLicenceImg());
driverInfo.setLicenceBackImg(host + driverLicenceFeignVO.getLicenceBackImg());
driverInfo.setLicenceStartTime(DateUtils.formatDateTime(driverLicenceFeignVO.getLicenceStartTime()).get());
driverInfo.setLicenceEndTime(Objects.equals(driverLicenceFeignVO.getLicenceLongTerm(), 1)
? LONG_TERM_TIME
: DateUtils.formatDateTime(driverLicenceFeignVO.getLicenceEndTime()).get());
// driverInfo.setTransportLicenceImg(truckInfoFeignVo.getTransportLicenceImg());
driverInfo.setOccupationalLicenceNo(driverLicenceFeignVO.getOccupationalLicenceNo());
driverInfo.setOccupationalLicenceImg(host + driverLicenceFeignVO.getOccupationalLicenceImg());
driverInfo.setOccupationalEndTime(DateUtils.formatDateTime(driverLicenceFeignVO.getOccupationalLicenceStartTime()).get());
driverInfo.setOccupationalEndTime(DateUtils.formatDateTime(driverLicenceFeignVO.getOccupationalLicenceEndTime()).get());
driverInfo.setBankCardNo(driverBankCard.getCardNo());
driverInfo.setBankMobile(driverBankCard.getMobile());
driverInfo.setBankName(driverBankCard.getBank());
// 车主
OpenOrderChildTruckOwnerDTO ownerInfo = new OpenOrderChildTruckOwnerDTO();
ownerInfo.setMobile(truckOwnerInfo.getMobile());
ownerInfo.setName(truckOwnerInfo.getName());
ownerInfo.setSex(truckOwnerUserIdCardVO.getSex());
ownerInfo.setCardNo(truckOwnerUserIdCardVO.getCardNo());
ownerInfo.setIdCardAddress(truckOwnerUserIdCardVO.getAddress());
ownerInfo.setCardStartTime(truckOwnerUserIdCardVO.getCardStartTime());
ownerInfo.setCardEndTime(Objects.equals(truckOwnerUserIdCardVO.getCardLongTerm(), 1)
? LONG_TERM_TIME
: truckOwnerUserIdCardVO.getCardEndTime());
ownerInfo.setCardLongTerm(truckOwnerUserIdCardVO.getCardLongTerm());
ownerInfo.setCardFrontImg(host + truckOwnerUserIdCardVO.getCardFaceImg());
ownerInfo.setCardBackImg(host + truckOwnerUserIdCardVO.getCardBackImg());
ownerInfo.setFaceCardImg(host + truckOwnerUserIdCardVO.getCardInHandImg());
ownerInfo.setBankCardNo(truckOwnerBankCard.getCardNo());
ownerInfo.setBankMobile(truckOwnerBankCard.getMobile());
ownerInfo.setBankName(truckOwnerBankCard.getBank());
// 车辆
OpenOrderChildTruckDTO truckInfo = new OpenOrderChildTruckDTO();
truckInfo.setTruckNo(orderChild.getTruckNo());
truckInfo.setTruckNoColor(truckInfoFeignVo.getTruckNoColor());
// truckInfo.setTruckNoColorCode();
truckInfo.setModel(truckInfoFeignVo.getModel());
truckInfo.setLoad(truckInfoFeignVo.getLoad());
truckInfo.setGrossMass(truckInfoFeignVo.getGrossMass().intValue());
truckInfo.setIdentifyCode(truckInfoFeignVo.getIdentifyCode());
truckInfo.setUseNature(truckInfoFeignVo.getUseNature());
truckInfo.setRegisterDate(DateUtils.formatDateTime(truckInfoFeignVo.getRegisterDate()).get());
truckInfo.setLicenceIssueOrganization(truckInfoFeignVo.getLicenceIssueOrganization());
truckInfo.setLicenceIssueDate(DateUtils.formatDateTime(truckInfoFeignVo.getLicenceIssueDate()).get());
truckInfo.setBusinessName(truckInfoFeignVo.getBusinessName());
truckInfo.setRoadTransportPermitNumber(truckInfoFeignVo.getRoadTransportPermitNumber());
truckInfo.setTruckNo2(truckInfoFeignVo.getTruckNo2());
truckInfo.setRoadTransportCertificateNo(truckInfoFeignVo.getRoadTransportCertificateNo());
truckInfo.setLicenceImgMain(host + truckInfoFeignVo.getLicenceImgMain());
truckInfo.setLicenceImgSecond(host + truckInfoFeignVo.getLicenceImgSecond());
truckInfo.setLicenceImgSecondBack(host + truckInfoFeignVo.getLicenceImgSecondBack());
truckInfo.setTransportLicenceImg(host + truckInfoFeignVo.getTransportLicenceImg());
truckInfo.setLicenceImgMain2(host + truckInfoFeignVo.getLicenceImgMain2());
truckInfo.setLicenceImgSecond2(host + truckInfoFeignVo.getLicenceImgSecond2());
truckInfo.setTransportLicenceImg2(host + truckInfoFeignVo.getTransportLicenceImg2());
truckInfo.setPowerType(StringUtils.isBlank(truckInfoFeignVo.getPowerType())
? PowerTypeEnum.Type.OTHER.getCode()
: PowerTypeEnum.Type.getCodeByName(truckInfoFeignVo.getPowerType()));
// 运单
OpenOrderChildDTO orderChildInfo = new OpenOrderChildDTO();
orderChildInfo.setSourceChildNo(orderChild.getChildNo());
orderChildInfo.setSourceGoodsNo(orderChild.getOrderGoodsNo());
orderChildInfo.setSourceOrderNo(orderChild.getOrderNo());
orderChildInfo.setSourceSettlementNo(settlementOwnerDetail.getSettlementNo());
orderChildInfo.setFreight(orderChild.getFreight().intValue());
orderChildInfo.setDriverFreight(orderChild.getFreight().intValue());
orderChildInfo.setDriverFreightPrice(orderChild.getFreightPrice().intValue());
orderChildInfo.setFreightPrice(settlementOwnerDetail.getFreightPrice().intValue());
orderChildInfo.setInvoiceFreight(settlementOwnerDetail.getInvoiceFreight().intValue());
orderChildInfo.setLossFee(settlementOwnerDetail.getLossFreight().intValue());
orderChildInfo.setLossFeePrice(settlementOwnerDetail.getLossPrice().intValue());
orderChildInfo.setSendTare(orderChild.getLoadTare());
orderChildInfo.setSendRough(orderChild.getLoadRough());
orderChildInfo.setSendNet(orderChild.getLoadNet());
orderChildInfo.setPayTime(DateUtils.formatDateTime(orderChild.getPayTime()).get());
orderChildInfo.setLoadTime(DateUtils.formatDateTime(orderChild.getLoadTime()).get());
orderChildInfo.setUnloadTime(DateUtils.formatDateTime(orderChild.getUnloadTime()).get());
orderChildInfo.setPayFinishedTime(DateUtils.formatDateTime(orderChild.getConfirmTime()).get());
orderChildInfo.setReceiveTare(orderChild.getUnloadTare());
orderChildInfo.setReceiveRough(orderChild.getUnloadRough());
orderChildInfo.setReceiveNet(orderChild.getUnloadNet());
transportParam.setOrder(orderInfo);
transportParam.setOrderChildImage(imageList);
transportParam.setOrderChildDriver(driverInfo);
transportParam.setOrderChildTruckOwner(ownerInfo);
transportParam.setOrderChildTruck(truckInfo);
transportParam.setOrderChild(orderChildInfo);
brokerService.orderChildSync(transportParam);
}
}
package com.clx.performance.service.impl.ordergoods;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.service.ordergoods.OrderGoodsPostService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
public class OrderGoodsPostServiceImpl implements OrderGoodsPostService {
@Override
public void orderGoodsAdd(OrderGoods orderGoods) {
}
@Override
public void orderGoodsAdd(List<OrderGoods> orderGoodsList) {
}
}
......@@ -21,6 +21,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
/**
......@@ -71,11 +72,9 @@ public class NetworkDriverAccountServiceImpl implements NetworkDriverAccountServ
Result<WalletResidueCardVO> result = paymentServiceFeign.getWallet(userCode);
WalletResidueCardVO data = result.getData();
NetworkDriverAccount account = networkDriverAccountDao.getOneByField(NetworkDriverAccount::getDriverUserNo, loginUserInfo.getUserNo()).get();
data.setAssetSum(data.getAssetSum().add(account.getAccountBalance().movePointLeft(2)));
data.setFrozen(new BigDecimal(data.getFrozen()).add(account.getFrozenBalance().movePointLeft(2)).longValue());
data.setResidue(new BigDecimal(data.getResidue()).add(account.getUsableBalance().movePointLeft(2)).longValue());
data.setFrozen(data.getFrozen().add(account.getFrozenBalance()).setScale(2, RoundingMode.UP));
data.setResidue(data.getResidue().add(account.getUsableBalance()).setScale(2, RoundingMode.UP));
return data;
}
}
......@@ -19,8 +19,6 @@ import com.clx.performance.vo.app.APPNetworkDriverRunningWaterRecordVO;
import com.clx.performance.vo.pc.NetworkDriverRunningWaterRecordVO;
import com.clx.user.feign.DriverFeign;
import com.clx.user.vo.feign.BankCardVO;
import com.msl.common.base.Optional;
import com.msl.common.enums.ResultCodeEnum;
import com.msl.common.result.Result;
import com.msl.user.utils.TokenUtil;
import lombok.AllArgsConstructor;
......@@ -33,7 +31,6 @@ import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import static java.util.Locale.filter;
......@@ -200,6 +197,36 @@ public class NetworkDriverRunningWaterRecordServiceImpl implements NetworkDriver
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void generateCaseOutSuccessRunningWaterRecord1(SettlementDriverDetail settlementDriverDetail) {
log.info("运单同步网络货运生成司机运单提现成功流水");
NetworkDriverAccount account = networkDriverAccountDao.getOneByField(NetworkDriverAccount::getDriverUserNo, settlementDriverDetail.getDriverUserNo()).get();
networkDriverRunningWaterRecordDao.updateFrozenFlagByChildNo(settlementDriverDetail.getChildNo());
NetworkDriverRunningWaterRecord entity = NetworkDriverRunningWaterRecord.builder()
.usableBalance(account.getUsableBalance())
.mobile(account.getMobile())
.alterationBalance(settlementDriverDetail.getSettlementFreight())
.accountBalance(account.getAccountBalance())
.frozenBalance(account.getFrozenBalance()).createBy("系统")
.fundType(NetworkDriverAccountEnum.FundType.EXPENDITURE.getCode())
.fundTypeMsg(NetworkDriverAccountEnum.FundType.EXPENDITURE.getMsg())
.driverUserName(account.getDriverUserName())
.driverUserNo(account.getDriverUserNo())
.runningWaterNo(idGenerateSnowFlake.nextId(3L))
.runningWaterTypeMsg(NetworkDriverAccountEnum.RunningWaterStatus.CASE_OUT_SUCCESS.getMsg())
.runningWaterType(NetworkDriverAccountEnum.RunningWaterStatus.CASE_OUT_SUCCESS.getCode())
.childNo(settlementDriverDetail.getChildNo())
.orderNo(settlementDriverDetail.getOrderNo())
.orderGoodsNo(settlementDriverDetail.getOrderGoodsNo())
.build();
networkDriverRunningWaterRecordDao.saveEntity(entity);
}
@Override
public void generateNetworkDriverRunningWaterRecord(SettlementDriverDetail settlementDriverDetail, Integer runningWaterType) {
if (NetworkDriverAccountEnum.RunningWaterStatus.SETTLEMENT.getCode().equals(runningWaterType)) {
......
package com.clx.performance.service.impl.settle;
import com.clx.order.enums.QuotationEnum;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.dao.settle.NetworkCaseOutRecordDao;
import com.clx.performance.dao.settle.OrderChildSyncTransportRecordDao;
import com.clx.performance.dao.settle.SettlementOwnerDetailDao;
import com.clx.performance.dto.PayStatusNotifyDTO;
import com.clx.performance.enums.NetworkDriverAccountEnum;
import com.clx.performance.enums.OrderChildEnum;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.enums.settle.SettlementOwnerDetailEnum;
import com.clx.performance.enums.settle.SettlementWayEnum;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.settle.OrderChildSyncTransportRecord;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.param.pc.payment.PayPlatformFeeParam;
import com.clx.performance.service.PaymentService;
import com.clx.performance.service.settle.NetworkDriverRunningWaterRecordService;
import com.clx.performance.service.settle.OrderChildSyncTransportRecordService;
import com.clx.performance.service.settle.SettlementDriverDetailService;
import com.clx.performance.service.settle.SettlementDriverService;
import com.clx.performance.struct.settle.SettlementDriverDetailStruct;
import com.msl.common.result.Result;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.Objects;
/**
* @author kavin
......@@ -36,23 +55,71 @@ public class OrderChildSyncTransportRecordServiceImpl implements OrderChildSyncT
private final SettlementDriverDetailService settlementDriverDetailService;
private final OrderChildDao orderChildDao;
private final PaymentService paymentService;
private final OrderGoodsDao orderGoodsDao;
private final SettlementOwnerDetailDao settlementOwnerDetailDao;
@Override
public void addOrderChildSyncTransportRecord(SettlementDriverDetail detail) {
OrderChildSyncTransportRecord record = struct.convertRecord(detail);
record.setId(null);
//0:未同步
record.setStatus(0);
orderChildSyncTransportRecordDao.saveEntity(record);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void updateStatus(PayStatusNotifyDTO payStatusNotifyDTO) {
String childNo = payStatusNotifyDTO.getChildNo();
//支付平台服务费
OrderChild orderChild = orderChildDao.getByChildNo(childNo).orElseThrow(PerformanceResultEnum.ORDER_CHILD_NO_FOUND);
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).orElseThrow(PerformanceResultEnum.ORDER_CHILD_NO_FOUND);
SettlementOwnerDetail settlementOwnerDetail = settlementOwnerDetailDao
.getByChildNo(orderChild.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
settlementOwnerDetail.setPayStatus(SettlementOwnerDetailEnum.PayStatus.YES.getCode());
settlementOwnerDetailDao.updatePayStatus(settlementOwnerDetail);
orderChildSyncTransportRecordDao.updateStatus(childNo);
networkCaseOutRecordDao.updateStatus(payStatusNotifyDTO.getChildNo(),
NetworkDriverAccountEnum.CaseOutRecordStatus.PAYED.getCode(),
NetworkDriverAccountEnum.CaseOutRecordStatus.PAYED.getMsg()
);
SettlementDriverDetail driverDetail = settlementDriverDetailService.selectOneByChildNo(childNo);
orderChild.setStatus(OrderChildEnum.Status.COMPLETE.getCode());
orderChild.setSettleTime(LocalDateTime.now());
orderChild.setFinishTime(orderChild.getSettleTime());
orderChildDao.updateSettlement(orderChild);
if (Objects.equals(orderGoods.getPlatformFreightQuotationTaxType(),
QuotationEnum.PlatformFreightQuotationTaxType.NO.getCode())
&& Objects.equals(orderGoods.getSettlementWay(), SettlementWayEnum.WayType.UNLOAD_LOSS.getCode())) {
// 未税,卸车减货损
networkDriverRunningWaterRecordService.generateCaseOutSuccessRunningWaterRecord1(driverDetail);
}
else {
networkDriverRunningWaterRecordService.generateCaseOutSuccessRunningWaterRecord(driverDetail);
}
try{
//支付平台服务费
if (Objects.nonNull(orderChild.getPlatformServiceFee()) &&
!Objects.equals(orderChild.getPlatformServiceFee().intValue(), 0)) {
PayPlatformFeeParam payPlatformFeeParam = PayPlatformFeeParam.builder()
.figure(orderChild.getPlatformServiceFee().intValue())
.tradeNo(childNo)
.build();
Result result = paymentService.paymentCompletePlatformFee(payPlatformFeeParam);
log.info("运单完成 第三方回调 {} ,{} " ,childNo,result);
}
}catch (Exception e){
log.error("支付平台服务费异常 {}",e);
}
}
}
package com.clx.performance.service.impl.settle;
import com.clx.performance.enums.settle.SettlementWayEnum;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.service.settle.SettlementCommonService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Objects;
@Slf4j
@Service
public class SettlementCommonServiceImpl implements SettlementCommonService {
/**
* 开票服务费金额
*/
@Override
public BigDecimal invoiceServiceFeeCalc(Integer settlementWay, SettlementOwnerDetail settlementOwnerDetail) {
return settlementOwnerDetail.getFreight().subtract(settlementOwnerDetail.getLossFreight()).setScale(0, RoundingMode.HALF_UP)
.divide(BigDecimal.ONE.subtract(settlementOwnerDetail.getInvoiceServiceFeeRate().movePointLeft(2)), 0, RoundingMode.HALF_UP)
.multiply(settlementOwnerDetail.getInvoiceServiceFeeRate().movePointLeft(2)).setScale(0, RoundingMode.HALF_UP);
}
/**
* 开票金额
*/
@Override
public BigDecimal invoiceFreightCalc(Integer settlementWay, BigDecimal invoiceServiceFeeRate, SettlementOwnerDetail settlementOwnerDetail) {
if (Objects.equals(settlementWay, SettlementWayEnum.WayType.LOAD.getCode())) { //订单结算方式为“装车净重”时,开票金额=实际净重*平台运费报价-货损金额。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice()).setScale(0, RoundingMode.HALF_UP)
.subtract(settlementOwnerDetail.getLossFreight());
}
else if (Objects.equals(settlementWay, SettlementWayEnum.WayType.UNLOAD_LOSS.getCode())) {
if (invoiceServiceFeeRate!=null){
//结算方式为“卸车净重(减货损)”,平台运费报价为“未税”时,开票金额=平台运费单价*实际净重-货损单价*货损吨数+开票服务费。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice()).setScale(0, RoundingMode.HALF_UP)
.subtract(settlementOwnerDetail.getLossFreight())
.add(settlementOwnerDetail.getInvoiceServiceFee());
}
else{
//结算方式为“卸车净重(减货损)”,平台运费报价为“含税”时 开票金额=平台运费单价*实际净重-货损单价*货损吨数
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice()).setScale(0, RoundingMode.HALF_UP)
.subtract(settlementOwnerDetail.getLossFreight());
}
}
else { //订单结算方式为“卸车净重”时,开票金额=实际净重*平台运费报价。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice()).setScale(0, RoundingMode.HALF_UP);
}
}
@Override
public BigDecimal settlementFreightCalc(Integer settlementWay, SettlementOwnerDetail settlementOwnerDetail) {
if (Objects.equals(settlementWay, SettlementWayEnum.WayType.LOAD.getCode())) { //订单结算方式为“装车净重”时,结算金额=实际净重*平台运费报价-预付运费-货损金额。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice()).setScale(0, RoundingMode.HALF_UP)
.subtract(settlementOwnerDetail.getPrepayFreight()).subtract(settlementOwnerDetail.getLossFreight());
}
else if (Objects.equals(settlementWay, SettlementWayEnum.WayType.UNLOAD_LOSS.getCode())) {
//结算方式为“卸车净重(减货损)“,结算金额=开票金额-预付运费金额-借款抵扣金额。
return settlementOwnerDetail.getInvoiceFreight()
.subtract(settlementOwnerDetail.getPrepayFreight())
.subtract(settlementOwnerDetail.getLoanFreight());
}else { //订单结算方式为“卸车净重”时,结算金额=实际净重*平台运费报价-预付运费
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice()).setScale(0, RoundingMode.HALF_UP)
.subtract(settlementOwnerDetail.getPrepayFreight());
}
}
}
......@@ -63,6 +63,18 @@ public class SettlementDriverDetailServiceImpl implements SettlementDriverDetai
// 结算金额
settlementDriverDetail.setSettlementFreight(settlementFreightCalc(settlementDriverDetail.getFreight(), settlementDriverDetail.getLossFreight()));
settlementDriverDetail.setInvoicingCompanyId(orderChild.getInvoicingCompanyId());
settlementDriverDetail.setInvoicingCompanyShorterName(orderChild.getInvoicingCompanyShorterName());
settlementDriverDetail.setInvoicingCompanyGroupCode(orderChild.getInvoicingCompanyGroupCode());
// 平台服务费: 司机结算金额*平台服务费费率
settlementDriverDetail.setPlatformServiceFeeRate(orderChild.getPlatformServiceFeeRate()==null
? BigDecimal.ZERO
: orderChild.getPlatformServiceFeeRate());
settlementDriverDetail.setPlatformServiceFee(orderChild.getPlatformServiceFee()==null
? BigDecimal.ZERO
: orderChild.getPlatformServiceFee());
settlementDriverDetailDao.saveEntity(settlementDriverDetail);
return settlementDriverDetail.getId();
......@@ -95,13 +107,6 @@ public class SettlementDriverDetailServiceImpl implements SettlementDriverDetai
}
/**
* 开票金额
*/
private BigDecimal invoiceFreightCalc(BigDecimal freight, BigDecimal lossFreight){
return freight.subtract(lossFreight);
}
/**
* 结算金额
*/
......
package com.clx.performance.service.impl.settle;
import cn.hutool.json.JSONUtil;
import com.clx.order.enums.QuotationEnum;
import com.clx.order.vo.feign.FeignOrderInfoVO;
import com.clx.performance.config.MslPaymentConfig;
import com.clx.performance.constant.RedissonConstants;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OrderChildSyncTransportInvoiceRecordDao;
import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.dao.settle.SettlementDriverDao;
import com.clx.performance.dao.settle.SettlementDriverDetailDao;
import com.clx.performance.dao.settle.SettlementOwnerDao;
import com.clx.performance.dao.settle.SettlementOwnerDetailDao;
import com.clx.performance.enums.OrderChildEnum;
import com.clx.performance.enums.OrderChildLogEnum;
import com.clx.performance.enums.PayRemarkEnum;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.dao.settle.*;
import com.clx.performance.dto.InvoicingStatusNotifyDTO;
import com.clx.performance.dto.PayStatusNotifyDTO;
import com.clx.performance.enums.*;
import com.clx.performance.enums.settle.*;
import com.clx.performance.extranal.broker.BrokerService;
import com.clx.performance.extranal.user.DriverService;
import com.clx.performance.extranal.user.OrderService;
import com.clx.performance.extranal.user.OwnerInfoService;
import com.clx.performance.listener.OrderChildSyncTransportListener;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderChildSyncTransportInvoiceRecord;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.settle.SettlementDriver;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwner;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.model.settle.*;
import com.clx.performance.param.pc.payment.PayParam;
import com.clx.performance.param.pc.payment.PayPlatformFeeParam;
import com.clx.performance.service.OrderChildLogService;
import com.clx.performance.service.PaymentService;
import com.clx.performance.service.impl.UniqueOrderNumService;
import com.clx.performance.service.settle.OrderChildSyncTransportRecordService;
import com.clx.performance.service.settle.SettlementLogService;
import com.clx.performance.service.settle.SettlementMqHandlerService;
import com.clx.performance.service.settle.SettlementService;
import com.clx.performance.service.settle.*;
import com.clx.performance.utils.LocalDateTimeUtils;
import com.clx.performance.utils.RedisUtil;
import com.clx.performance.vo.mq.SettlementDetailAddMqParam;
import com.clx.performance.vo.mq.SettlementDetailInvoiceTypeSyncMqParam;
import com.clx.performance.utils.spring.ApplicationContextUtils;
import com.clx.performance.vo.mq.*;
import com.clx.performance.vo.pc.broker.TransportVO;
import com.clx.user.vo.feign.DriverInfoFeignVo;
import com.clx.user.vo.feign.OwnerInfoFeignVO;
import com.msl.common.enums.ResultCodeEnum;
......@@ -49,6 +46,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
......@@ -94,6 +92,12 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
@Autowired
private OrderChildDao orderChildDao;
@Autowired
private SettlementPlatformServiceFeeDao settlementPlatformServiceFeeDao;
@Autowired
private OrderChildSyncTransportInvoiceRecordDao orderChildSyncTransportInvoiceRecordDao;
@Autowired
private OrderChildLogService orderChildLogService;
......@@ -105,17 +109,34 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
@Autowired
private OrderService orderService;
@Autowired
private OrderChildSyncTransportListener orderChildSyncTransportListener;
@Autowired
private BrokerService brokerService;
@Autowired
private OrderChildSyncTransportRecordService orderChildSyncTransportRecordService;
@Autowired
private SettlementMqService settlementMqService;
@Autowired
private OrderChildSyncTransportRecordDao orderChildSyncTransportRecordDao;
@Override
@Transactional(rollbackFor = Exception.class)
public void settlementDetailInvoiceTypeSync(SettlementDetailInvoiceTypeSyncMqParam mq) {
public void settlementStatistics(SettlementStatisticsMqParam mq) {
OrderChild orderChild = orderChildDao.getByChildNo(mq.getChildNo()).orElseThrow(PerformanceResultEnum.ORDER_CHILD_NO_FOUND);
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
SettlementOwnerDetail settlementOwnerDetail = settlementOwnerDetailDao.getByChildNo(mq.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
SettlementDriverDetail settlementDriverDetail = settlementDriverDetailDao.getByChildNo(mq.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
log.info("当前车主计费信息{},司机计费信息:{}", JSONUtil.parse(settlementOwnerDetail), JSONUtil.parse(settlementDriverDetail));
if (settlementOwnerDetail.getInvoiceFreight() == null) {
log.info("当前车主计费信息开票金额为空,需要重新处理计算开票金额");
OrderChild orderChild = orderChildDao.getByChildNo(mq.getChildNo()).get();
settlementOwnerDetail.setInvoiceFreight(invoiceFreightCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
settlementOwnerDetail.setInvoiceFreight(invoiceFreightCalc(orderChild.getSettlementWay(), orderGoods.getInvoiceServiceFeeRate(), settlementOwnerDetail));
SettlementOwnerDetail update = new SettlementOwnerDetail();
update.setId(settlementOwnerDetail.getId());
update.setInvoiceFreight(settlementOwnerDetail.getInvoiceFreight());
......@@ -126,28 +147,49 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
OwnerInfoFeignVO ownerInfo = ownerInfoService.getOwnerInfo(settlementOwnerDetail.getOwnerUserNo());
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(settlementOwnerDetail.getOrderGoodsNo()).get();
if (Objects.equals(orderGoods.getSettlementAccountPeriod(),2)){ //月结
log.info("月结初始化货主结算单");
LocalDateTime settlementPeriodTime = LocalDateTimeUtils.getBeginMonthDate();
settlementOwner = settlementOwnerDao.selectUnlockOfSettlementPeriodMonth(settlementOwnerDetail.getOrderNo(), settlementPeriodTime, settlementOwnerDetail.getInvoiceType()).orNull();
settlementOwner = settlementOwnerDao.selectUnlockOfSettlementPeriodMonth(settlementOwnerDetail.getOrderNo(),
settlementOwnerDetail.getInvoicingCompanyId(),
settlementPeriodTime, settlementOwnerDetail.getInvoiceType()).orNull();
if (settlementOwner == null){ // 月结初始化
settlementNo = settlementPeriodMonthInit(settlementOwnerDetail, settlementPeriodTime,ownerInfo);
settlementNo = settlementPeriodMonthInit(settlementOwnerDetail, settlementPeriodTime,
SettlementOwnerEnum.SettlementPeriodType.MONTH.getCode(), ownerInfo);
}
else { // 月结更新
settlementPeriodMonthUpdate(settlementOwner, settlementOwnerDetail);
settlementNo = settlementOwner.getSettlementNo();
}
}
else if (Objects.equals(orderGoods.getSettlementAccountPeriod(),
SettlementOwnerEnum.SettlementPeriodType.DAILY.getCode())){ //日结
log.info("日结初始化货主结算单");
LocalDateTime settlementPeriodTime = LocalDateTimeUtils.getDayStart();
settlementOwner = settlementOwnerDao.selectUnlockOfSettlementPeriodDaily(settlementOwnerDetail.getOrderNo(),
settlementOwnerDetail.getInvoicingCompanyId(),
settlementPeriodTime, settlementOwnerDetail.getInvoiceType()).orNull();
if (settlementOwner == null){ // 日结初始化
settlementNo = settlementPeriodMonthInit(settlementOwnerDetail, settlementPeriodTime,
SettlementOwnerEnum.SettlementPeriodType.DAILY.getCode(), ownerInfo);
}
else { // 日结更新
settlementPeriodMonthUpdate(settlementOwner, settlementOwnerDetail);
settlementNo = settlementOwner.getSettlementNo();
}
}
else {
log.info("拉运完成结初始化货主结算单");
settlementOwner = settlementOwnerDao.selectUnlockOfSettlementPeriodImmediate(settlementOwnerDetail.getOrderNo(), settlementOwnerDetail.getInvoiceType()).orNull();
settlementOwner = settlementOwnerDao.selectUnlockOfSettlementPeriodImmediate(settlementOwnerDetail.getOrderNo(),
settlementOwnerDetail.getInvoicingCompanyId(),
settlementOwnerDetail.getInvoiceType()).orNull();
if (settlementOwner == null){ // 拉运完成初始化
settlementNo = settlementPeriodImmediateInit(settlementOwnerDetail,ownerInfo);
settlementNo = settlementPeriodMonthInit(settlementOwnerDetail, null,
SettlementOwnerEnum.SettlementPeriodType.IMMEDIATE.getCode(),ownerInfo);
}
else { // 拉运完成更新
settlementPeriodImmediateUpdate(settlementOwner, settlementOwnerDetail);
settlementPeriodMonthUpdate(settlementOwner, settlementOwnerDetail);
settlementNo = settlementOwner.getSettlementNo();
}
}
......@@ -155,15 +197,24 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
//生成车主结算单
settlementDriverSave(settlementDriverDetail,settlementNo);
//车主结算单自动支付
log.info(" 运单号 {}, 是否是普通单 {} ",settlementDriverDetail.getChildNo(),settlementDriverDetail.getInvoiceType());
if (!settlementDriverDetail.getInvoiceType().equals(SettlementOwnerEnum.InvoiceType.ONLINE.getCode())) {
paySettlementDriver(settlementDriverDetail);
} else {
if (settlementDriverDetail.getPrepayFreightFlag().equals(SettlementDriverEnum.PrepayFreightFlag.PAYED.getCode())
if (Objects.equals(orderGoods.getPlatformFreightQuotationTaxType(),
QuotationEnum.PlatformFreightQuotationTaxType.NO.getCode())
&& Objects.equals(orderGoods.getSettlementWay(), SettlementWayEnum.WayType.UNLOAD_LOSS.getCode())) {
settlementDriverDetail.setSettlementNo(settlementNo);
//插入同步网络货运待支付记录
childSyncTransportRecordService.addOrderChildSyncTransportRecord(settlementDriverDetail);
}
else if (settlementDriverDetail.getPrepayFreightFlag().equals(SettlementDriverEnum.PrepayFreightFlag.PAYED.getCode())
&& settlementDriverDetail.getPrepayFreight().compareTo(BigDecimal.ZERO) > 0) {
settlementDriverDetail.setSettlementNo(settlementNo);
//插入同步网络货运待支付记录
childSyncTransportRecordService.addOrderChildSyncTransportRecord(settlementDriverDetail);
}
}
// 更新结算单
......@@ -173,12 +224,155 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
settlementDriverDetailDao.updateSettlementNo(settlementDriverDetail);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void settle(SettlementSettleMqParam mq) {
OrderChild orderChild = orderChildDao.getByChildNo(mq.getChildNo()).get();
SettlementOwnerDetail settlementOwnerDetail = settlementOwnerDetailDao.getByChildNo(orderChild.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
SettlementDriverDetail settlementDriverDetail = settlementDriverDetailDao.getByChildNo(orderChild.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
orderChildSyncTransportListener.extracted(orderChild, settlementOwnerDetail, settlementDriverDetail, mq.getInvoiceType(), mq.getRemark());
}
@Transactional(rollbackFor = Exception.class)
@Override
public void invoiceTypeSync(SettlementInvoiceTypeSyncMqParam mq) {
OrderChild orderChild = orderChildDao.getByChildNo(mq.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
SettlementOwnerDetail settlementOwnerDetail = settlementOwnerDetailDao
.getByChildNo(orderChild.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
if (!Objects.equals(settlementOwnerDetail.getInvoiceChannel(), SettlementOwnerDetailEnum.InvoiceChannel.BROKER.getCode())){
return;
}
if (settlementOwnerDetail.getInvoiceType() != null) {return;}
try {
// 获取状态
TransportVO result = brokerService.getOrderChildStatus(mq.getChildNo());
if (result == null){
log.info("运单号 {} 未找到运单信息",mq.getChildNo());
return;
}
String remark = "";
Integer invoiceType = SettlementOwnerEnum.InvoiceType.ONLINE.getCode();
// if (Objects.equals(result.getRiskStatus(), 1) || Objects.equals(result.getRiskStatus(), 2)) {
// invoiceType = SettlementOwnerEnum.InvoiceType.ORDINARY.getCode();
// remark += result.getRiskReason();
// }
if (Objects.equals(result.getSyncStatus(), 2)) {
invoiceType = SettlementOwnerEnum.InvoiceType.ORDINARY.getCode();
remark += result.getSyncMsg();
}
if (Objects.equals(result.getSyncStatus(), 0)) {
return;
}
// 发送mq (结算)
settlementMqService.settle(orderChild.getChildNo(), invoiceType, remark);
}catch (Exception e){
log.info("结算获取状态失败, 运单号 {}",mq.getChildNo(),e);
}
}
@Transactional(rollbackFor = Exception.class)
@Override
public void invoiceStatusSync(SettlementInvoiceStatusSyncMqParam mq) {
OrderChild orderChild = orderChildDao.getByChildNo(mq.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
SettlementOwnerDetail settlementOwnerDetail = settlementOwnerDetailDao
.getByChildNo(orderChild.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
if (!Objects.equals(settlementOwnerDetail.getInvoiceChannel(), SettlementOwnerDetailEnum.InvoiceChannel.BROKER.getCode())){
return;
}
if (!Objects.equals(settlementOwnerDetail.getInvoiceStatus(), SettlementOwnerDetailEnum.InvoiceStatus.NO.getCode())){
return;
}
// 获取状态
TransportVO result = brokerService.getOrderChildStatus(mq.getChildNo());
if (result == null){
log.info("运单号 {} 未找到运单信息",mq.getChildNo());
return;
}
if (Objects.equals(result.getInvoiceStatus(), 1) ) {
InvoicingStatusNotifyDTO invoicingStatusNotifyDTO = new InvoicingStatusNotifyDTO();
invoicingStatusNotifyDTO.setChildNoList(Arrays.asList(mq.getChildNo()));
ApplicationContextUtils.getBean(SettlementOwnerService.class)
.invoicingStatusNotify(invoicingStatusNotifyDTO);
}
}
@Transactional(rollbackFor = Exception.class)
@Override
public void payStatusSync(SettlementPayStatusSyncMqParam mq) {
OrderChild orderChild = orderChildDao.getByChildNo(mq.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
SettlementOwnerDetail settlementOwnerDetail = settlementOwnerDetailDao
.getByChildNo(orderChild.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
if (!Objects.equals(settlementOwnerDetail.getInvoiceChannel(), SettlementOwnerDetailEnum.InvoiceChannel.BROKER.getCode())){
return;
}
OrderChildSyncTransportRecord orderChildSyncTransportRecord = orderChildSyncTransportRecordDao
.getByChildNo(orderChild.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
if (!Objects.equals(orderChildSyncTransportRecord.getStatus(),
OrderChildSyncTransportRecordEnum.Status.INIT.getCode())){
return;
}
// 获取状态
TransportVO result = brokerService.getOrderChildStatus(mq.getChildNo());
if (result == null){
log.info("运单号 {} 未找到运单信息",mq.getChildNo());
return;
}
if (Objects.equals(result.getSettleStatus(), 1) ) {
PayStatusNotifyDTO payStatusNotifyDTO = new PayStatusNotifyDTO();
payStatusNotifyDTO.setChildNo(mq.getChildNo());
orderChildSyncTransportRecordService.updateStatus(payStatusNotifyDTO);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void settlementDetailAdd(SettlementDetailAddMqParam mq) {
SettlementOwnerDetail settlementOwnerDetail = settlementOwnerDetailDao.getEntityByKey(mq.getSettlementOwnerDetailId()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
//SettlementDriverDetail settlementDriverDetail = settlementDriverDetailDao.getEntityByKey(mq.getSettlementDriverDetailId()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
SettlementDriverDetail settlementDriverDetail = settlementDriverDetailDao.getEntityByKey(mq.getSettlementDriverDetailId()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
OrderChild orderChild = orderChildDao.getByChildNo(settlementDriverDetail.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
SettlementPlatformServiceFee settlementPlatformServiceFee = null;
if (settlementDriverDetail.getPlatformServiceFee().compareTo(BigDecimal.ZERO) > 0) {
settlementPlatformServiceFee = new SettlementPlatformServiceFee();
settlementPlatformServiceFee.setChildNo(settlementDriverDetail.getChildNo());
settlementPlatformServiceFee.setDriverUserNo(settlementDriverDetail.getDriverUserNo());
settlementPlatformServiceFee.setDriverName(settlementDriverDetail.getDriverName());
settlementPlatformServiceFee.setDriverMobile(orderChild.getDriverMobile());
settlementPlatformServiceFee.setSendAddressId(orderChild.getSendAddressId());
settlementPlatformServiceFee.setSendAddress(orderChild.getSendAddress());
settlementPlatformServiceFee.setReceiveAddressId(orderChild.getReceiveAddressId());
settlementPlatformServiceFee.setReceiveAddress(orderChild.getReceiveAddress());
settlementPlatformServiceFee.setTruckNo(orderChild.getTruckNo());
settlementPlatformServiceFee.setSettlementFreight(settlementDriverDetail.getSettlementFreight());
settlementPlatformServiceFee.setInvoiceServiceFeeRate(settlementDriverDetail.getPlatformServiceFeeRate());
settlementPlatformServiceFee.setInvoiceServiceFee(settlementDriverDetail.getPlatformServiceFee());
// 平台服务费
orderChild.setPlatformServiceFee(settlementDriverDetail.getPlatformServiceFee());
}
orderChildDao.updatePlatformServiceFee(orderChild);
if (settlementPlatformServiceFee != null) {
settlementPlatformServiceFeeDao.saveEntity(settlementPlatformServiceFee);
}
log.info("更新网络标识 {} ",orderChild.getChildNo());
// 更新网络标识
settlementService.updateSettlementDetailInvoiceType(settlementOwnerDetail.getChildNo(), SettlementOwnerEnum.InvoiceType.ORDINARY.getCode());
}
......@@ -212,11 +406,16 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
settlementDriver.setStatus(SettlementDriverEnum.Status.WAIT_SETTLEMENT.getCode());
}
settlementDriver.setInvoicingCompanyId(detail.getInvoicingCompanyId());
settlementDriver.setInvoicingCompanyShorterName(detail.getInvoicingCompanyShorterName());
settlementDriver.setInvoicingCompanyGroupCode(detail.getInvoicingCompanyGroupCode());
settlementDriver.setPlatformServiceFeeRate(detail.getPlatformServiceFeeRate());
settlementDriver.setPlatformServiceFee(detail.getPlatformServiceFee());
settlementDriverDao.saveEntity(settlementDriver);
}
@Override
public void settlementDriverNotify(String childNo,Integer payType,String payErrorMsg){
//运单状态修改为完成
......@@ -243,6 +442,7 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
/**
* 车主结算单自动支付
*/
@Override
public String paySettlementDriver(SettlementDriverDetail detail){
String uuid = UUID.randomUUID().toString();
String key = RedissonConstants.SETTLEMENT_OWNER_BATCH_PAY_ID_LOCK + detail.getId();
......@@ -274,7 +474,7 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
.remark(PayRemarkEnum.toString(PayRemarkEnum.FREIGHT_TO_OWNER.getValue()))
.build();
}
//支付司机运费
Result result = null;
String msg = null;
try{
......@@ -283,6 +483,20 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
settlementDriverNotify(detail.getChildNo(),0,e.getMessage());
msg = e.getMessage();
}
//支付平台服务费
try{
OrderChild orderChild = orderChildDao.getByChildNo(detail.getChildNo()).orElseThrow(PerformanceResultEnum.ORDER_CHILD_NO_FOUND);
if (Objects.nonNull(orderChild.getPlatformServiceFee()) &&
!Objects.equals(orderChild.getPlatformServiceFee().intValue(), 0)) {
PayPlatformFeeParam payPlatformFeeParam = PayPlatformFeeParam.builder()
.figure(orderChild.getPlatformServiceFee().intValue())
.tradeNo(detail.getChildNo())
.build();
result = paymentService.paymentCompletePlatformFee(payPlatformFeeParam);
}
}catch (Exception e){
log.error("支付平台服务费异常 {}",e);
}
if(Objects.nonNull(result)){
settlementDriverNotify(detail.getChildNo(),0,result.getMsg());
}
......@@ -298,10 +512,14 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
/**
* 月结初始化
*/
private String settlementPeriodMonthInit(SettlementOwnerDetail settlementOwnerDetail, LocalDateTime settlementPeriodTime,OwnerInfoFeignVO ownerInfo){
private String settlementPeriodMonthInit(SettlementOwnerDetail settlementOwnerDetail,
LocalDateTime settlementPeriodTime,
Integer settlementPeriodType,
OwnerInfoFeignVO ownerInfo){
FeignOrderInfoVO orderInfo = orderService.getOrderInfo(settlementOwnerDetail.getOrderNo()).orElseThrow(PerformanceResultEnum.ORDER_INVALID);
FeignOrderInfoVO orderInfo = orderService.getOrderInfo(settlementOwnerDetail.getOrderNo())
.orElseThrow(PerformanceResultEnum.ORDER_INVALID);
//获取所有detail
......@@ -314,7 +532,7 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
settlementOwner.setOwnerName(settlementOwnerDetail.getOwnerName());
settlementOwner.setOrderNo(settlementOwnerDetail.getOrderNo());
settlementOwner.setSettlementPeriodType(SettlementOwnerEnum.SettlementPeriodType.MONTH.getCode());
settlementOwner.setSettlementPeriodType(settlementPeriodType);
settlementOwner.setSettlementPeriodTime(settlementPeriodTime);
settlementOwner.setWeight(settlementOwnerDetail.getWeight());
......@@ -343,10 +561,12 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
settlementOwner.setCompanyContactAddress(ownerInfo.getContactsAddress());
settlementOwner.setSettlementWay(settlementOwnerDetail.getSettlementWay());
//设置开票公司
settlementOwner.setInvoicingCompanyId(orderInfo.getInvoicingCompanyId());
settlementOwner.setInvoicingCompanyShorterName(orderInfo.getInvoicingCompanyShorterName());
settlementOwner.setInvoicingCompanyGroupCode(orderInfo.getInvoicingCompanyGroupCode());
settlementOwner.setInvoicingCompanyId(settlementOwnerDetail.getInvoicingCompanyId());
settlementOwner.setInvoicingCompanyShorterName(settlementOwnerDetail.getInvoicingCompanyShorterName());
settlementOwner.setInvoicingCompanyGroupCode(settlementOwnerDetail.getInvoicingCompanyGroupCode());
settlementOwner.setReportFlag(orderInfo.getReportFlag());
// 开票服务费
settlementOwner.setInvoiceServiceFee(settlementOwnerDetail.getInvoiceServiceFee());
settlementOwnerDao.saveEntity(settlementOwner);
//保存结算单日志----创建结算单
......@@ -370,6 +590,7 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
settlementOwner.setSettlementFreight(settlementOwnerDetail.getSettlementFreight());
settlementOwner.setLoanFreight(settlementOwnerDetail.getLoanFreight());
settlementOwner.setInvoiceFreight(settlementOwnerDetail.getInvoiceFreight());
settlementOwner.setInvoiceServiceFee(settlementOwnerDetail.getInvoiceServiceFee());
List<SettlementOwnerDetail> details = settlementOwnerDetailDao.getBySettlementNo(settlementOwner.getSettlementNo());
......@@ -382,112 +603,40 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
settlementOwner.setPrepayFreight(settlementOwner.getPrepayFreight().add(item.getPrepayFreight()));
settlementOwner.setSettlementFreight(settlementOwner.getSettlementFreight().add(item.getSettlementFreight()));
settlementOwner.setInvoiceFreight(settlementOwner.getInvoiceFreight().add(item.getInvoiceFreight()));
settlementOwner.setInvoiceServiceFee(settlementOwner.getInvoiceServiceFee().add(item.getInvoiceServiceFee()));
});
settlementOwnerDao.updateSettlementPeriodMonth(settlementOwner);
}
/**
* 拉运完成结 初始化
*/
private String settlementPeriodImmediateInit(SettlementOwnerDetail settlementOwnerDetail,OwnerInfoFeignVO ownerInfo){
FeignOrderInfoVO orderInfo = orderService.getOrderInfo(settlementOwnerDetail.getOrderNo()).orElseThrow(PerformanceResultEnum.ORDER_INVALID);
SettlementOwner settlementOwner = new SettlementOwner();
String settlementNo = settlementNoGenerate();
settlementOwner.setSettlementNo(settlementNo);
settlementOwner.setOwnerUserNo(settlementOwnerDetail.getOwnerUserNo());
settlementOwner.setOwnerName(settlementOwnerDetail.getOwnerName());
settlementOwner.setOrderNo(settlementOwnerDetail.getOrderNo());
settlementOwner.setSettlementPeriodType(SettlementOwnerEnum.SettlementPeriodType.IMMEDIATE.getCode());
settlementOwner.setWeight(settlementOwnerDetail.getWeight());
settlementOwner.setFreight(settlementOwnerDetail.getFreight());
settlementOwner.setLossWeight(settlementOwnerDetail.getLossWeight());
settlementOwner.setLossFreight(settlementOwnerDetail.getLossFreight());
settlementOwner.setSettlementFreight(settlementOwnerDetail.getSettlementFreight());
settlementOwner.setLoanFreight(settlementOwnerDetail.getLoanFreight());
settlementOwner.setInvoiceType(settlementOwnerDetail.getInvoiceType());
settlementOwner.setInvoiceFreight(settlementOwnerDetail.getInvoiceFreight());
settlementOwner.setPrepayFreight(settlementOwnerDetail.getPrepayFreight());
settlementOwner.setStatus(SettlementOwnerEnum.Status.TO_BE_LOCKED.getCode());
settlementOwner.setCompanyName(ownerInfo.getCompanyName());
settlementOwner.setCompanyTaxCode(ownerInfo.getCompanyTaxCode());
settlementOwner.setCompanyAddress(ownerInfo.getCompanyAddress());
settlementOwner.setCompanyMobile(ownerInfo.getCompanyTelephone());
settlementOwner.setCompanyBankNo(ownerInfo.getCompanyBankAccount());
settlementOwner.setCompanyBankName(ownerInfo.getCompanyOpenBank());
settlementOwner.setCompanyContact(ownerInfo.getContactsName());
settlementOwner.setCompanyContactMobile(ownerInfo.getContactsTelephone());
settlementOwner.setCompanyContactAddress(ownerInfo.getContactsAddress());
settlementOwner.setSettlementWay(settlementOwnerDetail.getSettlementWay());
settlementOwner.setInvoiceStatus(SettlementOwnerEnum.InvoiceStatus.NOT_INVOICE.getCode());
//设置开票公司
settlementOwner.setInvoicingCompanyId(orderInfo.getInvoicingCompanyId());
settlementOwner.setInvoicingCompanyShorterName(orderInfo.getInvoicingCompanyShorterName());
settlementOwner.setInvoicingCompanyGroupCode(orderInfo.getInvoicingCompanyGroupCode());
settlementOwner.setReportFlag(orderInfo.getReportFlag());
settlementOwnerDao.saveEntity(settlementOwner);
//保存结算单日志----创建结算单
settlementLogService.saveSettlementLog(settlementNo,
SettlementLogEnum.Type.CREATE_SETTLEMENT.getCode(),SettlementLogEnum.Type.CREATE_SETTLEMENT.getMsg(),
OrderChildLogEnum.CreateType.PLATFORM.getCode(),0L,"系统");
return settlementNo;
}
/**
* 拉运完成结 更新
*/
private void settlementPeriodImmediateUpdate(SettlementOwner settlementOwner,SettlementOwnerDetail settlementOwnerDetail){
settlementOwner.setWeight(settlementOwnerDetail.getWeight());
settlementOwner.setFreight(settlementOwnerDetail.getFreight());
settlementOwner.setLossWeight(settlementOwnerDetail.getLossWeight());
settlementOwner.setLoanFreight(settlementOwnerDetail.getLoanFreight());
settlementOwner.setLossFreight(settlementOwnerDetail.getLossFreight());
settlementOwner.setPrepayFreight(settlementOwnerDetail.getPrepayFreight());
settlementOwner.setSettlementFreight(settlementOwnerDetail.getSettlementFreight());
settlementOwner.setInvoiceFreight(settlementOwnerDetail.getInvoiceFreight());
List<SettlementOwnerDetail> details = settlementOwnerDetailDao.getBySettlementNo(settlementOwner.getSettlementNo());
details.forEach(item->{
settlementOwner.setWeight(settlementOwner.getWeight().add(item.getWeight()));
settlementOwner.setFreight(settlementOwner.getFreight().add(item.getFreight()));
settlementOwner.setLossWeight(settlementOwner.getLossWeight().add(item.getLossWeight()));
settlementOwner.setLossFreight(settlementOwner.getLossFreight().add(item.getLossFreight()));
settlementOwner.setPrepayFreight(settlementOwner.getPrepayFreight().add(item.getPrepayFreight()));
settlementOwner.setLoanFreight(settlementOwner.getLoanFreight().add(item.getLoanFreight()));
settlementOwner.setSettlementFreight(settlementOwner.getSettlementFreight().add(item.getSettlementFreight()));
settlementOwner.setInvoiceFreight(settlementOwner.getInvoiceFreight().add(item.getInvoiceFreight()));
});
settlementOwnerDao.updateSettlementPeriodMonth(settlementOwner);
}
/**
* 创建结算单号
*/
@Override
public String settlementNoGenerate(){
return uniqueOrderNumService.getUniqueOrderNum(com.msl.common.utils.LocalDateTimeUtils.convertLocalDateTimeToString(LocalDateTime.now(), com.msl.common.utils.LocalDateTimeUtils.DATE_DAY));
}
private BigDecimal invoiceFreightCalc(Integer settlementWay, SettlementOwnerDetail settlementOwnerDetail) {
private BigDecimal invoiceFreightCalc(Integer settlementWay, BigDecimal invoiceServiceFeeRate, SettlementOwnerDetail settlementOwnerDetail) {
if (Objects.equals(settlementWay, SettlementWayEnum.WayType.LOAD.getCode())) { //订单结算方式为“装车净重”时,开票金额=实际净重*平台运费报价-货损金额。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice())
.subtract(settlementOwnerDetail.getLossFreight());
} else { //订单结算方式为“卸车净重”时,开票金额=实际净重*平台运费报价。
}
else if (Objects.equals(settlementWay, SettlementWayEnum.WayType.UNLOAD_LOSS.getCode())) {
if (invoiceServiceFeeRate!=null){
//结算方式为“卸车净重(减货损)”,平台运费报价为“未税”时,开票金额=平台运费单价*实际净重-货损单价*货损吨数+开票服务费。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice())
.subtract(settlementOwnerDetail.getLossPrice())
.add(settlementOwnerDetail.getInvoiceServiceFee());
}
else{
//结算方式为“卸车净重(减货损)”,平台运费报价为“含税”时 开票金额=平台运费单价*实际净重-货损单价*货损吨数
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice())
.subtract(settlementOwnerDetail.getLossFreight());
}
}
else { //订单结算方式为“卸车净重”时,开票金额=实际净重*平台运费报价。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice());
}
}
......
......@@ -5,8 +5,7 @@ import com.clx.performance.common.MqDelay;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeySettlementConstants;
import com.clx.performance.service.settle.SettlementMqService;
import com.clx.performance.vo.mq.SettlementDetailAddMqParam;
import com.clx.performance.vo.mq.SettlementDetailInvoiceTypeSyncMqParam;
import com.clx.performance.vo.mq.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
......@@ -27,24 +26,84 @@ public class SettlementMqServiceImpl implements SettlementMqService {
mq.setSettlementDriverDetailId(settlementDriverDetailId);
mq.setSettlementOwnerDetailId(settlementOwnerDetailId);
MqDelay<MqWrapper<SettlementDetailAddMqParam>> delay = new MqDelay<>(RabbitKeySettlementConstants.DEFAULT_EXCHANGE, RabbitKeySettlementConstants.SETTLEMENT_DETAIL_ADD_ROUTING_KEY, new MqWrapper<>(mq));
MqDelay<MqWrapper<SettlementDetailAddMqParam>> delay =
new MqDelay<>(RabbitKeySettlementConstants.DEFAULT_EXCHANGE,
RabbitKeySettlementConstants.SETTLEMENT_DETAIL_ADD_ROUTING_KEY, new MqWrapper<>(mq));
Message message = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(delay)).getBytes()).build();
message.getMessageProperties().setExpiration("5000");
rabbitTemplate.send(RabbitKeySettlementConstants.DEFAULT_EXCHANGE, RabbitKeySettlementConstants.DEFAULT_DELAY_ROUTING_KEY, message);
rabbitTemplate.send(RabbitKeySettlementConstants.DEFAULT_EXCHANGE,
RabbitKeySettlementConstants.DEFAULT_DELAY_ROUTING_KEY, message);
}
@Override
public void invoiceTypeSync(String childNo, Integer invoiceType) {
public void settlementStatistics(String childNo, Integer invoiceType) {
SettlementDetailInvoiceTypeSyncMqParam mq = new SettlementDetailInvoiceTypeSyncMqParam();
SettlementStatisticsMqParam mq = new SettlementStatisticsMqParam();
mq.setChildNo(childNo);
mq.setInvoiceType(invoiceType);
log.info("运单号 {} 开票标识 {} ",childNo,invoiceType);
MqDelay<MqWrapper<SettlementStatisticsMqParam>> delay =
new MqDelay<>(RabbitKeySettlementConstants.DEFAULT_EXCHANGE,
RabbitKeySettlementConstants.SETTLEMENT_DETAIL_INVOICE_TYPE_SYC_ROUTING_KEY, new MqWrapper<>(mq));
Message message = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(delay)).getBytes()).build();
message.getMessageProperties().setExpiration("5000");
rabbitTemplate.send(RabbitKeySettlementConstants.DEFAULT_EXCHANGE,
RabbitKeySettlementConstants.DEFAULT_DELAY_ROUTING_KEY, message);
}
@Override
public void invoiceTypeSync(String childNo) {
SettlementInvoiceTypeSyncMqParam mq = new SettlementInvoiceTypeSyncMqParam();
mq.setChildNo(childNo);
MqDelay<MqWrapper<SettlementInvoiceTypeSyncMqParam>> delay =
new MqDelay<>(RabbitKeySettlementConstants.DEFAULT_EXCHANGE,
RabbitKeySettlementConstants.SETTLEMENT_INVOICE_TYPE_SYNC_ROUTING_KEY, new MqWrapper<>(mq));
Message message = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(delay)).getBytes()).build();
message.getMessageProperties().setExpiration("5000");
rabbitTemplate.send(RabbitKeySettlementConstants.DEFAULT_EXCHANGE,
RabbitKeySettlementConstants.DEFAULT_DELAY_ROUTING_KEY, message);
}
MqDelay<MqWrapper<SettlementDetailInvoiceTypeSyncMqParam>> delay = new MqDelay<>(RabbitKeySettlementConstants.DEFAULT_EXCHANGE, RabbitKeySettlementConstants.SETTLEMENT_DETAIL_INVOICE_TYPE_SYC_ROUTING_KEY, new MqWrapper<>(mq));
@Override
public void settle(String childNo, Integer invoiceType, String remark) {
SettlementSettleMqParam mq = new SettlementSettleMqParam();
mq.setChildNo(childNo);
mq.setInvoiceType(invoiceType);
mq.setRemark(remark);
MqDelay<MqWrapper<SettlementSettleMqParam>> delay = new MqDelay<>(RabbitKeySettlementConstants.DEFAULT_EXCHANGE,
RabbitKeySettlementConstants.SETTLEMENT_SETTLE_ROUTING_KEY, new MqWrapper<>(mq));
Message message = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(delay)).getBytes()).build();
message.getMessageProperties().setExpiration("5000");
rabbitTemplate.send(RabbitKeySettlementConstants.DEFAULT_EXCHANGE,
RabbitKeySettlementConstants.DEFAULT_DELAY_ROUTING_KEY, message);
}
@Override
public void invoiceStatusSync(String childNo) {
SettlementInvoiceStatusSyncMqParam mq = new SettlementInvoiceStatusSyncMqParam();
mq.setChildNo(childNo);
MqDelay<MqWrapper<SettlementInvoiceStatusSyncMqParam>> delay = new MqDelay<>(RabbitKeySettlementConstants.DEFAULT_EXCHANGE,
RabbitKeySettlementConstants.SETTLEMENT_INVOICE_STATUS_SYNC_ROUTING_KEY, new MqWrapper<>(mq));
Message message = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(delay)).getBytes()).build();
message.getMessageProperties().setExpiration("5000");
rabbitTemplate.send(RabbitKeySettlementConstants.DEFAULT_EXCHANGE,
RabbitKeySettlementConstants.DEFAULT_DELAY_ROUTING_KEY, message);
}
@Override
public void payStatusSync(String childNo) {
SettlementPayStatusSyncMqParam mq = new SettlementPayStatusSyncMqParam();
mq.setChildNo(childNo);
MqDelay<MqWrapper<SettlementPayStatusSyncMqParam>> delay = new MqDelay<>(RabbitKeySettlementConstants.DEFAULT_EXCHANGE,
RabbitKeySettlementConstants.SETTLEMENT_PAY_STATUS_SYNC_ROUTING_KEY, new MqWrapper<>(mq));
Message message = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(delay)).getBytes()).build();
message.getMessageProperties().setExpiration("5000");
rabbitTemplate.send(RabbitKeySettlementConstants.DEFAULT_EXCHANGE, RabbitKeySettlementConstants.DEFAULT_DELAY_ROUTING_KEY, message);
rabbitTemplate.send(RabbitKeySettlementConstants.DEFAULT_EXCHANGE,
RabbitKeySettlementConstants.DEFAULT_DELAY_ROUTING_KEY, message);
}
}
......@@ -14,6 +14,7 @@ import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.param.pc.owner.PageCarrierSettlementOwnerDetailParam;
import com.clx.performance.param.pc.owner.PageOwnerSettlementOwnerDetailParam;
import com.clx.performance.service.settle.SettlementCommonService;
import com.clx.performance.service.settle.SettlementOwnerDetailService;
import com.clx.performance.struct.settle.SettlementOwnerDetailStruct;
import com.clx.performance.utils.excel.ExcelData;
......@@ -48,6 +49,7 @@ public class SettlementOwnerDetailServiceImpl implements SettlementOwnerDetailS
private final SettlementOwnerDetailStruct settlementOwnerDetailStruct;
private final OrderChildDao orderChildDao;
private final SettlementDriverDetailDao settlementDriverDetailDao;
private final SettlementCommonService settlementCommonService;
@Override
......@@ -82,26 +84,36 @@ public class SettlementOwnerDetailServiceImpl implements SettlementOwnerDetailS
settlementOwnerDetail.setLossFreight(lossFreightCalc(settlementOwnerDetail.getLossPrice(), settlementOwnerDetail.getLossWeight()));
// 预付运费
BigDecimal ans = settlementOwnerDetail.getFreight().subtract(settlementOwnerDetail.getLossFreight());
if (ans.compareTo(BigDecimal.ZERO) <= 0) {
settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
}
// // 开票金额
// settlementOwnerDetail.setInvoiceFreight(invoiceFreightCalc(orderGoods.getSettlementWay(),settlementOwnerDetail));
//
// // 结算金额
// settlementOwnerDetail.setSettlementFreight(settlementFreightCalc(orderGoods.getSettlementWay(),settlementOwnerDetail));
//
//借款抵扣金额初始化
settlementOwnerDetail.setLoanFreight(BigDecimal.ZERO);
// 开票服务费
settlementOwnerDetail.setInvoiceServiceFeeRate(
orderGoods.getInvoiceServiceFeeRate()==null? BigDecimal.ZERO : orderGoods.getInvoiceServiceFeeRate());
// 开票服务费
settlementOwnerDetail.setInvoiceServiceFee(
settlementCommonService.invoiceServiceFeeCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
// 开票金额
settlementOwnerDetail.setInvoiceFreight(
settlementCommonService.invoiceFreightCalc(orderChild.getSettlementWay(),
orderGoods.getInvoiceServiceFeeRate(), settlementOwnerDetail));
// 结算金额
settlementOwnerDetail.setSettlementFreight(
settlementCommonService.settlementFreightCalc(orderGoods.getSettlementWay(),settlementOwnerDetail));
settlementOwnerDetail.setFinalPaymentStatus(SettlementOwnerDetailEnum.FinalPaymentStatus.NO.getCode());
//设置开票公司信息
settlementOwnerDetail.setInvoicingCompanyId(orderChild.getInvoicingCompanyId());
settlementOwnerDetail.setInvoicingCompanyShorterName(orderChild.getInvoicingCompanyShorterName());
settlementOwnerDetail.setInvoicingCompanyGroupCode(orderChild.getInvoicingCompanyGroupCode());
settlementOwnerDetail.setReportFlag(orderChild.getReportFlag());
settlementOwnerDetail.setInvoiceChannel(SettlementOwnerDetailEnum.InvoiceChannel.BROKER.getCode());
settlementOwnerDetailDao.saveEntity(settlementOwnerDetail);
return settlementOwnerDetail.getId();
}
......@@ -140,30 +152,6 @@ public class SettlementOwnerDetailServiceImpl implements SettlementOwnerDetailS
}
/**
* 开票金额
*/
private BigDecimal invoiceFreightCalc(Integer settlementWay,SettlementOwnerDetail settlementOwnerDetail){
if(Objects.equals(settlementWay, SettlementWayEnum.WayType.LOAD.getCode())){ //订单结算方式为“装车净重”时,开票金额=实际净重*平台运费报价-货损金额。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice())
.subtract(settlementOwnerDetail.getLossFreight());
}else{ //订单结算方式为“卸车净重”时,开票金额=实际净重*平台运费报价。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice());
}
}
/**
* 结算金额
*/
private BigDecimal settlementFreightCalc(Integer settlementWay,SettlementOwnerDetail settlementOwnerDetail){
if(Objects.equals(settlementWay, SettlementWayEnum.WayType.LOAD.getCode())){ //订单结算方式为“装车净重”时,结算金额=实际净重*平台运费报价-预付运费-货损金额。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice())
.subtract(settlementOwnerDetail.getPrepayFreight()).subtract(settlementOwnerDetail.getLossFreight());
}else{ //订单结算方式为“卸车净重”时,结算金额=实际净重*平台运费报价-预付运费
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice()).subtract(settlementOwnerDetail.getPrepayFreight());
}
}
@Override
public IPage<CarrierPageSettlementOwnerDetailVO> pageSettlementOwnerDetail(
PageCarrierSettlementOwnerDetailParam param) {
......@@ -202,18 +190,20 @@ public class SettlementOwnerDetailServiceImpl implements SettlementOwnerDetailS
fieldList.add(new ExcelField(8, "货损吨数", "lossWeight", 5000));
fieldList.add(new ExcelField(9, "货损单价", "lossPrice", 5000));
fieldList.add(new ExcelField(10, "货损金额", "lossFreight", 5000));
fieldList.add(new ExcelField(11, "预付运费金额", "prepayFreight", 5000));
fieldList.add(new ExcelField(12, "结算金额", "settlementFreight", 5000));
fieldList.add(new ExcelField(13, "借款抵扣金额", "loanFreight", 5000));
fieldList.add(new ExcelField(14, "开票金额", "invoiceFreight", 5000));
fieldList.add(new ExcelField(15, "开票标识", "invoiceType", 5000));
fieldList.add(new ExcelField(16, "订单编号", "orderNo", 5000));
fieldList.add(new ExcelField(17, "结算单号", "settlementNo", 15000));
fieldList.add(new ExcelField(18, "结算子单号", "settlementSubNo", 15000));
fieldList.add(new ExcelField(19, "创建时间", "createTime", 5000));
fieldList.add(new ExcelField(20, "是否已付尾款", "finalPaymentStatus", 5000));
fieldList.add(new ExcelField(21, "是否已开票", "invoiceStatus", 5000));
fieldList.add(new ExcelField(11, "开票费率", "invoiceServiceFeeRate", 5000));
fieldList.add(new ExcelField(12, "开票服务费", "invoiceServiceFee", 5000));
fieldList.add(new ExcelField(13, "预付运费金额", "prepayFreight", 5000));
fieldList.add(new ExcelField(14, "结算金额", "settlementFreight", 5000));
fieldList.add(new ExcelField(15, "借款抵扣金额", "loanFreight", 5000));
fieldList.add(new ExcelField(16, "开票金额", "invoiceFreight", 5000));
fieldList.add(new ExcelField(17, "开票标识", "invoiceType", 5000));
fieldList.add(new ExcelField(18, "订单编号", "orderNo", 5000));
fieldList.add(new ExcelField(19, "结算单号", "settlementNo", 15000));
fieldList.add(new ExcelField(20, "结算子单号", "settlementSubNo", 15000));
fieldList.add(new ExcelField(21, "创建时间", "createTime", 5000));
fieldList.add(new ExcelField(22, "是否已付尾款", "finalPaymentStatus", 5000));
fieldList.add(new ExcelField(23, "是否已开票", "invoiceStatus", 5000));
// 组装数据
List<List<ExcelData>> dataList = new ArrayList<>();
......@@ -235,9 +225,12 @@ public class SettlementOwnerDetailServiceImpl implements SettlementOwnerDetailS
rowData.add(new ExcelData(dto.getLossWeight()));
rowData.add(new ExcelData(dto.getLossPrice().movePointLeft(2)));
rowData.add(new ExcelData(dto.getLossFreight().movePointLeft(2)));
rowData.add(new ExcelData(dto.getInvoiceServiceFeeRate().toString()+ "%"));
rowData.add(new ExcelData(dto.getInvoiceServiceFee().movePointLeft(2)));
rowData.add(new ExcelData(dto.getPrepayFreight().movePointLeft(2)));
rowData.add(new ExcelData(dto.getSettlementFreight().movePointLeft(2)));
rowData.add(new ExcelData(dto.getLoanFreight().movePointLeft(2)));
rowData.add(new ExcelData(dto.getInvoiceFreight().movePointLeft(2)));
rowData.add(new ExcelData(dto.getInvoiceTypeMsg()));
rowData.add(new ExcelData(dto.getOrderNo()));
......
......@@ -430,10 +430,11 @@ public class SettlementOwnerServiceImpl implements SettlementOwnerService {
fieldList.add(new ExcelField(8, "预付运费金额", "prepayFreight", 5000));
fieldList.add(new ExcelField(9, "货损吨数", "lossWeight", 5000));
fieldList.add(new ExcelField(10, "货损金额", "lossFreight", 5000));
fieldList.add(new ExcelField(11, "结算金额", "settlementFreight", 5000));
fieldList.add(new ExcelField(12, "开票金额", "invoiceFreight", 5000));
fieldList.add(new ExcelField(13, "创建时间", "createTime", 5000));
fieldList.add(new ExcelField(14, "状态", "status", 5000));
fieldList.add(new ExcelField(11, "开票服务费", "invoiceServiceFee", 5000));
fieldList.add(new ExcelField(12, "结算金额", "settlementFreight", 5000));
fieldList.add(new ExcelField(13, "开票金额", "invoiceFreight", 5000));
fieldList.add(new ExcelField(14, "创建时间", "createTime", 5000));
fieldList.add(new ExcelField(15, "状态", "status", 5000));
// 组装数据
List<List<ExcelData>> dataList = new ArrayList<>();
......@@ -453,6 +454,7 @@ public class SettlementOwnerServiceImpl implements SettlementOwnerService {
rowData.add(new ExcelData(dto.getPrepayFreight().movePointLeft(2)));
rowData.add(new ExcelData(dto.getLossWeight()));
rowData.add(new ExcelData(dto.getLossFreight().movePointLeft(2)));
rowData.add(new ExcelData(dto.getInvoiceServiceFee().movePointLeft(2)));
rowData.add(new ExcelData(dto.getSettlementFreight().movePointLeft(2)));
rowData.add(new ExcelData(dto.getInvoiceFreight().movePointLeft(2)));
rowData.add(new ExcelData(dto.getCreateTime()));
......
package com.clx.performance.service.impl.settle;
import com.clx.performance.param.pc.owner.PageCarrierSettlementPlatformServiceFeeParam;
import com.clx.performance.service.settle.SettlementPlatformServiceFeeExportService;
import com.clx.performance.service.settle.SettlementPlatformServiceFeeService;
import com.clx.performance.utils.excel.ExcelData;
import com.clx.performance.utils.excel.ExcelField;
import com.clx.performance.utils.excel.ExcelSheet;
import com.clx.performance.utils.excel.ExcelUtil;
import com.clx.performance.vo.pc.carrier.settle.SettlementPlatformServiceFeeVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service
public class SettlementPlatformServiceFeeExportServiceImpl implements SettlementPlatformServiceFeeExportService {
@Autowired
private SettlementPlatformServiceFeeService settlementPlatformServiceFeeService;
@Override
public void exportPlatformServiceFee(PageCarrierSettlementPlatformServiceFeeParam param) {
param.setPage(1);
param.setPageSize(1000000);
List<SettlementPlatformServiceFeeVO> list = settlementPlatformServiceFeeService.pagePlatformServiceFee(param).getRecords();
// 组装表头
List<ExcelField> fieldList = new ArrayList<>();
fieldList.add(new ExcelField(0, "序号", "index", 2000));
fieldList.add(new ExcelField(1, "运单编号", "childNo", 5000));
fieldList.add(new ExcelField(2, "司机姓名", "driverName", 5000));
fieldList.add(new ExcelField(3, "手机号", "driverMobile", 5000));
fieldList.add(new ExcelField(4, "发货地址", "sendAddress", 5000));
fieldList.add(new ExcelField(5, "收货地址", "receiveAddress", 5000));
fieldList.add(new ExcelField(6, "车牌号", "truckNo", 10000));
fieldList.add(new ExcelField(7, "结算金额", "settlementFreight", 10000));
fieldList.add(new ExcelField(8, "平台服务费率", "invoiceServiceFeeRate", 10000));
fieldList.add(new ExcelField(9, "平台服务费", "invoiceServiceFee", 10000));
fieldList.add(new ExcelField(10, "创建时间", "createTime", 5000));
// 组装数据
List<List<ExcelData>> dataList = new ArrayList<>();
for (int i=0; i<list.size(); i++){
SettlementPlatformServiceFeeVO dto = list.get(i);
List<ExcelData> rowData = new ArrayList<>();
rowData.add(new ExcelData(i+1));
rowData.add(new ExcelData(dto.getChildNo()));
rowData.add(new ExcelData(dto.getDriverName()));
rowData.add(new ExcelData(dto.getDriverMobile()));
rowData.add(new ExcelData(dto.getSendAddress()));
rowData.add(new ExcelData(dto.getReceiveAddress()));
rowData.add(new ExcelData(dto.getTruckNo()));
rowData.add(new ExcelData(dto.getSettlementFreight().movePointLeft(2).setScale(2, RoundingMode.HALF_UP).toString()));
rowData.add(new ExcelData(dto.getInvoiceServiceFeeRate().toString()+"%"));
rowData.add(new ExcelData(dto.getInvoiceServiceFee().movePointLeft(2).setScale(2, RoundingMode.HALF_UP).toString()));
rowData.add(new ExcelData(dto.getCreateTime()));
dataList.add(rowData);
}
// 导出
ExcelUtil.export(new ExcelSheet("平台服务费统计", fieldList, dataList));
}
}
package com.clx.performance.service.impl.settle;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.dao.settle.SettlementPlatformServiceFeeDao;
import com.clx.performance.param.pc.owner.PageCarrierSettlementPlatformServiceFeeParam;
import com.clx.performance.service.settle.SettlementPlatformServiceFeeService;
import com.clx.performance.struct.settle.SettlementPlatformServiceFeeStruct;
import com.clx.performance.vo.pc.carrier.settle.SettlementPlatformServiceFeeVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class SettlementPlatformServiceFeeServiceImpl implements SettlementPlatformServiceFeeService {
@Autowired
private SettlementPlatformServiceFeeDao settlementPlatformServiceFeeDao;
@Autowired
private SettlementPlatformServiceFeeStruct settlementPlatformServiceFeeStruct;
@Override
public IPage<SettlementPlatformServiceFeeVO> pagePlatformServiceFee(PageCarrierSettlementPlatformServiceFeeParam param) {
return settlementPlatformServiceFeeStruct.convertPage(settlementPlatformServiceFeeDao.pageByParam(param));
}
}
package com.clx.performance.service.impl.settle;
import cn.hutool.json.JSONUtil;
import com.clx.order.enums.OrderEnum;
import com.clx.order.enums.InvoicingCompanyEnum;
import com.clx.order.vo.pc.carrier.InvoicingCompanyVO;
import com.clx.performance.component.IdGenerateSnowFlake;
import com.clx.performance.config.SettlementConfig;
import com.clx.performance.constant.RabbitKeyConstants;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.dao.OwnerAccountDao;
import com.clx.performance.dao.OwnerRunningWaterRecordDao;
import com.clx.performance.dao.settle.SettlementDriverDetailDao;
......@@ -17,11 +20,14 @@ import com.clx.performance.enums.settle.SettlementOwnerDetailEnum;
import com.clx.performance.enums.settle.SettlementOwnerEnum;
import com.clx.performance.enums.settle.SettlementWayEnum;
import com.clx.performance.event.OwnerLoanThawEvent;
import com.clx.performance.extranal.order.InvoicingCompanyService;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.OwnerAccount;
import com.clx.performance.model.OwnerRunningWaterRecord;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.service.settle.SettlementCommonService;
import com.clx.performance.service.settle.SettlementMqService;
import com.clx.performance.service.settle.SettlementService;
import lombok.extern.slf4j.Slf4j;
......@@ -34,6 +40,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Objects;
@Slf4j
......@@ -43,6 +50,8 @@ public class SettlementServiceImpl implements SettlementService {
@Autowired
private OrderChildDao orderChildDao;
@Autowired
private OrderGoodsDao orderGoodsDao;
@Autowired
private SettlementOwnerDetailDao settlementOwnerDetailDao;
@Autowired
private SettlementDriverDetailDao settlementDriverDetailDao;
......@@ -59,21 +68,28 @@ public class SettlementServiceImpl implements SettlementService {
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
@Autowired
private InvoicingCompanyService invoicingCompanyService;
@Autowired
private SettlementConfig settlementConfig;
@Autowired
private SettlementCommonService settlementCommonService;
@Override
@Transactional(rollbackFor = Exception.class)
public void updateSettlementDetailInvoiceType(String childNo, Integer invoiceType) {
OrderChild orderChild = orderChildDao.getByChildNo(childNo).orElseThrow(PerformanceResultEnum.ORDER_CHILD_NO_FOUND);
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
SettlementOwnerDetail settlementOwnerDetail = settlementOwnerDetailDao.getByChildNo(childNo).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
SettlementDriverDetail settlementDriverDetail = settlementDriverDetailDao.getByChildNo(childNo).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
// 开票金额
settlementOwnerDetail.setInvoiceFreight(invoiceFreightCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
log.info("开始 更新网络标识 {} , {}",orderChild.getChildNo() ,settlementDriverDetail.getSettlementFreight().compareTo(BigDecimal.ZERO));
if (settlementDriverDetail.getSettlementFreight().compareTo(BigDecimal.ZERO) <= 0) {
settlementDriverDetail.setPrepayFreightFlag(SettlementDriverEnum.PrepayFreightFlag.NO_PAY.getCode());
settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
} else {
// 发mq (同步网络货运)
Message message = MessageBuilder.withBody(JSONUtil.parse(orderChild).toString().getBytes()).build();
rabbitTemplate.send(
RabbitKeyConstants.ORDER_CHILD_SYNC_TRANSPORT_EXCHANGE, RabbitKeyConstants.ORDER_CHILD_SYNC_TRANSPORT_ROUTE_KEY, message
......@@ -81,28 +97,56 @@ public class SettlementServiceImpl implements SettlementService {
return;
}
// 结算金额
settlementOwnerDetail.setSettlementFreight(settlementFreightCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
if (SettlementOwnerEnum.InvoiceType.ORDINARY.getCode().equals(invoiceType)) {
if (settlementOwnerDetail.getSettlementFreight().compareTo(BigDecimal.ZERO) == 0) {
settlementOwnerDetail.setFinalPaymentStatus(SettlementOwnerDetailEnum.FinalPaymentStatus.NO_REQUIRE.getCode());
}
// 设置开票公司信息
// 如果开票标识为“普通单”时,开票公司“五寨华祥”
InvoicingCompanyVO invoiceCompany = invoicingCompanyService.getInvoicingCompanyByGroupCode(
settlementConfig.getOrdinaryInvoiceCompanyGroupCode());
settlementOwnerDetail.setInvoicingCompanyId(invoiceCompany.getId());
settlementOwnerDetail.setInvoicingCompanyShorterName(invoiceCompany.getCompanyShorterName());
settlementOwnerDetail.setInvoicingCompanyGroupCode(invoiceCompany.getCompanyGroupCode());
settlementOwnerDetail.setInvoiceServiceFeeRate(BigDecimal.ZERO);
if (Objects.equals(invoiceCompany.getQuotationType(), InvoicingCompanyEnum.TaxType.TAX_EXCLUDED.getCode())) {
settlementOwnerDetail.setInvoiceServiceFeeRate(
invoiceCompany.getServiceFeeRate() == null ? BigDecimal.ZERO : invoiceCompany.getServiceFeeRate());
}
settlementDriverDetail.setInvoicingCompanyId(invoiceCompany.getId());
settlementDriverDetail.setInvoicingCompanyShorterName(invoiceCompany.getCompanyShorterName());
settlementDriverDetail.setInvoicingCompanyGroupCode(invoiceCompany.getCompanyGroupCode());
} else {
if (settlementDriverDetail.getSettlementFreight().compareTo(BigDecimal.ZERO) == 0) {
settlementOwnerDetail.setFinalPaymentStatus(SettlementOwnerDetailEnum.FinalPaymentStatus.NO_REQUIRE.getCode());
}
}
settlementOwnerDetail.setInvoiceType(invoiceType);
settlementDriverDetail.setInvoiceType(invoiceType);
// 开票服务费
settlementOwnerDetail.setInvoiceServiceFee(
settlementCommonService.invoiceServiceFeeCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
// 开票金额
settlementOwnerDetail.setInvoiceFreight(
settlementCommonService.invoiceFreightCalc(orderChild.getSettlementWay(),
orderGoods.getInvoiceServiceFeeRate(), settlementOwnerDetail));
// 结算金额
settlementOwnerDetail.setSettlementFreight(settlementCommonService.settlementFreightCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
log.info("当前货主结算信息{},车主结算信息:{}", JSONUtil.parse(settlementOwnerDetail), JSONUtil.parse(settlementDriverDetail));
settlementOwnerDetailDao.updateInvoiceType(settlementOwnerDetail);
settlementDriverDetailDao.updateInvoiceTypeAndPrepayFreightFlag(settlementDriverDetail);
//普通单解冻
applicationEventPublisher.publishEvent(new OwnerLoanThawEvent(this, childNo));
// 发送mq 通过开票标识
settlementMqService.invoiceTypeSync(childNo, invoiceType);
// 发送mq 结算统计
settlementMqService.settlementStatistics(childNo, invoiceType);
}
......@@ -185,29 +229,4 @@ public class SettlementServiceImpl implements SettlementService {
}
}
/**
* 开票金额
*/
private BigDecimal invoiceFreightCalc(Integer settlementWay, SettlementOwnerDetail settlementOwnerDetail) {
if (Objects.equals(settlementWay, SettlementWayEnum.WayType.LOAD.getCode())) { //订单结算方式为“装车净重”时,开票金额=实际净重*平台运费报价-货损金额。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice())
.subtract(settlementOwnerDetail.getLossFreight());
} else { //订单结算方式为“卸车净重”时,开票金额=实际净重*平台运费报价。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice());
}
}
/**
* 结算金额
*/
private BigDecimal settlementFreightCalc(Integer settlementWay, SettlementOwnerDetail settlementOwnerDetail) {
if (Objects.equals(settlementWay, SettlementWayEnum.WayType.LOAD.getCode())) { //订单结算方式为“装车净重”时,结算金额=实际净重*平台运费报价-预付运费-货损金额。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice())
.subtract(settlementOwnerDetail.getPrepayFreight()).subtract(settlementOwnerDetail.getLossFreight());
} else { //订单结算方式为“卸车净重”时,结算金额=实际净重*平台运费报价-预付运费
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice()).subtract(settlementOwnerDetail.getPrepayFreight());
}
}
}
package com.clx.performance.service.ordergoods;
import com.clx.performance.model.OrderGoods;
import java.util.List;
public interface OrderGoodsPostService {
void orderGoodsAdd(OrderGoods orderGoods);
void orderGoodsAdd(List<OrderGoods> orderGoodsList);
}
......@@ -7,6 +7,7 @@ import com.clx.performance.param.app.NetworkDriverPageParam;
import com.clx.performance.param.pc.PageNetworkAccountInfoListParam;
import com.clx.performance.vo.app.APPNetworkDriverRunningWaterRecordVO;
import com.clx.performance.vo.pc.NetworkDriverRunningWaterRecordVO;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
......@@ -25,6 +26,8 @@ public interface NetworkDriverRunningWaterRecordService {
void generateCaseOutSuccessRunningWaterRecord(SettlementDriverDetail settlementDriverDetail);
void generateCaseOutSuccessRunningWaterRecord1(SettlementDriverDetail settlementDriverDetail);
void generateNetworkDriverRunningWaterRecord(SettlementDriverDetail settlementDriverDetail, Integer runningWaterType);
IPage<APPNetworkDriverRunningWaterRecordVO> pageFrozenList(NetworkDriverPageParam param);
......
package com.clx.performance.service.settle;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import java.math.BigDecimal;
public interface SettlementCommonService {
BigDecimal invoiceServiceFeeCalc(Integer settlementWay, SettlementOwnerDetail settlementOwnerDetail);
BigDecimal invoiceFreightCalc(Integer settlementWay, BigDecimal invoiceServiceFeeRate, SettlementOwnerDetail settlementOwnerDetail);
BigDecimal settlementFreightCalc(Integer settlementWay, SettlementOwnerDetail settlementOwnerDetail);
}
package com.clx.performance.service.settle;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.vo.mq.SettlementDetailAddMqParam;
import com.clx.performance.vo.mq.SettlementDetailInvoiceTypeSyncMqParam;
import com.clx.performance.vo.mq.*;
public interface SettlementMqHandlerService {
void settlementDetailAdd(SettlementDetailAddMqParam mq);
void settlementDetailInvoiceTypeSync(SettlementDetailInvoiceTypeSyncMqParam mq);
void settlementStatistics(SettlementStatisticsMqParam mq);
void settle(SettlementSettleMqParam mq);
void invoiceTypeSync(SettlementInvoiceTypeSyncMqParam mq);
void invoiceStatusSync(SettlementInvoiceStatusSyncMqParam mq);
void payStatusSync(SettlementPayStatusSyncMqParam mq);
void settlementDriverNotify(String childNo,Integer payType,String payErrorMsg);
......
......@@ -4,6 +4,13 @@ public interface SettlementMqService {
void settlementDetailAdd(Integer settlementOwnerDetailId, Integer settlementDriverDetailId);
void invoiceTypeSync(String childNo, Integer invoiceType);
void settlementStatistics(String childNo, Integer invoiceType);
void invoiceTypeSync(String childNo);
void settle(String childNo, Integer invoiceType, String remark);
void invoiceStatusSync(String childNo);
void payStatusSync(String childNo);
}
package com.clx.performance.service.settle;
import com.clx.performance.param.pc.owner.PageCarrierSettlementPlatformServiceFeeParam;
public interface SettlementPlatformServiceFeeExportService {
void exportPlatformServiceFee(PageCarrierSettlementPlatformServiceFeeParam param);
}
package com.clx.performance.service.settle;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.param.pc.owner.PageCarrierSettlementPlatformServiceFeeParam;
import com.clx.performance.vo.pc.carrier.settle.SettlementPlatformServiceFeeVO;
/**
* @author
* Date 2023-10-12
* Time 09:43
*/
public interface SettlementPlatformServiceFeeService {
IPage<SettlementPlatformServiceFeeVO> pagePlatformServiceFee(PageCarrierSettlementPlatformServiceFeeParam param);
}
......@@ -40,7 +40,9 @@ public class OrderGoodsSqlProvider {
" date_format(a.create_time, '%Y-%m-%d %H:%i:%s') as create_time," +
" date_format(a.modified_time, '%Y-%m-%d %H:%i:%s') as modified_time," +
"a.extract_way,a.need_truck_num,a.senior_logistics_manager_id,a.senior_logistics_manager_name,a.pending_order_freight," +
"a.user_no,a.user_name,a.stop_flag,a.batch_number,a.last_arrive_receive_time,a.last_load_time,a.last_order_time,a.vehicle_usage");
"a.user_no,a.user_name,a.stop_flag,a.batch_number,a.last_arrive_receive_time,a.last_load_time,a.last_order_time,a.vehicle_usage," +
" a.platform_freight_quotation_tax_type, a.platform_service_fee_rate, " +
" a.deposit, a.invoice_service_fee_rate, a.settlement_way, a.support_loan ");
FROM("order_goods a");
if (StringUtils.isNotBlank(param.getBeginTime()) && StringUtils.isNotBlank(param.getEndTime())) {
......@@ -179,7 +181,8 @@ public class OrderGoodsSqlProvider {
"need_truck_num,vehicle_usage,pending_order_way,pending_order_time,pending_order_freight,last_arrive_send_time,senior_logistics_manager_id," +
"senior_logistics_manager_name,order_no,order_goods_no,order_goods_status,send_address_id,send_address_shorter,send_system_address_id,send_longitude," +
"send_latitude,receive_latitude,receive_longitude,receive_address_id,receive_address_shorter,receive_system_address_id,goods_name,goods_id,create_time,modified_time," +
"user_name,user_no,batch_number,last_arrive_receive_time,last_load_time,last_order_time,settlement_account_period,settlement_way) VALUES ");
"user_name,user_no,batch_number,last_arrive_receive_time,last_load_time,last_order_time,settlement_account_period,settlement_way," +
"platform_freight_quotation_tax_type, platform_service_fee_rate, deposit, invoice_service_fee_rate) VALUES ");
for (int i = 0; i < orderGoodsList.size(); i++) {
OrderGoods o = orderGoodsList.get(i);
......@@ -194,8 +197,9 @@ public class OrderGoodsSqlProvider {
.append(o.getReceiveAddressId()).append("','").append(o.getReceiveAddressShorter()).append("',").append(o.getReceiveSystemAddressId()).append(",'").append(o.getGoodsName()).append("','")
.append(o.getGoodsId()).append("','").append(o.getCreateTime()).append("','").append(o.getModifiedTime()).append("','").append(o.getUserName()).append("','")
.append(o.getUserNo()).append("','").append(o.getBatchNumber()).append("','").append(o.getLastArriveReceiveTime()).append("','")
.append(o.getLastLoadTime()).append("','").append(o.getLastOrderTime()).append("','").append(o.getSettlementAccountPeriod()).append("','").append(o.getSettlementWay())
.append("')");
.append(o.getLastLoadTime()).append("','").append(o.getLastOrderTime()).append("','").append(o.getSettlementAccountPeriod()).append("','").append(o.getSettlementWay()).append("','")
.append(o.getPlatformFreightQuotationTaxType()).append("',").append(o.getPlatformServiceFeeRate()).append(",").append(o.getDeposit()).append(",").append(o.getInvoiceServiceFeeRate())
.append(")");
if (i < orderGoodsList.size() - 1) {
sqlList.append(",");
......
package com.clx.performance.sqlProvider.settle;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.param.pc.owner.PageCarrierSettlementPlatformServiceFeeParam;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.jdbc.SQL;
import java.util.Objects;
public class SettlementPlatformServiceFeeSqlProvider {
private static final String TABLE = "settlement_platform_service_fee";
public String pageByParam(@Param("page") Page page, @Param("param") PageCarrierSettlementPlatformServiceFeeParam param) {
return new SQL(){{
SELECT("*");
FROM(TABLE);
if (StringUtils.isNotBlank(param.getChildNo())) {WHERE("child_no = #{param.childNo}");}
if (StringUtils.isNotBlank(param.getDriverName())) {WHERE("driver_name like CONCAT(#{param.driverName},'%')");}
if (StringUtils.isNotBlank(param.getDriverMobile())) {WHERE("driver_mobile = #{param.driverMobile}");}
if (Objects.nonNull(param.getDriverUserNo())) {WHERE("driver_user_no = #{param.driverUserNo}");}
if (Objects.nonNull(param.getBeginTime())) {WHERE("create_time >= #{param.beginTime}");}
if (Objects.nonNull(param.getEndTime())) {WHERE("create_time <= #{param.endTime}");}
ORDER_BY("id desc");
}}.toString();
}
}
......@@ -17,6 +17,7 @@ import com.clx.performance.enums.PendingOrderWayStatusEnum;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.enums.TruckDemandEnum;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.service.ordergoods.OrderGoodsPostService;
import com.clx.performance.strategy.GoodsOrderStrategy;
import com.msl.common.exception.ServiceSystemException;
import com.msl.common.utils.DateUtils;
......@@ -66,6 +67,8 @@ public class OwnGoodsOrderStrategy extends GoodsOrderStrategy implements Initial
private final IdGenerateSnowFlake idGenerateSnowFlake;
private final OrderGoodsPostService orderGoodsPostService;
@Override
@Transactional(rollbackFor = Exception.class)
public LocalDateTime goodsOrderProcess(OrderGoodsParams orderGoodsParams, FeignOrderVO orderInfo, LocalDateTime now) {
......@@ -175,6 +178,14 @@ public class OwnGoodsOrderStrategy extends GoodsOrderStrategy implements Initial
orderGoods.setSettlementAccountPeriod(orderInfo.getSettlementAccountPeriod());
//设置结算方式
orderGoods.setSettlementWay(orderInfo.getSettlementWay());
// 平台服务费
orderGoods.setPlatformFreightQuotationTaxType(orderInfoFeign.getPlatformFreightQuotationTaxType());
orderGoods.setInvoiceServiceFeeRate(orderInfoFeign.getPlatformFreightQuotationTaxRate());
orderGoods.setPlatformServiceFeeRate(orderInfoFeign.getPlatformServiceFeeRate());
orderGoods.setDeposit(orderInfoFeign.getDeposit());
orderGoods.setSupportLoan(orderInfoFeign.getSupportLoan());
List<OrderOwnTruckVo> orderOwnTruckVos = orderFeign.selectTruckListFeign(orderNo);
if (orderOwnTruckVos == null || orderOwnTruckVos.isEmpty()) {
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, "全部自由车辆列表数据为空");
......@@ -199,6 +210,9 @@ public class OwnGoodsOrderStrategy extends GoodsOrderStrategy implements Initial
}
orderGoodsDao.saveBatchEntity(orderGoodsList);
// 货单新增后置逻辑
orderGoodsPostService.orderGoodsAdd(orderGoodsList);
UpdateOrderInfoResidueWeightParam param = new UpdateOrderInfoResidueWeightParam();
param.setOrderId(orderInfo.getId());
param.setUpdateType("1");
......
......@@ -13,6 +13,7 @@ import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.dao.OrderGoodsTruckBindDao;
import com.clx.performance.enums.*;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.service.ordergoods.OrderGoodsPostService;
import com.clx.performance.strategy.GoodsOrderStrategy;
import com.msl.common.exception.ServiceSystemException;
import com.msl.common.utils.DateUtils;
......@@ -60,6 +61,7 @@ public class PartGoodsOrderStrategy extends GoodsOrderStrategy implements Initia
private final GoodsOrderTruckRecordComponent goodsOrderTruckRecordComponent;
private final IdGenerateSnowFlake idGenerateSnowFlake;
private final OrderGoodsPostService orderGoodsPostService;
@Override
@Transactional(rollbackFor = Exception.class)
......@@ -179,6 +181,14 @@ public class PartGoodsOrderStrategy extends GoodsOrderStrategy implements Initia
orderGoods.setSettlementAccountPeriod(orderInfo.getSettlementAccountPeriod());
//设置结算方式
orderGoods.setSettlementWay(orderInfo.getSettlementWay());
// 平台服务费
orderGoods.setPlatformFreightQuotationTaxType(orderInfoFeign.getPlatformFreightQuotationTaxType());
orderGoods.setInvoiceServiceFeeRate(orderInfoFeign.getPlatformFreightQuotationTaxRate());
orderGoods.setPlatformServiceFeeRate(orderInfoFeign.getPlatformServiceFeeRate());
orderGoods.setDeposit(orderInfoFeign.getDeposit());
orderGoods.setSupportLoan(orderInfoFeign.getSupportLoan());
if (CollectionUtil.isNotEmpty(child.getTruckList())) {
orderGoodsTruckBindDao.saveBatchEntity(orderNo, orderGoodsNo, child.getTruckList(), now);
goodsOrderTruckRecordComponent.saveTruckRecord(orderGoodsNo, child.getTruckList());
......@@ -191,6 +201,10 @@ public class PartGoodsOrderStrategy extends GoodsOrderStrategy implements Initia
orderGoodsList.add(orderGoods);
}
orderGoodsDao.saveBatchEntity(orderGoodsList);
// 货单新增后置逻辑
orderGoodsPostService.orderGoodsAdd(orderGoodsList);
BigDecimal residueWeight = new BigDecimal(orderInfo.getResidueWeight());
if (platSum.compareTo(BigDecimal.ZERO) != 0 && ownSum.compareTo(BigDecimal.ZERO) != 0) {
BigDecimal residuePlatSum = new BigDecimal(orderInfo.getPlatformResidueCarryWeight());
......
......@@ -13,6 +13,7 @@ import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.dao.OrderGoodsTruckBindDao;
import com.clx.performance.enums.*;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.service.ordergoods.OrderGoodsPostService;
import com.clx.performance.strategy.GoodsOrderStrategy;
import com.msl.common.exception.ServiceSystemException;
import com.msl.common.utils.DateUtils;
......@@ -62,6 +63,7 @@ public class PlatformGoodsOrderStrategy extends GoodsOrderStrategy implements In
private final IdGenerateSnowFlake idGenerateSnowFlake;
private final OrderGoodsPostService orderGoodsPostService;
@Override
@Transactional(rollbackFor = Exception.class)
......@@ -174,6 +176,13 @@ public class PlatformGoodsOrderStrategy extends GoodsOrderStrategy implements In
//设置结算方式
orderGoods.setSettlementWay(orderInfo.getSettlementWay());
// 平台服务费
orderGoods.setPlatformFreightQuotationTaxType(orderInfoFeign.getPlatformFreightQuotationTaxType());
orderGoods.setInvoiceServiceFeeRate(orderInfoFeign.getPlatformFreightQuotationTaxRate());
orderGoods.setPlatformServiceFeeRate(orderInfoFeign.getPlatformServiceFeeRate());
orderGoods.setDeposit(orderInfoFeign.getDeposit());
orderGoods.setSupportLoan(orderInfoFeign.getSupportLoan());
if (CollectionUtil.isNotEmpty(child.getTruckList())) {
orderGoodsTruckBindDao.saveBatchEntity(orderNo, orderGoodsNo, child.getTruckList(), now);
goodsOrderTruckRecordComponent.saveTruckRecord(orderGoodsNo, child.getTruckList());
......@@ -185,6 +194,10 @@ public class PlatformGoodsOrderStrategy extends GoodsOrderStrategy implements In
orderGoodsList.add(orderGoods);
}
orderGoodsDao.saveBatchEntity(orderGoodsList);
// 货单新增后置逻辑
orderGoodsPostService.orderGoodsAdd(orderGoodsList);
UpdateOrderInfoResidueWeightParam param = new UpdateOrderInfoResidueWeightParam();
param.setOrderId(orderInfo.getId());
param.setUpdateType("1");
......
package com.clx.performance.struct;
import com.clx.performance.enums.PlatformServiceFeeConfigEnum;
import com.clx.performance.model.PlatformServiceFeeConfig;
import com.clx.performance.vo.feign.PlatformServiceFeeConfigFeignVO;
import com.clx.performance.vo.pc.carrier.settle.CarrierPagePlatformServiceFeeConfigVO;
import com.msl.common.utils.DateStructUtil;
import com.msl.common.utils.DateUtils;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import java.util.Objects;
@Mapper(componentModel = "spring", uses = DateStructUtil.class, imports = {PlatformServiceFeeConfigEnum.class, Objects.class, DateUtils.class})
public interface PlatformServiceFeeConfigStruct {
@Mapping(target = "orderQuotationTypeMsg", expression = "java(Objects.isNull(config.getOrderQuotationType()) ? null : PlatformServiceFeeConfigEnum.getMsgByCode(config.getOrderQuotationType()))")
CarrierPagePlatformServiceFeeConfigVO convertToDetail(PlatformServiceFeeConfig config);
PlatformServiceFeeConfigFeignVO convertPlatformServiceFeeConfigFeignVO(PlatformServiceFeeConfig config);
}
package com.clx.performance.struct.settle;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.model.settle.SettlementPlatformServiceFee;
import com.clx.performance.vo.pc.carrier.settle.SettlementPlatformServiceFeeVO;
import com.msl.common.utils.DateStructUtil;
import com.msl.common.utils.DateUtils;
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring", uses = DateStructUtil.class, imports = {DateUtils.class})
public interface SettlementPlatformServiceFeeStruct {
SettlementPlatformServiceFeeVO convert(SettlementPlatformServiceFee item);
Page<SettlementPlatformServiceFeeVO> convertPage(IPage<SettlementPlatformServiceFee> page);
}
......@@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
......@@ -32,9 +33,15 @@ public class ExcelData {
this(value,null);
}
public ExcelData(String value, String defaultValue) {
if (!StringUtils.isBlank(value)) {
this.value = value;
this.dataType = DataType.STRING.value;
}
else {
this.value = defaultValue;
this.dataType = DataType.STRING.value;
}
}
public ExcelData(Double value) {
this(value,null);
......
......@@ -20,11 +20,13 @@ public class ExcelField {
private Integer width;
private Integer styleType;
private Integer contentAlignment;
private Integer span;
public ExcelField(String fieldName, String field, Integer width) {
this.fieldName = fieldName;
this.field = field;
this.width = width;
this.span = 1;
}
public ExcelField(Integer column, String fieldName, String field, Integer width) {
......@@ -32,5 +34,13 @@ public class ExcelField {
this.fieldName = fieldName;
this.field = field;
this.width = width;
this.span = 1;
}
public ExcelField(Integer column, String fieldName, String field, Integer width, Integer span) {
this.column = column;
this.fieldName = fieldName;
this.field = field;
this.width = width;
this.span = span;
}
}
package com.clx.performance.utils.excel;
import com.clx.performance.utils.excel.ExcelData;
import com.clx.performance.utils.excel.ExcelField;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -19,6 +21,7 @@ public class ExcelSheet {
private String time;
private Integer timeStyleType;
private List<ExcelField> fieldList;
private List<ExcelField> fieldSecondList;
private List<List<ExcelData>> dataList;
public ExcelSheet(String name, String title) {
......@@ -32,11 +35,24 @@ public class ExcelSheet {
this.fieldList = fieldList;
}
public ExcelSheet(String name, List<ExcelField> fieldList, List<List<ExcelData>> dataList) {
this.name = name;
this.title = name;
this.fieldList = fieldList;
this.dataList = dataList;
}
public ExcelSheet(String name, String title, List<ExcelField> fieldList, List<List<ExcelData>> dataList) {
this.name = name;
this.title = title;
this.fieldList = fieldList;
this.dataList = dataList;
}
public ExcelSheet(String name, String title, List<ExcelField> fieldList, List<ExcelField> fieldSecondList, List<List<ExcelData>> dataList) {
this.name = name;
this.title = title;
this.fieldList = fieldList;
this.fieldSecondList = fieldSecondList;
this.dataList = dataList;
}
}
......@@ -12,7 +12,12 @@ import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
......@@ -39,11 +44,30 @@ public class ExcelUtil {
}
/**
* 导出
*/
public static void export(ExcelSheet excelSheet) {
// 创建excel
SXSSFWorkbook workbook = create(excelSheet);
// 导出
HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);
try {
workbook.write(response.getOutputStream());
}catch (Exception e){
throw new RuntimeException("文件导出失败");
}
}
/**
* 创建excel
*/
public static SXSSFWorkbook create(ExcelSheet excelSheet) {
List<ExcelField> fieldList = excelSheet.getFieldList();
List<ExcelField> fieldSecondList = excelSheet.getFieldSecondList();
List<List<ExcelData>> dataList = excelSheet.getDataList();
SXSSFWorkbook workbook = new SXSSFWorkbook();
......@@ -51,14 +75,39 @@ public class ExcelUtil {
//创建sheet
SXSSFSheet sheet = workbook.createSheet(excelSheet.getName());
int fieldSize = fieldList.size();
for (int i = 0; i < fieldSize; i++) {
sheet.setColumnWidth(i, fieldList.get(i).getWidth());
int dataFieldSize = 0;
for (int i = 0; i < fieldList.size(); i++) {
dataFieldSize += fieldList.get(i).getSpan();
}
// 设置列宽
for (int i = 0, columnIdx = 0; i < fieldList.size(); i++) {
Integer width = null;
if (fieldList.get(i).getWidth() != null){width = fieldList.get(i).getWidth()/fieldList.get(i).getSpan();}
for (int j = 0; j < fieldList.get(i).getSpan(); j++) {
if (width != null) {sheet.setColumnWidth(columnIdx, width);}
columnIdx++;
}
}
if (fieldSecondList != null) {
for (int i = 0, columnIdx = 0; i < fieldSecondList.size(); i++) {
Integer width = null;
if (fieldSecondList.get(i).getWidth() != null){width = fieldSecondList.get(i).getWidth()/fieldSecondList.get(i).getSpan();}
for (int j = 0; j < fieldSecondList.get(i).getSpan(); j++) {
if (width != null) {sheet.setColumnWidth(columnIdx, width);}
columnIdx++;
}
}
}
//添加标题
int row = 0;
CellRangeAddress cellRangeAddress = new CellRangeAddress(row, row, 0, fieldSize - 1);
CellRangeAddress cellRangeAddress = new CellRangeAddress(row, row, 0, dataFieldSize - 1);
SXSSFRow rowTitle = sheet.createRow(row++);
sheet.addMergedRegion(cellRangeAddress);
rowTitle.setHeightInPoints(30);
......@@ -69,7 +118,7 @@ public class ExcelUtil {
//时间
if (StringUtils.isNotBlank(excelSheet.getTime())) {
CellRangeAddress timeCellRangeAddress = new CellRangeAddress(row, row, 0, fieldSize - 1);
CellRangeAddress timeCellRangeAddress = new CellRangeAddress(row, row, 0, dataFieldSize - 1);
SXSSFRow rowTime = sheet.createRow(row++);
sheet.addMergedRegion(timeCellRangeAddress);
......@@ -84,15 +133,49 @@ public class ExcelUtil {
//添加表头
CellStyle headCellStyle = getHeadStyle(workbook);
SXSSFRow rowHead = sheet.createRow(row++);
for (int i = 0; i < fieldSize; i++) {
SXSSFCell headCell = rowHead.createCell(i);
for (int i = 0, columnIdx=0; i < fieldList.size(); i++) {
SXSSFCell headCell = rowHead.createCell(columnIdx);
if (fieldList.get(i).getFieldName() != null) {
headCell.setCellValue(fieldList.get(i).getFieldName());
}
if (fieldList.get(i).getSpan()>1) {
CellRangeAddress cellAddresses = new CellRangeAddress(row-1, row-1, columnIdx, columnIdx + fieldList.get(i).getSpan()-1);
sheet.addMergedRegion(cellAddresses);
}
Integer styleType = fieldList.get(i).getStyleType();
if (null != styleType) {
headCell.setCellStyle(getCellStyle(workbook, styleType));
} else {
headCell.setCellStyle(headCellStyle);
}
columnIdx += fieldList.get(i).getSpan();
}
//添加二级表头
if (fieldSecondList != null) {
CellStyle headCellStyleSecond = getHeadStyle(workbook);
SXSSFRow rowHeadSecond = sheet.createRow(row++);
for (int i = 0, columnIdx = 0; i < fieldSecondList.size(); i++) {
SXSSFCell headCell = rowHeadSecond.createCell(columnIdx);
if (fieldSecondList.get(i).getFieldName()!=null) {
headCell.setCellValue(fieldSecondList.get(i).getFieldName());
}
if (fieldSecondList.get(i).getSpan() > 1){
CellRangeAddress cellAddresses = new CellRangeAddress(row-1, row-1, columnIdx, columnIdx + fieldSecondList.get(i).getSpan()-1);
sheet.addMergedRegion(cellAddresses);
}
Integer styleType = fieldSecondList.get(i).getStyleType();
if (null != styleType) {
headCell.setCellStyle(getCellStyle(workbook, styleType));
} else {
headCell.setCellStyle(headCellStyleSecond);
}
columnIdx += fieldSecondList.get(i).getSpan();
}
}
//内容
......@@ -100,7 +183,7 @@ public class ExcelUtil {
int dataSize = dataList.size();
for (int i = 0; i < dataSize; i++) {
rowData = sheet.createRow(row++);
for (int j = 0; j < fieldSize; j++) {
for (int j = 0; j < dataFieldSize; j++) {
SXSSFCell dataCell = rowData.createCell(j);
ExcelData excelData = dataList.get(i).get(j);
setCellValue(dataCell, excelData);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论