提交 10010c2b authored 作者: 刘海泉's avatar 刘海泉

Merge remote-tracking branch 'origin/dev' into dev

...@@ -260,8 +260,8 @@ public enum OrderChildEnum { ...@@ -260,8 +260,8 @@ public enum OrderChildEnum {
@AllArgsConstructor @AllArgsConstructor
public enum ExitNoticeStatus { public enum ExitNoticeStatus {
NOT_NOTIFIED(0, "到达货源地"), NOT_NOTIFIED(0, "未通知"),
NOTIFIED(1, "驶入"); NOTIFIED(1, "已通知");
private final Integer code; private final Integer code;
private final String name; private final String name;
......
package com.clx.performance.param.pc.owner;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import javax.validation.constraints.NotEmpty;
import java.util.List;
@Getter
@Setter
@NoArgsConstructor
@ToString
public class ConfirmBatchInvoiceParam {
@NotEmpty(message = "运单号不能为空")
@ApiModelProperty(value = "运单号")
private List<String> childNoList;
}
...@@ -70,4 +70,7 @@ public class OpenOrderChildDTO { ...@@ -70,4 +70,7 @@ public class OpenOrderChildDTO {
@ApiModelProperty(value = "线下平台", example = "华祥", required = true, dataType = "String") @ApiModelProperty(value = "线下平台", example = "华祥", required = true, dataType = "String")
private String invoicePlatform; private String invoicePlatform;
@ApiModelProperty(value = "开票状态 0 未开票 1 已开票 ", example = "1")
private Integer invoiceStatus;
} }
...@@ -27,7 +27,7 @@ public class TransportVO { ...@@ -27,7 +27,7 @@ public class TransportVO {
@ApiModelProperty(value = "同步失败原因", example = "1", dataType = "String") @ApiModelProperty(value = "同步失败原因", example = "1", dataType = "String")
private String syncMsg; private String syncMsg;
@ApiModelProperty(value = "结算状态 0 未结算 1 已结算 2结算中 ", example = "1234124", dataType = "String") @ApiModelProperty(value = "结算状态 0 未结算 1 已结算 2结算中 3结算失败 ", example = "1234124", dataType = "String")
private Integer settleStatus; private Integer settleStatus;
@ApiModelProperty(value = "结算方", example = "1", dataType = "String") @ApiModelProperty(value = "结算方", example = "1", dataType = "String")
private Integer settleOrg; private Integer settleOrg;
......
package com.clx.performance.vo.pc.owner.settle;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.math.BigDecimal;
import java.util.List;
@Getter
@Setter
@ToString
@NoArgsConstructor
public class UploadBatchInvoiceFileResultVO {
@ApiModelProperty(value="校验结果,true:数据无误,false:数据有误")
private Boolean verifyResult;
@ApiModelProperty(value="错误文件地址")
private String errorFileUrl;
@ApiModelProperty(value="运单数")
private Integer orderChildSum;
@ApiModelProperty("装车吨数")
private BigDecimal loadWeightSum;
@ApiModelProperty(value="开票金额")
private BigDecimal invoiceFreightSum;
@ApiModelProperty(value="运单号")
private List<String> childNoList;
}
\ No newline at end of file
...@@ -5,15 +5,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage; ...@@ -5,15 +5,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.enums.PerformanceResultEnum; import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.param.pc.carrier.CarrierSettlementOwnerDetailCompanyUpdateParam; import com.clx.performance.param.pc.carrier.CarrierSettlementOwnerDetailCompanyUpdateParam;
import com.clx.performance.param.pc.carrier.ExportBatchOwnerSettlementDetailParam; import com.clx.performance.param.pc.carrier.ExportBatchOwnerSettlementDetailParam;
import com.clx.performance.param.pc.owner.PageCarrierSettlementOwnerDetailParam; import com.clx.performance.param.pc.owner.*;
import com.clx.performance.param.pc.owner.PageInvoiceOwnerSettlementOwnerDetailParam;
import com.clx.performance.param.pc.owner.PageOwnerSettlementOwnerDetailParam;
import com.clx.performance.param.pc.owner.PagePendingCarrierSettlementOwnerDetailParam;
import com.clx.performance.service.settle.SettlementOwnerDetailService; import com.clx.performance.service.settle.SettlementOwnerDetailService;
import com.clx.performance.vo.pc.carrier.settle.CarrierPagePendingSettlementOwnerDetailVO; import com.clx.performance.vo.pc.carrier.settle.CarrierPagePendingSettlementOwnerDetailVO;
import com.clx.performance.vo.pc.carrier.settle.CarrierPageSettlementOwnerDetailVO; import com.clx.performance.vo.pc.carrier.settle.CarrierPageSettlementOwnerDetailVO;
import com.clx.performance.vo.pc.owner.settle.CountOwnerSettlementOwnerDetailVO; import com.clx.performance.vo.pc.owner.settle.CountOwnerSettlementOwnerDetailVO;
import com.clx.performance.vo.pc.owner.settle.PageOwnerSettlementOwnerDetailVO; import com.clx.performance.vo.pc.owner.settle.PageOwnerSettlementOwnerDetailVO;
import com.clx.performance.vo.pc.owner.settle.UploadBatchInvoiceFileResultVO;
import com.msl.common.base.PageData; import com.msl.common.base.PageData;
import com.msl.common.convertor.aspect.UnitCovert; import com.msl.common.convertor.aspect.UnitCovert;
import com.msl.common.exception.ServiceSystemException; import com.msl.common.exception.ServiceSystemException;
...@@ -27,8 +25,10 @@ import org.springframework.http.HttpHeaders; ...@@ -27,8 +25,10 @@ import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Slf4j @Slf4j
@RestController @RestController
...@@ -81,6 +81,19 @@ public class CarrierSettlementOwnerDetailController { ...@@ -81,6 +81,19 @@ public class CarrierSettlementOwnerDetailController {
} }
} }
@ApiOperation(value = "上传批量开票文件",notes = "<br>By:杨启发")
@PostMapping("/uploadBatchInvoiceFile")
public Result<UploadBatchInvoiceFileResultVO> uploadBatchInvoiceFile(@RequestPart("file") MultipartFile file) throws IOException {
return Result.ok(settlementOwnerDetailService.uploadBatchInvoiceFile(file));
}
@ApiOperation(value = "确认批量开票",notes = "<br>By:杨启发")
@PostMapping("/confirmBatchInvoice")
public Result<Object> confirmBatchInvoice(@RequestBody @Validated ConfirmBatchInvoiceParam param) {
settlementOwnerDetailService.confirmBatchInvoice(param.getChildNoList());
return Result.ok();
}
@ApiOperation(value = "导出货主结算单运单明细",notes = "<br>By:姜文业") @ApiOperation(value = "导出货主结算单运单明细",notes = "<br>By:姜文业")
@PostMapping("/exportOwnerSettlementOrderDetailList") @PostMapping("/exportOwnerSettlementOrderDetailList")
public void exportCarrierSettlementOwnerPageList(@RequestBody @Validated PageOwnerSettlementOwnerDetailParam param, HttpServletResponse response) throws Exception { public void exportCarrierSettlementOwnerPageList(@RequestBody @Validated PageOwnerSettlementOwnerDetailParam param, HttpServletResponse response) throws Exception {
......
package com.clx.performance.dto.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class InvoiceData {
@ExcelProperty("运单编号")
private String childNo;
@ExcelProperty("开票标识")
private String invoiceType;
@ExcelProperty("开票金额")
private BigDecimal invoiceFreight;
@ExcelProperty("备注")
private String remark;
/**
* 装货净重(单位吨)
*/
private BigDecimal loadNet;
}
package com.clx.performance.listener.excel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.dao.settle.SettlementOwnerDetailDao;
import com.clx.performance.dto.excel.InvoiceData;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.param.pc.owner.PageInvoiceOwnerSettlementOwnerDetailParam;
import lombok.AllArgsConstructor;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.List;
import static com.clx.performance.enums.settle.SettlementOwnerDetailEnum.InvoiceStatus.NO;
import static com.clx.performance.enums.settle.SettlementOwnerEnum.InvoiceType.ORDINARY;
@AllArgsConstructor
public class InvoiceDataListener extends AnalysisEventListener<InvoiceData> {
private final List<InvoiceData> invoiceDataList;
private final SettlementOwnerDetailDao settlementOwnerDetailDao;;
@Override
public void invoke(InvoiceData invoiceData, AnalysisContext context) {
// 每解析一行都会调用一次,逐行校验数据
PageInvoiceOwnerSettlementOwnerDetailParam param = new PageInvoiceOwnerSettlementOwnerDetailParam();
param.setInvoiceStatus(NO.getCode());
param.setChildNo(invoiceData.getChildNo());
//param.setInvoiceType(ORDINARY.getCode());
IPage<SettlementOwnerDetail> page = settlementOwnerDetailDao.pageInvoiceOwnerSettlementOrderDetailList(param);
List<SettlementOwnerDetail> records = page.getRecords();
if (CollectionUtils.isEmpty(records)) {
invoiceData.setRemark("校验失败(运单编号不匹配)");
}else if(!ORDINARY.getCode().equals(records.get(0).getInvoiceType())){
invoiceData.setRemark("校验失败(开票标识非普通单)");
}else if(records.get(0).getInvoiceFreight().compareTo(invoiceData.getInvoiceFreight().multiply(new BigDecimal(100))) != 0){
invoiceData.setRemark("校验失败(开票金额不匹配)");
}else {
invoiceData.setRemark("校验通过");
invoiceData.setLoadNet(records.get(0).getLoadNet());
}
invoiceDataList.add(invoiceData);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 解析完成后调用
// 可在此进行后续操作,如保存数据到数据库
}
}
package com.clx.performance.service.broker; package com.clx.performance.service.broker;
import java.util.List;
public interface OrderChildBrokerMqService { public interface OrderChildBrokerMqService {
void orderChildSync(String childNo); void orderChildSync(String childNo);
void orderChildUpdate(String childNo); void orderChildUpdate(String childNo);
void orderChildUpdate(List<String> childNoList);
} }
...@@ -3211,8 +3211,11 @@ public class OrderChildServiceImpl implements OrderChildService { ...@@ -3211,8 +3211,11 @@ public class OrderChildServiceImpl implements OrderChildService {
if (orderChild == null) { if (orderChild == null) {
return new OrderChildLoadRangeCheckResultVO(OrderChildEnum.NeedAlertEnum.FAIL.getCode(), ORDER_CHILD_NO_FOUND.getCode(), ORDER_CHILD_NO_FOUND.getMsg()); return new OrderChildLoadRangeCheckResultVO(OrderChildEnum.NeedAlertEnum.FAIL.getCode(), ORDER_CHILD_NO_FOUND.getCode(), ORDER_CHILD_NO_FOUND.getMsg());
} }
//如果运单已经解除装车限制,则直接返回成功
if (Objects.equals(orderChild.getRemoveLoadLimitStatus(), OrderChildEnum.RemoveLoadLimitStatus.REMOVED.getCode())) {
return new OrderChildLoadRangeCheckResultVO(OrderChildEnum.NeedAlertEnum.OK.getCode(), OrderChildEnum.NeedAlertEnum.OK.getCode(), "验证通过");
}
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).get(); OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).get();
//todo 解除装车限制
// 发货地址纬度 // 发货地址纬度
BigDecimal sendLatitude = orderGoods.getSendLatitude(); BigDecimal sendLatitude = orderGoods.getSendLatitude();
// 发货地经度 // 发货地经度
...@@ -3297,6 +3300,7 @@ public class OrderChildServiceImpl implements OrderChildService { ...@@ -3297,6 +3300,7 @@ public class OrderChildServiceImpl implements OrderChildService {
//超出货源地x公里范围了,且通知状态为未通知 //超出货源地x公里范围了,且通知状态为未通知
// 到达货源地 // 到达货源地
if (Objects.equals(child.getStatus(), OrderChildEnum.Status.ARRIVE_SEND.getCode())) { if (Objects.equals(child.getStatus(), OrderChildEnum.Status.ARRIVE_SEND.getCode())) {
log.info("{}超出货源地x公里范围了,运单{}为到达货源地状态,发送短信", truckNo, childNo);
sendLoadSms(child.getDriverMobile(), child.getTruckNo(), child.getChildNo()); sendLoadSms(child.getDriverMobile(), child.getTruckNo(), child.getChildNo());
} }
// 已装货 // 已装货
...@@ -3309,6 +3313,7 @@ public class OrderChildServiceImpl implements OrderChildService { ...@@ -3309,6 +3313,7 @@ public class OrderChildServiceImpl implements OrderChildService {
// 修改 通知状态 为已通知 // 修改 通知状态 为已通知
child.setExitNoticeStatus(OrderChildEnum.ExitNoticeStatus.NOTIFIED.getCode()); child.setExitNoticeStatus(OrderChildEnum.ExitNoticeStatus.NOTIFIED.getCode());
child.setEnterExitSendStatus(OrderChildEnum.EnterExitSendStatus.DRIVE_OUT.getCode()); child.setEnterExitSendStatus(OrderChildEnum.EnterExitSendStatus.DRIVE_OUT.getCode());
orderChildDao.updateEntityByKey(child);
} }
} else { } else {
...@@ -3320,6 +3325,7 @@ public class OrderChildServiceImpl implements OrderChildService { ...@@ -3320,6 +3325,7 @@ public class OrderChildServiceImpl implements OrderChildService {
child.setExitNoticeStatus(OrderChildEnum.ExitNoticeStatus.NOT_NOTIFIED.getCode()); child.setExitNoticeStatus(OrderChildEnum.ExitNoticeStatus.NOT_NOTIFIED.getCode());
// 状态改为驶入货源地 // 状态改为驶入货源地
child.setEnterExitSendStatus(OrderChildEnum.EnterExitSendStatus.DRIVE_IN.getCode()); child.setEnterExitSendStatus(OrderChildEnum.EnterExitSendStatus.DRIVE_IN.getCode());
orderChildDao.updateEntityByKey(child);
} }
} }
} }
...@@ -3337,7 +3343,7 @@ public class OrderChildServiceImpl implements OrderChildService { ...@@ -3337,7 +3343,7 @@ public class OrderChildServiceImpl implements OrderChildService {
* @param truckNo 当前运单关联车牌号 * @param truckNo 当前运单关联车牌号
* @param childNo 运单单号 * @param childNo 运单单号
*/ */
private void sendLoadSms(String mobile, String truckNo, String childNo) { protected void sendLoadSms(String mobile, String truckNo, String childNo) {
AliSmsMessageReq req = new AliSmsMessageReq(); AliSmsMessageReq req = new AliSmsMessageReq();
// 模板CODE // 模板CODE
//SMS_470795021 //SMS_470795021
......
...@@ -19,6 +19,8 @@ import org.apache.commons.lang3.exception.ExceptionUtils; ...@@ -19,6 +19,8 @@ import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Objects;
@Slf4j @Slf4j
@Service @Service
public class OrderChildBrokerMqHandlerServiceImpl implements OrderChildBrokerMqHandlerService { public class OrderChildBrokerMqHandlerServiceImpl implements OrderChildBrokerMqHandlerService {
...@@ -75,6 +77,10 @@ public class OrderChildBrokerMqHandlerServiceImpl implements OrderChildBrokerMqH ...@@ -75,6 +77,10 @@ public class OrderChildBrokerMqHandlerServiceImpl implements OrderChildBrokerMqH
SettlementDriverDetail settlementDriverDetail = settlementDriverDetailDao SettlementDriverDetail settlementDriverDetail = settlementDriverDetailDao
.getByChildNo(orderChild.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND); .getByChildNo(orderChild.getChildNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
if (Objects.equals(settlementOwnerDetail.getReportFlag(), com.clx.order.enums.OrderEnum.ReportFlag.NO.getCode())){
return;
}
try{ try{
// 更新broker // 更新broker
orderChildBrokerService.orderChildUpdate(orderChild, orderGoods, settlementOwnerDetail, settlementDriverDetail); orderChildBrokerService.orderChildUpdate(orderChild, orderGoods, settlementOwnerDetail, settlementDriverDetail);
......
...@@ -14,6 +14,8 @@ import org.springframework.amqp.rabbit.core.RabbitTemplate; ...@@ -14,6 +14,8 @@ import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j @Slf4j
@Service @Service
public class OrderChildBrokerMqServiceImpl implements OrderChildBrokerMqService { public class OrderChildBrokerMqServiceImpl implements OrderChildBrokerMqService {
...@@ -47,4 +49,13 @@ public class OrderChildBrokerMqServiceImpl implements OrderChildBrokerMqService ...@@ -47,4 +49,13 @@ public class OrderChildBrokerMqServiceImpl implements OrderChildBrokerMqService
rabbitTemplate.send(RabbitKeyBrokerConstants.DEFAULT_EXCHANGE, rabbitTemplate.send(RabbitKeyBrokerConstants.DEFAULT_EXCHANGE,
RabbitKeyBrokerConstants.DEFAULT_DELAY_ROUTING_KEY, message); RabbitKeyBrokerConstants.DEFAULT_DELAY_ROUTING_KEY, message);
} }
@Override
public void orderChildUpdate(List<String> childNoList) {
for (String childNo : childNoList) {
orderChildUpdate(childNo);
}
}
} }
...@@ -66,7 +66,7 @@ public class OrderChildBrokerServiceImpl implements OrderChildBrokerService { ...@@ -66,7 +66,7 @@ public class OrderChildBrokerServiceImpl implements OrderChildBrokerService {
TransportParam transportParam = buildParam(orderChild, orderGoods, settlementOwnerDetail, settlementDriverDetail); TransportParam transportParam = buildParam(orderChild, orderGoods, settlementOwnerDetail, settlementDriverDetail);
// 更新状态 // 运单同步
settlementOwnerDetail.setInvoiceTypeStatus(SettlementOwnerDetailEnum.InvoiceTypeStatus.PROCESSING.getCode()); settlementOwnerDetail.setInvoiceTypeStatus(SettlementOwnerDetailEnum.InvoiceTypeStatus.PROCESSING.getCode());
settlementOwnerDetailDao.updateInvoiceTypeStatus(settlementOwnerDetail); settlementOwnerDetailDao.updateInvoiceTypeStatus(settlementOwnerDetail);
...@@ -77,12 +77,8 @@ public class OrderChildBrokerServiceImpl implements OrderChildBrokerService { ...@@ -77,12 +77,8 @@ public class OrderChildBrokerServiceImpl implements OrderChildBrokerService {
public void orderChildUpdate(OrderChild orderChild, OrderGoods orderGoods, SettlementOwnerDetail settlementOwnerDetail, SettlementDriverDetail settlementDriverDetail) { public void orderChildUpdate(OrderChild orderChild, OrderGoods orderGoods, SettlementOwnerDetail settlementOwnerDetail, SettlementDriverDetail settlementDriverDetail) {
TransportParam transportParam = buildParam(orderChild, orderGoods, settlementOwnerDetail, settlementDriverDetail); TransportParam transportParam = buildParam(orderChild, orderGoods, settlementOwnerDetail, settlementDriverDetail);
// 更新状态 // 运单更新
settlementOwnerDetail.setInvoiceTypeStatus(SettlementOwnerDetailEnum.InvoiceTypeStatus.PROCESSING.getCode()); brokerService.orderChildUpdate(transportParam);
settlementOwnerDetailDao.updateInvoiceTypeStatus(settlementOwnerDetail);
brokerService.orderChildSync(transportParam);
brokerService.orderChildSync(transportParam);
} }
private TransportParam buildParam(OrderChild orderChild, OrderGoods orderGoods, SettlementOwnerDetail settlementOwnerDetail, private TransportParam buildParam(OrderChild orderChild, OrderGoods orderGoods, SettlementOwnerDetail settlementOwnerDetail,
...@@ -278,6 +274,8 @@ public class OrderChildBrokerServiceImpl implements OrderChildBrokerService { ...@@ -278,6 +274,8 @@ public class OrderChildBrokerServiceImpl implements OrderChildBrokerService {
orderChildInfo.setReceiveNet(orderChild.getUnloadNet()); orderChildInfo.setReceiveNet(orderChild.getUnloadNet());
orderChildInfo.setInvoiceFlag(settlementOwnerDetail.getInvoiceType()); orderChildInfo.setInvoiceFlag(settlementOwnerDetail.getInvoiceType());
orderChildInfo.setInvoicePlatform(settlementOwnerDetail.getInvoicingCompanyShorterName()); orderChildInfo.setInvoicePlatform(settlementOwnerDetail.getInvoicingCompanyShorterName());
orderChildInfo.setInvoiceStatus(Objects.equals(settlementOwnerDetail.getInvoiceStatus(),
SettlementOwnerDetailEnum.InvoiceStatus.YES.getCode())? 1 : 0);
transportParam.setOrder(orderInfo); transportParam.setOrder(orderInfo);
transportParam.setOrderChildImage(imageList); transportParam.setOrderChildImage(imageList);
......
...@@ -427,7 +427,7 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic ...@@ -427,7 +427,7 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
settlementMqService.settlementPlatformAutoConfirmUpdate(settlementOwnerDetail.getSettlementNo()); settlementMqService.settlementPlatformAutoConfirmUpdate(settlementOwnerDetail.getSettlementNo());
} }
else { else if (Objects.equals(result.getSettleStatus(), 3) ) {
SettlementOrderChildRisk settlementOrderChildRisk = new SettlementOrderChildRisk(); SettlementOrderChildRisk settlementOrderChildRisk = new SettlementOrderChildRisk();
settlementOrderChildRisk.setChildNo(orderChild.getChildNo()); settlementOrderChildRisk.setChildNo(orderChild.getChildNo());
settlementOrderChildRisk.setTruckNo(orderChild.getTruckNo()); settlementOrderChildRisk.setTruckNo(orderChild.getTruckNo());
...@@ -481,8 +481,8 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic ...@@ -481,8 +481,8 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
// 预付运费判断 // 预付运费判断
if (settlementDriverDetail.getSettlementFreight().compareTo(BigDecimal.ZERO) <= 0) { if (settlementDriverDetail.getSettlementFreight().compareTo(BigDecimal.ZERO) <= 0) {
// 转普通单 // // 转普通单
settlementOwnerDetail.setInvoiceType(SettlementOwnerEnum.InvoiceType.ORDINARY.getCode()); // settlementOwnerDetail.setInvoiceType(SettlementOwnerEnum.InvoiceType.ORDINARY.getCode());
settlementOwnerDetail.setInvoicingCompanyId(null); settlementOwnerDetail.setInvoicingCompanyId(null);
settlementOwnerDetail.setInvoicingCompanyShorterName(null); settlementOwnerDetail.setInvoicingCompanyShorterName(null);
settlementOwnerDetail.setInvoicingCompanyGroupCode(null); settlementOwnerDetail.setInvoicingCompanyGroupCode(null);
...@@ -497,6 +497,9 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic ...@@ -497,6 +497,9 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
settlementOwnerDetailDao.updatePreFreight(settlementOwnerDetail); settlementOwnerDetailDao.updatePreFreight(settlementOwnerDetail);
settlementDriverDetailDao.updatePreFreight(settlementDriverDetail); settlementDriverDetailDao.updatePreFreight(settlementDriverDetail);
// 发送mq (更新无车承运)
orderChildBrokerMqService.orderChildSync(orderChild.getChildNo());
} else { } else {
if (Objects.equals(settlementOwnerDetail.getReportFlag(), com.clx.order.enums.OrderEnum.ReportFlag.NO.getCode())){ if (Objects.equals(settlementOwnerDetail.getReportFlag(), com.clx.order.enums.OrderEnum.ReportFlag.NO.getCode())){
......
package com.clx.performance.service.impl.settle; package com.clx.performance.service.impl.settle;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.dao.OrderChildDao; import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.settle.SettlementDriverDetailDao; import com.clx.performance.dao.settle.SettlementDriverDetailDao;
import com.clx.performance.dao.settle.SettlementOwnerDetailDao; import com.clx.performance.dao.settle.SettlementOwnerDetailDao;
import com.clx.performance.dto.excel.InvoiceData;
import com.clx.performance.enums.PerformanceResultEnum; import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.enums.settle.SettlementOwnerDetailEnum; import com.clx.performance.enums.settle.SettlementOwnerDetailEnum;
import com.clx.performance.enums.settle.SettlementOwnerEnum; import com.clx.performance.enums.settle.SettlementOwnerEnum;
import com.clx.performance.enums.settle.SettlementWayEnum; import com.clx.performance.enums.settle.SettlementWayEnum;
import com.clx.performance.listener.excel.InvoiceDataListener;
import com.clx.performance.model.OrderChild; import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderGoods; import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.settle.SettlementDriverDetail; import com.clx.performance.model.settle.SettlementDriverDetail;
...@@ -20,6 +23,7 @@ import com.clx.performance.param.pc.owner.PageCarrierSettlementOwnerDetailParam; ...@@ -20,6 +23,7 @@ import com.clx.performance.param.pc.owner.PageCarrierSettlementOwnerDetailParam;
import com.clx.performance.param.pc.owner.PageInvoiceOwnerSettlementOwnerDetailParam; import com.clx.performance.param.pc.owner.PageInvoiceOwnerSettlementOwnerDetailParam;
import com.clx.performance.param.pc.owner.PageOwnerSettlementOwnerDetailParam; import com.clx.performance.param.pc.owner.PageOwnerSettlementOwnerDetailParam;
import com.clx.performance.param.pc.owner.PagePendingCarrierSettlementOwnerDetailParam; import com.clx.performance.param.pc.owner.PagePendingCarrierSettlementOwnerDetailParam;
import com.clx.performance.service.broker.OrderChildBrokerMqService;
import com.clx.performance.service.settle.SettlementCommonService; import com.clx.performance.service.settle.SettlementCommonService;
import com.clx.performance.service.settle.SettlementOwnerDetailService; import com.clx.performance.service.settle.SettlementOwnerDetailService;
import com.clx.performance.service.settle.SettlementPostService; import com.clx.performance.service.settle.SettlementPostService;
...@@ -32,7 +36,11 @@ import com.clx.performance.vo.pc.carrier.settle.CarrierPagePendingSettlementOwne ...@@ -32,7 +36,11 @@ import com.clx.performance.vo.pc.carrier.settle.CarrierPagePendingSettlementOwne
import com.clx.performance.vo.pc.carrier.settle.CarrierPageSettlementOwnerDetailVO; import com.clx.performance.vo.pc.carrier.settle.CarrierPageSettlementOwnerDetailVO;
import com.clx.performance.vo.pc.owner.settle.CountOwnerSettlementOwnerDetailVO; import com.clx.performance.vo.pc.owner.settle.CountOwnerSettlementOwnerDetailVO;
import com.clx.performance.vo.pc.owner.settle.PageOwnerSettlementOwnerDetailVO; import com.clx.performance.vo.pc.owner.settle.PageOwnerSettlementOwnerDetailVO;
import com.clx.performance.vo.pc.owner.settle.UploadBatchInvoiceFileResultVO;
import com.msl.common.exception.ServiceSystemException; import com.msl.common.exception.ServiceSystemException;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.time.LocalDateTime; import java.time.LocalDateTime;
...@@ -40,10 +48,16 @@ import java.util.ArrayList; ...@@ -40,10 +48,16 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import com.msl.common.result.Result;
import com.msl.document.api.feign.FileUploadFeign;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
/** /**
...@@ -73,6 +87,11 @@ public class SettlementOwnerDetailServiceImpl implements SettlementOwnerDetailS ...@@ -73,6 +87,11 @@ public class SettlementOwnerDetailServiceImpl implements SettlementOwnerDetailS
@Autowired @Autowired
private SettlementPostService settlementPostService; private SettlementPostService settlementPostService;
@Autowired
private OrderChildBrokerMqService orderChildBrokerMqService;
@Autowired
private FileUploadFeign fileUploadFeign;
@Override @Override
...@@ -666,4 +685,37 @@ public class SettlementOwnerDetailServiceImpl implements SettlementOwnerDetailS ...@@ -666,4 +685,37 @@ public class SettlementOwnerDetailServiceImpl implements SettlementOwnerDetailS
//创建excel //创建excel
return ExcelUtil.create(excelSheet); return ExcelUtil.create(excelSheet);
} }
@Override
public UploadBatchInvoiceFileResultVO uploadBatchInvoiceFile(MultipartFile file) throws IOException {
List<InvoiceData> invoiceDataList = new ArrayList<>();
// 解析上传的Excel文件
EasyExcel.read(file.getInputStream(), InvoiceData.class, new InvoiceDataListener(invoiceDataList,settlementOwnerDetailDao)).sheet().doRead();
boolean verifyResult = invoiceDataList.stream().allMatch(item -> "校验通过".equals(item.getRemark()));
Result<String> uploadResult = null;
if (!verifyResult) {
// 将校验后的数据写入新的Excel文件
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
EasyExcel.write(outputStream, InvoiceData.class).sheet("校验结果").doWrite(invoiceDataList);
// 将文件上传到OSS
uploadResult = fileUploadFeign.uploadBytes(outputStream.toByteArray(), null, null);
}
UploadBatchInvoiceFileResultVO vo = new UploadBatchInvoiceFileResultVO();
vo.setVerifyResult(verifyResult);
vo.setErrorFileUrl(uploadResult==null?null:uploadResult.getData());
vo.setOrderChildSum(invoiceDataList.size());
vo.setLoadWeightSum(invoiceDataList.stream().map(InvoiceData::getLoadNet).reduce(BigDecimal.ZERO,BigDecimal::add));
vo.setInvoiceFreightSum(invoiceDataList.stream().map(InvoiceData::getInvoiceFreight).reduce(BigDecimal.ZERO,BigDecimal::add));
vo.setChildNoList(invoiceDataList.stream().map(InvoiceData::getChildNo).collect(Collectors.toList()));
return vo;
}
@Override
public void confirmBatchInvoice(List<String> childNoList) {
settlementOwnerDetailDao.updateSettlementByChildNoList(childNoList);
// 发送mq (运单更新)
orderChildBrokerMqService.orderChildUpdate(childNoList);
}
} }
...@@ -15,7 +15,12 @@ import com.clx.performance.vo.pc.carrier.settle.CarrierPagePendingSettlementOwne ...@@ -15,7 +15,12 @@ import com.clx.performance.vo.pc.carrier.settle.CarrierPagePendingSettlementOwne
import com.clx.performance.vo.pc.carrier.settle.CarrierPageSettlementOwnerDetailVO; import com.clx.performance.vo.pc.carrier.settle.CarrierPageSettlementOwnerDetailVO;
import com.clx.performance.vo.pc.owner.settle.CountOwnerSettlementOwnerDetailVO; import com.clx.performance.vo.pc.owner.settle.CountOwnerSettlementOwnerDetailVO;
import com.clx.performance.vo.pc.owner.settle.PageOwnerSettlementOwnerDetailVO; import com.clx.performance.vo.pc.owner.settle.PageOwnerSettlementOwnerDetailVO;
import com.clx.performance.vo.pc.owner.settle.UploadBatchInvoiceFileResultVO;
import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.List;
/** /**
* @author liruixin * @author liruixin
...@@ -49,4 +54,8 @@ public interface SettlementOwnerDetailService { ...@@ -49,4 +54,8 @@ public interface SettlementOwnerDetailService {
SXSSFWorkbook exportBatchSettlementOwnerDetail(ExportBatchOwnerSettlementDetailParam param); SXSSFWorkbook exportBatchSettlementOwnerDetail(ExportBatchOwnerSettlementDetailParam param);
SXSSFWorkbook exportInvoiceOwnerSettlementOrderDetail(PageInvoiceOwnerSettlementOwnerDetailParam param); SXSSFWorkbook exportInvoiceOwnerSettlementOrderDetail(PageInvoiceOwnerSettlementOwnerDetailParam param);
UploadBatchInvoiceFileResultVO uploadBatchInvoiceFile(MultipartFile file) throws IOException;
void confirmBatchInvoice(List<String> childNoList);
} }
package com.clx.performance.service.impl;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.dto.gd.GdRouteDTO;
import com.clx.performance.enums.EnabledStatusEnum;
import com.clx.performance.enums.OrderChildEnum;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.param.app.OrderChildLoadRangeCheckParam;
import com.clx.performance.service.OrderChildOperateLimitConfigService;
import com.clx.performance.utils.gd.GdService;
import com.clx.performance.vo.app.OrderChildLoadRangeCheckResultVO;
import com.clx.performance.vo.pc.OrderChildOperateLimitConfigVO;
import com.msl.common.base.Optional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
import java.math.BigDecimal;
import java.util.Collections;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.LENIENT)
class OrderChildServiceImpl3Test {
@Mock
private OrderGoodsDao orderGoodsDao;
@Mock
private OrderChildDao orderChildDao;
@Mock
private GdService gdService;
@Mock
private OrderChildOperateLimitConfigService orderChildOperateLimitConfigService;
@InjectMocks
private OrderChildServiceImpl orderChildService;
private OrderChildLoadRangeCheckParam param;
@BeforeEach
void setUp() {
param = new OrderChildLoadRangeCheckParam();
param.setChildNo("testChildNo");
param.setLatitude(BigDecimal.TEN);
param.setLongitude(BigDecimal.TEN);
}
/**
* 无配置情况
*/
@Test
void loadRangeCheck_whenConfigIsNull_shouldReturnError() {
when(orderChildDao.getByChildNo(param.getChildNo())).thenReturn(Optional.of(new OrderChild()));
when(orderGoodsDao.getByOrderGoodsNo(anyString())).thenReturn(Optional.of(new OrderGoods()));
OrderChildLoadRangeCheckResultVO result = orderChildService.loadRangeCheck(param);
assertEquals(PerformanceResultEnum.ORDER_CHILD_LOAD_LIMIT_CONFIG_ERROR.getCode(), result.getCode());
}
@Test
void loadRangeCheck_whenConfigIsDisabled_shouldReturnDisabled() {
OrderChildOperateLimitConfigVO config = new OrderChildOperateLimitConfigVO();
config.setStatus(EnabledStatusEnum.DISABLE.getCode());
// 限制装车距离为1.5
config.setAllowUploadDistance(new BigDecimal("1.5"));
OrderChild orderChild = new OrderChild();
orderChild.setOrderGoodsNo("ordergoodsno");
orderChild.setOrderNo("orderno");
orderChild.setChildNo("orderno");
orderChild.setStatus(OrderChildEnum.Status.GO_TO_SEND.getCode());
OrderGoods orderGoods = new OrderGoods();
when(orderChildOperateLimitConfigService.listConfig()).thenReturn(config);
when(orderChildDao.getByChildNo(param.getChildNo())).thenReturn(Optional.of(orderChild));
when(orderGoodsDao.getByOrderGoodsNo(anyString())).thenReturn(Optional.of(orderGoods));
GdRouteDTO route = new GdRouteDTO();
route.setDistance(2000);
when(gdService.getRoute(any(), any(), any(), any())).thenReturn(Collections.singletonList(route));
OrderChildLoadRangeCheckResultVO result = orderChildService.loadRangeCheck(param);
assertEquals(PerformanceResultEnum.ORDER_CHILD_LOAD_LIMIT_CONFIG_DISABLED.getCode(), result.getCode());
}
/**
* 在装车范围内,不进行提示
*/
@Test
void loadRangeCheck_ok() {
OrderChildOperateLimitConfigVO config = new OrderChildOperateLimitConfigVO();
config.setStatus(EnabledStatusEnum.ENABLE.getCode());
// 限制装车距离为1.5
config.setAllowUploadDistance(new BigDecimal("1.5"));
OrderChild orderChild = new OrderChild();
orderChild.setOrderGoodsNo("ordergoodsno");
orderChild.setOrderNo("orderno");
orderChild.setChildNo("orderno");
orderChild.setStatus(OrderChildEnum.Status.GO_TO_SEND.getCode());
OrderGoods orderGoods = new OrderGoods();
when(orderChildOperateLimitConfigService.listConfig()).thenReturn(config);
when(orderChildDao.getByChildNo(param.getChildNo())).thenReturn(Optional.of(orderChild));
when(orderGoodsDao.getByOrderGoodsNo(anyString())).thenReturn(Optional.of(orderGoods));
GdRouteDTO route = new GdRouteDTO();
//距离装车距离为1000
route.setDistance(1000);
when(gdService.getRoute(any(), any(), any(), any())).thenReturn(Collections.singletonList(route));
OrderChildLoadRangeCheckResultVO result = orderChildService.loadRangeCheck(param);
assertEquals(OrderChildEnum.NeedAlertEnum.OK.getCode(), result.getCode());
}
/**
* 运单不存在
*/
@Test
void loadRangeCheck_whenOrderChildNotFound_shouldReturnNotFound() {
OrderChildOperateLimitConfigVO config = new OrderChildOperateLimitConfigVO();
config.setStatus(EnabledStatusEnum.ENABLE.getCode());
// 限制装车距离为1.5
config.setAllowUploadDistance(new BigDecimal("1.5"));
when(orderChildOperateLimitConfigService.listConfig()).thenReturn(config);
when(orderChildDao.getByChildNo(param.getChildNo())).thenReturn(new Optional<>());
OrderChildLoadRangeCheckResultVO result = orderChildService.loadRangeCheck(param);
assertEquals(PerformanceResultEnum.ORDER_CHILD_NO_FOUND.getCode(), result.getCode());
assertEquals(OrderChildEnum.NeedAlertEnum.FAIL.getCode(), result.getNeedAlert());
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论