You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

708 lines
24 KiB

package com.gaotao.modules.automatedWarehouse.controller;
import com.gaotao.common.utils.R;
import com.gaotao.modules.api.entity.IfsInventoryPart;
import com.gaotao.modules.api.service.IfsApiService;
import com.gaotao.modules.automatedWarehouse.entity.*;
import com.gaotao.modules.automatedWarehouse.service.WcsIntegrationService;
import com.gaotao.modules.automatedWarehouse.service.PalletChangeStationService;
import com.gaotao.modules.automatedWarehouse.service.PalletCancelService;
import com.gaotao.modules.base.entity.PalletType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/wcsIntegration")
public class WcsIntegrationController {
@Autowired
private WcsIntegrationService wcsIntegrationService;
@Autowired
private IfsApiService ifsApiService;
@Autowired
private PalletChangeStationService palletChangeStationService;
@Autowired
private PalletCancelService palletCancelService;
@PostMapping(value="/getShopOrderFromIFSWithOrderNo")
@ResponseBody
public R getIfsInventoryPart(@RequestBody IfsInventoryPart data) throws Exception{
//TODO 调用rifs接口获取列表数据
List<IfsInventoryPart> rows = ifsApiService.getIfsInventoryPart(data);
return R.ok().put("rows", rows);
}
@PostMapping(value="/palletListForPartNo")
@ResponseBody
public R palletListForPartNo(@RequestBody PartPalletData data) throws Exception{
List<WmsLabelAndPalletData> rows = wcsIntegrationService.palletListForPartNo(data);
return R.ok().put("rows", rows);
}
/**
*
* @description call栈板出来
* @author 常熟吴彦祖
* @date 2025/9/19 16:55
* @return R
*/
@PostMapping(value="/callPalletFromWcs")
@ResponseBody
public R callPalletFromWcs(@RequestBody List<WmsLabelAndPalletData> data) {
wcsIntegrationService.callPalletFromWcs(data);
return R.ok();
}
/**
* 【新方法】直接Call栈板(不使用定时任务方式) - rqrq
* @Description 实时调用WCS接口,返回失败的栈板信息 - rqrq
* @Title callPalletFromWcsNew
* @param data 栈板明细列表
* @return R
* @author rqrq
* @date 2025/10/04
*/
@PostMapping(value="/callPalletFromWcsNew")
@ResponseBody
public R callPalletFromWcsNew(@RequestBody List<WmsLabelAndPalletData> data) throws Exception {
Map<String, Object> result = wcsIntegrationService.callPalletFromWcsNew(data);
return R.ok()
.put("totalCount", result.get("totalCount"))
.put("successCount", result.get("successCount"))
.put("failedCount", result.get("failedCount"))
.put("failedPalletIds", result.get("failedPalletIds"))
.put("failedReasons", result.get("failedReasons"));
}
// ==================== 打托相关接口 - AI制作 ====================
/**
* 检查栈板是否存在并获取位置信息 - AI制作
*/
@PostMapping(value="/checkPalletExists")
@ResponseBody
public R checkPalletExists(@RequestBody Map<String, Object> params) {
Map<String, Object> result = wcsIntegrationService.checkPalletExists(params);
return R.ok()
.put("positions", result.get("positions"))
.put("palletType", result.get("palletType"))
.put("locationCode", result.get("locationCode"))
.put("palletId", result.get("palletId"));
}
/**
* @Description 简单查询栈板信息(无任何校验)- rqrq
* @Title getPalletInfoSimple
* @param params 查询参数(site, palletId)
* @return R
* @author rqrq
* @date 2025/10/09
*/
@PostMapping(value="/getPalletInfoSimple")
public R getPalletInfoSimple(@RequestBody Map<String, Object> params) throws Exception {
Map<String, Object> result = wcsIntegrationService.getPalletInfoSimple(params);
return R.ok()
.put("palletId", result.get("palletId"))
.put("positions", result.get("positions"))
.put("palletType", result.get("palletType"))
.put("locationCode", result.get("locationCode"));
}
/**
* 获取栈板明细 - AI制作
*/
@PostMapping(value="/getPalletDetails")
@ResponseBody
public R getPalletDetails(@RequestBody Map<String, Object> params) {
try {
List<Map<String, Object>> details = wcsIntegrationService.getPalletDetails(params);
return R.ok().put("details", details);
} catch (Exception e) {
return R.error(e.getMessage());
}
}
/**
* 根据位置获取层数 - AI制作
*/
@PostMapping(value="/getLayersByPosition")
@ResponseBody
public R getLayersByPosition(@RequestBody Map<String, Object> params) {
try {
List<Integer> layers = wcsIntegrationService.getLayersByPosition(params);
return R.ok().put("layers", layers);
} catch (Exception e) {
return R.error(e.getMessage());
}
}
/**
* 保存栈板明细(扫进) - AI制作
*/
@PostMapping(value="/savePalletDetail")
@ResponseBody
public R savePalletDetail(@RequestBody Map<String, Object> params) {
try {
wcsIntegrationService.savePalletDetail(params);
return R.ok();
} catch (Exception e) {
return R.error(e.getMessage());
}
}
/**
* 删除栈板明细(扫出) - AI制作
*/
@PostMapping(value="/deletePalletDetail")
@ResponseBody
public R deletePalletDetail(@RequestBody Map<String, Object> params) {
try {
wcsIntegrationService.deletePalletDetail(params);
return R.ok();
} catch (Exception e) {
return R.error(e.getMessage());
}
}
/**
* @Description 恢复标签到原栈板(分拣撤回)- rqrq
* @Title restorePalletDetail
* @param data 恢复标签请求参数实体
* @return R
* @author rqrq
* @date 2025/10/09
*/
@PostMapping(value="/restorePalletDetail")
@ResponseBody
public R restorePalletDetail(@RequestBody RestorePalletDetailData data) throws Exception {
wcsIntegrationService.restorePalletDetail(data);
return R.ok();
}
/**
* @Description 查询标签当前所在栈板的信息 - rqrq
* @Title getLabelInfo
* @param data 查询标签信息请求参数实体
* @return R
* @author rqrq
* @date 2025/10/09
*/
@PostMapping(value="/getLabelInfo")
@ResponseBody
public R getLabelInfo(@RequestBody GetLabelInfoData data) throws Exception {
LabelInfoResult row = wcsIntegrationService.getLabelInfo(data);
return R.ok().put("row", row);
}
/**
* 获取编辑位置时的层数选项(排除指定标签) - AI制作
*/
@PostMapping(value="/getLayersForEdit")
@ResponseBody
public R getLayersForEdit(@RequestBody Map<String, Object> params) {
try {
List<Integer> layers = wcsIntegrationService.getLayersForEdit(params);
return R.ok().put("layers", layers);
} catch (Exception e) {
return R.error(e.getMessage());
}
}
/**
* 更新栈板明细位置 - AI制作
*/
@PostMapping(value="/updatePalletDetailPosition")
@ResponseBody
public R updatePalletDetailPosition(@RequestBody Map<String, Object> params) {
try {
wcsIntegrationService.updatePalletDetailPosition(params);
return R.ok();
} catch (Exception e) {
return R.error(e.getMessage());
}
}
/**
* 获取指定层数下各个位置的可用状态 - rqrq
* @param params {site, palletId, layer}
* @return 各位置可用状态
*/
@PostMapping(value="/getAvailablePositionsForLayer")
@ResponseBody
public R getAvailablePositionsForLayer(@RequestBody Map<String, Object> params) throws Exception {
Map<String, Object> result = wcsIntegrationService.getAvailablePositionsForLayer(params);
return R.ok().put("data", result);
}
// ==================== 运输任务相关接口 - AI制作 ====================
/**
* 获取AGV站点列表 - AI制作
*/
@PostMapping(value="/getAgvStations")
@ResponseBody
public R getAgvStations(@RequestBody Map<String, Object> params) {
try {
List<Map<String, Object>> stations = wcsIntegrationService.getAgvStations(params);
return R.ok().put("stations", stations);
} catch (Exception e) {
return R.error(e.getMessage());
}
}
/**
* 获取可用的AGV站点列表(已在后台过滤状态和类型)- AI制作
* 参数:statusDb - 站点状态(0-空闲,1-有货),不传则返回所有正式站点
*/
@PostMapping(value="/getAvailableAgvStations")
@ResponseBody
public R getAvailableAgvStations(@RequestBody Map<String, Object> params) {
try {
List<AgvStation> stations = wcsIntegrationService.getAvailableAgvStations(params);
return R.ok().put("stations", stations);
} catch (Exception e) {
return R.error(e.getMessage());
}
}
/**
* 根据起点站点获取可达目标站点 - AI制作
*/
@PostMapping(value="/getTargetStations")
@ResponseBody
public R getTargetStations(@RequestBody Map<String, Object> params) {
try {
List<Map<String, Object>> targets = wcsIntegrationService.getTargetStations(params);
return R.ok().put("targets", targets);
} catch (Exception e) {
return R.error(e.getMessage());
}
}
/**
* 创建栈板运输任务 - AI制作
*/
@PostMapping(value="/createPalletTransportTask")
@ResponseBody
public R createPalletTransportTask(@RequestBody Map<String, Object> params) {
try {
wcsIntegrationService.createPalletTransportTask(params);
return R.ok();
} catch (Exception e) {
return R.error(e.getMessage());
}
}
/**
* Call栈板到指定站点 - AI制作
*/
@PostMapping(value="/callPalletToStation")
@ResponseBody
public R callPalletToStation(@RequestBody CallPalletRequestDto request) {
wcsIntegrationService.callPalletToStation(request);
return R.ok();
}
/**
* @Description 组盘完成后调用运输任务(自动判断空托盘/有货托盘)- rqrq
* @Title callPalletToStationWithUpdateZuPan
* @param request {site, startStation, targetArea, palletId}
* @return R
* @author rqrq
* @date 2025-10-31
*/
@PostMapping(value="/callPalletToStationWithUpdateZuPan")
@ResponseBody
public R callPalletToStationWithUpdateZuPan(@RequestBody CallPalletRequestDto request) {
System.out.println("开始处理组盘入库请求 - rqrq");
// 参数校验 - rqrq
if (!StringUtils.hasText(request.getSite()) || !StringUtils.hasText(request.getPalletId())) {
return R.error("工厂编码和栈板编码不能为空");
}
// 判断栈板是否有明细数据 - rqrq
boolean hasPalletDetail = wcsIntegrationService.checkPalletHasDetail(request.getSite(), request.getPalletId());
if (hasPalletDetail) {
// 有明细数据,调用组盘入库流程 - rqrq
System.out.println("栈板有明细数据,执行组盘入库流程 - rqrq");
wcsIntegrationService.callPalletToStationWithUpdateZuPan(request);
} else {
// 空托盘,调用空托盘入库流程 - rqrq
System.out.println("栈板无明细数据,执行空托盘入库流程 - rqrq");
Map<String, Object> params = new HashMap<>();
params.put("site", request.getSite());
params.put("palletId", request.getPalletId());
params.put("transportFlag", "Y"); // 默认入库并运输 - rqrq
params.put("count", 1);
wcsIntegrationService.notifyEmptyPalletInbound(params);
}
return R.ok();
}
/**
* 获取栈板详细信息(包含palletType和autoSort) - AI制作
*/
@PostMapping(value="/getPalletInfo")
@ResponseBody
public R getPalletInfo(@RequestBody Map<String, Object> params) {
try {
com.gaotao.modules.warehouse.entity.PalletData palletInfo = wcsIntegrationService.getPalletInfo(params);
return R.ok().put("row", palletInfo);
} catch (Exception e) {
return R.error(e.getMessage());
}
}
/**
* 更新栈板类型和自动分拣标志 - AI制作
*/
@PostMapping(value="/updatePalletTypeAndAutoSort")
@ResponseBody
public R updatePalletTypeAndAutoSort(@RequestBody Map<String, Object> params) {
try {
wcsIntegrationService.updatePalletTypeAndAutoSort(params);
return R.ok();
} catch (Exception e) {
return R.error(e.getMessage());
}
}
/**
* 完成组托(不创建运输任务,只推送组托数据到WCS) - AI制作
*/
@PostMapping(value="/completePalletAssembly")
@ResponseBody
public R completePalletAssembly(@RequestBody Map<String, Object> params) throws Exception {
wcsIntegrationService.completePalletAssembly(params);
return R.ok();
}
/**
* 手工分拣组托
*/
@PostMapping(value="/completePalletAssemblyForFenJian")
@ResponseBody
public R completePalletAssemblyForFenJian(@RequestBody Map<String, Object> params) throws Exception {
wcsIntegrationService.completePalletAssemblyForFenJian(params);
return R.ok();
}
// ==================== 栈板换站相关接口 - rqrq ====================
/**
* @Description 检查栈板是否可以换站(判断calling_flag和获取当前站点信息)- rqrq
* @Title checkPalletForChangeStation
* @param params {site, palletId}
* @return R
* @author rqrq
* @date 2025/10/16
*/
@PostMapping(value="/checkPalletForChangeStation")
@ResponseBody
public R checkPalletForChangeStation(@RequestBody Map<String, Object> params) {
CheckPalletResult row = wcsIntegrationService.checkPalletForChangeStation(params);
return R.ok().put("row", row);
}
/**
* @Description 获取可选择的区域列表(choose_able为Y)- rqrq
* @Title getAreaOptionsForChange
* @param params 查询参数
* @return R
* @author rqrq
* @date 2025/10/16
*/
@PostMapping(value="/getAreaOptionsForChange")
@ResponseBody
public R getAreaOptionsForChange(@RequestBody Map<String, Object> params) {
List<com.gaotao.modules.automatedWarehouse.entity.Area> rows = wcsIntegrationService.getAreaOptionsForChange(params);
return R.ok().put("rows", rows);
}
/**
* @Description 根据区域获取可用站点列表 - rqrq
* @Title getStationsByArea
* @param params {areaId}
* @return R
* @author rqrq
* @date 2025/10/16
*/
@PostMapping(value="/getStationsByArea")
@ResponseBody
public R getStationsByArea(@RequestBody Map<String, Object> params) {
List<AgvStation> rows = wcsIntegrationService.getStationsByArea(params);
return R.ok().put("rows", rows);
}
/**
* @Description 提交栈板换站任务 - rqrq
* @Title submitChangeStationTask
* @param request 换站任务请求参数
* @return R
* @author rqrq
* @date 2025/10/16
*/
@PostMapping(value="/submitChangeStationTask")
@ResponseBody
public R submitChangeStationTask(@RequestBody CallPalletRequestDto request) {
palletChangeStationService.handleChangeStationTask(request);
return R.ok();
}
/**
* @Description Call料到指定位置(Call料+预约取盘到指定区域/站点)- rqrq
* @Title callOutToStation
* @param request Call料到指定位置请求参数
* @return R
* @author rqrq
* @date 2025/10/17
*/
@PostMapping(value="/callOutToStation")
@ResponseBody
public R callOutToStation(@RequestBody CallOutToStationRequestDto request) {
wcsIntegrationService.callOutToStation(request);
return R.ok();
}
// ==================== 手工移动托盘相关方法 - rqrq ====================
/**
* @Description 检查托盘是否可以手工移动 - rqrq
* @Title checkPalletForManualMove
* @param params {site, palletId}
* @return R
* @author rqrq
* @date 2025/10/16
*/
@PostMapping(value="/checkPalletForManualMove")
@ResponseBody
public R checkPalletForManualMove(@RequestBody Map<String, Object> params) {
CheckPalletResult row = wcsIntegrationService.checkPalletForManualMove(params);
return R.ok().put("row", row);
}
/**
* @Description 移出站点 - rqrq
* @Title removeFromStation
* @param params {site, palletId, stationCode}
* @return R
* @author rqrq
* @date 2025/10/16
*/
@PostMapping(value="/removeFromStation")
@ResponseBody
public R removeFromStation(@RequestBody Map<String, Object> params) {
wcsIntegrationService.removeFromStation(params);
return R.ok();
}
/**
* @Description 获取可绑定的区域列表 - rqrq
* @Title getAreaOptionsForBind
* @param params {site}
* @return R
* @author rqrq
* @date 2025/10/16
*/
@PostMapping(value="/getAreaOptionsForBind")
@ResponseBody
public R getAreaOptionsForBind(@RequestBody Map<String, Object> params) {
List<Area> rows = wcsIntegrationService.getAreaOptionsForChange(params);
return R.ok().put("rows", rows);
}
/**
* @Description 根据区域获取可绑定的站点列表 - rqrq
* @Title getStationsForBind
* @param params {site, areaId}
* @return R
* @author rqrq
* @date 2025/10/16
*/
@PostMapping(value="/getStationsForBind")
@ResponseBody
public R getStationsForBind(@RequestBody Map<String, Object> params) {
List<AgvStation> rows = wcsIntegrationService.getStationsByArea(params);
return R.ok().put("rows", rows);
}
/**
* @Description 绑定托盘到站点 - rqrq
* @Title bindPalletToStation
* @param params {site, palletId, stationCode}
* @return R
* @author rqrq
* @date 2025/10/16
*/
@PostMapping(value="/bindPalletToStation")
@ResponseBody
public R bindPalletToStation(@RequestBody Map<String, Object> params) {
wcsIntegrationService.bindPalletToStation(params);
return R.ok();
}
// ==================== 空托盘组盘相关方法 - rqrq ====================
/**
* @Description 检查托盘是否为空托盘 - rqrq
* @Title checkEmptyPallet
* @param params {site, palletId}
* @return R
* @author rqrq
* @date 2025/10/16
*/
@PostMapping(value="/checkEmptyPallet")
@ResponseBody
public R checkEmptyPallet(@RequestBody Map<String, Object> params) {
CheckPalletResult row = wcsIntegrationService.checkEmptyPallet(params);
return R.ok().put("row", row);
}
/**
* @Description 获取托盘类型列表(根据pallet_family过滤)- rqrq
* @Title getPalletTypes
* @param params {site, palletFamily}
* @return R
* @author rqrq
* @date 2025/10/16
*/
@PostMapping(value="/getPalletTypes")
@ResponseBody
public R getPalletTypes(@RequestBody Map<String, Object> params) {
List<PalletType> rows = wcsIntegrationService.getPalletTypes(params);
return R.ok().put("rows", rows);
}
/**
* @Description 空托盘通知入库 - rqrq
* @Title notifyEmptyPalletInbound
* @param params {site, palletId, transportFlag}
* @return R
* @author rqrq
* @date 2025/10/16
*/
@PostMapping(value="/notifyEmptyPalletInbound")
@ResponseBody
public R notifyEmptyPalletInbound(@RequestBody Map<String, Object> params) {
wcsIntegrationService.notifyEmptyPalletInbound(params);
return R.ok();
}
/**
* @Description 调用空托盘到指定站点(选择区域、站点、栈板类型)- rqrq
* @Title callEmptyPalletToStation
* @param params {site, stationCode, palletType}
* @return R
* @author rqrq
* @date 2025/10/19
*/
@PostMapping(value="/callEmptyPalletToStation")
@ResponseBody
public R callEmptyPalletToStation(@RequestBody Map<String, Object> params) throws Exception {
wcsIntegrationService.callEmptyPalletToStation(params);
return R.ok();
}
// ==================== 取消WCS组盘相关方法 - rqrq ====================
/**
* @Description 检查栈板WCS组盘状态 - rqrq
* @Title checkPalletWcsStatus
* @param data 请求参数实体(包含site, palletId)
* @return R
* @author rqrq
* @date 2025/10/16
*/
@PostMapping(value="/checkPalletWcsStatus")
@ResponseBody
public R checkPalletWcsStatus(@RequestBody CancelWcsPalletData data) throws Exception {
CheckPalletResult row = wcsIntegrationService.checkPalletWcsStatus(data);
return R.ok().put("row", row);
}
/**
* @Description 取消组盘(包含AGV任务检查)- rqrq
* @Title cancelWcsPallet
* @param data 请求参数实体(包含site, palletId)
* @return R
* @author rqrq
* @date 2025/10/16
*/
@PostMapping(value="/cancelWcsPallet")
@ResponseBody
public R cancelWcsPallet(@RequestBody CancelWcsPalletData data) throws Exception {
palletCancelService.cancelWcsPallet(data);
return R.ok();
}
/**
* @Description 移出全部物料 - rqrq
* @Title removeAllPalletDetails
* @param data 请求参数实体(包含site, palletId)
* @return R
* @author rqrq
* @date 2025/10/16
*/
@PostMapping(value="/removeAllPalletDetails")
@ResponseBody
public R removeAllPalletDetails(@RequestBody CancelWcsPalletData data) throws Exception {
wcsIntegrationService.removeAllPalletDetails(data);
return R.ok();
}
/**
* @Description 结束分拣(下达预约送货任务到Z104区域,并更新pallet_detail的wcs_flag为1)- rqrq
* @Title finishSorting
* @param params {site, palletId}
* @return R
* @author rqrq
* @date 2025/10/19
*/
@PostMapping(value="/finishSorting")
@ResponseBody
public R finishSorting(@RequestBody Map<String, Object> params) throws Exception {
wcsIntegrationService.finishSorting(params);
return R.ok();
}
@PostMapping(value="/finishSortingNoAgv")
@ResponseBody
public R finishSortingNoAgv(@RequestBody Map<String, Object> params) throws Exception {
wcsIntegrationService.finishSortingNoAgv(params);
return R.ok();
}
// ==================== 分拣明细查询相关方法 - rqrq ====================
/**
* @Description 根据栈板站点获取分拣明细RFID列表 - rqrq
* @Title getSortingList
* @param params {site, palletId}
* @return R (返回devCode和rfidList)
* @author rqrq
* @date 2025/11/01
*/
@PostMapping(value="/getSortingList")
@ResponseBody
public R getSortingList(@RequestBody Map<String, Object> params) throws Exception {
Map<String, Object> result = wcsIntegrationService.getSortingList(params);
return R.ok()
.put("devCode", result.get("devCode"))
.put("rfidList", result.get("rfidList"));
}
}