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

Merge remote-tracking branch 'origin/v30.2_break_contract_20241021' into test_jdk17

# Conflicts: # clx-performance-web/src/main/java/com/clx/performance/controller/feign/PerformanceSdkFeignController.java # performance-api/src/main/java/com/clx/performance/feign/PerformanceSDKFeign.java Former-commit-id: f6318bdb
......@@ -59,4 +59,7 @@ public class RedisConstants {
//异常上报编号
public static final String EXCEPTION_REPORT_CACHE_KEY = "clx-performance:exception:report:cache:key:";
}
......@@ -48,4 +48,19 @@ public class AppDriverBreakContractDriverRecordController {
return Result.ok(breakContractDriverRecordService.getBreakContractFigure(childNo));
}
@Operation(summary = "违约记录是否展示小红点 1:展示", description = "<br>By:刘海泉")
@GetMapping("/getShowBreakContractRed")
public Result<Integer> getShowBreakContractRed() {
return Result.ok(breakContractDriverRecordService.getShowBreakContractRed());
}
@Operation(summary = "违约记录标记已读", description = "<br>By:刘海泉")
@GetMapping("/updateBreakContractRead")
public Result<Integer> updateBreakContractRead() {
breakContractDriverRecordService.updateBreakContractRead();
return Result.ok();
}
}
......@@ -4,6 +4,8 @@ import com.clx.open.sdk.request.action.GetOrderBreakContractOwnerRuleFileAction;
import com.clx.open.sdk.request.action.QueryPerformanceProgressAction;
import com.clx.open.sdk.request.action.QueryPerformanceProgressLogAction;
import com.clx.open.sdk.request.dto.OrderCanExtractWeightDTO;
import com.alibaba.fastjson.JSON;
import com.clx.open.sdk.request.action.*;
import com.clx.open.sdk.request.dto.BatchOrderStatisticsDTO;
import com.clx.open.sdk.request.dto.BatchOrderStatisticsInfoDTO;
import com.clx.open.sdk.request.dto.OrderCanExtractWeightDTO;
......@@ -19,16 +21,16 @@ import com.clx.performance.vo.pc.PerformanceProgressVO;
import com.clx.performance.vo.pc.breakcontract.carrier.BreakContractOwnerRuleFileVO;
import com.msl.common.result.Result;
import com.msl.user.utils.TokenUtil;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import java.math.BigDecimal;
import java.util.List;
......@@ -59,6 +61,8 @@ public class PerformanceSdkFeignController {
private final OrderService orderService;
private final OrderChildExceptionReportService orderChildExceptionReportService;
@Operation(summary = "货主端取消订单", description = "<br>By:胡宇帆")
@PostMapping("/ownCancelOrderPre")
......@@ -144,4 +148,53 @@ public class PerformanceSdkFeignController {
}
//数媒宝同步异常上报信息
@PostMapping("clx-performance/feign/sdk/smbSyncExceptionReportInfo")
Result<String> smbSyncExceptionReportInfo(@RequestBody @Validated SmbSyncExceptionReportInfoAction action){
log.info("数媒宝同步异常上报信息开始,请求参数:{}", JSON.toJSONString(action));
Result<String> result = orderChildExceptionReportService.smbSyncExceptionReportInfo(action);
log.info("数媒宝同步异常上报信息结束,响应结果:{}", result);
return result;
}
//数媒宝同步异常上报结果
@PostMapping("clx-performance/feign/sdk/smbSyncExceptionReportResult")
Result<Object> smbSyncExceptionReportResult(@RequestBody @Validated SmbSyncExceptionReportResultAction action){
log.info("数媒宝同步异常上报结果开始,请求参数:{}", JSON.toJSONString(action));
return orderChildExceptionReportService.smbSyncExceptionReportResult(action);
}
//数媒宝撤销异常上报
@PostMapping("clx-performance/feign/sdk/smbWithdrawExceptionReport")
Result<Object> smbWithdrawExceptionReport(@RequestBody @Validated SmbWithdrawExceptionReportAction action){
log.info("数媒宝撤销异常上报开始,请求参数:{}", JSON.toJSONString(action));
return orderChildExceptionReportService.smbWithdrawExceptionReport(action);
}
//马上来供应链同步异常上报信息
@PostMapping("clx-performance/feign/sdk/mslSyncExceptionReportInfo")
Result<String> mslSyncExceptionReportInfo(@RequestBody @Validated MslSyncExceptionReportInfoAction action){
log.info("马上来供应链同步异常上报信息开始,请求参数:{}", JSON.toJSONString(action));
Result<String> result = orderChildExceptionReportService.mslSyncExceptionReportInfo(action);
log.info("马上来供应链同步异常上报信息结束,响应结果:{}", result);
return result;
}
//马上来供应链同步异常上报结果
@PostMapping("clx-performance/feign/sdk/mslSyncExceptionReportResult")
Result<Object> mslSyncExceptionReportResult(@RequestBody @Validated MslSyncExceptionReportResultAction action){
log.info("马上来供应链同步异常上报结果开始,请求参数:{}", JSON.toJSONString(action));
return orderChildExceptionReportService.mslSyncExceptionReportResult(action);
}
//马上来供应链撤销异常上报
@PostMapping("clx-performance/feign/sdk/mslWithdrawExceptionReport")
Result<Object> mslWithdrawExceptionReport(@RequestBody @Validated MslWithdrawExceptionReportAction action){
log.info("马上来供应链撤销异常上报开始,请求参数:{}", JSON.toJSONString(action));
return orderChildExceptionReportService.mslWithdrawExceptionReport(action);
}
}
package com.clx.performance.controller.pc;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.param.pc.DealExceptionReportParam;
import com.clx.performance.param.pc.PageExceptionReportParam;
import com.clx.performance.param.pc.TransferDriverBreakContractParam;
import com.clx.performance.service.OrderChildExceptionReportService;
import com.clx.performance.vo.pc.OrderChildExceptionReportVO;
import com.msl.common.base.PageData;
import com.msl.common.convertor.aspect.UnitCovert;
import com.msl.common.result.Result;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
@Slf4j
@RestController
@RequestMapping(value="/pc/carrier/exceptionReport")
@Validated
@Tag(name = "承运端-异常上报")
@AllArgsConstructor
public class OrderChildExceptionReportController {
private final OrderChildExceptionReportService orderChildExceptionReportService;
@Operation(summary = "异常上报处理", description = "<br>By:刘海泉")
@PostMapping(value = "updateDealExceptionReport")
public Result<Object> updateDealExceptionReport(@RequestBody @Validated DealExceptionReportParam param) {
orderChildExceptionReportService.updateDealExceptionReport(param);
return Result.ok();
}
@Operation(summary = "异常上报分页列表", description = "<br>By:刘海泉")
@PostMapping(value = "pageExceptionReport")
@UnitCovert(param = false)
public Result<PageData<OrderChildExceptionReportVO>> pageExceptionReport(@RequestBody @Validated PageExceptionReportParam param) {
Page<OrderChildExceptionReportVO> page = orderChildExceptionReportService.pageExceptionReport(param);
return Result.page(page.getRecords(), page.getTotal(), page.getPages());
}
@Operation(summary = "导出异常上报分页列表", description = "<br>By:刘海泉")
@PostMapping(value = "exportExceptionReport")
public Result<Object> exportExceptionReport(@RequestBody @Validated PageExceptionReportParam param,
HttpServletResponse response) throws IOException {
SXSSFWorkbook workbook = orderChildExceptionReportService.exportExceptionReport(param);
response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);
workbook.write(response.getOutputStream());
return Result.ok();
}
@Operation(summary = "异常上报详情接口", description = "<br>By:刘海泉")
@GetMapping(value = "getExceptionReport")
public Result<OrderChildExceptionReportVO> getExceptionReport(@RequestParam("id") @NotNull(message = "id不能为空") Integer id) {
return Result.ok(orderChildExceptionReportService.getExceptionReport(id));
}
@Operation(summary = "转司机违约", description = "<br>By:刘海泉")
@PostMapping(value = "transferDriverBreakContract")
public Result<Object> transferDriverBreakContract(@RequestBody @Validated TransferDriverBreakContractParam param) {
orderChildExceptionReportService.transferDriverBreakContract(param);
return Result.ok();
}
}
package com.clx.performance.dao;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.param.pc.PageExceptionReportParam;
import com.msl.common.dao.BaseDao;
import com.clx.performance.mapper.OrderChildExceptionReportMapper;
import com.clx.performance.model.OrderChildExceptionReport;
/**
* @author kavin
* Date 2024-10-22
* Time 10:38
*/
public interface OrderChildExceptionReportDao extends BaseDao<OrderChildExceptionReportMapper, OrderChildExceptionReport, Integer> {
OrderChildExceptionReport findByThirdReportNoAndSource(Integer source, String thirdReportNo);
IPage<OrderChildExceptionReport> pageExceptionReport(PageExceptionReportParam param);
}
package com.clx.performance.dao;
import com.msl.common.dao.BaseDao;
import com.clx.performance.mapper.OrderChildExceptionReportDealLogMapper;
import com.clx.performance.model.OrderChildExceptionReportDealLog;
/**
* @author kavin
* Date 2024-10-22
* Time 11:08
*/
public interface OrderChildExceptionReportDealLogDao extends BaseDao<OrderChildExceptionReportDealLogMapper, OrderChildExceptionReportDealLog, Integer> {
}
package com.clx.performance.dao;
import com.clx.performance.mapper.OrderChildExceptionReportOperationLogMapper;
import com.clx.performance.model.OrderChildExceptionReportOperationLog;
import com.msl.common.dao.BaseDao;
/**
* @Author: aiqinguo
* @Description: 运单日志
* @Date: 2023/09/18 11:34:50
* @Version: 1.0
*/
public interface OrderChildExceptionReportOperationLogDao extends BaseDao<OrderChildExceptionReportOperationLogMapper, OrderChildExceptionReportOperationLog, Integer> {
}
......@@ -27,4 +27,7 @@ public interface BreakContractDriverRecordDao extends BaseDao<BreakContractDrive
IPage<BreakContractDriverRecordVO> pageByParam(PageBreakContractDriverRecordParam param);
IPage<DriverBreakContractDriverRecordVO> driverPageByParam(DriverPageBreakContractDriverRecordParam param);
Long getShowBreakContractRed(Long userNo);
void updateBreakContractRead(Long userNo);
}
package com.clx.performance.dao.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.param.pc.PageExceptionReportParam;
import com.msl.common.dao.impl.BaseDaoImpl;
import com.clx.performance.dao.OrderChildExceptionReportDao;
import com.clx.performance.mapper.OrderChildExceptionReportMapper;
import com.clx.performance.model.OrderChildExceptionReport;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;
import java.util.Objects;
/**
* @author kavin
* Date 2024-10-22
* Time 10:38
*/
@Repository
public class OrderChildExceptionReportDaoImpl extends BaseDaoImpl<OrderChildExceptionReportMapper, OrderChildExceptionReport, Integer> implements OrderChildExceptionReportDao {
@Override
public OrderChildExceptionReport findByThirdReportNoAndSource(Integer source, String thirdReportNo) {
LambdaQueryWrapper<OrderChildExceptionReport> query = new LambdaQueryWrapper<>();
query.eq(OrderChildExceptionReport :: getSource,source);
query.eq(OrderChildExceptionReport ::getThirdReportNo,thirdReportNo);
return baseMapper.selectOne(query);
}
@Override
public IPage<OrderChildExceptionReport> pageExceptionReport(PageExceptionReportParam param) {
LambdaQueryWrapper<OrderChildExceptionReport> query = new LambdaQueryWrapper<>();
query.eq(StringUtils.isNotBlank(param.getThirdReportNo()),OrderChildExceptionReport :: getThirdReportNo,param.getThirdReportNo());
query.eq(Objects.nonNull(param.getSource()),OrderChildExceptionReport ::getSource,param.getSource());
query.eq(Objects.nonNull(param.getStatus()),OrderChildExceptionReport ::getStatus,param.getStatus());
query.eq(StringUtils.isNotBlank(param.getChildNo()),OrderChildExceptionReport ::getChildNo,param.getChildNo());
query.eq(StringUtils.isNotBlank(param.getTruckNoOrMobile()),OrderChildExceptionReport ::getTruckNoOrMobile,param.getTruckNoOrMobile());
query.ge(StringUtils.isNotBlank(param.getBeginTime()),OrderChildExceptionReport ::getCreateTime,param.getBeginTime());
query.le(StringUtils.isNotBlank(param.getEndTime()),OrderChildExceptionReport ::getCreateTime,param.getEndTime());
return baseMapper.selectPage(Page.of(param.getPage(), param.getPageSize()),query);
}
}
package com.clx.performance.dao.impl;
import com.msl.common.dao.impl.BaseDaoImpl;
import com.clx.performance.dao.OrderChildExceptionReportDealLogDao;
import com.clx.performance.mapper.OrderChildExceptionReportDealLogMapper;
import com.clx.performance.model.OrderChildExceptionReportDealLog;
import org.springframework.stereotype.Repository;
/**
* @author kavin
* Date 2024-10-22
* Time 11:08
*/
@Repository
public class OrderChildExceptionReportDealLogDaoImpl extends BaseDaoImpl<OrderChildExceptionReportDealLogMapper, OrderChildExceptionReportDealLog, Integer> implements OrderChildExceptionReportDealLogDao {
}
package com.clx.performance.dao.impl;
import com.clx.performance.dao.OrderChildExceptionReportOperationLogDao;
import com.clx.performance.mapper.OrderChildExceptionReportOperationLogMapper;
import com.clx.performance.model.OrderChildExceptionReportOperationLog;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.springframework.stereotype.Repository;
/**
* @Author: aiqinguo
* @Description: 运单图片
* @Date: 2023/09/18 11:34:50
* @Version: 1.0
*/
@Repository
public class OrderChildExceptionReportOperationLogDaoImpl extends BaseDaoImpl<OrderChildExceptionReportOperationLogMapper, OrderChildExceptionReportOperationLog, Integer> implements OrderChildExceptionReportOperationLogDao {
}
package com.clx.performance.dao.impl.breakcontract;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.dao.breakcontract.BreakContractDriverRecordDao;
import com.clx.performance.enums.BreakContractRecordEnum;
import com.clx.performance.mapper.breakcontract.BreakContractDriverRecordMapper;
import com.clx.performance.model.breakcontract.BreakContractDriverRecord;
import com.clx.performance.param.app.breakcontract.DriverPageBreakContractDriverRecordParam;
......@@ -57,4 +59,26 @@ public class BreakContractDriverRecordDaoImpl extends BaseDaoImpl<BreakContractD
return baseMapper.driverPageByParam(page,param);
}
@Override
public Long getShowBreakContractRed(Long userNo) {
LambdaQueryWrapper<BreakContractDriverRecord> query = new LambdaQueryWrapper<>();
query.and(i ->
i.eq(BreakContractDriverRecord:: getTruckOwnUserNo,userNo).or()
.eq(BreakContractDriverRecord :: getDriverUserNo,userNo)
);
query.eq(BreakContractDriverRecord :: getReadFlag, BreakContractRecordEnum.ReadFlag.NO.getCode());
return baseMapper.selectCount(query);
}
@Override
public void updateBreakContractRead(Long userNo) {
LambdaUpdateWrapper<BreakContractDriverRecord> update = new LambdaUpdateWrapper<>();
update.and(i ->
i.eq(BreakContractDriverRecord:: getTruckOwnUserNo,userNo).or()
.eq(BreakContractDriverRecord :: getDriverUserNo,userNo)
);
update.set(BreakContractDriverRecord :: getReadFlag,BreakContractRecordEnum.ReadFlag.YES.getCode());
baseMapper.update(null,update);
}
}
package com.clx.performance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.clx.performance.model.OrderChildExceptionReportDealLog;
/**
* @author kavin
* Date 2024-10-22
* Time 11:08
*/
public interface OrderChildExceptionReportDealLogMapper extends BaseMapper<OrderChildExceptionReportDealLog> {
}
package com.clx.performance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.clx.performance.model.OrderChildExceptionReport;
/**
* @author kavin
* Date 2024-10-22
* Time 10:38
*/
public interface OrderChildExceptionReportMapper extends BaseMapper<OrderChildExceptionReport> {
}
package com.clx.performance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.clx.performance.model.OrderChildExceptionReportOperationLog;
import org.apache.ibatis.annotations.Mapper;
/**
* @Author: aiqinguo
* @Description: 运单日志
* @Date: 2023/09/18 11:34:50
* @Version: 1.0
*/
@Mapper
public interface OrderChildExceptionReportOperationLogMapper extends BaseMapper<OrderChildExceptionReportOperationLog> {
}
\ No newline at end of file
package com.clx.performance.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.msl.common.config.KeyColumn;
import com.msl.common.model.HasKey;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author kavin
* Date 2024-10-22
* Time 10:38
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("order_child_exception_report")
public class OrderChildExceptionReport implements HasKey<Integer> {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField("report_no")
@Schema(description="异常上报编号")
private String reportNo;
@TableField("third_report_no")
@Schema(description="三方异常上报编号")
private String thirdReportNo;
@TableField("source")
@Schema(description="来源")
private Integer source;
@TableField("exception_category")
@Schema(description="异常类别")
private String exceptionCategory;
@TableField("exception_type")
@Schema(description="异常类型")
private String exceptionType;
@TableField("truck_no_or_mobile")
@Schema(description="车牌号/手机号")
private String truckNoOrMobile;
@TableField("child_no")
@Schema(description="运单编号")
private String childNo;
@TableField("status")
@Schema(description="状态:1:待处理 2:申诉中 3:已处理 4:已撤回")
private Integer status;
@TableField("deduction_amount")
@Schema(description="扣罚金额")
private BigDecimal deductionAmount;
@TableField("report_time")
@Schema(description="异常上报时间")
private LocalDateTime reportTime;
@TableField("reason")
@Schema(description="异常原因描述")
private String reason;
@TableField("picture_url_json")
@Schema(description="图片")
private String pictureUrlJson;
@TableField("video_url_json")
@Schema(description="视频")
private String videoUrlJson;
@TableField("deal_user_code")
@Schema(description="处理人用户编码")
private Long dealUserCode;
@TableField("deal_user")
@Schema(description="处理人用户姓名")
private String dealUser;
@TableField("deal_time")
@Schema(description="处理时间")
private LocalDateTime dealTime;
@TableField("deal_result")
@Schema(description="处理结果")
private Integer dealResult;
@TableField("transfer_driver_break_contract")
@Schema(description="是否转司机违约 1:是")
private Integer transferDriverBreakContract;
@TableField("break_contract_reason")
@Schema(description="违约原因")
private String breakContractReason;
@TableField("create_time")
@Schema(description="创建时间")
private LocalDateTime createTime;
@TableField("modified_time")
@Schema(description="修改时间")
private LocalDateTime modifiedTime;
@Override
@KeyColumn("id")
public Integer gainKey() {
return this.id;
}
}
package com.clx.performance.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.msl.common.config.KeyColumn;
import com.msl.common.model.HasKey;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
/**
* @author kavin
* Date 2024-10-22
* Time 11:08
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("order_child_exception_report_deal_log")
public class OrderChildExceptionReportDealLog implements HasKey<Integer> {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField("report_no")
@Schema(description="异常上报编号")
private String reportNo;
@TableField("deal_way")
@Schema(description="处理方式 1:同意扣罚 2:申诉")
private Integer dealWay;
@TableField("appeal_reason")
@Schema(description="申诉原因")
private String appealReason;
@TableField("picture_url")
@Schema(description="图片")
private String pictureUrl;
@TableField("video_url")
@Schema(description="视频")
private String videoUrl;
@TableField("create_by")
@Schema(description="申诉人编码")
private Long createBy; //操作人编号
@TableField("create_name")
@Schema(description="申诉人")
private String createName; //操作人名称
@TableField("create_time")
@Schema(description="创建时间")
private LocalDateTime createTime;
@TableField("modified_time")
@Schema(description="修改时间")
private LocalDateTime modifiedTime;
@Override
@KeyColumn("id")
public Integer gainKey() {
return this.id;
}
}
package com.clx.performance.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.msl.common.config.KeyColumn;
import com.msl.common.model.HasKey;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.time.LocalDateTime;
@Getter
@Setter
@NoArgsConstructor
@TableName(autoResultMap = true)
public class OrderChildExceptionReportOperationLog implements HasKey<Integer> {
@TableId(value = "id", type = IdType.AUTO)
private Integer id; //id
private String reportNo; //异常上报编号
private Integer type; //操作事项编码
private String result; //处理结果
private Long createBy; //操作人编号
private String createName; //操作人名称
private LocalDateTime createTime; //创建时间
private LocalDateTime modifiedTime; //修改时间
@KeyColumn("id")
@Override
public Integer gainKey() {
return id;
}
}
\ No newline at end of file
package com.clx.performance.model.breakcontract;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.msl.common.config.KeyColumn;
import com.msl.common.model.HasKey;
......@@ -8,9 +10,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
/**
......@@ -28,7 +29,7 @@ public class BreakContractDriverRecord implements HasKey<Integer> {
private Integer id;
@TableField("trigger_type")
@Schema(description="触发类型:1系统触发 2手动触发")
@Schema(description="触发类型:1系统触发 2手动触发 3.异常上报")
private Integer triggerType;
@TableField("break_contract_party_type")
......@@ -79,6 +80,36 @@ public class BreakContractDriverRecord implements HasKey<Integer> {
@Schema(description="结算单编号")
private String settlementNo;
@TableField("exception_report_no")
@Schema(description="异常上报单号")
private String exceptionReportNo;
@TableField("exception_category")
@Schema(description="异常类别")
private String exceptionCategory;
@TableField("exception_type")
@Schema(description="异常类型")
private String exceptionType;
@TableField("picture_url")
@Schema(description="图片")
private String pictureUrl;
@TableField("video_url")
@Schema(description="视频")
private String videoUrl;
@TableField("read_flag")
@Schema(description="已读未读标志 0:未读 1:已读")
private String readFlag;
@TableField("remark")
@Schema(description="备注")
private String remark;
......
package com.clx.performance.service;
/**
* @author kavin
* Date 2024-10-22
* Time 11:08
*/
public interface OrderChildExceptionReportDealLogService {
}
package com.clx.performance.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.open.sdk.request.action.*;
import com.clx.performance.param.pc.DealExceptionReportParam;
import com.clx.performance.param.pc.PageExceptionReportParam;
import com.clx.performance.param.pc.TransferDriverBreakContractParam;
import com.clx.performance.vo.pc.OrderChildExceptionReportVO;
import com.msl.common.result.Result;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
/**
* @author kavin
* Date 2024-10-22
* Time 10:38
*/
public interface OrderChildExceptionReportService {
Result<String> smbSyncExceptionReportInfo(SmbSyncExceptionReportInfoAction action);
Result<Object> smbSyncExceptionReportResult(SmbSyncExceptionReportResultAction action);
Result<Object> smbWithdrawExceptionReport(SmbWithdrawExceptionReportAction action);
Result<String> mslSyncExceptionReportInfo(MslSyncExceptionReportInfoAction action);
Result<Object> mslSyncExceptionReportResult(MslSyncExceptionReportResultAction action);
Result<Object> mslWithdrawExceptionReport(MslWithdrawExceptionReportAction action);
void updateDealExceptionReport(DealExceptionReportParam param);
Page<OrderChildExceptionReportVO> pageExceptionReport(PageExceptionReportParam param);
SXSSFWorkbook exportExceptionReport(PageExceptionReportParam param);
OrderChildExceptionReportVO getExceptionReport(Integer id);
void transferDriverBreakContract(TransferDriverBreakContractParam param);
}
......@@ -23,6 +23,8 @@ public interface BreakContractDriverRecordService {
IPage<DriverBreakContractDriverRecordVO> driverPageRecord(DriverPageBreakContractDriverRecordParam param);
String breakNoGenerate();
void saveDriverRecordOfOrderChildCancel(OrderChild orderChild, Long createBy, String createName);
void saveDriverRecordOfArriveSendAddressTimeout(OrderChild orderChild, Long createBy, String createName);
......@@ -33,4 +35,8 @@ public interface BreakContractDriverRecordService {
BigDecimal getBreakContractFigure(String childNo);
Integer getChildTruckDemand(String childNo);
Integer getShowBreakContractRed();
void updateBreakContractRead();
}
package com.clx.performance.service.impl;
import com.clx.performance.service.OrderChildExceptionReportDealLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author kavin
* Date 2024-10-22
* Time 11:08
*/
@Service
@Slf4j
public class OrderChildExceptionReportDealLogServiceImpl implements OrderChildExceptionReportDealLogService {
}
package com.clx.performance.service.impl;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.open.sdk.callback.OpenCallBackClient;
import com.clx.open.sdk.callback.message.MslExceptionReportDealMessage;
import com.clx.open.sdk.callback.message.SmbExceptionReportDealMessage;
import com.clx.open.sdk.enums.ExceptionReportEnum;
import com.clx.open.sdk.request.action.*;
import com.clx.performance.config.ThirdAppConfig;
import com.clx.performance.constant.RedisConstants;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OrderChildExceptionReportDao;
import com.clx.performance.dao.OrderChildExceptionReportDealLogDao;
import com.clx.performance.dao.OrderChildExceptionReportOperationLogDao;
import com.clx.performance.dao.breakcontract.BreakContractDriverRecordDao;
import com.clx.performance.enums.*;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderChildExceptionReport;
import com.clx.performance.model.OrderChildExceptionReportDealLog;
import com.clx.performance.model.OrderChildExceptionReportOperationLog;
import com.clx.performance.model.breakcontract.BreakContractDriverRecord;
import com.clx.performance.param.pc.DealExceptionReportParam;
import com.clx.performance.param.pc.PageExceptionReportParam;
import com.clx.performance.param.pc.TransferDriverBreakContractParam;
import com.clx.performance.service.OrderChildExceptionReportService;
import com.clx.performance.service.breakcontract.BreakContractDriverRecordService;
import com.clx.performance.struct.OrderChildExceptionReportOperationLogStruct;
import com.clx.performance.struct.OrderChildExceptionReportStruct;
import com.clx.performance.utils.LocalDateTimeUtils;
import com.clx.performance.utils.excel.ExcelData;
import com.clx.performance.utils.excel.ExcelField;
import com.clx.performance.utils.excel.ExcelSheet;
import com.clx.performance.utils.excel.ExcelUtil;
import com.clx.performance.vo.pc.OrderChildExceptionReportOperationLogVO;
import com.clx.performance.vo.pc.OrderChildExceptionReportVO;
import com.msl.common.base.Optional;
import com.msl.common.exception.ServiceSystemException;
import com.msl.common.result.Result;
import com.msl.common.utils.DateUtils;
import com.msl.user.data.UserSessionData;
import com.msl.user.utils.TokenUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* @author kavin
* Date 2024-10-22
* Time 10:38
*/
@Service
@Slf4j
@AllArgsConstructor
public class OrderChildExceptionReportServiceImpl implements OrderChildExceptionReportService {
private final OrderChildExceptionReportStruct orderChildExceptionReportStruct;
private final OrderChildExceptionReportDao orderChildExceptionReportDao;
private final OrderChildExceptionReportDealLogDao orderChildExceptionReportDealLogDao;
private final RedisTemplate<String,Object> redisTemplate;
private final ThirdAppConfig thirdAppConfig;
private final OrderChildExceptionReportOperationLogDao orderChildExceptionReportOperationLogDao;
private final BreakContractDriverRecordService breakContractDriverRecordService;
private final OrderChildDao orderChildDao;
private final BreakContractDriverRecordDao breakContractDriverRecordDao;
private final OrderChildExceptionReportOperationLogStruct orderChildExceptionReportOperationLogStruct;
@Override
public Result<String> smbSyncExceptionReportInfo(SmbSyncExceptionReportInfoAction action) {
OrderChildExceptionReport report = orderChildExceptionReportStruct.convertInfoSmbAction(action);
report.setPictureUrlJson(JSON.toJSONString(action.getPictureUrl()));
report.setVideoUrlJson(JSON.toJSONString(action.getVideoUrl()));
report.setExceptionCategory(action.getOneLevelName());
report.setExceptionType(action.getTwoLevelName() + action.getThreeLevelName());
return Result.ok(saveExceptionReportInfo(report, SyncPlatformEnum.Source.TRADE_PLATFORM.getCode()));
}
@Override
public Result<Object> smbSyncExceptionReportResult(SmbSyncExceptionReportResultAction action) {
updateExceptionReportResult(SyncPlatformEnum.Source.TRADE_PLATFORM.getCode(),
action.getThirdReportNo(),action.getBreakContractParty());
return Result.ok();
}
@Override
public Result<Object> smbWithdrawExceptionReport(SmbWithdrawExceptionReportAction action) {
withdrawExceptionReport(SyncPlatformEnum.Source.TRADE_PLATFORM.getCode(), action.getThirdReportNo());
return Result.ok();
}
@Override
public Result<String> mslSyncExceptionReportInfo(MslSyncExceptionReportInfoAction action) {
OrderChildExceptionReport report = orderChildExceptionReportStruct.convertInfoMslAction(action);
report.setPictureUrlJson(JSON.toJSONString(action.getPictureUrl()));
report.setVideoUrlJson(JSON.toJSONString(action.getVideoUrl()));
return Result.ok(saveExceptionReportInfo(report, SyncPlatformEnum.Source.NEW_OWNER_CLIENT.getCode()));
}
@Override
public Result<Object> mslSyncExceptionReportResult(MslSyncExceptionReportResultAction action) {
updateExceptionReportResult(SyncPlatformEnum.Source.NEW_OWNER_CLIENT.getCode(),
action.getThirdReportNo(),action.getBreakContractParty());
return Result.ok();
}
@Override
public Result<Object> mslWithdrawExceptionReport(MslWithdrawExceptionReportAction action) {
withdrawExceptionReport(SyncPlatformEnum.Source.NEW_OWNER_CLIENT.getCode(), action.getThirdReportNo());
return Result.ok();
}
public void updateExceptionReportResult(Integer source,String thirdReportNo,Integer breakContractParty){
OrderChildExceptionReport report = orderChildExceptionReportDao.findByThirdReportNoAndSource(source,thirdReportNo);
if(Objects.isNull(report)){
log.warn("通过第三方上报编号:{} 未找到对应数据",thirdReportNo);
throw new ServiceSystemException(ResultEnum.DATA_NOT_FIND);
}
Integer oldStatus = report.getStatus();
if(Objects.equals(report.getStatus(), CarrierExceptionReportEnum.Status.PROCESSED.getCode())
|| Objects.equals(report.getStatus(), CarrierExceptionReportEnum.Status.WITHDRAWN.getCode())){
throw new ServiceSystemException(ResultEnum.PARAM_ERROR,"异常数据已被处理或撤回");
}
report.setDealTime(LocalDateTime.now());
report.setDealUser(SyncPlatformEnum.Source.getNameByCode(source));
report.setStatus(CarrierExceptionReportEnum.Status.PROCESSED.getCode());
report.setDealResult(breakContractParty);
orderChildExceptionReportDao.updateEntityByKey(report);
if(Objects.equals(oldStatus,CarrierExceptionReportEnum.Status.APPEAL_IN_PROGRESS.getCode())){
saveOperationLog(report.getReportNo(),CarrierExceptionLogEnum.Type.APPEAL_DEAL,
ExceptionReportEnum.DealResult.getNameByCode(breakContractParty),null,SyncPlatformEnum.Source.getNameByCode(source));
}else{
saveOperationLog(report.getReportNo(),CarrierExceptionLogEnum.Type.TIMEOUT,
ExceptionReportEnum.DealResult.getNameByCode(breakContractParty),null,SyncPlatformEnum.Source.getNameByCode(source));
}
}
public void withdrawExceptionReport(Integer source,String thirdReportNo){
OrderChildExceptionReport report = orderChildExceptionReportDao.findByThirdReportNoAndSource(source,thirdReportNo);
if(Objects.isNull(report)){
log.warn("通过第三方上报编号:{} 未找到对应数据",thirdReportNo);
throw new ServiceSystemException(ResultEnum.DATA_NOT_FIND);
}
if(!Objects.equals(report.getStatus(), CarrierExceptionReportEnum.Status.WAIT_DEAL.getCode())){
throw new ServiceSystemException(ResultEnum.PARAM_ERROR,"非待处理数据无法撤回");
}
report.setDealTime(LocalDateTime.now());
report.setDealUser(SyncPlatformEnum.Source.getNameByCode(source));
report.setStatus(CarrierExceptionReportEnum.Status.WITHDRAWN.getCode());
orderChildExceptionReportDao.updateEntityByKey(report);
}
private String saveExceptionReportInfo(OrderChildExceptionReport report,Integer source){
report.setReportNo(getReportNo());
report.setSource(source);
report.setStatus(CarrierExceptionReportEnum.Status.WAIT_DEAL.getCode());
orderChildExceptionReportDao.saveEntity(report);
saveOperationLog(report.getReportNo(),CarrierExceptionLogEnum.Type.CREATE,null,null,SyncPlatformEnum.Source.getNameByCode(source));
return report.getReportNo();
}
public String getReportNo(){
LocalDateTime begin = LocalDateTime.now();
String datetime = DateUtils.formatDateTime(begin,"yyyyMMdd").get();
String reportCacheKey = getReportCacheKey(datetime);
int randomNumber = (int) (Math.random() * 99999999) + 10000000;
boolean isFirst = false;
if (Boolean.TRUE.equals(redisTemplate.hasKey(reportCacheKey))){
List<Object> range = redisTemplate.opsForList().range(reportCacheKey, 0, -1);
if(CollectionUtils.isNotEmpty(range)){
//如果缓存中包含生成的数字,则重新获取
while (range.contains(randomNumber)){
randomNumber = (int) (Math.random() * 99999999) + 10000000;
}
redisTemplate.opsForList().leftPush(reportCacheKey,randomNumber);
}else{
isFirst = true;
}
}else{ //首次
isFirst = true;
}
if(isFirst){
redisTemplate.opsForList().leftPush(reportCacheKey,randomNumber);
LocalDateTime end = LocalDateTimeUtils.getDayEnd(begin);
long seconds = LocalDateTimeUtils.betweenSecond(begin, end);
redisTemplate.expire(reportCacheKey,seconds, TimeUnit.SECONDS);
}
return "YCSB" + datetime + randomNumber;
}
public String getReportCacheKey(String datetime){
return RedisConstants.EXCEPTION_REPORT_CACHE_KEY + datetime;
}
@Override
public void updateDealExceptionReport(DealExceptionReportParam param) {
OrderChildExceptionReport report = orderChildExceptionReportDao.getEntityByKey(param.getId()).orElseThrow(
ResultEnum.DATA_NOT_FIND);
OrderChildExceptionReportDealLog dealLog = null;
if(Objects.equals(report.getStatus(), CarrierExceptionReportEnum.Status.PROCESSED.getCode())
|| Objects.equals(report.getStatus(), CarrierExceptionReportEnum.Status.WITHDRAWN.getCode())){
throw new ServiceSystemException(ResultEnum.PARAM_ERROR,"异常数据已被处理或撤回");
}
if(Objects.equals(param.getDealWay(),ExceptionReportEnum.DealWay.APPEAL.getCode()) && StringUtils.isBlank(param.getAppealReason())){
throw new ServiceSystemException(ResultEnum.PARAM_ERROR,"申诉原因不能为空");
}
UserSessionData loginUserInfo = TokenUtil.getLoginUserInfo();
if(Objects.equals(param.getDealWay(),ExceptionReportEnum.DealWay.APPEAL.getCode())){
report.setStatus(CarrierExceptionReportEnum.Status.APPEAL_IN_PROGRESS.getCode());
dealLog = new OrderChildExceptionReportDealLog();
dealLog.setReportNo(report.getReportNo());
dealLog.setDealWay(param.getDealWay());
dealLog.setAppealReason(param.getAppealReason());
dealLog.setPictureUrl(JSON.toJSONString(param.getPictureUrl()));
dealLog.setVideoUrl(JSON.toJSONString(param.getVideoUrl()));
}else{
report.setStatus(CarrierExceptionReportEnum.Status.PROCESSED.getCode());
report.setDealTime(LocalDateTime.now());
report.setDealResult(ExceptionReportEnum.DealResult.CARRIER_BREAK_CONTRACT.getCode());
report.setDealUserCode(loginUserInfo.getUserNo());
report.setDealUser(loginUserInfo.getUserName());
}
//同步给第三方
if(Objects.equals(report.getSource(),SyncPlatformEnum.Source.TRADE_PLATFORM.getCode())){
SmbExceptionReportDealMessage message = new SmbExceptionReportDealMessage();
message.setThirdReportNo(report.getThirdReportNo());
message.setDealWay(param.getDealWay());
message.setAppealReason(param.getAppealReason());
message.setPictureUrl(param.getPictureUrl());
message.setVideoUrl(param.getVideoUrl());
String data = JSONUtil.parse(message).toString();
log.info("开始通知:{} 上报异常处理,请求参数:{}",SyncPlatformEnum.Source.TRADE_PLATFORM.getName(),data);
OpenCallBackClient openCallBackClient = thirdAppConfig.getOpenCallBackClient(report.getSource().toString());
Result<?> result = openCallBackClient.encryptPost(JSONUtil.parse(message).toString(),message.topic());
log.info("结束通知:{} 上报异常处理,请求参数:{}",SyncPlatformEnum.Source.TRADE_PLATFORM.getName(),result);
}
if(Objects.equals(report.getSource(),SyncPlatformEnum.Source.NEW_OWNER_CLIENT.getCode())){
MslExceptionReportDealMessage message = new MslExceptionReportDealMessage();
message.setThirdReportNo(report.getThirdReportNo());
message.setDealWay(param.getDealWay());
message.setAppealReason(param.getAppealReason());
message.setPictureUrl(param.getPictureUrl());
message.setVideoUrl(param.getVideoUrl());
String data = JSONUtil.parse(message).toString();
log.info("开始通知:{} 上报异常处理,请求参数:{}",SyncPlatformEnum.Source.NEW_OWNER_CLIENT.getName(),data);
OpenCallBackClient openCallBackClient = thirdAppConfig.getOpenCallBackClient(report.getSource().toString());
Result<?> result = openCallBackClient.encryptPost(data,message.topic());
log.info("结束通知:{} 上报异常处理,请求参数:{}",SyncPlatformEnum.Source.NEW_OWNER_CLIENT.getName(),result);
}
CarrierExceptionLogEnum.Type type = CarrierExceptionLogEnum.Type.AGREE;
String result = ExceptionReportEnum.DealResult.CARRIER_BREAK_CONTRACT.getName();
orderChildExceptionReportDao.updateEntityByKey(report);
if(Objects.nonNull(dealLog)){
orderChildExceptionReportDealLogDao.saveEntity(dealLog);
type = CarrierExceptionLogEnum.Type.APPEAL;
result = null;
}
saveOperationLog(report.getReportNo(),type,result,loginUserInfo.getUserNo(),loginUserInfo.getUserName());
}
@Override
public Page<OrderChildExceptionReportVO> pageExceptionReport(PageExceptionReportParam param) {
IPage<OrderChildExceptionReport> page = orderChildExceptionReportDao.pageExceptionReport(param);
return orderChildExceptionReportStruct.convertPage(page);
}
@Override
public SXSSFWorkbook exportExceptionReport(PageExceptionReportParam param) {
param.setPage(1);
param.setPageSize(1000000);
Page<OrderChildExceptionReportVO> page = pageExceptionReport(param);
List<OrderChildExceptionReportVO> list = page.getRecords();
// 组装表头
List<ExcelField> fieldList = new ArrayList<>();
fieldList.add(new ExcelField(0, "异常上报编号", "reportNo", 5000));
fieldList.add(new ExcelField(1, "三方异常上报编号", "thirdReportNo", 5000));
fieldList.add(new ExcelField(2, "来源", "sourceMsg", 5000));
fieldList.add(new ExcelField(3, "异常类别", "exceptionCategory", 5000));
fieldList.add(new ExcelField(4, "异常类型", "exceptionType", 5000));
fieldList.add(new ExcelField(5, "车牌号/手机号", "truckNoOrMobile", 5000));
fieldList.add(new ExcelField(6, "运单编号", "childNo", 5000));
fieldList.add(new ExcelField(7, "状态", "statusMsg", 5000));
fieldList.add(new ExcelField(8, "扣罚金额", "deductionAmount", 5000));
fieldList.add(new ExcelField(9, "异常上报时间", "reportTime", 5000));
fieldList.add(new ExcelField(10, "创建时间", "createTime", 5000));
fieldList.add(new ExcelField(11, "处理人", "dealUser", 5000));
fieldList.add(new ExcelField(11, "处理时间", "dealTime", 5000));
fieldList.add(new ExcelField(11, "处理结果", "dealResult", 5000));
fieldList.add(new ExcelField(11, "是否转司机违约", "transferDriverBreakContractMsg", 5000));
// 组装数据
List<List<ExcelData>> dataList = new ArrayList<>();
for (OrderChildExceptionReportVO vo : list) {
List<ExcelData> rowData = new ArrayList<>();
rowData.add(new ExcelData(vo.getReportNo(),"-"));
rowData.add(new ExcelData(vo.getThirdReportNo(),"-"));
rowData.add(new ExcelData(vo.getSourceMsg(), "-"));
rowData.add(new ExcelData(vo.getExceptionCategory(),"-"));
rowData.add(new ExcelData(vo.getExceptionType(),"-"));
rowData.add(new ExcelData(vo.getTruckNoOrMobile(),"-"));
rowData.add(new ExcelData(vo.getChildNo(),"-"));
rowData.add(new ExcelData(vo.getStatusMsg(),"-"));
rowData.add(new ExcelData(Objects.nonNull(vo.getDeductionAmount())?vo.getDeductionAmount().movePointLeft(2):null,"-"));
rowData.add(new ExcelData(vo.getReportTime(),"-"));
rowData.add(new ExcelData(vo.getCreateTime(),"-"));
rowData.add(new ExcelData(vo.getDealUser(),"-"));
rowData.add(new ExcelData(vo.getDealTime(),"-"));
rowData.add(new ExcelData(vo.getDealResultMsg(),"-"));
rowData.add(new ExcelData(vo.getTransferDriverBreakContractMsg(),"-"));
dataList.add(rowData);
}
ExcelSheet excelSheet = new ExcelSheet("异常上报处理", "异常上报处理", fieldList, dataList);
//创建excel
return ExcelUtil.create(excelSheet);
}
@Override
public OrderChildExceptionReportVO getExceptionReport(Integer id) {
OrderChildExceptionReport report = orderChildExceptionReportDao.getEntityByKey(id).orElseThrow(
ResultEnum.DATA_NOT_FIND);
OrderChildExceptionReportVO vo = orderChildExceptionReportStruct.convert(report);
vo.setVideoUrlList(JSON.parseArray(report.getVideoUrlJson(),String.class));
vo.setPictureUrlList(JSON.parseArray(report.getPictureUrlJson(),String.class));
Optional<OrderChildExceptionReportDealLog> limitOneByField = orderChildExceptionReportDealLogDao.getLimitOneByField(
OrderChildExceptionReportDealLog::getReportNo, report.getReportNo());
if(limitOneByField.isPresent()) {
OrderChildExceptionReportDealLog dealLog = limitOneByField.get();
vo.setAppealPictureUrlList(JSON.parseArray(dealLog.getVideoUrl(),String.class));
vo.setAppealVideoUrlList(JSON.parseArray(dealLog.getPictureUrl(),String.class));
}
List<OrderChildExceptionReportOperationLog> list = orderChildExceptionReportOperationLogDao.listByField(
OrderChildExceptionReportOperationLog::getReportNo, report.getReportNo());
List<OrderChildExceptionReportOperationLogVO> logs = orderChildExceptionReportOperationLogStruct.convertList(list);
vo.setOperationLogs(logs);
return vo;
}
@Override
public void transferDriverBreakContract(TransferDriverBreakContractParam param) {
OrderChildExceptionReport report = orderChildExceptionReportDao.getEntityByKey(param.getId()).orElseThrow(
ResultEnum.DATA_NOT_FIND);
if(Objects.equals(report.getStatus(),CarrierExceptionReportEnum.Status.PROCESSED.getCode())
&& Objects.equals(report.getDealResult(),ExceptionReportEnum.DealResult.CARRIER_BREAK_CONTRACT.getCode())){
throw new ServiceSystemException(ResultEnum.DATA_ERROR);
}
//创建司机违约记录
saveDriverBreakContractRecord(report);
UserSessionData loginUserInfo = TokenUtil.getLoginUserInfo();
report.setTransferDriverBreakContract(1);
report.setBreakContractReason(param.getReason());
orderChildExceptionReportDao.updateEntityByKey(report);
saveOperationLog(report.getReportNo(),CarrierExceptionLogEnum.Type.TRANSFER_DRIVER_BREAK_CONTRACT,null,loginUserInfo.getUserNo(),
loginUserInfo.getUserName());
}
public void saveOperationLog(String reportNo, CarrierExceptionLogEnum.Type type,String result,Long createBy,String createName){
OrderChildExceptionReportOperationLog operationLog = new OrderChildExceptionReportOperationLog();
operationLog.setReportNo(reportNo);
operationLog.setType(type.getCode());
operationLog.setResult(result);
operationLog.setCreateBy(createBy);
operationLog.setCreateName(createName);
orderChildExceptionReportOperationLogDao.saveEntity(operationLog);
}
public void saveDriverBreakContractRecord(OrderChildExceptionReport report){
UserSessionData loginUserInfo = TokenUtil.getLoginUserInfo();
Long userNo = loginUserInfo.getUserNo();
LocalDateTime time = LocalDateTime.now();
String breakNo = breakContractDriverRecordService.breakNoGenerate();
OrderChild orderChild = orderChildDao.getByChildNo(report.getChildNo()).orElseThrow(PerformanceResultEnum.ORDER_CHILD_NO_FOUND);
BreakContractDriverRecord record = new BreakContractDriverRecord();
record.setBreakNo(breakNo);
record.setTriggerType(BreakContractRecordEnum.TriggerType.EXCEPTION_REPORT.getCode());
record.setBreakContractPartyType(BreakContractRecordEnum.BreakContractPartyType.DRIVER.getCode());
record.setChildNo(orderChild.getChildNo());
record.setTruckNo(orderChild.getTruckNo());
record.setTruckOwnName(orderChild.getTruckOwnName());
record.setTruckOwnUserNo(orderChild.getTruckOwnUserNo());
record.setDriverUserNo(orderChild.getDriverUserNo());
record.setDriverName(orderChild.getDriverName());
record.setFigure(report.getDeductionAmount());
record.setExceptionCategory(record.getExceptionCategory());
record.setExceptionType(record.getExceptionType());
record.setExceptionReportNo(report.getReportNo());
record.setPictureUrl(record.getPictureUrl());
record.setVideoUrl(record.getVideoUrl());
record.setRemark(report.getBreakContractReason());
record.setCreateBy(userNo);
record.setCreateName(loginUserInfo.getUserName());
record.setCreateTime(time);
breakContractDriverRecordDao.saveEntity(record);
}
}
......@@ -209,6 +209,7 @@ public class OrderGoodsServiceImpl implements OrderGoodsService, InitializingBea
orderGoodsVO.setReceiveWaitSystem(orderInfoFeign.getReveiveWaitSystem());
orderGoodsVO.setReceiveWaitSystemName(orderInfoFeign.getReveiveWaitSystemName());
orderGoodsVO.setReceiveWaitMode(orderInfoFeign.getReveiveWaitMode());
orderGoodsVO.setOrderSource(orderInfoFeign.getOrderSource());
return orderGoodsVO;
}
......
......@@ -128,7 +128,8 @@ public class BreakContractDriverRecordServiceImpl implements BreakContractDrive
}
private String breakNoGenerate() {
@Override
public String breakNoGenerate() {
return "WYD"+uniqueOrderNumService.getUniqueOrderNum(
LocalDateTimeUtils.convertLocalDateTimeToString(LocalDateTime.now(), LocalDateTimeUtils.DATE_DAY));
}
......@@ -321,4 +322,21 @@ public class BreakContractDriverRecordServiceImpl implements BreakContractDrive
}
return 0;
}
@Override
public Integer getShowBreakContractRed() {
UserSessionData loginUserInfo = TokenUtil.getLoginUserInfo();
Long count = breakContractDriverRecordDao.getShowBreakContractRed(loginUserInfo.getUserNo());
if(count > 0 ){
return 1;
}
return 0;
}
@Override
public void updateBreakContractRead() {
UserSessionData loginUserInfo = TokenUtil.getLoginUserInfo();
breakContractDriverRecordDao.updateBreakContractRead(loginUserInfo.getUserNo());
}
}
......@@ -20,8 +20,8 @@ public class BreakContractDriverRecordSqlProvider {
" child_no, truck_no, truck_own_user_no, truck_own_name, " +
" driver_user_no, driver_name, figure, time_limit, " +
" date_format(limit_time, '%Y-%m-%d %H:%i:%s') as limitTime, " +
" settlement_no, " +
" remark, " +
" settlement_no,exception_report_no,exception_category,exception_type," +
" remark,picture_url,video_url, " +
" create_by, create_name, " +
" date_format(create_time, '%Y-%m-%d %H:%i:%s') as createTime, " +
" date_format(modified_time, '%Y-%m-%d %H:%i:%s') as modifiedTime "
......@@ -47,8 +47,8 @@ public class BreakContractDriverRecordSqlProvider {
" child_no, truck_no, truck_own_user_no, truck_own_name, " +
" driver_user_no, driver_name, figure, time_limit, " +
" date_format(limit_time, '%Y-%m-%d %H:%i:%s') as limitTime, " +
" settlement_no, " +
" remark, " +
" settlement_no,exception_report_no,exception_category,exception_type," +
" remark,picture_url,video_url, " +
" create_by, create_name, " +
" date_format(create_time, '%Y-%m-%d %H:%i:%s') as createTime, " +
" date_format(modified_time, '%Y-%m-%d %H:%i:%s') as modifiedTime "
......
package com.clx.performance.struct;
import com.clx.performance.model.OrderChildExceptionReportOperationLog;
import com.clx.performance.vo.pc.OrderChildExceptionReportOperationLogVO;
import com.msl.common.utils.DateStructUtil;
import com.msl.common.utils.DateUtils;
import org.mapstruct.Mapper;
import java.util.List;
@Mapper(componentModel = "spring", uses = DateStructUtil.class, imports = {DateUtils.class})
public interface OrderChildExceptionReportOperationLogStruct {
List<OrderChildExceptionReportOperationLogVO> convertList(List<OrderChildExceptionReportOperationLog> list);
}
package com.clx.performance.struct;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.open.sdk.request.action.MslSyncExceptionReportInfoAction;
import com.clx.open.sdk.request.action.SmbSyncExceptionReportInfoAction;
import com.clx.performance.model.OrderChildExceptionReport;
import com.clx.performance.vo.pc.OrderChildExceptionReportVO;
import com.msl.common.utils.DateStructUtil;
import com.msl.common.utils.DateUtils;
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring", uses = DateStructUtil.class, imports = {DateUtils.class})
public interface OrderChildExceptionReportStruct {
OrderChildExceptionReport convertInfoSmbAction(SmbSyncExceptionReportInfoAction action);
OrderChildExceptionReport convertInfoMslAction(MslSyncExceptionReportInfoAction action);
Page<OrderChildExceptionReportVO> convertPage(IPage<OrderChildExceptionReport> page);
OrderChildExceptionReportVO convert(OrderChildExceptionReport report);
}
......@@ -14,6 +14,7 @@ public enum BreakContractRecordEnum {
public enum TriggerType {
SYSTEM(1, "系统触发"),
MANUAL(2, "手动触发"),
EXCEPTION_REPORT(3, "异常上报"),
;
private final Integer code;
......@@ -22,6 +23,10 @@ public enum BreakContractRecordEnum {
public static Optional<TriggerType> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(BreakContractRecordEnum.TriggerType::getMsg).orElse(null);
}
}
@Getter
@AllArgsConstructor
......@@ -37,6 +42,26 @@ public enum BreakContractRecordEnum {
public static Optional<BreakContractPartyType> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(BreakContractRecordEnum.BreakContractPartyType::getMsg).orElse(null);
}
}
@Getter
@AllArgsConstructor
public enum ReadFlag {
NO(0, "未读"),
YES(1, "已读"),
;
private final Integer code;
private final String msg;
public static Optional<ReadFlag> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
}
}
package com.clx.performance.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Optional;
public enum CarrierExceptionLogEnum {
;
@Getter
@AllArgsConstructor
public enum Type {
CREATE(1, "创建违约单"),
TIMEOUT(2, "超时货主处理"),
APPEAL(3, "申诉"),
APPEAL_DEAL(4, "申诉处理"),
AGREE(5, "同意扣罚"),
TRANSFER_DRIVER_BREAK_CONTRACT(6, "转司机违约"),
;
private final Integer code;
private final String name;
public static Optional<Type> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
public static String getMsgByCode(Integer code) {
if (code == null) {return null;}
return getByCode(code).map(Type::getName).orElse(null);
}
}
}
package com.clx.performance.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Optional;
public enum CarrierExceptionReportEnum {
;
@Getter
@AllArgsConstructor
public enum Status {
//:1:待处理 2:申诉中 3:已处理 4:已撤回
WAIT_DEAL(1, "待处理"),
APPEAL_IN_PROGRESS(2, "申诉中"),
PROCESSED(3, "已处理"),
WITHDRAWN(4, "已撤回"),
;
private final Integer code;
private final String name;
public static Optional<Status> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
public static String getMsgByCode(Integer code) {
if (code == null) {return null;}
return getByCode(code).map(Status::getName).orElse(null);
}
}
}
......@@ -4,6 +4,7 @@ import com.clx.open.sdk.request.action.GetOrderBreakContractOwnerRuleFileAction;
import com.clx.open.sdk.request.action.QueryPerformanceProgressAction;
import com.clx.open.sdk.request.action.QueryPerformanceProgressLogAction;
import com.clx.open.sdk.request.dto.OrderCanExtractWeightDTO;
import com.clx.open.sdk.request.action.*;
import com.clx.open.sdk.request.dto.BatchOrderStatisticsDTO;
import com.clx.open.sdk.request.dto.BatchOrderStatisticsInfoDTO;
import com.clx.open.sdk.request.dto.OrderCanExtractWeightDTO;
......@@ -14,13 +15,14 @@ import com.clx.performance.vo.pc.PerformanceProgressOperationLogVO;
import com.clx.performance.vo.pc.PerformanceProgressVO;
import com.clx.performance.vo.pc.breakcontract.carrier.BreakContractOwnerRuleFileVO;
import com.msl.common.result.Result;
import jakarta.validation.constraints.NotEmpty;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import jakarta.validation.constraints.NotEmpty;
import java.math.BigDecimal;
import java.util.List;
......@@ -76,4 +78,34 @@ public interface PerformanceSDKFeign {
@GetMapping("clx-performance/feign/sdk/queryOrderStatistics")
Result<BatchOrderStatisticsDTO> queryOrderStatistics(@RequestParam("orderNoList")
@NotEmpty(message = "订单编号集合不能为空") List<String> orderNoList);
@PostMapping("clx-performance/feign/sdk/smbSyncExceptionReportInfo")
Result<String> smbSyncExceptionReportInfo(@RequestBody @Validated SmbSyncExceptionReportInfoAction action);
@PostMapping("clx-performance/feign/sdk/smbSyncExceptionReportResult")
Result<Object> smbSyncExceptionReportResult(@RequestBody @Validated SmbSyncExceptionReportResultAction action);
@PostMapping("clx-performance/feign/sdk/smbWithdrawExceptionReport")
Result<Object> smbWithdrawExceptionReport(@RequestBody @Validated SmbWithdrawExceptionReportAction action);
@PostMapping("clx-performance/feign/sdk/mslSyncExceptionReportInfo")
Result<String> mslSyncExceptionReportInfo(@RequestBody @Validated MslSyncExceptionReportInfoAction action);
@PostMapping("clx-performance/feign/sdk/mslSyncExceptionReportResult")
Result<Object> mslSyncExceptionReportResult(@RequestBody @Validated MslSyncExceptionReportResultAction action);
@PostMapping("clx-performance/feign/sdk/mslWithdrawExceptionReport")
Result<Object> mslWithdrawExceptionReport(@RequestBody @Validated MslWithdrawExceptionReportAction action);
}
package com.clx.performance.param.pc;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* @ClassName DealExceptionReportParam
* @Description
* @Author kavin
* @Date 2024/10/22 20:07
* @Version 1.0
*/
@Getter
@Setter
public class DealExceptionReportParam {
@NotNull(message = "异常上报ID不能为空")
@Schema(description="异常上报ID")
private Integer id;
@NotNull(message = "处理方式不能为空")
@Schema(description="处理方式 1:同意扣罚 2:申诉" ,example = "枚举 ExceptionReportEnum.DealWay ")
private Integer dealWay;
@Schema(description="申诉原因")
private String appealReason;
@Schema(description="图片")
private List<String> pictureUrl;
@Schema(description="视频")
private List<String> videoUrl;
}
package com.clx.performance.param.pc;
import com.msl.common.base.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
/**
* @ClassName PageExceptionReportParam
* @Description
* @Author kavin
* @Date 2024/10/23 13:31
* @Version 1.0
*/
@Getter
@Setter
public class PageExceptionReportParam extends PageParam {
@Schema(description="三方异常上报编号")
private String thirdReportNo;
@Schema(description="来源 1:数煤宝 3:供应链")
private Integer source;
@Schema(description="运单编号")
private String childNo;
@Schema(description="车牌号/手机号")
private String truckNoOrMobile;
@Schema(description="状态:1:待处理 2:申诉中 3:已处理 4:已撤回")
private Integer status;
@Schema(description="开始时间")
private String beginTime;
@Schema(description="结束时间")
private String endTime;
}
package com.clx.performance.param.pc;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
/**
* @ClassName TransferDriverBreakContractParam
* @Description
* @Author kavin
* @Date 2024/10/23 14:39
* @Version 1.0
*/
@Getter
@Setter
public class TransferDriverBreakContractParam {
@NotNull(message = "异常记录ID不能为空")
@Schema(description = "异常记录ID")
private Integer id;
@NotBlank(message = "违约原因不能为空")
@Schema(description = "违约原因")
private String reason;
}
package com.clx.performance.vo.app.breakcontract;
import com.alibaba.fastjson.JSON;
import com.clx.performance.enums.BreakContractRecordEnum;
import com.msl.common.convertor.type.MoneyOutConvert;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
......@@ -8,6 +10,8 @@ import lombok.Setter;
import lombok.ToString;
import java.math.BigDecimal;
import java.util.List;
import java.util.Objects;
/**
* @author liruixin
......@@ -23,9 +27,14 @@ public class DriverBreakContractDriverRecordVO {
@Schema(description="id")
private Integer id;
@Schema(description="触发类型:1系统触发 2手动触发")
@Schema(description="触发类型:1系统触发 2手动触发 3.异常上报")
private Integer triggerType;
public String getTriggerTypeMsg(){
return BreakContractRecordEnum.TriggerType.getMsgByCode(triggerType);
}
@Schema(description="违约方类型:1平台 2货主 3司机")
private Integer breakContractPartyType;
......@@ -60,9 +69,52 @@ public class DriverBreakContractDriverRecordVO {
@Schema(description="结算单编号")
private String settlementNo;
@Schema(description="备注")
@Schema(description="违约原因")
private String remark;
@Schema(description="异常上报单号")
private String exceptionReportNo;
@Schema(description="异常类别")
private String exceptionCategory;
@Schema(description="异常类型")
private String exceptionType;
@Schema(description="图片字地址符串")
private String pictureUrl;
@Schema(description="视频地址字符串")
private String videoUrl;
@Schema(description="图片")
private List<String> pictureUrlList;
public List<String> getPictureUrlList(){
if(Objects.nonNull(pictureUrl)){
return JSON.parseArray(pictureUrl,String.class);
}
return null;
}
@Schema(description="视频")
private List<String> videoUrlList;
public List<String> getVideoUrlList(){
if(Objects.nonNull(videoUrl)){
return JSON.parseArray(videoUrl,String.class);
}
return null;
}
@Schema(description = "操作人名称", example = "")
private String createName;
@Schema(description="创建时间")
private String createTime;
......
package com.clx.performance.vo.pc;
import com.clx.performance.enums.CarrierExceptionLogEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class OrderChildExceptionReportOperationLogVO {
@Schema(description = "id")
private Integer id; //id
@Schema(description = "异常上报编号")
private String reportNo; //运单编号
@Schema(description = "操作事项编码")
private Integer type;
@Schema(description = "操作事项")
private String typeMsg;
@Schema(description = "操作事项")
private String getTypeMsg(){
return CarrierExceptionLogEnum.Type.getMsgByCode(type);
}
//操作事项编码
@Schema(description = "处理结果")
private String result; //处理结果
@Schema(description = "操作人名称")
private String createName; //操作人名称
@Schema(description = "创建时间")
private String createTime; //创建时间
}
\ No newline at end of file
package com.clx.performance.vo.pc;
import com.clx.open.sdk.enums.ExceptionReportEnum;
import com.clx.performance.enums.CarrierExceptionReportEnum;
import com.clx.performance.enums.SyncPlatformEnum;
import com.msl.common.convertor.type.MoneyOutConvert;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.util.List;
import java.util.Objects;
/**
* @author kavin
* Date 2024-10-22
* Time 10:38
*/
@Getter
@Setter
public class OrderChildExceptionReportVO {
private Integer id;
@Schema(description="异常上报编号")
private String reportNo;
@Schema(description="三方异常上报编号")
private String thirdReportNo;
@Schema(description="来源")
private Integer source;
@Schema(description="来源描述")
private String sourceMsg;
public String getSourceMsg(){
return SyncPlatformEnum.Source.getNameByCode(source);
}
@Schema(description="异常类别")
private String exceptionCategory;
@Schema(description="异常类型")
private String exceptionType;
@Schema(description="车牌号/手机号")
private String truckNoOrMobile;
@Schema(description="运单编号")
private String childNo;
@Schema(description="状态:1:待处理 2:申诉中 3:已处理 4:已撤回")
private Integer status;
@Schema(description="状态:1:待处理 2:申诉中 3:已处理 4:已撤回")
private String statusMsg;
public String getStatusMsg(){
return CarrierExceptionReportEnum.Status.getMsgByCode(status);
}
@Schema(description="扣罚金额")
@MoneyOutConvert
private BigDecimal deductionAmount;
@Schema(description="异常上报时间")
private String reportTime;
@Schema(description="异常描述")
private String reason;
@Schema(description="处理人用户编码")
private Long dealUserCode;
@Schema(description="处理人用户姓名")
private String dealUser;
@Schema(description="处理时间")
private String dealTime;
@Schema(description="处理结果 1:承运违约 2:承运不违约 ")
private Integer dealResult;
@Schema(description="处理结果 1:承运违约 2:承运不违约")
private String dealResultMsg;
@Schema(description="处理结果")
public String getDealResultMsg(){
return ExceptionReportEnum.DealResult.getNameByCode(dealResult);
}
@Schema(description="是否转司机违约 1:是")
private Integer transferDriverBreakContract;
@Schema(description="是否转司机违约 1:是")
private String transferDriverBreakContractMsg;
public String transferDriverBreakContractMsg(){
if(Objects.nonNull(transferDriverBreakContract)){
return "是";
}else{
return "-";
}
}
@Schema(description="创建时间")
private String createTime;
@Schema(description="异常记录图片")
private List<String> pictureUrlList;
@Schema(description="异常记录视频")
private List<String> videoUrlList;
@Schema(description="申诉时间")
private String appealTime;
@Schema(description="申诉人")
private String createName;
@Schema(description="申诉原因")
private String appealReason;
@Schema(description="申诉图片")
private List<String> appealPictureUrlList;
@Schema(description="申诉视频")
private List<String> appealVideoUrlList;
@Schema(description="操作日志列表")
private List<OrderChildExceptionReportOperationLogVO> operationLogs;
}
package com.clx.performance.vo.pc.breakcontract.carrier;
import com.alibaba.fastjson.JSON;
import com.msl.common.convertor.type.MoneyOutConvert;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
......@@ -8,6 +9,8 @@ import lombok.Setter;
import lombok.ToString;
import java.math.BigDecimal;
import java.util.List;
import java.util.Objects;
/**
* @author liruixin
......@@ -23,7 +26,7 @@ public class BreakContractDriverRecordVO {
@Schema(description="id")
private Integer id;
@Schema(description="触发类型:1系统触发 2手动触发")
@Schema(description="触发类型:1系统触发 2手动触发 3.异常上报")
private Integer triggerType;
@Schema(description="违约方类型:1平台 2货主 3司机")
......@@ -60,9 +63,52 @@ public class BreakContractDriverRecordVO {
@Schema(description="结算单编号")
private String settlementNo;
@Schema(description="备注")
@Schema(description="违约原因")
private String remark;
@Schema(description="异常上报单号")
private String exceptionReportNo;
@Schema(description="异常类别")
private String exceptionCategory;
@Schema(description="异常类型")
private String exceptionType;
@Schema(description="图片字地址符串")
private String pictureUrl;
@Schema(description="视频地址字符串")
private String videoUrl;
@Schema(description="图片")
private List<String> pictureUrlList;
public List<String> getPictureUrlList(){
if(Objects.nonNull(pictureUrl)){
return JSON.parseArray(pictureUrl,String.class);
}
return null;
}
@Schema(description="视频")
private List<String> videoUrlList;
public List<String> getVideoUrlList(){
if(Objects.nonNull(videoUrl)){
return JSON.parseArray(videoUrl,String.class);
}
return null;
}
@Schema(description = "操作人名称", example = "")
private String createName;
@Schema(description="创建时间")
private String createTime;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论