物流项目后端接口

liweidong
绫Umbrella 4 weeks ago
parent 7e9cbb0248
commit fa515c899c
  1. 50
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/vo/BoxbarcodeDetailsVO.java
  2. 41
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/vo/QuantityLocationVO.java
  3. 23
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/vo/StationNameBoxBarcodeVO.java
  4. 14
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/controller/OrderBindController.java
  5. 17
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/controller/OrderBoxController.java
  6. 40
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/controller/StationController.java
  7. 1
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/IOrderBindService.java
  8. 8
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/IOrderBoxService.java
  9. 5
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/IStationService.java
  10. 100
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/IOrderBoxServiceImpl.java
  11. 6
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/OrderBindServiceImpl.java
  12. 14
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/PipelineServiceImpl.java
  13. 14
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/StationServiceImpl.java
  14. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/TaskExecuteRecordServiceImpl.java

@ -0,0 +1,50 @@
package org.springblade.desk.logistics.pojo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* 获取箱条码订单详情前端返回
*
* @author
* @since
*/
@Data
@Schema(description = "获取箱条码订单详情前端返回")
public class BoxbarcodeDetailsVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 箱条码
*/
@Schema(description = "箱条码")
private String boxBarcode;
/**
* 订单数量
*/
@Schema(description = "订单数量")
private Long quantity;
/**
* 总重量
*/
@Schema(description = "总重量")
private BigDecimal weight;
/**
* 订单详情数据
*/
@Schema(description = "订单详情数据")
private List<YieldOrder> yieldOrderList;
}

@ -0,0 +1,41 @@
package org.springblade.desk.logistics.pojo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 获取订单数量与作业中心前端返回
*
* @author
* @since
*/
@Data
@Schema(description = "获取订单数量与作业中心前端返回")
public class QuantityLocationVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 箱条码
*/
@Schema(description = "箱条码")
private String boxBarcode;
/**
* 订单数量
*/
@Schema(description = "订单数量")
private Long quantity;
/**
* 作业中心名字
*/
@Schema(description = "作业中心名字")
private String wcName;
}

@ -0,0 +1,23 @@
package org.springblade.desk.logistics.pojo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springblade.desk.logistics.pojo.entity.Station;
import java.io.Serial;
import java.io.Serializable;
/**
* 获取订单数量与作业中心前端返回
*
* @author
* @since
*/
@Data
@Schema(description = "获取订单数量与作业中心前端返回")
public class StationNameBoxBarcodeVO implements Serializable {
private BoxbarcodeDetailsVO boxbarcodeDetailsVO;
private Station station;
}

@ -9,12 +9,15 @@ import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springblade.common.exception.BusinessException;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.pojo.dto.BoxBindingDto;
import org.springblade.desk.logistics.pojo.dto.OrderBindDto;
import org.springblade.desk.logistics.pojo.dto.ReturnToWarehouseDto;
import org.springblade.desk.logistics.pojo.dto.TaskDto;
import org.springblade.desk.logistics.pojo.vo.OrderBindVO;
import org.springblade.desk.logistics.pojo.vo.TaskVO;
@ -23,6 +26,8 @@ import org.springblade.desk.logistics.service.IOrderBoxService;
import org.springblade.desk.order.service.IYieldOrderService;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
/**
* 订单绑定对象控制器
*
@ -94,5 +99,14 @@ public class OrderBindController {
return iYieldOrderService.getCardNo(cardNo);
}
@GetMapping("/boxbarcode-details")
@ApiOperationSupport(order = 6)
@Operation(
summary = "箱条码查询",
description = "获取箱条码数据详情"
)
public R getBoxbarcodeDetails(@RequestParam String boxBarcode) throws BusinessException {
return iOrderBoxService.getBoxbarcodeDetails(boxBarcode);
}
}

@ -13,6 +13,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jodd.util.StringUtil;
import lombok.AllArgsConstructor;
import lombok.Value;
import org.springblade.common.exception.BusinessException;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
@ -27,6 +28,7 @@ import org.springblade.desk.logistics.pojo.dto.TaskDto;
import org.springblade.desk.logistics.pojo.vo.TaskVO;
import org.springblade.desk.logistics.service.IOrderBoxService;
import org.springblade.desk.logistics.service.IStationService;
import org.springblade.desk.logistics.service.ITaskService;
import org.springframework.web.bind.annotation.*;
@ -47,6 +49,7 @@ public class OrderBoxController extends BladeController {
private final ITaskService taskService;
@PostMapping("/getWeighing")
@ApiOperationSupport(order = 1)
@Operation(
@ -119,9 +122,21 @@ public class OrderBoxController extends BladeController {
@GetMapping("/receive")
@ApiOperationSupport(order = 7)
@Operation(summary = "接收", description = "接收释放站点")
public R receive(@RequestParam String stationCode) {
public R receive(@RequestParam String stationCode) throws BusinessException {
return iOrderBoxService.receive(stationCode);
}
/**
* 回调作业中心list
*/
@GetMapping("/getQuantity-Location")
@ApiOperationSupport(order = 7)
@Operation(summary = "订单位置和重量", description = "获取箱条码对应的订单位置与作业中心")
public R getQuantityLocation(@RequestParam String boxBarcode) {
return iOrderBoxService.getQuantityLocation(boxBarcode);
}
}

@ -0,0 +1,40 @@
package org.springblade.desk.logistics.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.service.IOrderBoxService;
import org.springblade.desk.logistics.service.IStationService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@AllArgsConstructor
@RequestMapping("/station")
@Tag(name = "站点", description = "站点相关接口")
public class StationController {
private final IStationService stationService;
private final IOrderBoxService iOrderBoxService;
/**
* 获取起点站点名字
*/
@GetMapping("/getName")
@ApiOperationSupport(order = 1)
@Operation(summary = "站点名字", description = "获取站点名字")
public R getStationName(@RequestParam String stationCode) {
return stationService.getStationName(stationCode);
}
/**
* 获取起点站点名字
*/
@GetMapping("/getName-boxbarcode")
@ApiOperationSupport(order = 1)
@Operation(summary = "站点名字", description = "获取站点名字")
public R getStationNameBoxBarcode(@RequestParam String stationCode) {
return iOrderBoxService.getStationNameBoxBarcode(stationCode);
}
}

@ -53,4 +53,5 @@ public interface IOrderBindService extends BaseService<OrderBind> {
R getBoxcodelist();
}

@ -1,5 +1,6 @@
package org.springblade.desk.logistics.service;
import org.springblade.common.exception.BusinessException;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.pojo.dto.BoxBindingDto;
import org.springblade.desk.logistics.pojo.dto.ReturnToWarehouseDto;
@ -44,8 +45,13 @@ public interface IOrderBoxService {
R receive(String stationCode);
R receive(String stationCode) throws BusinessException;
R saveTask(ReturnToWarehouseDto returnToWarehouseDto,Boolean agvSend);
R getWcId(String boxBarcode);
R getQuantityLocation(String boxBarcode);
R getBoxbarcodeDetails(String boxBarcode);
R getStationNameBoxBarcode(String stationCode);
}

@ -26,6 +26,7 @@
package org.springblade.desk.logistics.service;
import org.springblade.core.mp.base.BaseService;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.pojo.entity.Location;
import org.springblade.desk.logistics.pojo.entity.Station;
@ -52,4 +53,8 @@ public interface IStationService extends BaseService<Station> {
* @return
*/
Station getByStationCode(String stationCode);
R getStationName(String stationCode);
}

@ -6,14 +6,20 @@ import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.exception.BusinessException;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.desk.dashboard.pojo.entity.BsWorkCenterEntity;
import org.springblade.desk.dashboard.service.IBsWorkCenterService;
import org.springblade.desk.logistics.pojo.dto.BoxBindingDto;
import org.springblade.desk.logistics.pojo.dto.ReturnToWarehouseDto;
import org.springblade.desk.logistics.pojo.entity.*;
import org.springblade.desk.logistics.pojo.vo.BoxbarcodeDetailsVO;
import org.springblade.desk.logistics.pojo.vo.BsWorkCenterVO;
import org.springblade.desk.logistics.pojo.vo.QuantityLocationVO;
import org.springblade.desk.logistics.pojo.vo.StationNameBoxBarcodeVO;
import org.springblade.desk.logistics.service.*;
import org.springblade.desk.logistics.utils.AgvTaskTypeUtil;
import org.springblade.desk.order.pojo.entity.YieldOrder;
@ -307,7 +313,7 @@ public class IOrderBoxServiceImpl implements IOrderBoxService {
* </ul>
*/
@Override
public R<?> receive(String stationCode) {
public R<?> receive(String stationCode) throws BusinessException {
log.info("【站点状态接收】开始处理 - 站点编码:{}", stationCode);
// 1. 参数校验
@ -333,6 +339,10 @@ public class IOrderBoxServiceImpl implements IOrderBoxService {
// 4. 返回结果
if (updateResult) {
log.info("【站点状态接收】站点编码{}已置为空闲", stationCode);
List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getStationId, targetStation.getId()).orderByDesc(Task::getUpdateTime));
BoxBindingDto boxBindingDto = new BoxBindingDto();
boxBindingDto.setBoxBarcode(taskList.get(0).getBoxBarcode());
orderBindService.boxUnbind(boxBindingDto);
return R.success();
} else {
log.error("【站点状态接收】站点编码{}状态更新失败", stationCode);
@ -477,6 +487,8 @@ public class IOrderBoxServiceImpl implements IOrderBoxService {
return R.data(wcId);
}
// ========================== 私有工具方法 ==========================
/**
@ -929,4 +941,90 @@ public class IOrderBoxServiceImpl implements IOrderBoxService {
log.warn("【订单绑定校验】{}", errorMsg);
return R.fail(errorMsg);
}
@Override
public R getQuantityLocation(String boxBarcode) {
// 1. 校验箱条码非空(增加空白字符校验)
if (StringUtils.isEmpty(boxBarcode) || boxBarcode.trim().isEmpty()) {
return R.fail("箱条码信息不能为空");
}
// 2. 查询箱条码绑定信息(使用Spring工具类简化空值判断)
List<OrderBind> orderBindList = orderBindService.list(
new LambdaQueryWrapper<OrderBind>()
.eq(OrderBind::getBoxBarcode, boxBarcode.trim())
.eq(OrderBind::getBindingStatus, OrderBind.STATUS_BOUND)
);
if (CollectionUtils.isEmpty(orderBindList)) {
return R.fail("未查询到该箱条码的绑定信息");
}
// 3. 构建返回VO(提前获取首个元素,避免多次调用get(0))
OrderBind firstOrderBind = orderBindList.get(0);
QuantityLocationVO quantityLocationVO = new QuantityLocationVO();
quantityLocationVO.setBoxBarcode(boxBarcode.trim());
quantityLocationVO.setQuantity((long) orderBindList.size()); // Long类型可直接自动装箱,无需强制转换
// 4. 查询作业中心信息(增加wcId空值校验,避免NPE)
Long wcId = yieldOrderService.getWcId(firstOrderBind.getOrderId());
if (wcId == null) {
return R.fail("订单未关联作业中心");
}
BsWorkCenterEntity workCenter = bsWorkCenterService.getById(wcId);
if (workCenter == null) {
return R.fail("订单所属作业中心异常");
}
quantityLocationVO.setWcName(workCenter.getWcName());
return R.data(quantityLocationVO);
}
@Override
public R getBoxbarcodeDetails(String boxBarcode) {
if (StringUtils.isBlank(boxBarcode)) {
return R.fail("箱条码不能为空");
}
List<OrderBind> orderBindList = orderBindService.list(new LambdaQueryWrapper<OrderBind>().eq(OrderBind::getBoxBarcode, boxBarcode).eq(OrderBind::getBindingStatus, OrderBind.STATUS_BOUND));
if (orderBindList==null||orderBindList.size()==0) {
BoxbarcodeDetailsVO boxbarcodeDetailsVO = new BoxbarcodeDetailsVO();
boxbarcodeDetailsVO.setBoxBarcode(boxBarcode);
boxbarcodeDetailsVO.setWeight(new BigDecimal(0));
boxbarcodeDetailsVO.setQuantity(0L);
return R.data(boxbarcodeDetailsVO);
}
List<Long> orderIdList = orderBindList.stream()
.map(OrderBind::getOrderId)
.collect(Collectors.toList());
BigDecimal totalWeight = calculateOrderTotalWeight(orderIdList);
List<YieldOrder> orderList = yieldOrderService.list(
new LambdaQueryWrapper<YieldOrder>().in(YieldOrder::getId, orderIdList)
);
BoxbarcodeDetailsVO boxbarcodeDetailsVO = new BoxbarcodeDetailsVO();
boxbarcodeDetailsVO.setBoxBarcode(boxBarcode);
boxbarcodeDetailsVO.setWeight(totalWeight);
boxbarcodeDetailsVO.setQuantity((long) orderList.size());
boxbarcodeDetailsVO.setYieldOrderList(orderList);
return R.data(boxbarcodeDetailsVO);
}
@Override
public R getStationNameBoxBarcode(String stationCode) {
R stationR = stationService.getStationName(stationCode);
if (!stationR.isSuccess()) {
return stationR;
}
Station station = (Station) stationR.getData();
List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getStationId, station.getId()).orderByDesc(Task::getUpdateTime));
R boxbarcodeDetailsR = getBoxbarcodeDetails(taskList.get(0).getBoxBarcode());
if (!boxbarcodeDetailsR.isSuccess()) {
return boxbarcodeDetailsR;
}
StationNameBoxBarcodeVO stationNameBoxBarcodeVO = new StationNameBoxBarcodeVO();
stationNameBoxBarcodeVO.setStation(station);
stationNameBoxBarcodeVO.setBoxbarcodeDetailsVO((BoxbarcodeDetailsVO) boxbarcodeDetailsR.getData());
return R.data(stationNameBoxBarcodeVO);
}
}

@ -36,12 +36,15 @@ import org.springblade.desk.logistics.mapper.OrderBindMapper;
import org.springblade.desk.logistics.pojo.dto.BoxBindingDto;
import org.springblade.desk.logistics.pojo.dto.OrderBindDto;
import org.springblade.desk.logistics.pojo.entity.OrderBind;
import org.springblade.desk.logistics.pojo.vo.BoxbarcodeDetailsVO;
import org.springblade.desk.logistics.pojo.vo.OrderBindVO;
import org.springblade.desk.logistics.pojo.vo.TaskVO;
import org.springblade.desk.logistics.service.IOrderBindService;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@ -110,6 +113,8 @@ public class OrderBindServiceImpl extends BaseServiceImpl<OrderBindMapper, Order
return R.data(boxCodeNameList);
}
/**
* 按箱条码批量解绑
* @param boxBarcode 箱条码
@ -156,4 +161,5 @@ public class OrderBindServiceImpl extends BaseServiceImpl<OrderBindMapper, Order
return updateById(orderBind);
}
}

@ -83,13 +83,13 @@ public class PipelineServiceImpl implements IPipelineService {
// 2. 保存称重数据
taskService.savePipelineWeigh(boxBarcode,actualWeight,Task.STATUS_RETURNED);
// 3.超重处理,解绑
BoxBindingDto boxBindingDto = new BoxBindingDto();
boxBindingDto.setBoxBarcode(boxBarcode);
R ret = iOrderBindService.boxUnbind(boxBindingDto);
if(!ret.isSuccess()){
throw new ServiceException("解绑失败: "+boxBarcode);
}
// // 3.超重处理,解绑
// BoxBindingDto boxBindingDto = new BoxBindingDto();
// boxBindingDto.setBoxBarcode(boxBarcode);
// R ret = iOrderBindService.boxUnbind(boxBindingDto);
// if(!ret.isSuccess()){
// throw new ServiceException("解绑失败: "+boxBarcode);
// }
return false;
} else {

@ -25,8 +25,10 @@
*/
package org.springblade.desk.logistics.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.mapper.StationMapper;
import org.springblade.desk.logistics.pojo.entity.Station;
import org.springblade.desk.logistics.service.IStationService;
@ -56,4 +58,16 @@ public class StationServiceImpl extends BaseServiceImpl<StationMapper, Station>
public Station getByStationCode(String stationCode) {
return baseMapper.selectByStationCode(stationCode);
}
@Override
public R getStationName(String stationCode) {
if (stationCode.isEmpty()) {
return R.fail("站点不能为空");
}
List<Station> list = list(new LambdaQueryWrapper<Station>().eq(Station::getStationCode, stationCode));
if (list==null||list.size()==0) {
return R.fail("该站点编码不存在");
}
return R.data(list.get(0));
}
}

@ -433,7 +433,7 @@ public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRec
if (boxBarcode != null && !boxBarcode.trim().isEmpty()) {
BoxBindingDto boxBindingDto = new BoxBindingDto();
boxBindingDto.setBoxBarcode(boxBarcode);
R ret = iOrderBindService.boxUnbind(boxBindingDto);
// R ret = iOrderBindService.boxUnbind(boxBindingDto);
}
if (taskUpdate) {

Loading…
Cancel
Save