提交 4ffcb910 authored 作者: 杨启发's avatar 杨启发

Merge remote-tracking branch 'origin/v17.5_order_child_sync_broker_20240617'…

Merge remote-tracking branch 'origin/v17.5_order_child_sync_broker_20240617' into v17.5_order_child_sync_broker_20240617
......@@ -49,6 +49,22 @@ 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);
}
}
}
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 childNo,
@RequestParam @NotNull(message = "userCode不能为空") String userCode);
}
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; //开票类型
}
......@@ -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
......
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 = "车辆燃料类型 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 orderInfo;
@ApiModelProperty(value = "图片", required = true)
@NotEmpty(message = "运单图片不能为空")
private List<OpenOrderChildImageDTO> imageList;
@ApiModelProperty(value = "司机", required = true)
@NotNull(message = "司机不能为空")
private OpenOrderChildDriverDTO driverInfo;
@ApiModelProperty(value = "车主", required = true)
@NotNull(message = "车主不能为空")
private OpenOrderChildTruckOwnerDTO ownerInfo;
@ApiModelProperty(value = "车辆", required = true)
@NotNull(message = "车辆不能为空")
private OpenOrderChildTruckDTO truckInfo;
@ApiModelProperty(value = "运单", required = true)
@NotNull(message = "运单不能为空")
private OpenOrderChildDTO orderChildInfo;
}
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;
}
......@@ -77,7 +77,7 @@ public class CarrierPageSettlementDriverDetailVO {
@ApiModelProperty(value = "开票公司id")
private Integer invoicingCompanyId;
@ApiModelProperty(value = "开票公司简称")
private Integer invoicingCompanyShorterName;
private String invoicingCompanyShorterName;
@MoneyOutConvert
@ApiModelProperty(value = "平台服务费")
private BigDecimal platformServiceFee;
......
......@@ -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,7 @@ package com.clx.performance.component;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.json.JSONUtil;
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 +26,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;
......@@ -89,6 +91,8 @@ public class OrderChildLoanComponent {
private final PaymentService paymentService;
private final OrderService orderService;
/**
* 接单校验判断
*
......@@ -201,6 +205,7 @@ 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,如果不需要借款相关逻辑,正常设置结算金额
......@@ -224,6 +229,12 @@ public class OrderChildLoanComponent {
log.info("3.当前是网运单,但预付运费不为0,说明已经处理");
return;
}
if (!Objects.equals(orderInfo.getSupportLoan(), StatusEnum.YES.getCode())){
log.info("3.2当前运单不支持货主借款");
return;
}
Integer loanTypeFlag = null;
String childNo = settlementDriverDetail.getChildNo();
......
......@@ -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);
}
}
......@@ -9,11 +9,12 @@ import org.springframework.stereotype.Component;
@Component
public class SettlementConfig {
// 普通单开票公司
private InvoiceCompany invoiceCompanyDefault;
// broker host
private String brokerHost;
// broker用户编号
private String brokerUserCode;
// 普通单开票公司编号
private String ordinaryInvoiceCompanyGroupCode;
@Data
public class InvoiceCompany {
String companyGroupCode;
}
}
......@@ -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;
}
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.SettlementMqService;
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;
@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();
}
}
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.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 +19,8 @@ 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))
);
}
}
......@@ -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.clx.performance.model.settle.SettlementOwnerDetail;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import java.util.List;
/**
......@@ -19,7 +21,10 @@ 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))
.eq(OrderChildSyncTransportRecord::getStatus, 0)
);
}
@Override
......
......@@ -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;
......@@ -161,4 +162,14 @@ public class SettlementOwnerDetailDaoImpl extends BaseDaoImpl<SettlementOwnerDet
);
}
@Override
public List<SettlementOwnerDetail> listInvoiceStatusSync() {
return list(lUdWrapper()
.gt(SettlementOwnerDetail::getCreateTime, LocalDateTime.now().minusMonths(3))
.eq(SettlementOwnerDetail::getInvoiceChannel, SettlementOwnerDetailEnum.InvoiceChannel.BROKER.getCode())
.eq(SettlementOwnerDetail::getInvoiceStatus, SettlementOwnerDetailEnum.InvoiceStatus.NO.getCode())
.eq(SettlementOwnerDetail::getInvoiceType, SettlementOwnerEnum.InvoiceType.ONLINE.getCode())
);
}
}
......@@ -48,4 +48,5 @@ public interface SettlementOwnerDetailDao extends BaseDao<SettlementOwnerDetailM
void updateSettlementMerge(String settlementNo, List<String> settlementNos);
List<SettlementOwnerDetail>listInvoiceStatusSync();
}
......@@ -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;
......@@ -144,8 +139,8 @@ public class EventListenerComponent {
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 {
......
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.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());
}
}
@Override
public TransportVO getOrderChildStatus(String childNo) {
Result<TransportVO> result = brokerFeign.getTransportByChildNo(childNo, settlementConfig.getBrokerUserCode());
if (result.getCode() != 0) {
log.info("运单同步网络货运失败, msg:{}", result.getMsg());
}
return result.getData();
}
}
......@@ -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,9 +49,9 @@ public class OrderChildPaySyncTransportJob {
private final OrderGoodsDao orderGoodsDao;
/**
* 同步网络货运
* 同步网络货运运单支付(禁用网络货运同步)
*/
@XxlJob("orderChildPaySyncTransportJob")
// @XxlJob("orderChildPaySyncTransportJob")
public void orderChildPaySyncTransportJob() {
List<OrderChildSyncTransportRecord> recordList = orderChildSyncTransportRecordDao.selectListForJob();
if (CollectionUtil.isEmpty(recordList)) {
......@@ -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,9 +49,9 @@ public class OrderChildSyncTransportInvoiceExceptionJob {
private final SettlementDriverDetailDao settlementDriverDetailDao;
/**
* 同步网络货运
* 同步网络货运(禁用网络货运同步)
*/
@XxlJob("orderChildSyncTransportInvoiceExceptionJob")
// @XxlJob("orderChildSyncTransportInvoiceExceptionJob")
@Transactional(rollbackFor = Exception.class)
public void orderChildSyncTransportInvoiceExceptionJob() {
//只查询同步异常的网络货运任务
......
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<OrderChildSyncTransportInvoiceRecord> recordList = orderChildSyncTransportInvoiceRecordDao
.selectListForJob();
log.info("待同步无车承运运单状态,size:{}", recordList.size());
if (recordList.isEmpty()) {return;}
for (OrderChildSyncTransportInvoiceRecord item : recordList) {
settlementMqService.invoiceTypeSync(item.getChildNo());
}
orderChildSyncTransportInvoiceRecordDao.deleteByKeys(
recordList.stream().map(item->item.getId()).collect(Collectors.toList()));
}
/**
* 同步无车承运运单开票状态
*/
@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;
......
......@@ -3,9 +3,9 @@ package com.clx.performance.listener;
import cn.hutool.json.JSONUtil;
import com.clx.order.vo.pc.carrier.InvoicingCompanyVO;
import com.clx.performance.component.IdGenerateSnowFlake;
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;
......@@ -25,10 +25,9 @@ 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.msl.common.dto.HttpDTO;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
......@@ -72,7 +71,8 @@ public class OrderChildSyncTransportListener {
private final ApplicationEventPublisher applicationEventPublisher;
private final InvoicingCompanyService invoicingCompanyService;
private final SettlementConfig settlementConfig;
private final OrderChildBrokerService orderChildBrokerService;
private final OrderChildDao orderChildDao;
/**
* 承运同步网络货运运单
*/
......@@ -81,7 +81,10 @@ public class OrderChildSyncTransportListener {
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));
......@@ -100,85 +103,86 @@ public class OrderChildSyncTransportListener {
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(), orderGoods.getInvoiceServiceFeeRate(), settlementOwnerDetail));
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);
extracted(orderChild, bean, JSONUtil.parse(bean).toString(), settlementOwnerDetail, invoiceType, settlementDriverDetail);
// 同步broker
orderChildBrokerService.orderChildSync(orderChild, orderGoods, settlementOwnerDetail, settlementDriverDetail);
}
public void extracted(OrderChild orderChild, OrderChildSyncDTO bean, String remark,
SettlementOwnerDetail settlementOwnerDetail,
Integer invoiceType, SettlementDriverDetail settlementDriverDetail) {
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).get();
SettlementOwnerDetail settlementOwnerDetail,
Integer invoiceType, SettlementDriverDetail settlementDriverDetail) {
if (null != bean && bean.getCode() == 0) {
log.info("当前OrderChildSyncTransportListener监听同步网络货运成功,运单号为{}", orderChild.getChildNo());
if (null != bean.getData() && bean.getData().getStatus() == 1) {
//通过风控
List<OwnerRunningWaterRecord> runningWaterRecordList = ownerRunningWaterRecordDao.getOwnerRunningWaterRecord(orderChild.getOrderNo());
BigDecimal frozen = runningWaterRecordList.stream().filter(item -> {
return item.getRunningWaterType().equals(OwnerAccountEnum.RunningWaterStatus.FROZEN.getCode())
&& item.getAccountType().equals(OwnerAccountEnum.AccountTypeStatus.PREPAID_FREIGHT_ACCOUNT.getCode())
;
}).map(OwnerRunningWaterRecord::getAlterationBalance).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal takeOut = runningWaterRecordList.stream().filter(item -> {
return item.getRunningWaterType().equals(OwnerAccountEnum.RunningWaterStatus.TAKE_OUT.getCode())
&& item.getAccountType().equals(OwnerAccountEnum.AccountTypeStatus.PREPAID_FREIGHT_ACCOUNT.getCode())
;
}).map(OwnerRunningWaterRecord::getAlterationBalance).reduce(BigDecimal.ZERO, BigDecimal::add);
//设置预付运费金额
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());
if (null != bean && bean.getCode() == 0 && null != bean.getData() && bean.getData().getStatus() == 1){
invoiceType = SettlementOwnerEnum.InvoiceType.ONLINE.getCode();
}
extracted(orderChild, settlementOwnerDetail, settlementDriverDetail, invoiceType);
}
public void extracted(OrderChild orderChild,
SettlementOwnerDetail settlementOwnerDetail,
SettlementDriverDetail settlementDriverDetail,
Integer invoiceType) {
if (Objects.equals(invoiceType, SettlementOwnerEnum.InvoiceType.ONLINE.getCode())) {
//通过风控
List<OwnerRunningWaterRecord> runningWaterRecordList = ownerRunningWaterRecordDao.getOwnerRunningWaterRecord(orderChild.getOrderNo());
BigDecimal frozen = runningWaterRecordList.stream().filter(item -> {
return item.getRunningWaterType().equals(OwnerAccountEnum.RunningWaterStatus.FROZEN.getCode())
&& item.getAccountType().equals(OwnerAccountEnum.AccountTypeStatus.PREPAID_FREIGHT_ACCOUNT.getCode())
;
}).map(OwnerRunningWaterRecord::getAlterationBalance).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal takeOut = runningWaterRecordList.stream().filter(item -> {
return item.getRunningWaterType().equals(OwnerAccountEnum.RunningWaterStatus.TAKE_OUT.getCode())
&& item.getAccountType().equals(OwnerAccountEnum.AccountTypeStatus.PREPAID_FREIGHT_ACCOUNT.getCode())
;
}).map(OwnerRunningWaterRecord::getAlterationBalance).reduce(BigDecimal.ZERO, BigDecimal::add);
//设置预付运费金额
BigDecimal ans = getPrepayFreightPay(orderChild.getSettlementWay(), settlementOwnerDetail, frozen);
BigDecimal subtract = frozen.subtract(takeOut);
log.info("冻结预付运费:{}, 扣除的流水总和:{}", frozen, takeOut);
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) {
//账户扣钱并生成扣除流水
generateTakeOutRunningWatter(orderChild, ans, settlementOwnerDetail, settlementDriverDetail);
try {
//网络货运钱包账户
networkDriverRunningWaterRecordService.generateNetworkDriverRunningWaterRecord(
settlementDriverDetail,
NetworkDriverAccountEnum.RunningWaterStatus.SETTLEMENT.getCode()
);
//生成提现记录
networkDriverRunningWaterRecordService.generateNetworkCaseOutRecord(settlementDriverDetail);
} catch (Exception e) {
log.info("运单同步网络货运生成司机运单结算流水失败:{}", e.getMessage());
}
} else {
settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
settlementDriverDetail.setPrepayFreightFlag(SettlementDriverEnum.PrepayFreightFlag.NO_PAY.getCode());
} else {
if (subtract.subtract(ans).compareTo(BigDecimal.ZERO) >= 0) {
//账户扣钱并生成扣除流水
generateTakeOutRunningWatter(orderChild, ans, settlementOwnerDetail, settlementDriverDetail);
try {
//网络货运钱包账户
networkDriverRunningWaterRecordService.generateNetworkDriverRunningWaterRecord(
settlementDriverDetail,
NetworkDriverAccountEnum.RunningWaterStatus.SETTLEMENT.getCode()
);
//生成提现记录
networkDriverRunningWaterRecordService.generateNetworkCaseOutRecord(settlementDriverDetail);
} catch (Exception e) {
log.info("运单同步网络货运生成司机运单结算流水失败:{}", e.getMessage());
}
} else {
settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
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);
settlementDriverDetail.setPrepayFreightFlag(SettlementDriverEnum.PrepayFreightFlag.NO_PAY.getCode());
settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
settlementOwnerDetail.setFinalPaymentStatus(SettlementOwnerDetailEnum.FinalPaymentStatus.NO.getCode());
}
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).get();
// 结算金额
settlementOwnerDetail.setSettlementFreight(settlementFreightCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
......@@ -190,12 +194,15 @@ public class OrderChildSyncTransportListener {
settlementOwnerDetail.setInvoiceServiceFeeRate(BigDecimal.ZERO);
InvoicingCompanyVO invoiceCompany = invoicingCompanyService.getInvoicingCompanyByGroupCode(
settlementConfig.getInvoiceCompanyDefault().getCompanyGroupCode());
settlementConfig.getOrdinaryInvoiceCompanyGroupCode());
//设置开票公司信息
settlementOwnerDetail.setInvoicingCompanyId(invoiceCompany.getId());
settlementOwnerDetail.setInvoicingCompanyShorterName(invoiceCompany.getCompanyShorterName());
settlementOwnerDetail.setInvoicingCompanyGroupCode(invoiceCompany.getCompanyGroupCode());
settlementOwnerDetail.setInvoiceServiceFeeRate(
invoiceCompany.getServiceFeeRate()==null? BigDecimal.ZERO : orderGoods.getInvoiceServiceFeeRate());
settlementDriverDetail.setInvoicingCompanyId(invoiceCompany.getId());
settlementDriverDetail.setInvoicingCompanyShorterName(invoiceCompany.getCompanyShorterName());
settlementDriverDetail.setInvoicingCompanyGroupCode(invoiceCompany.getCompanyGroupCode());
......@@ -203,9 +210,6 @@ public class OrderChildSyncTransportListener {
if (settlementDriverDetail.getSettlementFreight().compareTo(BigDecimal.ZERO) == 0) {
settlementOwnerDetail.setFinalPaymentStatus(SettlementOwnerDetailEnum.FinalPaymentStatus.NO_REQUIRE.getCode());
}
// 如果开票标识为“网运单”时,开票费率取货单单所记录的开票费率
settlementOwnerDetail.setInvoiceServiceFeeRate(
orderGoods.getInvoiceServiceFeeRate()==null? BigDecimal.ZERO : orderGoods.getInvoiceServiceFeeRate());
}
settlementOwnerDetail.setInvoiceType(invoiceType);
settlementDriverDetail.setInvoiceType(invoiceType);
......
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);
}
}
......@@ -93,7 +93,7 @@ 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; //开票公司统一社会信用代码
......
......@@ -60,6 +60,7 @@ public class SettlementOwnerDetail implements HasKey<Integer> {
private String invoicingCompanyShorterName; //开票公司简称
private String invoicingCompanyGroupCode; //开票公司统一社会信用代码
private Integer reportFlag; //是否上报 0-否;1-是
private Integer invoiceChannel; //开票渠道:1无车承运
private Integer status; //状态
private LocalDateTime createTime; //创建时间
private LocalDateTime modifiedTime; //修改时间
......
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);
}
......@@ -6,6 +6,7 @@ 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;
......@@ -459,10 +460,14 @@ public class OrderChildServiceImpl implements OrderChildService {
orderChild.setInvoicingCompanyGroupCode(orderInfo.getInvoicingCompanyGroupCode());
orderChild.setReportFlag(orderInfo.getReportFlag());
// 平台服务费
orderChild.setPlatformServiceFeeRate(orderGoods.getPlatformServiceFeeRate());
orderChild.setPlatformServiceFee(orderGoods.getDeposit());
orderChild.setDeposit(orderGoods.getDeposit());
// 平台服务费 (订单运费报价为“未税”订单结算方式为“卸车净重(减货损))
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);
......@@ -1543,7 +1548,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);
}
......
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.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;
@Slf4j
@Service
public class OrderChildBrokerServiceImpl implements OrderChildBrokerService {
@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();
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(truckOwnerInfo.getMobile());
// 货单
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(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(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(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.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.setFreightPrice(orderChild.getFreightPrice().intValue());
orderChildInfo.setFreight(orderChild.getFreight().intValue());
orderChildInfo.setDriverFreight(orderChild.getFreight().intValue());
orderChildInfo.setDriverFreightPrice(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.setPayFinishedTime(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.setOrderInfo(orderInfo);
transportParam.setImageList(imageList);
transportParam.setDriverInfo(driverInfo);
transportParam.setOwnerInfo(ownerInfo);
transportParam.setTruckInfo(truckInfo);
transportParam.setOrderChildInfo(orderChildInfo);
brokerService.orderChildSync(transportParam);
}
}
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())
.divide(BigDecimal.ONE.subtract(settlementOwnerDetail.getInvoiceServiceFeeRate()), 0, RoundingMode.HALF_UP)
.multiply(settlementOwnerDetail.getInvoiceServiceFeeRate()).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())
.subtract(settlementOwnerDetail.getLossFreight());
}
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());
}
}
@Override
public 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 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()).subtract(settlementOwnerDetail.getPrepayFreight());
}
}
}
......@@ -108,13 +108,6 @@ public class SettlementDriverDetailServiceImpl implements SettlementDriverDetai
}
/**
* 开票金额
*/
private BigDecimal invoiceFreightCalc(BigDecimal freight, BigDecimal lossFreight){
return freight.subtract(lossFreight);
}
/**
* 结算金额
*/
......
......@@ -5,17 +5,20 @@ 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.*;
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.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.*;
import com.clx.performance.param.pc.payment.PayParam;
......@@ -23,14 +26,12 @@ 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;
......@@ -44,6 +45,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;
......@@ -92,6 +94,9 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
@Autowired
private SettlementPlatformServiceFeeDao settlementPlatformServiceFeeDao;
@Autowired
private OrderChildSyncTransportInvoiceRecordDao orderChildSyncTransportInvoiceRecordDao;
@Autowired
private OrderChildLogService orderChildLogService;
......@@ -104,17 +109,31 @@ 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;
@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());
......@@ -125,7 +144,6 @@ 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();
......@@ -176,6 +194,7 @@ 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 {
......@@ -194,6 +213,108 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
settlementDriverDetailDao.updateSettlementNo(settlementDriverDetail);
}
@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());
}
@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;
}
try {
// 获取状态
TransportVO result = brokerService.getOrderChildStatus(mq.getChildNo());
if (result == null){
log.info("运单号 {} 未找到运单信息",mq.getChildNo());
return;
}
Integer invoiceType;
if (Objects.equals(result.getRiskStatus(), 1) || Objects.equals(result.getRiskStatus(), 2)) {
invoiceType = SettlementOwnerEnum.InvoiceType.ORDINARY.getCode();
} else if (Objects.equals(result.getSyncStatus(), 2)) {
invoiceType = SettlementOwnerEnum.InvoiceType.ORDINARY.getCode();
} else if (Objects.equals(result.getSyncStatus(), 0)) {
OrderChildSyncTransportInvoiceRecord entity = new OrderChildSyncTransportInvoiceRecord();
entity.setChildNo(orderChild.getChildNo());
entity.setType(TransportSyncTypeEnum.Type.EXCEPTION.getCode());
entity.setRemark("处理中");
orderChildSyncTransportInvoiceRecordDao.saveEntity(entity);
return;
} else {
invoiceType = SettlementOwnerEnum.InvoiceType.ONLINE.getCode();
}
// 发送mq (结算)
settlementMqService.settle(orderChild.getChildNo(), invoiceType);
}catch (Exception e){
OrderChildSyncTransportInvoiceRecord entity = new OrderChildSyncTransportInvoiceRecord();
entity.setChildNo(orderChild.getChildNo());
entity.setType(TransportSyncTypeEnum.Type.EXCEPTION.getCode());
entity.setRemark("接口调用失败");
orderChildSyncTransportInvoiceRecordDao.saveEntity(entity);
}
}
@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;
}
// 获取状态
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);
}
}
@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;
}
// 获取状态
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) {
......@@ -202,26 +323,31 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
OrderChild orderChild = orderChildDao.getByChildNo(settlementDriverDetail.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
SettlementPlatformServiceFee 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());
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);
settlementPlatformServiceFeeDao.saveEntity(settlementPlatformServiceFee);
if (settlementPlatformServiceFee != null) {
settlementPlatformServiceFeeDao.saveEntity(settlementPlatformServiceFee);
}
log.info("更新网络标识 {} ",orderChild.getChildNo());
// 更新网络标识
settlementService.updateSettlementDetailInvoiceType(settlementOwnerDetail.getChildNo(), SettlementOwnerEnum.InvoiceType.ORDINARY.getCode());
}
......@@ -261,6 +387,7 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
settlementDriverDao.saveEntity(settlementDriver);
}
@Override
public void settlementDriverNotify(String childNo,Integer payType,String payErrorMsg){
//运单状态修改为完成
......@@ -287,6 +414,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();
......@@ -462,11 +590,25 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
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,83 @@ 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) {
SettlementSettleMqParam mq = new SettlementSettleMqParam();
mq.setChildNo(childNo);
mq.setInvoiceType(invoiceType);
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
......@@ -87,9 +89,18 @@ public class SettlementOwnerDetailServiceImpl implements SettlementOwnerDetailS
settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
}
// // 开票金额
// settlementOwnerDetail.setInvoiceFreight(invoiceFreightCalc(orderGoods.getSettlementWay(),settlementOwnerDetail));
//
// 开票服务费
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(settlementFreightCalc(orderGoods.getSettlementWay(),settlementOwnerDetail));
//
......@@ -103,6 +114,8 @@ public class SettlementOwnerDetailServiceImpl implements SettlementOwnerDetailS
settlementOwnerDetail.setInvoicingCompanyGroupCode(orderChild.getInvoicingCompanyGroupCode());
settlementOwnerDetail.setReportFlag(orderChild.getReportFlag());
settlementOwnerDetail.setInvoiceChannel(SettlementOwnerDetailEnum.InvoiceChannel.BROKER.getCode());
settlementOwnerDetailDao.saveEntity(settlementOwnerDetail);
return settlementOwnerDetail.getId();
}
......@@ -141,18 +154,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());
}
}
/**
* 结算金额
*/
......
package com.clx.performance.service.impl.settle;
import cn.hutool.json.JSONUtil;
import com.clx.order.enums.OrderEnum;
import com.clx.order.vo.pc.carrier.InvoicingCompanyVO;
import com.clx.performance.component.IdGenerateSnowFlake;
import com.clx.performance.config.SettlementConfig;
......@@ -27,6 +26,7 @@ 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;
......@@ -71,19 +71,18 @@ public class SettlementServiceImpl implements SettlementService {
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()).get();
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.setSettlementFreight(settlementFreightCalc(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);
......@@ -101,15 +100,15 @@ public class SettlementServiceImpl implements SettlementService {
if (settlementOwnerDetail.getSettlementFreight().compareTo(BigDecimal.ZERO) == 0) {
settlementOwnerDetail.setFinalPaymentStatus(SettlementOwnerDetailEnum.FinalPaymentStatus.NO_REQUIRE.getCode());
}
// 如果开票标识为“普通单”时,开票费率从开票公司“五寨华祥”中获取
settlementOwnerDetail.setInvoiceServiceFeeRate(BigDecimal.ZERO);
// 设置开票公司信息
// 如果开票标识为“普通单”时,开票公司“五寨华祥”
InvoicingCompanyVO invoiceCompany = invoicingCompanyService.getInvoicingCompanyByGroupCode(
settlementConfig.getInvoiceCompanyDefault().getCompanyGroupCode());
//设置开票公司信息
settlementConfig.getOrdinaryInvoiceCompanyGroupCode());
settlementOwnerDetail.setInvoicingCompanyId(invoiceCompany.getId());
settlementOwnerDetail.setInvoicingCompanyShorterName(invoiceCompany.getCompanyShorterName());
settlementOwnerDetail.setInvoicingCompanyGroupCode(invoiceCompany.getCompanyGroupCode());
settlementOwnerDetail.setInvoiceServiceFeeRate(invoiceCompany.getServiceFeeRate());
settlementDriverDetail.setInvoicingCompanyId(invoiceCompany.getId());
settlementDriverDetail.setInvoicingCompanyShorterName(invoiceCompany.getCompanyShorterName());
......@@ -118,27 +117,30 @@ public class SettlementServiceImpl implements SettlementService {
if (settlementDriverDetail.getSettlementFreight().compareTo(BigDecimal.ZERO) == 0) {
settlementOwnerDetail.setFinalPaymentStatus(SettlementOwnerDetailEnum.FinalPaymentStatus.NO_REQUIRE.getCode());
}
// 如果开票标识为“网运单”时,开票费率取货单单所记录的开票费率
settlementOwnerDetail.setInvoiceServiceFeeRate(
orderGoods.getInvoiceServiceFeeRate()==null? BigDecimal.ZERO : orderGoods.getInvoiceServiceFeeRate());
}
settlementOwnerDetail.setInvoiceType(invoiceType);
settlementDriverDetail.setInvoiceType(invoiceType);
// 开票服务费
settlementOwnerDetail.setInvoiceServiceFee(invoiceServiceFeeCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
settlementOwnerDetail.setInvoiceServiceFee(
settlementCommonService.invoiceServiceFeeCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
// 开票金额
settlementOwnerDetail.setInvoiceFreight(invoiceFreightCalc(orderChild.getSettlementWay(),
settlementOwnerDetail.setInvoiceFreight(
settlementCommonService.invoiceFreightCalc(orderChild.getSettlementWay(),
orderGoods.getInvoiceServiceFeeRate(), settlementOwnerDetail));
// 结算金额
settlementOwnerDetail.setSettlementFreight(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);
}
......@@ -221,41 +223,6 @@ public class SettlementServiceImpl implements SettlementService {
}
}
/**
* 开票服务费金额
*/
private BigDecimal invoiceServiceFeeCalc(Integer settlementWay, SettlementOwnerDetail settlementOwnerDetail) {
return settlementOwnerDetail.getFreight().subtract(settlementOwnerDetail.getLossFreight())
.divide(BigDecimal.ONE.subtract(settlementOwnerDetail.getInvoiceServiceFeeRate()), 0, RoundingMode.HALF_UP)
.multiply(settlementOwnerDetail.getInvoiceServiceFeeRate()).setScale(0, RoundingMode.HALF_UP);
}
/**
* 开票金额
*/
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 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());
}
}
/**
* 结算金额
*/
......
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);
void invoiceStatusSync(String childNo);
void payStatusSync(String childNo);
}
......@@ -168,8 +168,8 @@ public class OrderGoodsSqlProvider {
.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.getPlatformFreightQuotationTaxType()).append("','").append(o.getPlatformServiceFeeRate()).append("','").append(o.getDeposit()).append("','").append(o.getInvoiceServiceFeeRate())
.append("')");
.append(o.getPlatformFreightQuotationTaxType()).append("',").append(o.getPlatformServiceFeeRate()).append(",").append(o.getDeposit()).append(",").append(o.getInvoiceServiceFeeRate())
.append(")");
if (i < orderGoodsList.size() - 1) {
sqlList.append(",");
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论