Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop
| | |
| | | useNotify, |
| | | Form, |
| | | useCreateController, |
| | | SelectArrayInput, |
| | | } from 'react-admin'; |
| | | import { |
| | | Dialog, |
| | |
| | | import DialogCloseButton from "../../components/DialogCloseButton"; |
| | | import StatusSelectInput from "../../components/StatusSelectInput"; |
| | | import MemoInput from "../../components/MemoInput"; |
| | | import DictionarySelect from "../../components/DictionarySelect"; |
| | | |
| | | const BasStationCreate = (props) => { |
| | | const { open, setOpen } = props; |
| | |
| | | source="stationName" |
| | | parse={v => v} |
| | | autoFocus |
| | | validate={[required()]} |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6} display="flex" gap={1}> |
| | | <NumberInput |
| | | <SelectInput |
| | | label="table.field.basStation.inAble" |
| | | source="inAble" |
| | | choices={[ |
| | | { id: 0, name: '否' }, |
| | | { id: 1, name: '是' }, |
| | | ]} |
| | | validate={[required()]} |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6} display="flex" gap={1}> |
| | | <NumberInput |
| | | <SelectInput |
| | | label="table.field.basStation.outAble" |
| | | source="outAble" |
| | | choices={[ |
| | | { id: 0, name: '否' }, |
| | | { id: 1, name: '是' }, |
| | | ]} |
| | | validate={[required()]} |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6} display="flex" gap={1}> |
| | | <TextInput |
| | | label="table.field.basStation.useStatus" |
| | | source="useStatus" |
| | | parse={v => v} |
| | | <DictionarySelect |
| | | label={translate("table.field.basStation.useStatus")} |
| | | name="useStatus" |
| | | size="small" |
| | | validate={[required()]} |
| | | dictTypeCode="sys_sta_use_stas" |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6} display="flex" gap={1}> |
| | | <NumberInput |
| | | <ReferenceInput source="area" reference="warehouseAreas"> |
| | | <SelectInput |
| | | label="table.field.basStation.area" |
| | | source="area" |
| | | optionText="name" |
| | | optionValue="id" |
| | | fullWidth |
| | | validate={[required()]} |
| | | /> |
| | | </ReferenceInput> |
| | | </Grid> |
| | | <Grid item xs={6} display="flex" gap={1}> |
| | | <NumberInput |
| | | <SelectInput |
| | | label="table.field.basStation.isCrossZone" |
| | | source="isCrossZone" |
| | | choices={[ |
| | | { id: 0, name: '否' }, |
| | | { id: 1, name: '是' }, |
| | | ]} |
| | | validate={[required()]} |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6} display="flex" gap={1}> |
| | | <TextInput |
| | | <ReferenceArrayInput source="areaIds" reference="warehouseAreas"> |
| | | <SelectArrayInput |
| | | label="table.field.basStation.crossZoneArea" |
| | | source="crossZoneArea" |
| | | parse={v => v} |
| | | optionText="name" |
| | | optionValue="id" |
| | | fullWidth |
| | | validate={[required()]} |
| | | /> |
| | | </ReferenceArrayInput> |
| | | </Grid> |
| | | <Grid item xs={6} display="flex" gap={1}> |
| | | <NumberInput |
| | | <SelectInput |
| | | label="table.field.basStation.isWcs" |
| | | source="isWcs" |
| | | choices={[ |
| | | { id: 0, name: '否' }, |
| | | { id: 1, name: '是' }, |
| | | ]} |
| | | validate={[required()]} |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6} display="flex" gap={1}> |
| | | <TextInput |
| | | label="table.field.basStation.wcsData" |
| | | source="wcsData" |
| | | parse={v => v} |
| | | <DictionarySelect |
| | | label={translate("table.field.basStation.containerType")} |
| | | name="containerType" |
| | | size="small" |
| | | validate={[required()]} |
| | | dictTypeCode="sys_container_type" |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6} display="flex" gap={1}> |
| | | <NumberInput |
| | | label="table.field.basStation.containerType" |
| | | source="containerType" |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6} display="flex" gap={1}> |
| | | <TextInput |
| | | label="table.field.basStation.barcode" |
| | | source="barcode" |
| | | parse={v => v} |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6} display="flex" gap={1}> |
| | | <NumberInput |
| | | <SelectInput |
| | | label="table.field.basStation.autoTransfer" |
| | | source="autoTransfer" |
| | | choices={[ |
| | | { id: 0, name: '否' }, |
| | | { id: 1, name: '是' }, |
| | | ]} |
| | | validate={[required()]} |
| | | /> |
| | | </Grid> |
| | | |
| | | <Grid item xs={6} display="flex" gap={1}> |
| | | <StatusSelectInput /> |
| | | </Grid> |
| | | <Grid item xs={12} display="flex" gap={1}> |
| | | <Stack direction="column" spacing={1} width={'100%'}> |
| | | <MemoInput /> |
| | |
| | | private AgvService agvService; |
| | | |
| | | @ApiOperation("站点绑定查询") |
| | | @PreAuthorize("hasAuthority('manager:qlyInspect:list')") |
| | | @PreAuthorize("hasAuthority('manager:basStation:list')") |
| | | @PostMapping("/staBind/list") |
| | | public R getStaBindList(@RequestBody Map<String, Object> params) { |
| | | if (Objects.isNull(params)) { |
| | |
| | | return agvService.getAGVStaBind(params); |
| | | } |
| | | |
| | | @PreAuthorize("hasAuthority('manager:asnOrderItem:list')") |
| | | @PreAuthorize("hasAuthority('manager:basStation:list')") |
| | | @ApiOperation("站点解绑") |
| | | @PostMapping("/AGV/staUnBind") |
| | | public R getAGVStaUnBind(@RequestBody Map<String, Object> params) { |
| | |
| | | } |
| | | return agvService.AGVStaUnBind(params); |
| | | } |
| | | |
| | | @PreAuthorize("hasAuthority('manager:basStation:list')") |
| | | @ApiOperation("AGV启动入库") |
| | | @PostMapping("/AGV/task/start") |
| | | public R AGVInTaskStart(@RequestBody Map<String, Object> params) { |
| | | if (Objects.isNull(params)) { |
| | | return R.error("参数不能为空!!"); |
| | | } |
| | | return agvService.AGVInTaskStart(params, getLoginUserId()); |
| | | } |
| | | } |
| | |
| | | R getStaBindList(Map<String, Object> params); |
| | | |
| | | R AGVStaUnBind(Map<String, Object> params); |
| | | |
| | | R AGVInTaskStart(Map<String, Object> params ,Long loginUserId); |
| | | } |
| | |
| | | import com.vincent.rsf.server.manager.entity.BasStation; |
| | | import com.vincent.rsf.server.manager.entity.WaitPakin; |
| | | import com.vincent.rsf.server.manager.entity.WaitPakinItem; |
| | | import com.vincent.rsf.server.manager.entity.WarehouseAreas; |
| | | import com.vincent.rsf.server.manager.enums.PakinIOStatus; |
| | | import com.vincent.rsf.server.manager.enums.StaUseStatusType; |
| | | import com.vincent.rsf.server.manager.service.BasStationService; |
| | | import com.vincent.rsf.server.manager.service.WaitPakinItemService; |
| | | import com.vincent.rsf.server.manager.service.WaitPakinService; |
| | | import com.vincent.rsf.server.manager.service.*; |
| | | import com.vincent.rsf.server.manager.utils.LocManageUtil; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | |
| | | private BasStationService basStationService; |
| | | @Autowired |
| | | private WaitPakinItemService waitPakinItemService; |
| | | @Autowired |
| | | private WarehouseAreasService warehouseAreasService; |
| | | @Autowired |
| | | private TaskService taskService; |
| | | |
| | | |
| | | @Override |
| | | public R AGVInTaskStart(Map<String, Object> params,Long loginUserId ) { |
| | | String sta = params.get("sta").toString(); |
| | | String area = params.get("area").toString(); |
| | | if (Cools.isEmpty(sta)){ |
| | | throw new CoolException("接驳位条码不能为空"); |
| | | } |
| | | if (Cools.isEmpty(area)){ |
| | | throw new CoolException("目标库区不能为空"); |
| | | } |
| | | BasStation basStation = basStationService.getOne(new LambdaQueryWrapper<BasStation>() |
| | | .eq(BasStation::getStationName, sta) |
| | | .eq(BasStation::getUseStatus,StaUseStatusType.TYPE_F.type) |
| | | ); |
| | | if (Cools.isEmpty(basStation)){ |
| | | throw new CoolException("未找到接驳站点信息,请检查站点状态"); |
| | | } |
| | | if (Cools.isEmpty(basStation.getBarcode())){ |
| | | throw new CoolException("数据错误,接驳站无条码信息"); |
| | | } |
| | | WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>() |
| | | .eq(WaitPakin::getBarcode, basStation.getBarcode()) |
| | | .eq(WaitPakin::getIoStatus,PakinIOStatus.PAKIN_IO_STATUS_DONE.val) |
| | | ); |
| | | if (Cools.isEmpty(waitPakin)){ |
| | | throw new CoolException("未找到组托数据,请检查状态"); |
| | | } |
| | | String targetLoc = LocManageUtil.getTargetLoc(Long.parseLong(area)); |
| | | |
| | | taskService.generateAGVTasks(waitPakin,targetLoc,sta,loginUserId); |
| | | |
| | | return R.ok(); |
| | | } |
| | | |
| | | @Override |
| | | public R AGVStaUnBind(Map<String, Object> params) { |
| | |
| | | return R.ok("解绑成功"); |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | | public R getStaBindList(Map<String, Object> params) { |
| | | String sta = params.get("sta").toString(); |
| | |
| | | if (Cools.isEmpty(waitPakinItems)){ |
| | | throw new CoolException("数据错误,未找到组托明细"); |
| | | } |
| | | |
| | | |
| | | List<Long> ids = new ArrayList<>(); |
| | | ids.add(basStation.getArea()); |
| | | if (basStation.getIsCrossZone() == 1){ |
| | | String content = basStation.getCrossZoneArea().substring(1, basStation.getCrossZoneArea().length() - 1); |
| | | String[] parts = content.split(","); |
| | | for (int i = 0; i < parts.length; i++) { |
| | | ids.add(Long.parseLong(parts[i].trim())); |
| | | } |
| | | } |
| | | List<WarehouseAreas> warehouseAreasList = warehouseAreasService.list(new LambdaQueryWrapper<WarehouseAreas>() |
| | | .in(WarehouseAreas::getId, ids) |
| | | ); |
| | | |
| | | return R.ok(Cools |
| | | .add("barcode", basStation.getBarcode()) |
| | | .add("list", waitPakinItems) |
| | | .add("warehouseAreasList", warehouseAreasList) |
| | | .add("area", basStation.getArea()) |
| | | ); |
| | | } |
| | | |
| | |
| | | import com.vincent.rsf.server.common.domain.KeyValVo; |
| | | import com.vincent.rsf.server.common.domain.PageParam; |
| | | import com.vincent.rsf.server.manager.entity.BasStation; |
| | | import com.vincent.rsf.server.manager.enums.StaUseStatusType; |
| | | import com.vincent.rsf.server.manager.service.BasStationService; |
| | | import com.vincent.rsf.server.system.controller.BaseController; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | if (null !=basStation.getAreaIds()){ |
| | | basStation.setCrossZoneArea(Arrays.toString(basStation.getAreaIds())); |
| | | } |
| | | if (null !=basStation.getUseStatus() && basStation.getUseStatus().equals(StaUseStatusType.TYPE_O.type)){ |
| | | basStation.setBarcode(null); |
| | | } |
| | | if (!basStationService.updateById(basStation)) { |
| | | return R.error("更新失败"); |
| | | } |
| | |
| | | * 所属库区id |
| | | */ |
| | | @ApiModelProperty(value= "所属库区id") |
| | | private Integer area; |
| | | private Long area; |
| | | |
| | | /** |
| | | * 是否可跨区 |
| | |
| | | * 条码 |
| | | */ |
| | | @ApiModelProperty(value= "条码") |
| | | @TableField(updateStrategy = FieldStrategy.IGNORED) |
| | | private String barcode; |
| | | |
| | | /** |
| | |
| | | |
| | | R generateFlatWarehouseTasks(WaitPakin waitPakins,String locCode, Long loginUserId); |
| | | |
| | | R generateAGVTasks(WaitPakin waitPakins,String locCode,String orgSta, Long loginUserId); |
| | | |
| | | // R completeTask(String id); |
| | | |
| | | void completeTask(List<Task> task) throws Exception; |
| | |
| | | @Autowired |
| | | private WarehouseAreasItemService warehouseAreasItemService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public synchronized R generateAGVTasks(WaitPakin pakins,String locCode,String orgSta, Long loginUserId) { |
| | | if (Cools.isEmpty(pakins) || Cools.isEmpty(locCode)) { |
| | | throw new CoolException("参数不能为空!!"); |
| | | } |
| | | /**获取组拖*/ |
| | | // List<Long> ids = pakins.stream().map(WaitPakin::getId).collect(Collectors.toList()); |
| | | List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>() |
| | | .in(WaitPakin::getId, pakins.getId()) |
| | | .eq(WaitPakin::getIoStatus, Short.parseShort(PakinIOStatus.PAKIN_IO_STATUS_DONE.val))); |
| | | if (waitPakins.isEmpty()) { |
| | | throw new CoolException("请检查组托状态是否完成!!"); |
| | | } |
| | | waitPakins.forEach(pakin -> { |
| | | /**获取库位*/ |
| | | String targetLoc = locCode; |
| | | if (Cools.isEmpty(targetLoc)) { |
| | | throw new CoolException("该站点对应库区未找到库位"); |
| | | } |
| | | |
| | | List<TaskItem> taskItems = new ArrayList<>(); |
| | | String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null); |
| | | if (StringUtils.isBlank(ruleCode)) { |
| | | throw new CoolException("编码错误:请确认编码「SYS_TASK_CODE」是否已生成!!"); |
| | | } |
| | | Task task = new Task(); |
| | | task.setTaskCode(ruleCode) |
| | | .setTaskStatus(TaskStsType.GENERATE_IN.id.shortValue()) |
| | | .setTaskType(TaskType.TASK_TYPE_AGV_IN.type.shortValue()) |
| | | .setTargLoc(targetLoc) |
| | | .setOrgSite(orgSta) |
| | | .setBarcode(pakin.getBarcode()) |
| | | .setCreateBy(loginUserId) |
| | | .setUpdateBy(loginUserId); |
| | | |
| | | if (!this.save(task)) { |
| | | throw new CoolException("任务保存失败!!"); |
| | | } |
| | | if (!locService.update(new LambdaUpdateWrapper<Loc>().eq(Loc::getCode, task.getTargLoc()) |
| | | .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_S.type).set(Loc::getBarcode, pakin.getBarcode()))) { |
| | | throw new CoolException("库位预约失败!!"); |
| | | } |
| | | /**获取组拖明细**/ |
| | | List<WaitPakinItem> waitPakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, pakin.getId())); |
| | | if (waitPakinItems.isEmpty()) { |
| | | throw new CoolException("数据错误:组拖明细不存在"); |
| | | } |
| | | waitPakinItems.forEach(item -> { |
| | | TaskItem taskItem = new TaskItem(); |
| | | BeanUtils.copyProperties(item, taskItem); |
| | | taskItem.setTaskId(task.getId()) |
| | | .setOrderType(OrderType.ORDER_IN.type) |
| | | .setSource(item.getId()) |
| | | .setTrackCode(item.getTrackCode()) |
| | | .setCreateBy(loginUserId) |
| | | .setUpdateBy(loginUserId) |
| | | .setExtendFields(item.getExtendFields()) |
| | | .setOrderId(item.getAsnId()) |
| | | .setOrderItemId(item.getAsnItemId()); |
| | | taskItems.add(taskItem); |
| | | }); |
| | | if (!taskItemService.saveBatch(taskItems)) { |
| | | throw new CoolException("任务明细保存失败!!"); |
| | | } |
| | | waitPakinItems.forEach(item -> { |
| | | if (! waitPakinItemService.update(new LambdaUpdateWrapper<WaitPakinItem>() |
| | | .set(WaitPakinItem::getWorkQty, item.getAnfme()) |
| | | .eq(WaitPakinItem::getId, item.getId()))) { |
| | | throw new CoolException("组托明细修执行数量修改失败!!"); |
| | | } |
| | | }); |
| | | }); |
| | | |
| | | if (!waitPakinService.update(new LambdaUpdateWrapper<WaitPakin>() |
| | | .in(WaitPakin::getId, pakins.getId()) |
| | | .set(WaitPakin::getUpdateBy, loginUserId) |
| | | .set(WaitPakin::getCreateBy, loginUserId) |
| | | .set(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val))) { |
| | | throw new CoolException("组托状态修改失败!!"); |
| | | } |
| | | return R.ok("任务生成完毕!"); |
| | | } |
| | | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |