提交 605706a4 authored 作者: jiangwujie's avatar jiangwujie

merge into release

###
GET http://localhost:8081/clx-performance/app/goodsOrder/getOrderGoodsInfo?orderGoodsNo=GK2024073100004
###
GET http://localhost:8081/clx-performance/app/driver/orderChild/getOrderChildInfo?childNo=CYD2024073113994137
productchannel:android_app
imei:22965e13c2e1233cdbc682a56484e2b5e
product-code:carrier-driver-app
content-type:application/json;charset=UTF-8
versioncode:9
platform:1
token:da38733eb052496fb7b4991bf643c626
producttype:carrier-driver-app
versionname:1.0.8
\ No newline at end of file
......@@ -6,7 +6,7 @@
<groupId>com.clx.cy</groupId>
<artifactId>performance-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>${clx-performance-api.version}</version>
<name>performance-api</name>
<parent>
......
package com.clx.performance.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
public enum AppEnum {
;
@Getter
@AllArgsConstructor
public enum UniqueIdentifier {
SMART_WEIGHT(1, "场站-smart-weight"),
PURCHASE_MANAGE(2, "供应链-purchase-manage"),
;
private final Integer code;
private final String name;
public static Optional<UniqueIdentifier> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(UniqueIdentifier::getName).orElse(null);
}
}
}
package com.clx.performance.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;
@Getter
@AllArgsConstructor
public enum EnabledStatusEnum {
ENABLE(1, "启用"),
DISABLE(0, "禁用"),
;
private final Integer code;
private final String msg;
public static Optional<EnabledStatusEnum> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> Objects.equals(e.code, code)).findFirst();
}
public static String getMsgByCode(Integer code) {
return getByCode(code).map(EnabledStatusEnum::getMsg).orElse(null);
}
}
\ No newline at end of file
......@@ -185,4 +185,113 @@ public enum OrderChildEnum {
}
}
@Getter
@AllArgsConstructor
public enum OperateRecordType {
CANCEL_ORDER(1, "取消订单"),
REMOVE_LIMIT(2, "解除装车限制"),
;
private final int code;
private final String msg;
public static Optional<OperateRecordType> getByCode(int code) {
return Arrays.stream(values()).filter(e -> e.code == code).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(OperateRecordType::getMsg).orElse(null);
}
}
/**
* 驶入驶离货源地状态
*/
@Getter
@AllArgsConstructor
public enum EnterExitSendStatus {
INIT(0, "到达货源地"),
DRIVE_IN(1, "驶入"),
DRIVE_OUT(2, "驶离");
private final Integer code;
private final String name;
public static Optional<EnterExitSendStatus> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(EnterExitSendStatus::getName).orElse(null);
}
}
/**
* 驶离通知状态
*/
@Getter
@AllArgsConstructor
public enum ExitNoticeStatus {
NOT_NOTIFIED(0, "未通知"),
NOTIFIED(1, "已通知");
private final Integer code;
private final String name;
public static Optional<ExitNoticeStatus> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(ExitNoticeStatus::getName).orElse(null);
}
}
/**
* 驶入驶离货源地状态
*/
@Getter
@AllArgsConstructor
public enum RemoveLoadLimitStatus {
NOT_REMOVED(0, "未解除"),
REMOVED(1, "已解除"),
;
private final Integer code;
private final String name;
public static Optional<RemoveLoadLimitStatus> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(RemoveLoadLimitStatus::getName).orElse(null);
}
}
@Getter
@AllArgsConstructor
public enum NeedAlertEnum {
OK(0, "不用弹窗"),
FAIL(1, "需要弹");
private final int code;
private final String msg;
}
@Getter
@AllArgsConstructor
public enum SuperviseTypeEnum {
SUPERVISE_LOAD(1, "监装"),
SUPERVISE_UNLOAD(2, "监卸");
private final int code;
private final String msg;
}
}
......@@ -4,6 +4,9 @@ import com.msl.common.enums.ResultEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Optional;
@Getter
@AllArgsConstructor
......@@ -183,7 +186,28 @@ public enum PerformanceResultEnum implements ResultEnum {
UNLOAD_TIME_BEFORE_ARRIVE_RECEIVE_TIME(2106, "交货时间不可早于到达目的地时间"),
UNLOAD_TIME_AFTER_NOW(2107, "交货时间不可晚于当前时间"),
UNLOAD_TIME_AFTER_FIRST_UNLOAD_TIME(2108, "交货时间不可晚于首次提交时间"),
/**
* 运单装车限制配置
*/
ORDER_CHILD_LOAD_LIMIT_CONFIG_ERROR(2201, "运单装车限制配置错误"),
TRUCK_LOCATION_OUT_OF_SEND_RANGE(2202, "请在货源地%.2f公里范围内上传装车信息"),
ORDER_CHILD_LOAD_LIMIT_CONFIG_DISABLED(2203, "运单装车限制配置禁用"),
GAODE_DISTANCE_ERROR(2204, "调用高德获取货源地距离失败"),
TRUCK_LOCATION_ERROR(2205, "获取卡车位置失败"),
;
private final int code;
private final String msg;
public static Optional<PerformanceResultEnum> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code == (code)).findFirst();
}
public static String getMsgByCode(Integer code) {
return getByCode(code).map(PerformanceResultEnum::getMsg).orElse(null);
}
public static PerformanceResultEnum getEnumByCode(Integer code) {
return getByCode(code).orElse(null);
}
}
package com.clx.performance.param.app;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
/**
* 装车范围校验检查参数
*/
@Getter
@Setter
@NoArgsConstructor
public class NeedAlertSuperviseInfoParam {
@ApiModelProperty(value = "运单编号", example = "100000000")
@NotBlank(message = "运单编号不能为空")
private String childNo;
@ApiModelProperty(value = "类型 1-监装 2-监卸", example = "1")
private Integer type;
}
package com.clx.performance.param.app;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
/**
* 装车范围校验检查参数
*/
@Getter
@Setter
@NoArgsConstructor
public class OrderChildLoadRangeCheckParam {
@ApiModelProperty(value = "运单编号", example = "100000000")
@NotBlank(message = "运单编号不能为空")
private String childNo;
@ApiModelProperty("纬度")
private BigDecimal latitude;
@ApiModelProperty("经度")
private BigDecimal longitude;
}
package com.clx.performance.param.pc;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
public class ArtificialCancelOrderQueryParam {
@ApiModelProperty("运单编号")
private String orderChildNo;
@ApiModelProperty("车牌号")
private String truckNo;
public void checkParam() {
if (orderChildNo == null && truckNo == null) {
throw new IllegalArgumentException("运单编号和车牌号不能同时为空");
}
}
}
package com.clx.performance.param.pc;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
/**
* @author jiangwujie
*/
@Getter
@Setter
public class SaveDriverNoticeConfigParam {
@ApiModelProperty(value = "id")
private Integer id;
@ApiModelProperty("配置名称")
private String name;
@ApiModelProperty(value = "通知触发距离:默认1.5,最大9999.9")
private BigDecimal noticeTriggerDistance;
@ApiModelProperty(value = "启用状态 ,0:禁用,1:启用")
private Integer status;
}
\ No newline at end of file
package com.clx.performance.param.pc;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
/**
* @author jiangwujie
*/
@Getter
@Setter
public class SaveOrderChildOperateLimitConfigParam {
@ApiModelProperty(value = "id")
private Integer id;
@ApiModelProperty("配置名称")
private String name;
@ApiModelProperty("可上传装车信息范围")
private BigDecimal allowUploadDistance;
}
package com.clx.performance.vo.app;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
* 是否需要监装结果VO
*/
@Getter
@Setter
@NoArgsConstructor
public class NeedAlertSuperviseInfoResultVO {
@ApiModelProperty(value = "是否需要弹信息 0 不需要 1 需要", example = "0")
private Integer needAlert;
@ApiModelProperty(value = "监装人", example = "张三")
private String supervisor;
@ApiModelProperty(value = "联系方式", example = "12345678901")
private String mobile;
@ApiModelProperty(value = "监装位置", example = "北业亿林洗煤厂")
private String location;
}
\ No newline at end of file
package com.clx.performance.vo.app;
import com.clx.performance.enums.OrderChildEnum;
import com.clx.performance.enums.PerformanceResultEnum;
import com.msl.common.result.Result;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.Objects;
import static com.clx.performance.enums.PerformanceResultEnum.ORDER_CHILD_LOAD_LIMIT_CONFIG_DISABLED;
/**
* 是否需要监装结果VO
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class OrderChildLoadRangeCheckResultVO {
@ApiModelProperty(value = "是否需要弹信息 0 不需要 1 需要", example = "0")
private Integer needAlert;
@ApiModelProperty(value = "错误码", example = "-1")
private Integer code;
@ApiModelProperty(value = "错误信息", example = "错误")
private String msg;
public Result<OrderChildLoadRangeCheckResultVO> toResult() {
if (Objects.equals(code, OrderChildEnum.NeedAlertEnum.OK.getCode())
//配置禁用也不弹窗
|| (Objects.equals(code, ORDER_CHILD_LOAD_LIMIT_CONFIG_DISABLED.getCode()))
) {
return Result.ok();
} else {
Result<OrderChildLoadRangeCheckResultVO> result = Result.fail(PerformanceResultEnum.getEnumByCode(code));
result.setData(this);
result.setMsg(msg);
return result;
}
}
}
\ No newline at end of file
package com.clx.performance.vo.app;
import cn.hutool.json.JSONUtil;
import com.clx.performance.enums.OrderChildEnum;
import com.clx.performance.enums.OrderGoodsEnum;
import com.msl.common.convertor.type.MoneyOutConvert;
......@@ -9,10 +10,12 @@ import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
/**
......@@ -258,4 +261,31 @@ public class OrderChildVO {
return OrderGoodsEnum.SendWaitModeEnum.getMsgByCode(sendWaitMode);
}
@ApiModelProperty(value = "发货采样位置")
private String sendQualityPosition;
@ApiModelProperty(value = "发货地采样视频")
private String sendSamplingVideo;
@ApiModelProperty(value = "发货地采样照片")
private String sendSamplingPic;
@ApiModelProperty(value = "监装联系人")
private String superviseContacts;
@ApiModelProperty(value = "监装联系人电话")
private String superviseMobile;
@ApiModelProperty(value = "发货地采样照片")
public List<String> getSendSamplingPicList() {
if (StringUtils.isNotBlank(sendSamplingPic)) {
return JSONUtil.toList(sendSamplingPic, String.class);
}
return new ArrayList<>();
}
@ApiModelProperty(value = "发货地采样视频")
public List<String> getSendSamplingVideoList() {
if (StringUtils.isNotBlank(sendSamplingVideo)) {
return JSONUtil.toList(sendSamplingVideo, String.class);
}
return new ArrayList<>();
}
}
package com.clx.performance.vo.pc;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.math.BigDecimal;
/**
* 司机通知配置
* @author jiangwujie
*/
@Getter
@Setter
@ToString
public class DriverNoticeConfigVO {
@ApiModelProperty(value = "id")
private Integer id;
@ApiModelProperty("配置名称")
private String name;
@ApiModelProperty(value = "通知触发距离:默认1.5,最大9999.9")
private BigDecimal noticeTriggerDistance;
@ApiModelProperty(value = "启用状态:0禁用 1启用")
private Integer status;
public Integer getNoticeTriggerDistanceMeter() {
return noticeTriggerDistance != null ? noticeTriggerDistance.multiply(new BigDecimal(1000)).intValue() : 0;
}
}
package com.clx.performance.vo.pc;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.math.BigDecimal;
/**
* @author yangqifa
*/
@Getter
@Setter
@ToString
public class OrderChildOperateLimitConfigVO {
@ApiModelProperty(value = "id")
private Integer id;
@ApiModelProperty("配置名称")
private String name;
@ApiModelProperty("可上传装车信息范围:默认2.0,最大9999.9")
private BigDecimal allowUploadDistance;
@ApiModelProperty(value = "启用状态 0 禁用 1 启用")
private Integer status;
public Integer allowUploadDistanceMeter() {
return allowUploadDistance.multiply(new BigDecimal(1000)).intValue();
}
}
package com.clx.performance.vo.pc;
import com.clx.performance.enums.OrderChildEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@NoArgsConstructor
public class OrderChildOperateRecordVO {
@ApiModelProperty(value = "运单编号", example = "100000000")
private String childNo;
@ApiModelProperty(value = "操作类型 1 取消运单 2 解除装车限制", example = "1")
private Integer type;
@ApiModelProperty(value = "主车牌照", example = "京A12345")
private String truckNo;
@ApiModelProperty(value = "司机名称", example = "张三")
private String driverName;
@ApiModelProperty(value = "联系方式", example = "130000000")
private String driverMobile;
@ApiModelProperty(value = "货源地", example = "朝阳")
private String sendAddress;
@ApiModelProperty(value = "目的地", example = "西城")
private String receiveAddress;
@ApiModelProperty(value = "货物类型名称", example = "面煤")
public String goodTypeName;
@ApiModelProperty(value = "备注", example = "备注xxxx")
public String remark;
@ApiModelProperty(value = "操作时间", example = "2020-01-01 10:10:10")
public String operateTime;
@ApiModelProperty(value = "操作人", example = "张三")
public String operator;
@ApiModelProperty(value = "操作类型 取消运单 解除装车限制", example = "取消运单")
public String getTypeMsg() {
return OrderChildEnum.OperateRecordType.getMsgByCode(type);
}
}
\ No newline at end of file
......@@ -93,6 +93,16 @@
<artifactId>server-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.msl</groupId>
<artifactId>open-starter</artifactId>
</dependency>
<dependency>
<groupId>com.clx.cy</groupId>
<artifactId>purchase-manage-sdk</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.msl</groupId>-->
<!-- <artifactId>cache-spring-boot-starter</artifactId>-->
......
......@@ -35,5 +35,13 @@ public class ClxMessageConfig {
private Integer vehicleWarnChannelId;
//线路报警短信模板
private String lineWarnTemplateCode;
/**
* 上传装货信息短信模板
*/
private String uploadLoadInfoTemplateCode;
/**
* 提示监装信息短信模板
*/
private String noticeSupervisionTemplateCode;
}
package com.clx.performance.config;
import com.clx.performance.dao.AppDao;
import com.clx.performance.enums.AppEnum;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.model.App;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Author liruixin
* @create 2024-01-10 13:19
*/
@Component
public class LoadAppConfig {
private App purchaseManageApp;
@Autowired
private AppDao appDao;
public App getPurchaseManageApp() {
if (purchaseManageApp == null) {
purchaseManageApp = appDao.getOneByField(App::getUniqueIdentifier, AppEnum.UniqueIdentifier.PURCHASE_MANAGE.getCode()).orElseThrow(
PerformanceResultEnum.DATA_NOT_FIND);;
}
return purchaseManageApp;
}
}
......@@ -42,4 +42,13 @@ public class RedisConstants {
*/
public static final String LINE_WARN_WEATHER = "clx-performance:lineWarn:weather:";
/**
* 电子围栏短信通知 未装车
*/
public static final String NOTICE_MESSAGE_LIMIT_UNLOAD = "clx-performance:notice_message_limit_unload:";
/**
* 电子围栏短信通知 未监装
*/
public static final String NOTICE_MESSAGE_LIMIT_UNSUPERVISED = "clx-performance:notice_message_limit_unsupervised:";
}
......@@ -195,4 +195,20 @@ public class AppDriverOrderChildController {
return Result.ok(orderChildService.ocrRecognition(param));
}
@ApiOperation(value = "司机端装货范围检查拦截", notes = "<br>By:姜武杰")
@PostMapping("/loadRangeCheck")
public Result<OrderChildLoadRangeCheckResultVO> loadRangeCheck(@RequestBody @Validated OrderChildLoadRangeCheckParam param) {
return orderChildService.loadRangeCheck(param).toResult();
}
@ApiOperation(value = "是否需要弹出监装信息", notes = "<br>By:姜武杰")
@PostMapping("/needAlertSuperviseInfo")
public Result<NeedAlertSuperviseInfoResultVO> needAlertSuperviseInfo(@RequestBody @Validated NeedAlertSuperviseInfoParam param) {
// todo :jiangwujie 临时设置type 前端给type后删除
if (param.getType() == null) {
param.setType(1);
}
return Result.ok(orderChildService.needAlertSuperviseInfo(param));
}
}
package com.clx.performance.controller.pc;
import com.clx.performance.param.pc.SaveDriverNoticeConfigParam;
import com.clx.performance.service.DriverNoticeConfigService;
import com.clx.performance.vo.pc.DriverNoticeConfigVO;
import com.msl.common.convertor.aspect.UnitCovert;
import com.msl.common.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
/**
* @author jiangwujie
*/
@Slf4j
@RestController
@RequestMapping(value = "/pc/carrier/driverNoticeConfig")
@Validated
@Api(tags = "司机通知配置")
@AllArgsConstructor
public class DriverNoticeConfigController {
private final DriverNoticeConfigService driverNoticeConfigService;
@ApiOperation(value = "司机通知配置列表", notes = "<br>By:姜武杰")
@GetMapping("/listConfig")
@UnitCovert(param = false)
public Result<DriverNoticeConfigVO> listConfig() {
return Result.ok(driverNoticeConfigService.listConfig());
}
@ApiOperation(value = "司机通知配置详情", notes = "<br>By:姜武杰")
@GetMapping("/getDetail")
@UnitCovert(param = false)
public Result<DriverNoticeConfigVO> getDetail(@NotNull(message = "id不能为空") Integer id) {
return Result.ok(driverNoticeConfigService.getDetail(id));
}
@ApiOperation(value = "编辑司机通知配置", notes = "<br>By:姜武杰")
@PostMapping("/update")
@UnitCovert
public Result updateConfig(@RequestBody @Validated SaveDriverNoticeConfigParam param) {
driverNoticeConfigService.updateConfig(param);
return Result.ok();
}
@ApiOperation(value = "司机通知配置启用", notes = "<br>By:姜武杰")
@PostMapping("/enable")
@UnitCovert
public Result enableConfig(@ApiParam("id") @RequestParam("id") @NotNull(message = "id不能为空") @Validated Integer id) {
driverNoticeConfigService.enableConfig(id);
return Result.ok();
}
@ApiOperation(value = "司机通知配置禁用", notes = "<br>By:姜武杰")
@PostMapping("/disable")
@UnitCovert
public Result disableConfig(@ApiParam("id") @RequestParam("id") @NotNull(message = "id不能为空") Integer id) {
driverNoticeConfigService.disableConfig(id);
return Result.ok();
}
}
......@@ -2,24 +2,19 @@ package com.clx.performance.controller.pc;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.dao.settle.SettlementDriverDetailDao;
import com.clx.performance.dao.settle.SettlementOwnerDetailDao;
import com.clx.performance.feign.TransportFeignService;
import com.clx.performance.param.pc.ArtificialCancelOrderParam;
import com.clx.performance.param.pc.ArtificialCancelOrderQueryParam;
import com.clx.performance.param.pc.OrderCancelParam;
import com.clx.performance.param.pc.OrderChildCancelRecordParam;
import com.clx.performance.service.OrderCancelService;
import com.clx.performance.service.TransportSyncService;
import com.clx.performance.vo.app.OrderChildVO;
import com.clx.performance.vo.pc.OrderChildOperateRecordVO;
import com.msl.common.base.PageData;
import com.msl.common.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
......@@ -50,8 +45,8 @@ public class OrderCancelController {
@ApiOperation(value = "客服取消运单查询", notes = "<br>By:胡宇帆")
@GetMapping("/findArtificialCancelOrder")
public Result<OrderChildVO> findArtificialCancelOrder(@RequestParam String orderChildNo) {
OrderChildVO vo = orderCancelService.findArtificialCancelOrder(orderChildNo);
public Result<OrderChildVO> findArtificialCancelOrder(ArtificialCancelOrderQueryParam param) {
OrderChildVO vo = orderCancelService.findArtificialCancelOrder(param);
return Result.ok(vo);
}
......@@ -70,5 +65,19 @@ public class OrderCancelController {
return Result.page(page.getRecords(), page.getTotal(), page.getPages());
}
@ApiOperation(value = "运单处理记录", notes = "<br>By:姜武杰")
@PostMapping("/orderChildOperateRecord")
public Result<PageData<OrderChildOperateRecordVO>> orderChildOperateRecord(@RequestBody OrderChildCancelRecordParam param) {
IPage<OrderChildOperateRecordVO> page = orderCancelService.orderChildOperateRecord(param);
return Result.page(page.getRecords(), page.getTotal(), page.getPages());
}
@ApiOperation(value = "客服解除装车限制", notes = "<br>By:姜武杰")
@PostMapping("/artificialRemoveLoadLimit")
public Result<Object> artificialRemoveLoadLimit(@RequestBody ArtificialCancelOrderParam param) {
orderCancelService.removeLoadLimit(param);
return Result.ok();
}
}
package com.clx.performance.controller.pc;
import com.clx.performance.param.pc.SaveOrderChildOperateLimitConfigParam;
import com.clx.performance.service.OrderChildOperateLimitConfigService;
import com.clx.performance.vo.pc.OrderChildOperateLimitConfigVO;
import com.msl.common.convertor.aspect.UnitCovert;
import com.msl.common.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
/**
* @author jiangwujie
*/
@Slf4j
@RestController
@RequestMapping(value = "/pc/carrier/orderChildOperateLimitConfig")
@Validated
@Api(tags = "运单操作限制配置")
@AllArgsConstructor
public class OrderChildOperateLimitConfigController {
private final OrderChildOperateLimitConfigService orderChildOperateLimitService;
@ApiOperation(value = "运单操作限制配置列表", notes = "<br>By:姜武杰")
@GetMapping("/listConfig")
@UnitCovert(param = false)
public Result<OrderChildOperateLimitConfigVO> listConfig() {
return Result.ok(orderChildOperateLimitService.listConfig());
}
@ApiOperation(value = "运单操作限制配置详情", notes = "<br>By:姜武杰")
@GetMapping("/getDetail")
@UnitCovert(param = false)
public Result<OrderChildOperateLimitConfigVO> getDetail(@NotNull(message = "id不能为空") Integer id) {
return Result.ok(orderChildOperateLimitService.getDetail(id));
}
@ApiOperation(value = "编辑运单操作限制配置", notes = "<br>By:姜武杰")
@PostMapping("/update")
@UnitCovert
public Result updateConfig(@RequestBody @Validated SaveOrderChildOperateLimitConfigParam param) {
orderChildOperateLimitService.updateConfig(param);
return Result.ok();
}
@ApiOperation(value = "运单操作限制配置启用", notes = "<br>By:姜武杰")
@PostMapping("/enable")
@UnitCovert
public Result enableConfig(@NotNull(message = "id不能为空") @RequestParam("id") Integer id) {
orderChildOperateLimitService.enableConfig(id);
return Result.ok();
}
@ApiOperation(value = "运单操作限制配置禁用", notes = "<br>By:姜武杰")
@PostMapping("/disable")
@UnitCovert
public Result disableConfig(@ApiParam("id") @RequestParam("id") @NotNull(message = "id不能为空") Integer id) {
orderChildOperateLimitService.disableConfig(id);
return Result.ok();
}
}
package com.clx.performance.controller.temp;
import com.clx.performance.dto.gd.GdRouteDTO;
import com.clx.performance.esplus.model.TruckLatestPosESPlus;
import com.clx.performance.param.mq.trace.TruckTraceSyncMqParam;
import com.clx.performance.esplus.model.TruckLatestPosESPlus;
import com.clx.performance.param.temp.DriverTraceAddParam;
......@@ -19,6 +20,7 @@ import org.springframework.data.repository.query.Param;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
......@@ -120,4 +122,16 @@ public class TempTraceController {
}
@ApiOperation(value = "获取车辆最新位置信息", notes = "<br>By:姜武杰")
@GetMapping("/calDistance")
public Result<Integer> getTruckLatestPos(
@RequestParam("l1") @NotNull(message = "当前经度不能为空") BigDecimal l1,
@RequestParam("l2") @NotNull(message = "当前纬度不能为空") BigDecimal l2,
@RequestParam("l3") @NotNull(message = "货源经度不能为空") BigDecimal l3,
@RequestParam("l4") @NotNull(message = "货源纬度不能为空") BigDecimal l4
) {
return Result.ok( gdService.getShortestRouteDistance(l1,l2,l3,l4));
}
}
package com.clx.performance.dao;
import com.clx.performance.mapper.AppMapper;
import com.clx.performance.model.App;
import com.msl.common.dao.BaseDao;
public interface AppDao extends BaseDao<AppMapper, App, Integer> {
}
package com.clx.performance.dao;
import com.msl.common.dao.BaseDao;
import com.clx.performance.mapper.DriverNoticeConfigMapper;
import com.clx.performance.model.DriverNoticeConfig;
/**
* @author jiangwj
* Date 2024-08-07
* Time 16:29
*/
public interface DriverNoticeConfigDao extends BaseDao<DriverNoticeConfigMapper, DriverNoticeConfig, Integer> {
DriverNoticeConfig listConfig();
boolean updateConfig(DriverNoticeConfig config);
boolean updateStatus(Integer id, Integer status);
}
......@@ -151,7 +151,7 @@ public interface OrderChildDao extends BaseDao<OrderChildMapper, OrderChild, Int
* @param orderChildNo
* @return
*/
OrderChildVO findArtificialCancelOrder(String orderChildNo);
OrderChildVO findArtificialCancelOrder(ArtificialCancelOrderQueryParam param);
IPage<OrderChildVO> orderChildCancelRecord(OrderChildCancelRecordParam param);
......
package com.clx.performance.dao;
import com.msl.common.dao.BaseDao;
import com.clx.performance.mapper.OrderChildOperateLimitConfigMapper;
import com.clx.performance.model.OrderChildOperateLimitConfig;
/**
* @author jiangwj
* Date 2024-08-07
* Time 16:29
*/
public interface OrderChildOperateLimitConfigDao extends BaseDao<OrderChildOperateLimitConfigMapper, OrderChildOperateLimitConfig, Integer> {
OrderChildOperateLimitConfig listConfig();
boolean updateConfig(OrderChildOperateLimitConfig config);
boolean updateStatus(Integer id, Integer status);
}
package com.clx.performance.dao;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.mapper.OrderChildOperateRecordMapper;
import com.clx.performance.model.OrderChildOperateRecord;
import com.clx.performance.param.pc.OrderChildCancelRecordParam;
import com.clx.performance.vo.app.OrderChildVO;
import com.clx.performance.vo.pc.OrderChildOperateRecordVO;
import com.msl.common.dao.BaseDao;
/**
* @author jiangwujie
* Date 2024-08-08
* Time 11:20
*/
public interface OrderChildOperateRecordDao extends BaseDao<OrderChildOperateRecordMapper, OrderChildOperateRecord, Integer> {
IPage<OrderChildOperateRecordVO> orderChildOperateRecord(OrderChildCancelRecordParam param);
}
package com.clx.performance.dao.impl;
import com.clx.performance.dao.DriverNoticeConfigDao;
import com.clx.performance.mapper.DriverNoticeConfigMapper;
import com.clx.performance.model.DriverNoticeConfig;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;
/**
* @author jiangwj
* Date 2024-08-07
* Time 16:29
*/
@Repository
public class DriverNoticeConfigDaoImpl extends BaseDaoImpl<DriverNoticeConfigMapper, DriverNoticeConfig, Integer> implements DriverNoticeConfigDao {
@Override
public DriverNoticeConfig listConfig() {
return list().get(0);
}
@Override
public boolean updateConfig(DriverNoticeConfig config) {
return update(lUdWrapper()
.eq(DriverNoticeConfig::getId, config.getId())
.set(StringUtils.isNotBlank(config.getName()), DriverNoticeConfig::getName, config.getName())
.set(config.getNoticeTriggerDistance() != null, DriverNoticeConfig::getNoticeTriggerDistance, config.getNoticeTriggerDistance())
.set(config.getStatus() != null, DriverNoticeConfig::getStatus, config.getStatus())
);
}
@Override
public boolean updateStatus(Integer id, Integer status) {
return update(lUdWrapper()
.eq(DriverNoticeConfig::getId, id)
.set(DriverNoticeConfig::getStatus, status)
);
}
}
......@@ -440,8 +440,8 @@ public class OrderChildDaoImpl extends BaseDaoImpl<OrderChildMapper, OrderChild,
}
@Override
public OrderChildVO findArtificialCancelOrder(String orderChildNo) {
return baseMapper.findArtificialCancelOrder(orderChildNo);
public OrderChildVO findArtificialCancelOrder(ArtificialCancelOrderQueryParam param) {
return baseMapper.findArtificialCancelOrder(param);
}
@Override
......
package com.clx.performance.dao.impl;
import com.clx.performance.dao.OrderChildOperateLimitConfigDao;
import com.clx.performance.mapper.OrderChildOperateLimitConfigMapper;
import com.clx.performance.model.OrderChildOperateLimitConfig;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;
/**
* @author jiangwj
* Date 2024-08-07
* Time 16:29
*/
@Repository
public class OrderChildOperateLimitConfigDaoImpl extends BaseDaoImpl<OrderChildOperateLimitConfigMapper, OrderChildOperateLimitConfig, Integer> implements OrderChildOperateLimitConfigDao {
@Override
public OrderChildOperateLimitConfig listConfig() {
return list().get(0);
}
@Override
public boolean updateConfig(OrderChildOperateLimitConfig config) {
return update(lUdWrapper()
.eq(OrderChildOperateLimitConfig::getId, config.getId())
.set(StringUtils.isNotBlank(config.getName()), OrderChildOperateLimitConfig::getName, config.getName())
.set(config.getAllowUploadDistance() != null, OrderChildOperateLimitConfig::getAllowUploadDistance, config.getAllowUploadDistance())
.set(config.getStatus() != null, OrderChildOperateLimitConfig::getStatus, config.getStatus())
);
}
@Override
public boolean updateStatus(Integer id, Integer status) {
return update(lUdWrapper()
.eq(OrderChildOperateLimitConfig::getId, id)
.set(OrderChildOperateLimitConfig::getStatus, status)
);
}
}
package com.clx.performance.dao.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.dao.OrderChildOperateRecordDao;
import com.clx.performance.mapper.OrderChildOperateRecordMapper;
import com.clx.performance.model.OrderChildOperateRecord;
import com.clx.performance.param.pc.OrderChildCancelRecordParam;
import com.clx.performance.vo.app.OrderChildVO;
import com.clx.performance.vo.pc.OrderChildOperateRecordVO;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.springframework.stereotype.Repository;
/**
* @author jiangwujie
* Date 2024-08-08
* Time 11:20
*/
@Repository
public class OrderChildOperateRecordDaoImpl extends BaseDaoImpl<OrderChildOperateRecordMapper, OrderChildOperateRecord, Integer> implements OrderChildOperateRecordDao {
@Override
public IPage<OrderChildOperateRecordVO> orderChildOperateRecord(OrderChildCancelRecordParam param) {
Page<OrderChildOperateRecordVO> page = Page.of(param.getPage(), param.getPageSize());
return baseMapper.orderChildOperateRecord(page, param);
}
}
package com.clx.performance.job;
import com.clx.performance.service.OrderChildService;
import com.msl.common.job.JobLog;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 运单监控实时位置耗时信息job
* @author jiangwujie
*/
@Slf4j
@Component
public class OrderChildMessageNoticeJob {
@Autowired
OrderChildService orderChildService;
/**
* 运单监控实时位置耗时信息
*/
@XxlJob("orderChildMessageNotice")
public void orderChildMessageNotice() {
try {
log.info("开始实时计算进行中的运单的实时位置计算任务================================================");
orderChildService.orderChildMessageNotice();
log.info("结束实时计算进行中的运单的实时位置计算任务================================================");
} catch (Exception e) {
log.warn("定时任务计算进行中的运单的实时位置失败,异常原因:{}", ExceptionUtils.getStackTrace(e));
JobLog.error("定时任务计算进行中的运单的实时位置失败,异常原因=====================", e);
}
}
}
package com.clx.performance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.clx.performance.model.App;
public interface AppMapper extends BaseMapper<App> {
}
package com.clx.performance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.clx.performance.model.DriverNoticeConfig;
/**
* @author jiangwj
* Date 2024-08-07
* Time 16:29
*/
public interface DriverNoticeConfigMapper extends BaseMapper<DriverNoticeConfig> {
}
......@@ -8,10 +8,7 @@ import com.clx.performance.dto.linewarn.LineWarnOrderChildStatisticsDTO;
import com.clx.performance.model.OrderChild;
import com.clx.performance.param.app.PageOrderChildOfDriverParam;
import com.clx.performance.param.app.PageOrderChildOfDriverSearchParam;
import com.clx.performance.param.pc.OrderChildCancelRecordParam;
import com.clx.performance.param.pc.OrderChildReportParam;
import com.clx.performance.param.pc.PageCarrierOrderChildParam;
import com.clx.performance.param.pc.PagePoundAuditParam;
import com.clx.performance.param.pc.*;
import com.clx.performance.sqlProvider.OrderChildSqlProvider;
import com.clx.performance.vo.MonthInComeAndOrderedVO;
import com.clx.performance.vo.app.OrderChildVO;
......@@ -83,7 +80,7 @@ public interface OrderChildMapper extends BaseMapper<OrderChild> {
@SelectProvider(type = OrderChildSqlProvider.class, method = "findArtificialCancelOrder")
OrderChildVO findArtificialCancelOrder(@Param("orderChildNo") String orderChildNo);
OrderChildVO findArtificialCancelOrder(@Param("param") ArtificialCancelOrderQueryParam param);
@SelectProvider(type = OrderChildSqlProvider.class, method = "orderChildCancelRecord")
IPage<OrderChildVO> orderChildCancelRecord(@Param("page")Page<OrderChildVO> page, @Param(value = "param") OrderChildCancelRecordParam param);
......
package com.clx.performance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.clx.performance.model.OrderChildOperateLimitConfig;
/**
* @author jiangwj
* Date 2024-08-07
* Time 16:29
*/
public interface OrderChildOperateLimitConfigMapper extends BaseMapper<OrderChildOperateLimitConfig> {
}
package com.clx.performance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.model.OrderChildOperateRecord;
import com.clx.performance.param.pc.OrderChildCancelRecordParam;
import com.clx.performance.sqlProvider.OrderChildOperateRecordSqlProvider;
import com.clx.performance.sqlProvider.OrderChildSqlProvider;
import com.clx.performance.vo.app.OrderChildVO;
import com.clx.performance.vo.pc.OrderChildOperateRecordVO;
import org.apache.ibatis.annotations.SelectProvider;
/**
* @author jiangwujie
* Date 2024-08-08
* Time 11:20
*/
public interface OrderChildOperateRecordMapper extends BaseMapper<OrderChildOperateRecord> {
@SelectProvider(type = OrderChildOperateRecordSqlProvider.class, method = "orderChildOperateRecord")
IPage<OrderChildOperateRecordVO> orderChildOperateRecord(Page<OrderChildOperateRecordVO> page, OrderChildCancelRecordParam param);
}
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.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
@Getter
@Setter
@Accessors(chain = true)
@TableName("app")
public class App implements HasKey<Integer> {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField("unique_identifier")
@ApiModelProperty("唯一标识 1:场站-smart-weight")
private Integer uniqueIdentifier;
@TableField("name")
@ApiModelProperty("应用名称")
private String name;
@TableField("namespace")
@ApiModelProperty("命名空间")
private String namespace;
@TableField("app_no")
@ApiModelProperty("应用标识")
private String appNo;
@TableField("app_key")
@ApiModelProperty("应用密钥")
private String appKey;
@TableField("callback")
@ApiModelProperty("回调网关")
private String callback;
@TableField("create_time")
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@TableField("modified_time")
@ApiModelProperty("修改时间")
private LocalDateTime modifiedTime;
@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.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author jiangwj
* Date 2024-08-07
* Time 16:29
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("driver_notice_config")
public class DriverNoticeConfig implements HasKey<Integer> {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField("name")
@ApiModelProperty("配置名称")
private String name;
@TableField("notice_trigger_distance")
@ApiModelProperty("通知触发距离")
private BigDecimal noticeTriggerDistance;
@TableField("status")
@ApiModelProperty("启用状态:0禁用1启用")
private Integer status;
@TableField("created_time")
@ApiModelProperty("创建时间")
private LocalDateTime createdTime;
@TableField("modified_time")
@ApiModelProperty("更新时间")
private LocalDateTime modifiedTime;
@Override
@KeyColumn("id")
public Integer gainKey() {
return this.id;
}
}
......@@ -105,6 +105,19 @@ public class OrderChild implements HasKey<Integer> {
private BigDecimal platformServiceFeeRate; //平台服务费费率%
private BigDecimal deposit; //接单保证金(分/车)
/**
* 驶入驶离货源地状态 0 初始 1 驶入 2 驶离
*/
private Integer enterExitSendStatus;
/**
* 驶离通知状态 0 未通知 1 已通知
*/
private Integer exitNoticeStatus;
/**
* 是否解除监装限制 0 未解除 1 解除
*/
private Integer removeLoadLimitStatus;
private LocalDateTime createTime; //创建时间
private LocalDateTime modifiedTime; //修改时间
......
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.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author jiangwj
* Date 2024-08-07
* Time 16:29
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("order_child_operate_limit_config")
public class OrderChildOperateLimitConfig implements HasKey<Integer> {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField("name")
@ApiModelProperty("配置名称")
private String name;
@TableField("allow_upload_distance")
@ApiModelProperty("可上传装车信息范围")
private BigDecimal allowUploadDistance;
@TableField("status")
@ApiModelProperty("启用状态0禁用,1启用")
private Integer status;
@TableField("created_time")
@ApiModelProperty("创建时间")
private LocalDateTime createdTime;
@TableField("modified_time")
@ApiModelProperty("更新时间")
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.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
/**
* @author jiangwujie
* Date 2024-08-08
* Time 11:20
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("order_child_operate_record")
public class OrderChildOperateRecord implements HasKey<Integer> {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField("child_no")
@ApiModelProperty("运单编号")
private String childNo;
@TableField("type")
@ApiModelProperty("操作类型 1 取消运单 2 解除装车限制")
private Integer type;
@TableField("truck_no")
@ApiModelProperty("主车牌照")
private String truckNo;
@TableField("driver_name")
@ApiModelProperty("司机名称")
private String driverName;
@TableField("driver_mobile")
@ApiModelProperty("司机手机号")
private String driverMobile;
@TableField("send_address")
@ApiModelProperty("货源地")
private String sendAddress;
@TableField("receive_address")
@ApiModelProperty("目的地")
private String receiveAddress;
@TableField("good_type_name")
@ApiModelProperty("货物类型名称")
private String goodTypeName;
@TableField("remark")
@ApiModelProperty("备注")
private String remark;
@TableField("operate_time")
@ApiModelProperty("操作时间")
private LocalDateTime operateTime;
@TableField("operator")
@ApiModelProperty("操作人")
private String operator;
@TableField("created_time")
@ApiModelProperty("创建时间")
private LocalDateTime createdTime;
@TableField("modified_time")
@ApiModelProperty("更新时间")
private LocalDateTime modifiedTime;
@Override
@KeyColumn("id")
public Integer gainKey() {
return this.id;
}
}
package com.clx.performance.service;
import com.clx.performance.param.pc.SaveDriverNoticeConfigParam;
import com.clx.performance.vo.pc.DriverNoticeConfigVO;
/**
* @author jiangwj
* Date 2024-08-07
* Time 16:29
*/
public interface DriverNoticeConfigService {
DriverNoticeConfigVO listConfig();
DriverNoticeConfigVO getDetail(Integer id);
void updateConfig(SaveDriverNoticeConfigParam param);
void enableConfig(Integer id);
void disableConfig(Integer id);
}
package com.clx.performance.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.param.pc.ArtificialCancelOrderParam;
import com.clx.performance.param.pc.ArtificialCancelOrderQueryParam;
import com.clx.performance.param.pc.OrderCancelParam;
import com.clx.performance.param.pc.OrderChildCancelRecordParam;
import com.clx.performance.vo.app.OrderChildVO;
import com.msl.common.base.PageParam;
import java.util.List;
import com.clx.performance.vo.pc.OrderChildOperateRecordVO;
public interface OrderCancelService {
......@@ -47,7 +47,20 @@ public interface OrderCancelService {
* @param orderChildNo
* @return
*/
OrderChildVO findArtificialCancelOrder(String orderChildNo);
OrderChildVO findArtificialCancelOrder(ArtificialCancelOrderQueryParam param);
IPage<OrderChildVO> orderChildCancelRecord(OrderChildCancelRecordParam param);
/**
* 异常运单处理记录
* @param param
* @return
*/
IPage<OrderChildOperateRecordVO> orderChildOperateRecord(OrderChildCancelRecordParam param);
/**
* 客服移除监装限制
* @param param
*/
void removeLoadLimit(ArtificialCancelOrderParam param);
}
package com.clx.performance.service;
import com.clx.performance.param.pc.SaveOrderChildOperateLimitConfigParam;
import com.clx.performance.vo.pc.OrderChildOperateLimitConfigVO;
/**
* @author jiangwj
* Date 2024-08-07
* Time 16:29
*/
public interface OrderChildOperateLimitConfigService {
OrderChildOperateLimitConfigVO listConfig();
OrderChildOperateLimitConfigVO getDetail(Integer id);
void updateConfig(SaveOrderChildOperateLimitConfigParam param);
void enableConfig(Integer id);
void disableConfig(Integer id);
}
package com.clx.performance.service;
/**
* @author jiangwujie
* Date 2024-08-08
* Time 11:20
*/
public interface OrderChildOperateRecordService {
}
......@@ -111,4 +111,10 @@ public interface OrderChildService {
List<HistoryLineTranVolumeChartVO> getHistoryLineTransportVolume(String orderNo);
OrderChildLoadRangeCheckResultVO loadRangeCheck(OrderChildLoadRangeCheckParam param);
void orderChildMessageNotice();
NeedAlertSuperviseInfoResultVO needAlertSuperviseInfo(NeedAlertSuperviseInfoParam param);
}
package com.clx.performance.service.impl;
import com.clx.performance.dao.DriverNoticeConfigDao;
import com.clx.performance.enums.EnabledStatusEnum;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.model.DriverNoticeConfig;
import com.clx.performance.param.pc.SaveDriverNoticeConfigParam;
import com.clx.performance.service.DriverNoticeConfigService;
import com.clx.performance.struct.DriverNoticeConfigStruct;
import com.clx.performance.vo.pc.DriverNoticeConfigVO;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
/**
* @author jiangwj
* Date 2024-08-07
* Time 16:29
*/
@Service
@AllArgsConstructor
public class DriverNoticeConfigServiceImpl implements DriverNoticeConfigService {
private final DriverNoticeConfigDao dao;
private final DriverNoticeConfigStruct struct;
@Override
public DriverNoticeConfigVO listConfig() {
return struct.convertVO(dao.listConfig());
}
@Override
public DriverNoticeConfigVO getDetail(Integer id) {
DriverNoticeConfig config = dao.getEntityByKey(id).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
return struct.convertVO(config);
}
@Override
public void updateConfig(SaveDriverNoticeConfigParam param) {
DriverNoticeConfig config = new DriverNoticeConfig();
config.setId(param.getId());
config.setNoticeTriggerDistance(param.getNoticeTriggerDistance());
dao.updateConfig(config);
}
@Override
public void enableConfig(Integer id) {
dao.updateStatus(id, EnabledStatusEnum.ENABLE.getCode());
}
@Override
public void disableConfig(Integer id) {
dao.updateStatus(id, EnabledStatusEnum.DISABLE.getCode());
}
}
......@@ -16,19 +16,24 @@ import com.clx.performance.component.OrderCancelComponent;
import com.clx.performance.component.OwnerAccountComponent;
import com.clx.performance.constant.RabbitKeyConstants;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OrderChildOperateRecordDao;
import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.dto.OrderCancelDTO;
import com.clx.performance.enums.*;
import com.clx.performance.extranal.user.DriverService;
import com.clx.performance.extranal.user.OwnerInfoService;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderChildOperateRecord;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.param.pc.ArtificialCancelOrderParam;
import com.clx.performance.param.pc.ArtificialCancelOrderQueryParam;
import com.clx.performance.param.pc.OrderCancelParam;
import com.clx.performance.param.pc.OrderChildCancelRecordParam;
import com.clx.performance.service.*;
import com.clx.performance.service.child.OrderChildPostService;
import com.clx.performance.vo.app.OrderChildVO;
import com.clx.performance.vo.mq.OrderTruckBindCancelParam;
import com.clx.performance.vo.pc.OrderChildOperateRecordVO;
import com.clx.user.enums.driver.DriverInfoEnum;
import com.clx.user.enums.owner.FreezeSettingEnum;
import com.clx.user.vo.feign.OwnerInfoFeignVO;
......@@ -85,6 +90,8 @@ public class OrderCancelServiceImpl implements OrderCancelService {
private final OwnerAccountComponent ownerAccountComponent;
private final OrderChildOperateRecordDao orderChildOperateRecordDao;
@Override
@Transactional(rollbackFor = Exception.class)
......@@ -736,6 +743,16 @@ public class OrderCancelServiceImpl implements OrderCancelService {
public void artificialCancelOrder(String orderChildNo, String remark) {
LocalDateTime now = LocalDateTime.now();
OrderChild orderChild = orderChildDao.getByChildNo(orderChildNo).orElseThrow(PerformanceResultEnum.ORDER_CHILD_NO_FOUND);
//运单状态不在【装车成功】【前往目的地】【到达目的地】【收货待确认】范围中,不允许取消
if (!Arrays.asList(OrderChildEnum.Status.LOAD.getCode(),
OrderChildEnum.Status.GO_TO_SEND.getCode(),
OrderChildEnum.Status.ARRIVE_SEND.getCode(),
OrderChildEnum.Status.UNLOAD.getCode())
.contains(orderChild.getStatus())) {
log.error("运单:{} 状态:{}不在【装车成功】【前往目的地】【到达目的地】【收货待确认】范围中,不允许取消", orderChildNo, orderChild.getStatus());
throw new ServiceSystemException(PerformanceResultEnum.ORDER_CHILD_CANCEL_FORBID, "不可操作");
}
OrderChild update = new OrderChild();
update.setId(orderChild.getId());
update.setStatus(OrderChildEnum.Status.ARTIFICIAL_CANCEL.getCode());
......@@ -751,15 +768,21 @@ public class OrderCancelServiceImpl implements OrderCancelService {
// 运单取消
orderChildPostService.orderChildCancelByArtificial(orderChildNo);
// 保存操作记录
orderChildLogService.saveOrderChildLog(orderChild.getChildNo(),
OrderChildEnum.Status.ARTIFICIAL_CANCEL.getCode(), OrderChildEnum.Status.ARTIFICIAL_CANCEL.getName(),
OrderChildLogEnum.CreateType.ARTIFICIAL.getCode(), 0L, OrderChildLogEnum.CreateType.ARTIFICIAL.getMsg()
);
// 保存运单处理记录
saveOrderChildOperateRecord(orderChild, OrderChildEnum.OperateRecordType.CANCEL_ORDER, remark);
}
@Override
public OrderChildVO findArtificialCancelOrder(String orderChildNo) {
OrderChildVO artificialCancelOrder = orderChildDao.findArtificialCancelOrder(orderChildNo);
public OrderChildVO findArtificialCancelOrder(ArtificialCancelOrderQueryParam param) {
//检查参数
param.checkParam();
OrderChildVO artificialCancelOrder = orderChildDao.findArtificialCancelOrder(param);
if (artificialCancelOrder == null) {
return null;
}
......@@ -783,5 +806,61 @@ public class OrderCancelServiceImpl implements OrderCancelService {
return page;
}
@Override
public IPage<OrderChildOperateRecordVO> orderChildOperateRecord(OrderChildCancelRecordParam param) {
return orderChildOperateRecordDao.orderChildOperateRecord(param);
}
@Override
// todo :jiangwujie 事务判断 ,其他也检查一下
public void removeLoadLimit(ArtificialCancelOrderParam param) {
OrderChild orderChild = orderChildDao.getByChildNo(param.getOrderChildNo()).orElseThrow(PerformanceResultEnum.ORDER_CHILD_NO_FOUND);
//判断运单状态【已接单】【前往货源地】【到达货源地】时可对该运单解除装车限制,否则toast:不可操作
if (!Arrays.asList(OrderChildEnum.Status.CREATED.getCode(),
OrderChildEnum.Status.GO_TO_SEND.getCode(),
OrderChildEnum.Status.ARRIVE_SEND.getCode())
.contains(orderChild.getStatus())) {
//todo log.error 检查一下
log.info("运单:{} 状态:{}不在【已接单】【前往货源地】【到达货源地】范围中,不允许解除装车限制", param.getOrderChildNo(), orderChild.getStatus());
throw new ServiceSystemException(PerformanceResultEnum.ORDER_CHILD_CANCEL_FORBID, "不可操作");
}
OrderChild update = new OrderChild();
update.setId(orderChild.getId());
update.setRemoveLoadLimitStatus(OrderChildEnum.RemoveLoadLimitStatus.REMOVED.getCode());
orderChildDao.updateEntityByKey(update);
//保存运单处理记录
saveOrderChildOperateRecord(orderChild, OrderChildEnum.OperateRecordType.REMOVE_LIMIT, param.getRemark());
//保存运单操作记录
orderChildLogService.saveOrderChildLog(orderChild.getChildNo(),
orderChild.getStatus(), OrderChildEnum.OperateRecordType.REMOVE_LIMIT.getMsg(),
OrderChildLogEnum.CreateType.ARTIFICIAL.getCode(), 0L, OrderChildLogEnum.CreateType.ARTIFICIAL.getMsg()
);
}
private void saveOrderChildOperateRecord(OrderChild orderChild, OrderChildEnum.OperateRecordType type, String remark) {
OrderChildOperateRecord record = new OrderChildOperateRecord();
record.setChildNo(orderChild.getChildNo());
record.setType(type.getCode());
record.setTruckNo(orderChild.getTruckNo());
record.setDriverName(orderChild.getDriverName());
record.setDriverMobile(orderChild.getDriverMobile());
record.setSendAddress(orderChild.getSendAddress());
record.setReceiveAddress(orderChild.getReceiveAddress());
FeignOrderVO orderInfoFeign = orderFeign.getOrderInfoFeign(orderChild.getOrderNo());
if (orderInfoFeign != null) {
record.setGoodTypeName(orderInfoFeign.getGoodsTypeName());
}
record.setRemark(remark);
record.setOperateTime(LocalDateTime.now());
UserSessionData loginUserInfo = TokenUtil.getLoginUserInfo();
record.setOperator(loginUserInfo.getUserName());
record.setCreatedTime(LocalDateTime.now());
record.setModifiedTime(LocalDateTime.now());
orderChildOperateRecordDao.saveEntity(record);
}
}
\ No newline at end of file
package com.clx.performance.service.impl;
import com.clx.performance.dao.OrderChildOperateLimitConfigDao;
import com.clx.performance.enums.EnabledStatusEnum;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.model.OrderChildOperateLimitConfig;
import com.clx.performance.param.pc.SaveOrderChildOperateLimitConfigParam;
import com.clx.performance.service.OrderChildOperateLimitConfigService;
import com.clx.performance.struct.OrderChildOperateLimitConfigStruct;
import com.clx.performance.vo.pc.OrderChildOperateLimitConfigVO;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
/**
* @author jiangwj
* Date 2024-08-07
* Time 16:29
*/
@Service
@AllArgsConstructor
public class OrderChildOperateLimitConfigServiceImpl implements OrderChildOperateLimitConfigService {
private final OrderChildOperateLimitConfigDao dao;
private final OrderChildOperateLimitConfigStruct struct;
@Override
public OrderChildOperateLimitConfigVO listConfig() {
return struct.convertVO(dao.listConfig());
}
@Override
public OrderChildOperateLimitConfigVO getDetail(Integer id) {
OrderChildOperateLimitConfig config = dao.getEntityByKey(id).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
return struct.convertVO(config);
}
@Override
public void updateConfig(SaveOrderChildOperateLimitConfigParam param) {
OrderChildOperateLimitConfig config = new OrderChildOperateLimitConfig();
config.setId(param.getId());
config.setAllowUploadDistance(param.getAllowUploadDistance());
dao.updateConfig(config);
}
@Override
public void enableConfig(Integer id) {
dao.updateStatus(id, EnabledStatusEnum.ENABLE.getCode());
}
@Override
public void disableConfig(Integer id) {
dao.updateStatus(id, EnabledStatusEnum.DISABLE.getCode());
}
}
package com.clx.performance.service.impl;
import com.clx.performance.service.OrderChildOperateRecordService;
import org.springframework.stereotype.Service;
/**
* @author jiangwujie
* Date 2024-08-08
* Time 11:20
*/
@Service
public class OrderChildOperateRecordServiceImpl implements OrderChildOperateRecordService {
}
......@@ -303,6 +303,41 @@ public class TruckTraceServiceImpl implements TruckTraceService {
return null;
}
/**
* 获取卡车当前位置 5分钟内的位置
* @param truckNo 卡车车牌号
* @return 位置
*/
@Override
public BigDecimal[] getTruckCurrentPosition(String truckNo) {
String beginTime = LocalDateTimeUtils.formatTime(LocalDateTime.now().minusMinutes(LAST_POSITION_TIME));
return getTruckCurrentPosition(truckNo, beginTime);
}
/**
* 获取卡车当前位置
* @param truckNo 卡车车牌号
* @param beginTime 开始时间
* @return 位置
*/
@Override
public BigDecimal[] getTruckCurrentPosition(String truckNo, String beginTime) {
String endTime = LocalDateTimeUtils.formatTime();
// 车辆
List<TruckTraceESPlus> list = truckTraceESPlusMapper.selectList(new LambdaEsQueryWrapper<TruckTraceESPlus>()
.eq(TruckTraceESPlus::getTruckNo, truckNo)
.ge(TruckTraceESPlus::getGpsTime, beginTime)
.le(TruckTraceESPlus::getGpsTime, endTime)
.orderByDesc("gpsTime")
.limit(1)
);
if (!list.isEmpty()){
return list.get(0).getLocation();
}
return null;
}
@Override
public int getParkTime(String truckNo, Long userNo, LocalDateTime beginDateTime) {
return getParkTime(truckNo, userNo, beginDateTime, LocalDateTime.now());
......
......@@ -23,6 +23,10 @@ public interface TruckTraceService {
BigDecimal[] getCurrentPosition(String truckNo, Long userNo, String beginTime);
BigDecimal[] getTruckCurrentPosition(String truckNo);
BigDecimal[] getTruckCurrentPosition(String truckNo, String beginTime);
int getParkTime(String truckNo, Long userNo, LocalDateTime beginDateTime);
int getParkTime(String truckNo, Long userNo, LocalDateTime beginTime, LocalDateTime endTime);
......
package com.clx.performance.sqlProvider;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.param.pc.OrderChildCancelRecordParam;
import com.clx.performance.vo.app.OrderChildVO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.jdbc.SQL;
public class OrderChildOperateRecordSqlProvider {
public String orderChildOperateRecord(@Param("page") Page<OrderChildVO> page, @Param("param") OrderChildCancelRecordParam param) {
return new SQL() {{
SELECT("id," +
"child_no," +
"type," +
"truck_no," +
"driver_name," +
"driver_mobile," +
"send_address," +
"receive_address," +
"good_type_name," +
"remark," +
"date_format(operate_time, '%Y-%m-%d %H:%i:%s') as operateTime," +
"operator"
);
FROM("order_child_operate_record ");
ORDER_BY("created_time desc");
}}.toString();
}
}
......@@ -5,10 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.enums.OrderChildEnum;
import com.clx.performance.param.app.PageOrderChildOfDriverParam;
import com.clx.performance.param.app.PageOrderChildOfDriverSearchParam;
import com.clx.performance.param.pc.OrderChildCancelRecordParam;
import com.clx.performance.param.pc.OrderChildReportParam;
import com.clx.performance.param.pc.PageCarrierOrderChildParam;
import com.clx.performance.param.pc.PagePoundAuditParam;
import com.clx.performance.param.pc.*;
import com.clx.performance.vo.app.OrderChildVO;
import com.clx.performance.vo.pc.PageCarrierOrderChildVO;
import com.clx.performance.vo.pc.PageOrderChildPoundAuditVO;
......@@ -170,21 +167,34 @@ public class OrderChildSqlProvider {
return sql;
}
public String findArtificialCancelOrder(@Param("orderChildNo") String orderChildNo) {
String sql = "select child_no,goods_name,freight_price,order_no," +
"send_address,receive_address," +
"driver_user_no, driver_name,driver_mobile," +
"truck_no," +
"unload_pound_no,weight," +
"cancel_remark," +
"pound_status,status," +
"date_format(load_deadline, '%Y-%m-%d %H:%i:%s') as loadDeadline," +
"date_format(create_time, '%Y-%m-%d %H:%i:%s') as createTime," +
"date_format(unload_time, '%Y-%m-%d %H:%i:%s') as unloadTime from order_child where child_no = #{orderChildNo}";
sql += " and status >="+ OrderChildEnum.Status.LOAD.getCode();
sql += " and status <"+ OrderChildEnum.Status.UNSETTLE.getCode();
return sql;
public String findArtificialCancelOrder(ArtificialCancelOrderQueryParam param) {
return new SQL() {{
SELECT("child_no, goods_name, freight_price, order_no, " +
"send_address, receive_address, " +
"driver_user_no, driver_name, driver_mobile, " +
"truck_no, unload_pound_no, weight, " +
"cancel_remark, pound_status, status, " +
"DATE_FORMAT(load_deadline, '%Y-%m-%d %H:%i:%s') AS loadDeadline, " +
"DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') AS createTime, " +
"DATE_FORMAT(unload_time, '%Y-%m-%d %H:%i:%s') AS unloadTime ");
FROM("order_child ");
if (StringUtils.isNotBlank(param.getOrderChildNo())) {
WHERE("child_no = #{param.orderChildNo,jdbcType=VARCHAR}");
}
if (StringUtils.isNotBlank(param.getTruckNo())) {
WHERE("truck_no = #{param.truckNo,jdbcType=VARCHAR}");
}
//支付状态 可以忽略
WHERE("status >=" + OrderChildEnum.Status.CREATED.getCode());
WHERE("status <=" + OrderChildEnum.Status.ARRIVE_RECEIVE.getCode());
}}.toString();
}
public static void main(String[] args) {
ArtificialCancelOrderQueryParam param = new ArtificialCancelOrderQueryParam();
param.setTruckNo("A123456");
param.setOrderChildNo("CYD1234567890");
System.out.println(new OrderChildSqlProvider().findArtificialCancelOrder(param));
}
public String orderChildCancelRecord(@Param("page") Page<OrderChildVO> page, @Param("param") OrderChildCancelRecordParam param) {
......
package com.clx.performance.struct;
import com.clx.performance.model.DriverNoticeConfig;
import com.clx.performance.vo.pc.DriverNoticeConfigVO;
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface DriverNoticeConfigStruct {
DriverNoticeConfigVO convertVO(DriverNoticeConfig config);
}
package com.clx.performance.struct;
import com.clx.performance.model.OrderChildOperateLimitConfig;
import com.clx.performance.vo.pc.OrderChildOperateLimitConfigVO;
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface OrderChildOperateLimitConfigStruct {
OrderChildOperateLimitConfigVO convertVO(OrderChildOperateLimitConfig config);
}
......@@ -9,14 +9,12 @@ import com.msl.common.enums.ResultCodeEnum;
import com.msl.common.exception.ServiceSystemException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.dromara.easyes.common.utils.CollectionUtils;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.*;
/**
* @Author: aiqingguo
......@@ -47,6 +45,26 @@ public class GdService {
return getRoute(gaodeKey, originLongitude, originLatitude, destinationLongitude, destinationLatitude);
}
/**
* 获取最短距离路径
* @param originLongitude
* @param originLatitude
* @param destinationLongitude
* @param destinationLatitude
* @return
*/
public Integer getShortestRouteDistance(BigDecimal originLongitude, BigDecimal originLatitude,
BigDecimal destinationLongitude, BigDecimal destinationLatitude) {
List<GdRouteDTO> routeList = getRoute(gaodeKey, originLongitude, originLatitude, destinationLongitude, destinationLatitude);
if (CollectionUtils.isNotEmpty(routeList)) {
Optional<GdRouteDTO> minRoute = routeList.stream()
.min((r1, r2) -> Double.compare(r1.getDistance(), r2.getDistance()));
return minRoute.map(GdRouteDTO::getDistance).orElse(null);
}
return null;
}
public static List<GdRouteDTO> getRoute(String key, BigDecimal originLongitude, BigDecimal originLatitude,
BigDecimal destinationLongitude, BigDecimal destinationLatitude) {
//log.info("高德线路规划开始");
......
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());
}
}
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.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 org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import java.math.BigDecimal;
import java.util.Arrays;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class OrderChildServiceImplTest {
@InjectMocks
private OrderChildServiceImpl orderChildService;
@Mock
private OrderChildOperateLimitConfigService orderChildOperateLimitConfigService;
@Mock
private GdService gdService;
@Mock
private OrderGoodsDao orderGoodsDao;
@Mock
private OrderChildDao orderChildDao;
private OrderChildLoadRangeCheckParam param;
private OrderChildOperateLimitConfigVO config;
@Before
public void setUp() {
param = new OrderChildLoadRangeCheckParam();
param.setLatitude(new BigDecimal("32.2304"));
param.setLongitude(new BigDecimal("122.4737"));
OrderChild orderChild = new OrderChild();
orderChild.setOrderGoodsNo("123456789");
orderChild.setTruckNo("黑A88888");
Mockito.<com.msl.common.base.Optional<OrderChild>>when(orderChildDao.getByChildNo(param.getChildNo())).thenReturn(com.msl.common.base.Optional.of(orderChild));
// 预设的返回值,根据具体业务逻辑可能需要调整
OrderGoods orderGoods = new OrderGoods();
orderGoods.setSendLatitude(BigDecimal.valueOf(31.2304));
orderGoods.setSendLongitude(BigDecimal.valueOf(121.4737));
Mockito.<com.msl.common.base.Optional<OrderGoods>>when(orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo())).thenReturn(com.msl.common.base.Optional.of(orderGoods));
// Mock配置
config = new OrderChildOperateLimitConfigVO();
config.setAllowUploadDistance(BigDecimal.valueOf(2));
config.setStatus(1);
when(orderChildOperateLimitConfigService.listConfig()).thenReturn(config);
}
@Test
public void testLoadRangeCheckSuccess() {
GdRouteDTO gdRoute = new GdRouteDTO();
gdRoute.setDistance(1000);
// 假设高德服务返回了一个有效的路线
Mockito.when(gdService.getRoute(any(BigDecimal.class), any(BigDecimal.class), any(BigDecimal.class), any(BigDecimal.class))).thenReturn(Arrays.asList(gdRoute));
OrderChildLoadRangeCheckResultVO result = orderChildService.loadRangeCheck(param);
assertEquals(0, result.getCode().intValue());
assertEquals("验证通过", result.getMsg());
}
@Test
public void testLoadRangeCheckFailDueToConfigNull() {
// 假设没有配置
when(orderChildOperateLimitConfigService.listConfig()).thenReturn(null);
OrderChildLoadRangeCheckResultVO result = orderChildService.loadRangeCheck(param);
assertEquals(PerformanceResultEnum.ORDER_CHILD_LOAD_LIMIT_CONFIG_ERROR.getCode(), result.getCode().intValue());
assertEquals(PerformanceResultEnum.ORDER_CHILD_LOAD_LIMIT_CONFIG_ERROR.getMsg(), result.getMsg());
}
@Test
public void testLoadRangeCheckFailDueToDisabledConfig() {
// 假设配置被禁用
OrderChildOperateLimitConfigVO config = new OrderChildOperateLimitConfigVO();
config.setStatus(0);
config.setAllowUploadDistance(new BigDecimal("2"));
when(orderChildOperateLimitConfigService.listConfig()).thenReturn(config);
OrderChildLoadRangeCheckResultVO result = orderChildService.loadRangeCheck(param);
assertEquals(0, result.getNeedAlert().intValue());
assertEquals(PerformanceResultEnum.ORDER_CHILD_LOAD_LIMIT_CONFIG_DISABLED.getCode(), result.getCode().intValue());
assertEquals(PerformanceResultEnum.ORDER_CHILD_LOAD_LIMIT_CONFIG_DISABLED.getMsg(), result.getMsg());
}
@Test
public void testLoadRangeCheckFailDueToTruckLocation() {
param.setLatitude(null);
param.setLongitude(null);
OrderChildLoadRangeCheckResultVO result = orderChildService.loadRangeCheck(param);
assertEquals(PerformanceResultEnum.TRUCK_LOCATION_ERROR.getCode(), result.getCode().intValue());
assertEquals(String.format(PerformanceResultEnum.TRUCK_LOCATION_ERROR.getMsg(), config.getAllowUploadDistance()), result.getMsg());
}
@Test
public void testLoadRangeCheckFailDueToDistanceOut() {
GdRouteDTO gdRoute = new GdRouteDTO();
gdRoute.setDistance(5000);
Mockito.when(gdService.getRoute(any(BigDecimal.class), any(BigDecimal.class), any(BigDecimal.class), any(BigDecimal.class))).thenReturn(Arrays.asList(gdRoute));
OrderChildLoadRangeCheckResultVO result = orderChildService.loadRangeCheck(param);
assertEquals(PerformanceResultEnum.TRUCK_LOCATION_OUT_OF_SEND_RANGE.getCode(), result.getCode().intValue());
assertEquals(String.format(PerformanceResultEnum.TRUCK_LOCATION_OUT_OF_SEND_RANGE.getMsg(), config.getAllowUploadDistance()), result.getMsg());
}
}
package com.clx.performance.sqlProvider;
import com.clx.performance.enums.OrderChildEnum;
import com.clx.performance.param.pc.ArtificialCancelOrderQueryParam;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@RunWith(JUnit4.class)
public class OrderChildSqlProviderTest {
@Test
public void testFindArtificialCancelOrderWithParams() {
ArtificialCancelOrderQueryParam param = new ArtificialCancelOrderQueryParam();
param.setOrderChildNo("testChildNo");
param.setTruckNo("testTruckNo");
OrderChildSqlProvider orderChildSqlProvider = new OrderChildSqlProvider();
String sql = orderChildSqlProvider.findArtificialCancelOrder(param);
String expectedSql = "SELECT child_no, goods_name, freight_price, order_no, "
+ "send_address, receive_address, "
+ "driver_user_no, driver_name, driver_mobile, "
+ "truck_no, unload_pound_no, weight, "
+ "cancel_remark, pound_status, status, "
+ "DATE_FORMAT(load_deadline, '%Y-%m-%d %H:%i:%s') AS loadDeadline, "
+ "DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') AS createTime, "
+ "DATE_FORMAT(unload_time, '%Y-%m-%d %H:%i:%s') AS unloadTime "
+ "FROM order_child "
+ "WHERE 1=1 "
+ "AND child_no = #{param.orderChildNo} "
+ "AND truck_no = #{param.truckNo} "
+ "AND status IN (10, 30, 40, 50, 60, 70, 80)";
Assert.assertEquals("SQL statement does not match expected output", expectedSql, sql);
}
@Test
public void testFindArtificialCancelOrderWithoutParams() {
ArtificialCancelOrderQueryParam param = new ArtificialCancelOrderQueryParam();
OrderChildSqlProvider orderChildSqlProvider = new OrderChildSqlProvider();
String sql = orderChildSqlProvider.findArtificialCancelOrder(param);
List<Integer> statusList = Arrays.asList(
OrderChildEnum.Status.CREATED.getCode(),
OrderChildEnum.Status.GO_TO_SEND.getCode(),
OrderChildEnum.Status.ARRIVE_SEND.getCode(),
OrderChildEnum.Status.LOAD.getCode(),
OrderChildEnum.Status.GO_TO_RECEIVE.getCode(),
OrderChildEnum.Status.ARRIVE_RECEIVE.getCode(),
OrderChildEnum.Status.UNLOAD.getCode()
);
String expectedSql = "SELECT child_no, goods_name, freight_price, order_no, "
+ "send_address, receive_address, "
+ "driver_user_no, driver_name, driver_mobile, "
+ "truck_no, unload_pound_no, weight, "
+ "cancel_remark, pound_status, status, "
+ "DATE_FORMAT(load_deadline, '%Y-%m-%d %H:%i:%s') AS loadDeadline, "
+ "DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') AS createTime, "
+ "DATE_FORMAT(unload_time, '%Y-%m-%d %H:%i:%s') AS unloadTime "
+ "FROM order_child "
+ "WHERE 1=1 "
+ "AND status IN (" + String.join(", ", statusList.stream().map(String::valueOf).collect(Collectors.toList())) + ")";
Assert.assertEquals("SQL statement does not match expected output for empty parameters", expectedSql, sql);
}
}
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论