提交 6dfa8116 authored 作者: aiqingguo's avatar aiqingguo

结算

上级 b4c05d0e
package com.clx.performance.common;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
* @Author: aiqingguo
* @Description:
* @Date: 2023-10-12 14:00:14
* @Version: 1.0
*/
@Setter
@Getter
@NoArgsConstructor
public class MqDelay<T> {
private String exchange;
private String routerKey;
private T data;
public MqDelay(String exchange, String routerKey, T data) {
this.exchange = exchange;
this.routerKey = routerKey;
this.data = data;
}
}
package com.clx.performance.common;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* @Author: aiqingguo
* @Description:
* @Date: 2023-10-12 11:59:33
* @Version: 1.0
*/
@Getter
@Setter
@NoArgsConstructor
public class MqWrapper<T> {
private T data;
private String exchange; //交换机
private String routeKey; //路由键
private String createTime; //创建时间
public MqWrapper(T data) {
this.data = data;
this.createTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
}
public MqWrapper(T data, String exchange, String routeKey) {
this.data = data;
this.exchange = exchange;
this.routeKey = routeKey;
this.createTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
}
}
......@@ -91,5 +91,21 @@ public enum SettlementOwnerEnum {
}
}
@Getter
@AllArgsConstructor
public enum SettlementPeriodType {
IMMEDIATE(10, "拉运完成结算"),
MONTH(10, "月结"),
;
private final int code;
private final String name;
public static Optional<SettlementPeriodType> getByCode(int code) {
return Arrays.stream(values()).filter(e -> e.code == code).findFirst();
}
}
}
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 OrderChildAddMqParam {
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 OrderChildDriverConfirmMqParam {
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 SettlementDetailAddMqParam {
private Integer settlementOwnerDetailId; //货主计费明细id
private Integer settlementDriverDetailId; //司机计费明细id
}
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 SettlementDetailInvoiceTypeSyncMqParam {
private String childNo; //运单编号
private Integer InvoiceType; //司机计费明细id
}
......@@ -32,6 +32,11 @@ public class CarrierSettlementOwnerDetailVO {
@ApiModelProperty(value = "结算子单号", example = "JS012")
private String settlementSubNo;
@ApiModelProperty(value = "结算周期类型:1拉运完成结 2月结", example = "")
private Integer settlementPeriodType;
@ApiModelProperty(value = "结算周期时间(月结)", example = "")
private String settlementPeriodTime;
@ApiModelProperty(value = "订单编号", example = "123")
private String orderNo;
......
package com.clx.performance.config;
import com.clx.performance.constant.RabbitKeyOrderChildConstants;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: aiqingguo
* @Description: 运单 MQ
* @Date: 2023-10-12 16:27:30
* @Version: 1.0
*/
@Configuration
public class RabbitOrderChildConfig {
@Bean
public DirectExchange orderChildDefaultExchange() {
return new DirectExchange(RabbitKeyOrderChildConstants.DEFAULT_EXCHANGE);
}
@Bean
public Queue orderChildDefaultDelayQueue() {
Map<String, Object> params = new HashMap<>(8);
params.put("x-message-ttl", 15 * 60 * 1000);
params.put("x-max-length", 5000000);
params.put("x-dead-letter-exchange", RabbitKeyOrderChildConstants.DEFAULT_EXCHANGE);
params.put("x-dead-letter-routing-key", RabbitKeyOrderChildConstants.DEFAULT_DEAD_ROUTING_KEY);
return new Queue(RabbitKeyOrderChildConstants.DEFAULT_DELAY_QUEUE, true, false, false, params);
}
@Bean
public Binding orderChildDefaultDelayQueueBinding() {
return BindingBuilder.bind(orderChildDefaultDelayQueue()).to(orderChildDefaultExchange()).with(RabbitKeyOrderChildConstants.DEFAULT_DELAY_ROUTING_KEY);
}
@Bean
public Queue orderChildDefaultDeadQueue() {
return new Queue(RabbitKeyOrderChildConstants.DEFAULT_DEAD_QUEUE);
}
@Bean
public Binding orderChildDefaultDeadQueueBinding() {
return BindingBuilder.bind(orderChildDefaultDeadQueue()).to(orderChildDefaultExchange()).with(RabbitKeyOrderChildConstants.DEFAULT_DEAD_ROUTING_KEY);
}
/**
* 新增
*/
@Bean
public Queue orderChildAddQueue() {
return new Queue(RabbitKeyOrderChildConstants.ORDER_CHILD_ADD_QUEUE);
}
@Bean
public Binding orderChildAddQueueBinding() {
return BindingBuilder.bind(orderChildAddQueue()).to(orderChildDefaultExchange()).with(RabbitKeyOrderChildConstants.ORDER_CHILD_ADD_ROUTING_KEY);
}
/**
* 司机确认收货
*/
@Bean
public Queue orderChildDriverConfirmQueue() {
return new Queue(RabbitKeyOrderChildConstants.ORDER_CHILD_DRIVER_CONFIRM_QUEUE);
}
@Bean
public Binding orderChildDriverConfirmQueueBinding() {
return BindingBuilder.bind(orderChildDriverConfirmQueue()).to(orderChildDefaultExchange()).with(RabbitKeyOrderChildConstants.ORDER_CHILD_DRIVER_CONFIRM_ROUTING_KEY);
}
}
......@@ -58,7 +58,19 @@ public class RabbitSettlementConfig {
}
@Bean
public Binding settlementDetailAddQueueBinding() {
return BindingBuilder.bind(settlementDetailAddQueue()).to(settlementDefaultExchange()).with(RabbitKeySettlementConstants.SETTLEMENT_DETAIL_ROUTING_KEY);
return BindingBuilder.bind(settlementDetailAddQueue()).to(settlementDefaultExchange()).with(RabbitKeySettlementConstants.SETTLEMENT_DETAIL_ADD_ROUTING_KEY);
}
/**
* 计费明细新增
*/
@Bean
public Queue settlementDetailInvoiceTypeSyncQueue() {
return new Queue(RabbitKeySettlementConstants.SETTLEMENT_DETAIL_INVOICE_TYPE_SYC_QUEUE);
}
@Bean
public Binding settlementDetailInvoiceTypeSyncQueueBinding() {
return BindingBuilder.bind(settlementDetailInvoiceTypeSyncQueue()).to(settlementDefaultExchange()).with(RabbitKeySettlementConstants.SETTLEMENT_DETAIL_INVOICE_TYPE_SYC_ROUTING_KEY);
}
......
......@@ -33,6 +33,18 @@ public class RabbitKeyOrderChildConstants {
public static final String DEFAULT_DEAD_QUEUE = PREFIX +"default"+DEAD_QUEUE;
public static final String DEFAULT_DEAD_ROUTING_KEY = PREFIX +"default"+DEAD_ROUTING_KEY;
/**
* 新增
*/
public static final String ORDER_CHILD_ADD_QUEUE = PREFIX +"orderChild.add"+QUEUE;
public static final String ORDER_CHILD_ADD_ROUTING_KEY = PREFIX +"orderChild.add"+QUEUE_ROUTING_KEY;
/**
* 司机确认
*/
public static final String ORDER_CHILD_DRIVER_CONFIRM_QUEUE = PREFIX +"orderChild.driverConfirm"+QUEUE;
public static final String ORDER_CHILD_DRIVER_CONFIRM_ROUTING_KEY = PREFIX +"orderChild.driverConfirm"+QUEUE_ROUTING_KEY;
/**
* 运单完成
*/
......
......@@ -37,6 +37,12 @@ public class RabbitKeySettlementConstants {
* 新增计费单
*/
public static final String SETTLEMENT_DETAIL_ADD_QUEUE = PREFIX +"settlementDetail.add"+QUEUE;
public static final String SETTLEMENT_DETAIL_ROUTING_KEY = PREFIX +"settlementDetail.add"+QUEUE_ROUTING_KEY;
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;
}
......@@ -7,6 +7,7 @@ import com.clx.performance.dao.settle.SettlementDriverDetailDao;
import com.clx.performance.mapper.settle.SettlementDriverDetailMapper;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.param.pc.driver.PageCarrierSettlementDriverDetailParam;
import com.msl.common.base.Optional;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;
......@@ -21,6 +22,21 @@ import java.util.Objects;
*/
@Repository
public class SettlementDriverDetailDaoImpl extends BaseDaoImpl<SettlementDriverDetailMapper, SettlementDriverDetail, Integer> implements SettlementDriverDetailDao {
@Override
public boolean updateInvoiceType(SettlementDriverDetail item) {
return false;
}
@Override
public boolean updateSettlementNo(SettlementDriverDetail item) {
return false;
}
@Override
public Optional<SettlementDriverDetail> getByChildNo(String childNo) {
return null;
}
@Override
public IPage<SettlementDriverDetail> pageSettlementDriverDetail(PageCarrierSettlementDriverDetailParam param) {
LambdaQueryWrapper<SettlementDriverDetail> query = new LambdaQueryWrapper<>();
......
......@@ -14,6 +14,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;
......@@ -25,6 +26,17 @@ import java.util.Objects;
*/
@Repository
public class SettlementOwnerDaoImpl extends BaseDaoImpl<SettlementOwnerMapper, SettlementOwner, Integer> implements SettlementOwnerDao {
@Override
public boolean updateSettlementPeriodMonth(SettlementOwner item) {
return false;
}
@Override
public boolean updateLock(SettlementOwner item) {
return false;
}
@Override
public List<SettlementOwner> getMergeSettlementNos(String settlementNo) {
return super.list(lQrWrapper()
......@@ -94,4 +106,19 @@ public class SettlementOwnerDaoImpl extends BaseDaoImpl<SettlementOwnerMapper, S
query.orderByDesc(SettlementOwner :: getCreateTime);
return baseMapper.selectPage(Page.of(param.getPage(),param.getPageSize()),query);
}
@Override
public Optional<SettlementOwner> selectUnlockOfSettlementPeriodMonth(String orderNo, LocalDateTime settlementPeriodTime, Integer invoiceType) {
return null;
}
@Override
public Optional<SettlementOwner> selectUnlockOfSettlementPeriodImmediate(String orderNo, Integer invoiceType) {
return null;
}
@Override
public List<SettlementOwner> listToBeLockOfSettlementPeriodMonth(LocalDateTime settlementPeriodTime) {
return null;
}
}
......@@ -8,7 +8,7 @@ import com.clx.performance.mapper.settle.SettlementOwnerDetailMapper;
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.vo.pc.owner.settle.PageOwnerSettlementOwnerDetailVO;
import com.msl.common.base.Optional;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;
......@@ -23,6 +23,22 @@ import java.util.Objects;
*/
@Repository
public class SettlementOwnerDetailDaoImpl extends BaseDaoImpl<SettlementOwnerDetailMapper, SettlementOwnerDetail, Integer> implements SettlementOwnerDetailDao {
@Override
public boolean updateInvoiceType(SettlementOwnerDetail item) {
return false;
}
@Override
public boolean updateSettlementNo(SettlementOwnerDetail item) {
return false;
}
@Override
public Optional<SettlementOwnerDetail> getByChildNo(String childNo) {
return null;
}
@Override
public IPage<SettlementOwnerDetail> pageSettlementOwnerDetail(
PageCarrierSettlementOwnerDetailParam param) {
......
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.mapper.settle.SettlementDriverDetailMapper;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.param.pc.driver.PageCarrierSettlementDriverDetailParam;
import com.msl.common.base.Optional;
import com.msl.common.dao.BaseDao;
/**
......@@ -13,5 +14,13 @@ import com.msl.common.dao.BaseDao;
* @Version: 1.0
*/
public interface SettlementDriverDetailDao extends BaseDao<SettlementDriverDetailMapper, SettlementDriverDetail, Integer> {
boolean updateInvoiceType(SettlementDriverDetail item);
boolean updateSettlementNo(SettlementDriverDetail item);
Optional<SettlementDriverDetail> getByChildNo(String childNo);
IPage<SettlementDriverDetail> pageSettlementDriverDetail(PageCarrierSettlementDriverDetailParam param);
}
......@@ -9,10 +9,14 @@ import com.clx.performance.param.pc.owner.PageOwnerSettlementParam;
import com.msl.common.dao.BaseDao;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
import java.util.List;
public interface SettlementOwnerDao extends BaseDao<SettlementOwnerMapper, SettlementOwner, Integer> {
boolean updateSettlementPeriodMonth(SettlementOwner item);
boolean updateLock(SettlementOwner item);
List<SettlementOwner> getMergeSettlementNos(@Param("settlementNo")String settlementNo);
......@@ -25,4 +29,12 @@ public interface SettlementOwnerDao extends BaseDao<SettlementOwnerMapper, Settl
Optional<SettlementOwner> selectBySettlementNo(@Param("settlementNo")String settlementNo);
IPage<SettlementOwner> pageSettlementOwner(Long userNo,PageOwnerSettlementParam param);
Optional<SettlementOwner> selectUnlockOfSettlementPeriodMonth(@Param("orderNo")String orderNo,
@Param("settlementPeriodTime") LocalDateTime settlementPeriodTime,
@Param("invoiceType")Integer invoiceType);
Optional<SettlementOwner> selectUnlockOfSettlementPeriodImmediate(@Param("orderNo")String orderNo,
@Param("invoiceType")Integer invoiceType);
List<SettlementOwner> listToBeLockOfSettlementPeriodMonth(@Param("settlementPeriodTime") LocalDateTime settlementPeriodTime);
}
......@@ -5,7 +5,7 @@ import com.clx.performance.mapper.settle.SettlementOwnerDetailMapper;
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.vo.pc.owner.settle.PageOwnerSettlementOwnerDetailVO;
import com.msl.common.base.Optional;
import com.msl.common.dao.BaseDao;
......@@ -17,6 +17,11 @@ import com.msl.common.dao.BaseDao;
*/
public interface SettlementOwnerDetailDao extends BaseDao<SettlementOwnerDetailMapper, SettlementOwnerDetail, Integer> {
boolean updateInvoiceType(SettlementOwnerDetail item);
boolean updateSettlementNo(SettlementOwnerDetail item);
Optional<SettlementOwnerDetail> getByChildNo(String childNo);
IPage<SettlementOwnerDetail> pageOwnerSettlementOrderDetailList(PageOwnerSettlementOwnerDetailParam param);
IPage<SettlementOwnerDetail> pageSettlementOwnerDetail(PageCarrierSettlementOwnerDetailParam param);
......
package com.clx.performance.listener.child;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeyOrderChildConstants;
import com.clx.performance.service.OrderChildMqHandlerService;
import com.clx.performance.vo.mq.OrderChildAddMqParam;
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 16:34:40
* @Version: 1.0
*/
@Slf4j
@Component
public class OrderChildAddListener {
@Autowired
private OrderChildMqHandlerService orderChildMqHandlerService;
@RabbitListener(queues = RabbitKeyOrderChildConstants.ORDER_CHILD_ADD_QUEUE)
public void process(Message message) {
try{
log.info("运单-新增, message:{}", new String(message.getBody()));
process(JSON.parseObject(new String(message.getBody()), new TypeReference<MqWrapper<OrderChildAddMqParam>>(){}).getData());
}catch (Exception e){
log.info("运单-新增 失败",e);
}
}
private void process(OrderChildAddMqParam mq){
orderChildMqHandlerService.orderChildAdd(mq);
}
}
package com.clx.performance.listener.child;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.clx.performance.common.MqDelay;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeyOrderChildConstants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Author: 艾庆国
* @Description: 运单 mq
* @Date: 2023-10-20 10:30:49
* @Version: 1.0
*/
@Slf4j
@Component
public class OrderChildDelayListener {
@Autowired
private RabbitTemplate rabbitTemplate;
@RabbitListener(queues = RabbitKeyOrderChildConstants.DEFAULT_DEAD_QUEUE)
public void process(Message message) {
try{
log.info("运单-延迟, message:{}", message);
process(JSON.parseObject(new String(message.getBody()), new TypeReference<MqWrapper<MqDelay>>(){}).getData());
}catch (Exception e){
log.info("运单-延迟 失败",e);
}
}
void process(MqDelay mq){
Message message = MessageBuilder.withBody(JSON.toJSONString(mq.getData()).getBytes()).build();
rabbitTemplate.send(mq.getExchange(), mq.getRouterKey(), message);
}
}
package com.clx.performance.listener.child;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeyOrderChildConstants;
import com.clx.performance.service.OrderChildMqHandlerService;
import com.clx.performance.vo.mq.OrderChildDriverConfirmMqParam;
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 17:39:27
* @Version: 1.0
*/
@Slf4j
@Component
public class OrderChildDriverConfirmListener {
@Autowired
private OrderChildMqHandlerService orderChildMqHandlerService;
@RabbitListener(queues = RabbitKeyOrderChildConstants.ORDER_CHILD_ADD_QUEUE)
public void process(Message message) {
try{
log.info("运单-司机确认收货, message:{}", new String(message.getBody()));
process(JSON.parseObject(new String(message.getBody()), new TypeReference<MqWrapper<OrderChildDriverConfirmMqParam>>(){}).getData());
}catch (Exception e){
log.info("运单-司机确认收货 失败",e);
}
}
private void process(OrderChildDriverConfirmMqParam mq){
orderChildMqHandlerService.orderChildDriverConfirm(mq);
}
}
package com.clx.performance.listener.settle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.clx.performance.common.MqDelay;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeySettlementConstants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Author: 艾庆国
* @Description: 结算 mq
* @Date: 2023-10-20 16:14:30
* @Version: 1.0
*/
@Slf4j
@Component
public class SettlementDelayListener {
@Autowired
private RabbitTemplate rabbitTemplate;
@RabbitListener(queues = RabbitKeySettlementConstants.DEFAULT_DEAD_QUEUE)
public void process(Message message) {
try{
log.info("结算-延迟, message:{}", message);
process(JSON.parseObject(new String(message.getBody()), new TypeReference<MqWrapper<MqDelay>>(){}).getData());
}catch (Exception e){
log.info("结算-延迟 失败",e);
}
}
void process(MqDelay mq){
Message message = MessageBuilder.withBody(JSON.toJSONString(mq.getData()).getBytes()).build();
rabbitTemplate.send(mq.getExchange(), mq.getRouterKey(), message);
}
}
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.SettlementDetailAddMqParam;
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 SettlementDetailAddListener {
@Autowired
private SettlementMqHandlerService settlementMqHandlerService;
@RabbitListener(queues = RabbitKeySettlementConstants.SETTLEMENT_DETAIL_ADD_QUEUE)
public void process(Message message) {
try{
log.info("结算-计费明细新增, message:{}", new String(message.getBody()));
process(JSON.parseObject(new String(message.getBody()), new TypeReference<MqWrapper<SettlementDetailAddMqParam>>(){}).getData());
}catch (Exception e){
log.info("结算-计费明细新增 失败",e);
}
}
private void process(SettlementDetailAddMqParam mq){
settlementMqHandlerService.settlementDetailAdd(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.SettlementDetailInvoiceTypeSyncMqParam;
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 SettlementInvoiceTypeSyncListener {
@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<SettlementDetailInvoiceTypeSyncMqParam>>(){}).getData());
}catch (Exception e){
log.info("结算-开票标识同步 失败",e);
}
}
private void process(SettlementDetailInvoiceTypeSyncMqParam mq){
settlementMqHandlerService.settlementDetailInvoiceTypeSync(mq);
}
}
......@@ -31,6 +31,8 @@ public class SettlementOwner implements HasKey<Integer> {
private String ownerName; //货主名称
private String settlementNo; //结算单编号
private String settlementSubNo; //结算子单号
private Integer settlementPeriodType; //结算周期类型:1拉运完成结 2月结
private LocalDateTime settlementPeriodTime; //结算周期时间(月结)
private String orderNo; //订单编号
private BigDecimal weight; //实际净重(吨)
private BigDecimal freight; //实际运费(分)
......
......@@ -34,6 +34,10 @@ public class SettlementOwnerDetail implements HasKey<Integer> {
private String childNo; //运单编号
private String orderGoodsNo; //货单编号
private String orderNo; //订单编号
private Integer sendAddressId; //发货地址id
private String sendAddress; //发货地址
private Integer receiveAddressId; //收货地址id
private String receiveAddress; //收货地址
private Integer goodsId; //货物id
private String goodsName; //货物名称
private BigDecimal freightPrice; //平台运费单价(分)
......
package com.clx.performance.service;
import com.clx.performance.vo.mq.OrderChildAddMqParam;
import com.clx.performance.vo.mq.OrderChildDriverConfirmMqParam;
public interface OrderChildMqHandlerService {
void orderChildAdd(OrderChildAddMqParam mq);
void orderChildDriverConfirm(OrderChildDriverConfirmMqParam mq);
}
package com.clx.performance.service;
public interface OrderChildMqService {
void orderChildAdd(String childNo);
void orderChildDriverConfirm(String childNo);
}
package com.clx.performance.service.impl;
import com.clx.performance.service.OrderChildMqHandlerService;
import com.clx.performance.vo.mq.OrderChildAddMqParam;
import com.clx.performance.vo.mq.OrderChildDriverConfirmMqParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class OrderChildMqHandlerServiceImpl implements OrderChildMqHandlerService {
@Override
public void orderChildAdd(OrderChildAddMqParam mq) {
}
@Override
public void orderChildDriverConfirm(OrderChildDriverConfirmMqParam mq) {
}
}
package com.clx.performance.service.impl;
import com.alibaba.fastjson.JSON;
import com.clx.performance.common.MqDelay;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeyOrderChildConstants;
import com.clx.performance.service.OrderChildMqService;
import com.clx.performance.vo.mq.OrderChildAddMqParam;
import com.clx.performance.vo.mq.OrderChildDriverConfirmMqParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class OrderChildMqServiceImpl implements OrderChildMqService {
@Autowired
private RabbitTemplate rabbitTemplate;
@Override
public void orderChildAdd(String childNo) {
OrderChildAddMqParam mq = new OrderChildAddMqParam();
mq.setChildNo(childNo);
MqDelay<MqWrapper<OrderChildAddMqParam>> delay = new MqDelay<>(RabbitKeyOrderChildConstants.DEFAULT_EXCHANGE, RabbitKeyOrderChildConstants.ORDER_CHILD_ADD_ROUTING_KEY, new MqWrapper<>(mq));
Message message = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(delay)).getBytes()).build();
message.getMessageProperties().setExpiration("5000");
rabbitTemplate.send(RabbitKeyOrderChildConstants.DEFAULT_EXCHANGE, RabbitKeyOrderChildConstants.DEFAULT_DELAY_ROUTING_KEY, message);
}
@Override
public void orderChildDriverConfirm(String childNo) {
OrderChildDriverConfirmMqParam mq = new OrderChildDriverConfirmMqParam();
mq.setChildNo(childNo);
MqDelay<MqWrapper<OrderChildDriverConfirmMqParam>> delay = new MqDelay<>(RabbitKeyOrderChildConstants.DEFAULT_EXCHANGE, RabbitKeyOrderChildConstants.ORDER_CHILD_DRIVER_CONFIRM_ROUTING_KEY, new MqWrapper<>(mq));
Message message = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(delay)).getBytes()).build();
message.getMessageProperties().setExpiration("5000");
rabbitTemplate.send(RabbitKeyOrderChildConstants.DEFAULT_EXCHANGE, RabbitKeyOrderChildConstants.DEFAULT_DELAY_ROUTING_KEY, message);
}
}
......@@ -20,6 +20,10 @@ import com.clx.performance.service.OrderChildLogService;
import com.clx.performance.service.OrderChildPoundLogService;
import com.clx.performance.service.OrderChildService;
import com.clx.performance.service.OrderGoodsService;
import com.clx.performance.service.*;
import com.clx.performance.service.settle.SettlementDriverDetailService;
import com.clx.performance.service.settle.SettlementMqService;
import com.clx.performance.service.settle.SettlementOwnerDetailService;
import com.clx.performance.struct.*;
import com.clx.performance.utils.spring.ApplicationContextUtils;
import com.clx.performance.vo.app.*;
......@@ -91,6 +95,11 @@ public class OrderChildServiceImpl implements OrderChildService {
private final OrderFeign orderFeign;
private final RedissonClient redissonClient;
private final SettlementDriverDetailService settlementDriverDetailService;
private final SettlementOwnerDetailService settlementOwnerDetailService;
private final SettlementMqService settlementMqService;
private final OrderChildMqService orderChildMqService;
@Override
public SaveOrderChildVO saveOrderChild(OrderChildSaveParam param) {
......@@ -246,6 +255,9 @@ public class OrderChildServiceImpl implements OrderChildService {
// 更新出车状态
updateDriverOrderStatusLock(orderChild.getDriverUserNo(), orderChild.getTruckId());
// 发送mq 新增运单
orderChildMqService.orderChildAdd(orderChild.getChildNo());
// 新增日志
orderChildLogService.saveDriverOrderChildLog(childNo, OrderChildLogEnum.Type.CREATED.getCode(), OrderChildLogEnum.Type.CREATED.getMsg(),
loginUserInfo.getUserNo(), loginUserInfo.getUserName());
......@@ -810,6 +822,12 @@ public class OrderChildServiceImpl implements OrderChildService {
// 更新车辆状态
updateDriverOrderStatusDriverConfirm(orderChild.getTruckId());
// 生成计费单
saveSettlementDetail(orderChild);
// 发送mq 司机确认收货
orderChildMqService.orderChildDriverConfirm(orderChild.getChildNo());
// 日志
orderChildLogService.saveDriverOrderChildLog(childNo, OrderChildLogEnum.Type.DRIVER_CONFIRM.getCode(), OrderChildLogEnum.Type.DRIVER_CONFIRM.getMsg(),
loginUserInfo.getUserNo(), loginUserInfo.getUserName());
......@@ -926,6 +944,19 @@ public class OrderChildServiceImpl implements OrderChildService {
loginUserInfo.getUserNo(), loginUserInfo.getUserName());
}
/**
* 生成计费单
*/
private void saveSettlementDetail(OrderChild orderChild){
Integer settlementDriverDetailId = settlementDriverDetailService.saveSettlementDetail(orderChild);
Integer settlementOwnerDetailId = settlementOwnerDetailService.saveSettlementDetail(orderChild);
settlementMqService.settlementDetailAdd(settlementDriverDetailId, settlementOwnerDetailId);
}
@Override
public OrderChildVO getOrderChildInfo(String childNo) {
UserSessionData loginUserInfo = TokenUtil.getLoginUserInfo();
......
package com.clx.performance.service.impl.settle;
import com.clx.performance.dao.settle.SettlementOwnerDao;
import com.clx.performance.model.settle.SettlementOwner;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.service.settle.CarrierSettlementOwnerService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
@Slf4j
@Service
@AllArgsConstructor
public class CarrierSettlementOwnerServiceImpl implements CarrierSettlementOwnerService {
private final SettlementOwnerDao settlementOwnerDao;
@Override
public void saveSettlement(SettlementOwnerDetail settlementDetail) {
SettlementOwner settlementOwner = new SettlementOwner();
settlementOwner.setSettlementNo("");
settlementOwner.setOwnerUserNo(settlementDetail.getOwnerUserNo());
settlementOwner.setOwnerName(settlementDetail.getOwnerName());
settlementOwner.setOrderNo(settlementDetail.getOrderNo());
settlementOwner.setWeight(BigDecimal.ZERO);
settlementOwner.setFreight(BigDecimal.ZERO);
settlementOwner.setLossFreight(BigDecimal.ZERO);
settlementOwner.setSettlementFreight(BigDecimal.ZERO);
settlementOwner.setInvoiceType(settlementDetail.getInvoiceType());
settlementOwner.setInvoiceFreight(BigDecimal.ZERO);
settlementOwner.setPrepayFreight(BigDecimal.ZERO);
settlementOwnerDao.saveEntity(settlementOwner);
}
}
......@@ -3,6 +3,7 @@ package com.clx.performance.service.impl.settle;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.dao.settle.SettlementDriverDetailDao;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.param.pc.driver.PageCarrierSettlementDriverDetailParam;
import com.clx.performance.service.settle.SettlementDriverDetailService;
......@@ -12,6 +13,8 @@ import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
/**
......@@ -27,6 +30,83 @@ public class SettlementDriverDetailServiceImpl implements SettlementDriverDetai
private final SettlementDriverDetailDao settlementDriverDetailDao;
private final SettlementDriverDetailStruct settlementOwnerDetailStruct;
@Override
public Integer saveSettlementDetail(OrderChild orderChild) {
SettlementDriverDetail settlementDriverDetail = new SettlementDriverDetail();
settlementDriverDetail.setChildNo(orderChild.getChildNo());
settlementDriverDetail.setOrderGoodsNo(orderChild.getOrderGoodsNo());
settlementDriverDetail.setOrderNo(orderChild.getOrderNo());
settlementDriverDetail.setDriverUserNo(orderChild.getTruckOwnUserNo());
settlementDriverDetail.setDriverName(orderChild.getOwnerName());
settlementDriverDetail.setTruckNo(orderChild.getTruckNo());
settlementDriverDetail.setGoodsId(orderChild.getGoodsId());
settlementDriverDetail.setGoodsName(orderChild.getGoodsName());
// 运费
settlementDriverDetail.setFreightPrice(orderChild.getFreightPrice()); //平台运费
settlementDriverDetail.setWeight(weightCalc(orderChild.getLoadNet(), orderChild.getUnloadNet()));
settlementDriverDetail.setFreight(freightCalc(settlementDriverDetail.getFreightPrice(), settlementDriverDetail.getWeight()));
// 亏吨
settlementDriverDetail.setLossPrice(orderChild.getLossPrice());
settlementDriverDetail.setLossWeight(lossWeightCalc(orderChild.getLoadNet(), orderChild.getUnloadNet()));
settlementDriverDetail.setLossFreight(lossFreightCalc(settlementDriverDetail.getLossPrice(), settlementDriverDetail.getLossWeight()));
// 预付运费
settlementDriverDetail.setPrepayFreight(BigDecimal.ZERO);
// 结算金额
settlementDriverDetail.setSettlementFreight(settlementFreightCalc(settlementDriverDetail.getFreight(), settlementDriverDetail.getLossFreight()));
settlementDriverDetailDao.saveEntity(settlementDriverDetail);
return settlementDriverDetail.getId();
}
private BigDecimal weightCalc(BigDecimal loadNet, BigDecimal unLoadNet){
return unLoadNet.compareTo(loadNet) < 0? unLoadNet : loadNet;
}
/**
* 运费计算
*/
public BigDecimal freightCalc(BigDecimal freightPrice, BigDecimal weight){
return freightPrice.multiply(weight).setScale(0, RoundingMode.HALF_UP);
}
/**
* 亏吨计算
*/
private BigDecimal lossWeightCalc(BigDecimal loadNet, BigDecimal unLoadNet){
return unLoadNet.compareTo(loadNet) < 0? unLoadNet.subtract(loadNet) : BigDecimal.ZERO;
}
/**
* 亏吨运费
*/
private BigDecimal lossFreightCalc(BigDecimal freightPrice, BigDecimal weight){
return freightPrice.multiply(weight).setScale(0, RoundingMode.HALF_UP);
}
/**
* 开票金额
*/
private BigDecimal invoiceFreightCalc(BigDecimal freight, BigDecimal lossFreight){
return freight.subtract(lossFreight);
}
/**
* 结算金额
*/
private BigDecimal settlementFreightCalc(BigDecimal freight, BigDecimal lossFreight){
return freight.subtract(lossFreight);
}
@Override
public IPage<CarrierPageSettlementDriverDetailVO> pageSettlementDriverDetail(
......
package com.clx.performance.service.impl.settle;
import com.clx.performance.dao.settle.SettlementDriverDetailDao;
import com.clx.performance.dao.settle.SettlementOwnerDao;
import com.clx.performance.dao.settle.SettlementOwnerDetailDao;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.extranal.user.OwnerInfoService;
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.service.impl.UniqueOrderNumService;
import com.clx.performance.service.settle.SettlementMqHandlerService;
import com.clx.performance.vo.mq.SettlementDetailAddMqParam;
import com.clx.performance.vo.mq.SettlementDetailInvoiceTypeSyncMqParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
@Slf4j
@Service
public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerService {
@Autowired
private SettlementOwnerDetailDao settlementOwnerDetailDao;
@Autowired
private SettlementDriverDetailDao settlementDriverDetailDao;
@Autowired
private SettlementOwnerDao settlementOwnerDao;
@Autowired
private OwnerInfoService ownerInfoService;
@Autowired
private UniqueOrderNumService uniqueOrderNumService;
@Override
@Transactional(rollbackFor = Exception.class)
public void settlementDetailInvoiceTypeSync(SettlementDetailInvoiceTypeSyncMqParam mq) {
SettlementOwnerDetail settlementOwnerDetail = settlementOwnerDetailDao.getByChildNo(mq.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
SettlementDriverDetail settlementDriverDetail = settlementDriverDetailDao.getByChildNo(mq.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void settlementDetailAdd(SettlementDetailAddMqParam mq) {
}
/**
* 月结初始化
*/
private void settlementPeriodMonthInit(SettlementOwnerDetail settlementOwnerDetail, LocalDateTime settlementPeriodTime){
}
/**
* 月结更新
*/
private void settlementPeriodMonthUpdate(SettlementOwner settlementOwner, SettlementOwnerDetail settlementOwnerDetail){
}
/**
* 拉运完成结 初始化
*/
private void settlementPeriodImmediateInit(SettlementOwnerDetail settlementOwnerDetail){
}
/**
* 拉运完成结 更新
*/
private void settlementPeriodImmediateUpdate(SettlementOwner settlementOwner,SettlementOwnerDetail settlementOwnerDetail){
}
/**
* 创建结算单号
*/
private String settlementNoGenerate(){
return uniqueOrderNumService.getUniqueOrderNum(com.msl.common.utils.LocalDateTimeUtils.convertLocalDateTimeToString(LocalDateTime.now(), com.msl.common.utils.LocalDateTimeUtils.DATE_DAY));
}
}
package com.clx.performance.service.impl.settle;
import com.alibaba.fastjson.JSON;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class SettlementMqServiceImpl implements SettlementMqService {
@Autowired
private RabbitTemplate rabbitTemplate;
@Override
public void settlementDetailAdd(Integer settlementDriverDetailId, Integer settlementOwnerDetailId) {
SettlementDetailAddMqParam mq = new SettlementDetailAddMqParam();
mq.setSettlementDriverDetailId(settlementDriverDetailId);
mq.setSettlementOwnerDetailId(settlementOwnerDetailId);
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);
}
@Override
public void invoiceTypeSync(String childNo, Integer invoiceType) {
SettlementDetailInvoiceTypeSyncMqParam mq = new SettlementDetailInvoiceTypeSyncMqParam();
mq.setChildNo(childNo);
mq.setInvoiceType(invoiceType);
MqDelay<MqWrapper<SettlementDetailInvoiceTypeSyncMqParam>> 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);
}
}
......@@ -3,6 +3,7 @@ package com.clx.performance.service.impl.settle;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.dao.settle.SettlementOwnerDetailDao;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.param.pc.owner.PageCarrierSettlementOwnerDetailParam;
import com.clx.performance.param.pc.owner.PageOwnerSettlementOwnerDetailParam;
......@@ -19,6 +20,8 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
......@@ -35,6 +38,94 @@ public class SettlementOwnerDetailServiceImpl implements SettlementOwnerDetailS
private final SettlementOwnerDetailDao settlementOwnerDetailDao;
private final SettlementOwnerDetailStruct settlementOwnerDetailStruct;
@Override
public Integer saveSettlementDetail(OrderChild orderChild) {
SettlementOwnerDetail settlementOwnerDetail = new SettlementOwnerDetail();
settlementOwnerDetail.setChildNo(orderChild.getChildNo());
settlementOwnerDetail.setOrderGoodsNo(orderChild.getOrderGoodsNo());
settlementOwnerDetail.setOrderNo(orderChild.getOrderNo());
settlementOwnerDetail.setOwnerUserNo(orderChild.getOwnerUserNo());
settlementOwnerDetail.setOwnerName(orderChild.getOwnerName());
settlementOwnerDetail.setSendAddressId(orderChild.getSendAddressId());
settlementOwnerDetail.setSendAddress(orderChild.getSendAddress());
settlementOwnerDetail.setReceiveAddressId(orderChild.getReceiveAddressId());
settlementOwnerDetail.setReceiveAddress(orderChild.getReceiveAddress());
settlementOwnerDetail.setGoodsId(orderChild.getGoodsId());
settlementOwnerDetail.setGoodsName(orderChild.getGoodsName());
// 运费
settlementOwnerDetail.setFreightPrice(BigDecimal.ZERO); //平台运费
settlementOwnerDetail.setWeight(weightCalc(orderChild.getLoadNet(), orderChild.getUnloadNet()));
settlementOwnerDetail.setFreight(freightCalc(settlementOwnerDetail.getFreightPrice(), settlementOwnerDetail.getWeight()));
// 亏吨
settlementOwnerDetail.setLossPrice(orderChild.getLossPrice());
settlementOwnerDetail.setLossWeight(lossWeightCalc(orderChild.getLoadNet(), orderChild.getUnloadNet()));
settlementOwnerDetail.setLossFreight(lossFreightCalc(settlementOwnerDetail.getLossPrice(), settlementOwnerDetail.getLossWeight()));
// 预付运费
settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
// 开票金额
settlementOwnerDetail.setInvoiceFreight(invoiceFreightCalc(settlementOwnerDetail.getFreight(), settlementOwnerDetail.getLossFreight()));
// 结算金额
settlementOwnerDetail.setSettlementFreight(settlementFreightCalc(settlementOwnerDetail.getFreight(), settlementOwnerDetail.getLossFreight()));
settlementOwnerDetailDao.saveEntity(settlementOwnerDetail);
return settlementOwnerDetail.getId();
}
/**
* 吨数计算
*/
private BigDecimal weightCalc(BigDecimal loadNet, BigDecimal unLoadNet){
return unLoadNet.compareTo(loadNet) < 0? unLoadNet : loadNet;
}
/**
* 运费计算
*/
public BigDecimal freightCalc(BigDecimal freightPrice, BigDecimal weight){
return freightPrice.multiply(weight).setScale(0, RoundingMode.HALF_UP);
}
/**
* 亏吨计算
*/
private BigDecimal lossWeightCalc(BigDecimal loadNet, BigDecimal unLoadNet){
return unLoadNet.compareTo(loadNet) < 0? unLoadNet.subtract(loadNet) : BigDecimal.ZERO;
}
/**
* 亏吨运费
*/
private BigDecimal lossFreightCalc(BigDecimal freightPrice, BigDecimal weight){
return freightPrice.multiply(weight).setScale(0, RoundingMode.HALF_UP);
}
/**
* 开票金额
*/
private BigDecimal invoiceFreightCalc(BigDecimal freight, BigDecimal lossFreight){
return freight.subtract(lossFreight);
}
/**
* 结算金额
*/
private BigDecimal settlementFreightCalc(BigDecimal freight, BigDecimal lossFreight){
return freight.subtract(lossFreight);
}
@Override
public IPage<CarrierPageSettlementOwnerDetailVO> pageSettlementOwnerDetail(
PageCarrierSettlementOwnerDetailParam param) {
......
package com.clx.performance.service.impl.settle;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.settle.SettlementDriverDetailDao;
import com.clx.performance.dao.settle.SettlementOwnerDetailDao;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.service.settle.SettlementMqService;
import com.clx.performance.service.settle.SettlementService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Slf4j
@Service
public class SettlementServiceImpl implements SettlementService {
@Autowired
private OrderChildDao orderChildDao;
@Autowired
private SettlementOwnerDetailDao settlementOwnerDetailDao;
@Autowired
private SettlementDriverDetailDao settlementDriverDetailDao;
@Autowired
private SettlementMqService settlementMqService;
@Override
@Transactional(rollbackFor = Exception.class)
public void updateInvoiceType(String childNo, Integer invoiceType) {
OrderChild orderChild = orderChildDao.getByChildNo(childNo).orElseThrow(PerformanceResultEnum.ORDER_CHILD_NO_FOUND);
SettlementOwnerDetail settlementOwnerDetail = settlementOwnerDetailDao.getByChildNo(childNo).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
SettlementDriverDetail settlementDriverDetail = settlementDriverDetailDao.getByChildNo(childNo).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
if (settlementOwnerDetail.getInvoiceType() != null) {return;}
settlementOwnerDetail.setInvoiceType(invoiceType);
settlementDriverDetail.setInvoiceType(invoiceType);
settlementOwnerDetailDao.updateInvoiceType(settlementOwnerDetail);
settlementDriverDetailDao.updateInvoiceType(settlementDriverDetail);
// 发送mq 通过开票标识
settlementMqService.invoiceTypeSync(childNo, invoiceType);
}
}
package com.clx.performance.service.settle;
import com.clx.performance.model.settle.SettlementOwnerDetail;
public interface CarrierSettlementOwnerService {
void saveSettlement(SettlementOwnerDetail settlementDetail);
}
package com.clx.performance.service.settle;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.model.OrderChild;
import com.clx.performance.param.pc.driver.PageCarrierSettlementDriverDetailParam;
import com.clx.performance.vo.pc.carrier.settle.CarrierPageSettlementDriverDetailVO;
......@@ -10,5 +11,8 @@ import com.clx.performance.vo.pc.carrier.settle.CarrierPageSettlementDriverDetai
* Time 09:43
*/
public interface SettlementDriverDetailService {
Integer saveSettlementDetail(OrderChild orderChild);
IPage<CarrierPageSettlementDriverDetailVO> pageSettlementDriverDetail(PageCarrierSettlementDriverDetailParam param);
}
package com.clx.performance.service.settle;
import com.clx.performance.vo.mq.SettlementDetailAddMqParam;
import com.clx.performance.vo.mq.SettlementDetailInvoiceTypeSyncMqParam;
public interface SettlementMqHandlerService {
void settlementDetailAdd(SettlementDetailAddMqParam mq);
void settlementDetailInvoiceTypeSync(SettlementDetailInvoiceTypeSyncMqParam mq);
}
package com.clx.performance.service.settle;
public interface SettlementMqService {
void settlementDetailAdd(Integer settlementOwnerDetailId, Integer settlementDriverDetailId);
void invoiceTypeSync(String childNo, Integer invoiceType);
}
......@@ -2,11 +2,10 @@ package com.clx.performance.service.settle;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.model.OrderChild;
import com.clx.performance.param.pc.owner.PageCarrierSettlementOwnerDetailParam;
import com.clx.performance.param.pc.owner.PageOwnerSettlementOwnerDetailParam;
import com.clx.performance.param.pc.owner.PageOwnerSettlementParam;
import com.clx.performance.vo.pc.carrier.settle.CarrierPageSettlementOwnerDetailVO;
import com.clx.performance.vo.pc.owner.settle.OwnerPageSettlementOwnerVO;
import com.clx.performance.vo.pc.owner.settle.PageOwnerSettlementOwnerDetailVO;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
......@@ -17,6 +16,8 @@ import org.apache.poi.xssf.streaming.SXSSFWorkbook;
*/
public interface SettlementOwnerDetailService {
Integer saveSettlementDetail(OrderChild orderChild);
IPage<PageOwnerSettlementOwnerDetailVO> pageOwnerSettlementOrderDetailList(PageOwnerSettlementOwnerDetailParam param);
IPage<CarrierPageSettlementOwnerDetailVO> pageSettlementOwnerDetail(PageCarrierSettlementOwnerDetailParam param);
......
package com.clx.performance.service.settle;
public interface SettlementService {
void updateInvoiceType(String childNo, Integer invoiceType);
}
package com.clx.performance.utils;
import com.msl.common.exception.ServiceSystemException;
import com.msl.common.job.JobLog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
import java.util.function.Consumer;
/**
* @Author: aiqingguo
* @Description:
* @Date: 2023-10-12 19:38:41
* @Version: 1.0
*/
@Component
public class JobHandlerService {
protected Logger logger = LoggerFactory.getLogger(this.getClass());
public <T> void handler(String title, Runnable target) {
handler(title, null, target);
}
public <T> void handler(String title, T data, Runnable target) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
logger.info("{}, 主任务开始, data:{}", title, data);
try {
target.run();
}catch (ServiceSystemException e){
logger.info("{}, 主任务执行失败, data:{}, error:{}, detail:{}", title, data, e.getResultEnum().getMsg(), e.getDetail());
JobLog.error(title + "定时任务处理失败", e);
}catch (Exception e){
logger.error("{}, 主任务执行异常, data:{}, error:{}", title, data, e.getMessage());
JobLog.error(title + "定时任务处理失败", e);
}
stopWatch.stop();
logger.info("{}, 主任务结束, data:{}, duration:{}", title, data, stopWatch.getTotalTimeMillis());
}
public <T> void subHandler(String title, T data, Consumer<T> target) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
logger.info("{}, 子任务开始, data:{}", title, data);
try {
target.accept(data);
}catch (ServiceSystemException e){
logger.info("{}, 子任务执行失败, data:{}, error:{}, detail:{}", title, data, e.getResultEnum().getMsg(), e.getDetail());
JobLog.error(title + "定时任务处理失败", e);
}catch (Exception e){
logger.error("{}, 子任务执行异常, data:{}, error:{}", title, data, e.getMessage());
JobLog.error(title + "定时任务处理失败", e);
}
stopWatch.stop();
logger.info("{}, 子任务结束, data:{}, duration:{}", title, data, stopWatch.getTotalTimeMillis());
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论