rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java
@@ -1,14 +1,10 @@ package com.vincent.rsf.server.api.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.api.controller.params.CheckObjParams; import com.vincent.rsf.server.api.controller.params.OtherReceiptParams; import com.vincent.rsf.server.api.controller.params.ReceiptParams; import com.vincent.rsf.server.api.controller.params.*; import com.vincent.rsf.server.api.service.MobileService; import com.vincent.rsf.server.manager.controller.params.WaitPakinParam; import com.vincent.rsf.server.manager.entity.AsnOrderItem; import com.vincent.rsf.server.manager.entity.QlyIsptItem; import com.vincent.rsf.server.system.controller.BaseController; import com.vincent.rsf.server.system.controller.param.LoginParam; @@ -201,8 +197,49 @@ @PostMapping("/inspect/check/update") public R checkUpdate(@RequestBody QlyIsptItem params) { if (Objects.isNull(params)) { throw new CoolException("参数不能为空!!"); return R.error("参数不能为空!!"); } return mobileService.checkUpdate(params); } @ApiOperation("获取上架信息") @PreAuthorize("hasAuthority('manager:qlyInspect:list')") @PostMapping("/stock/operate/list") public R operateToStock(@RequestBody OpStockParams params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); } return mobileService.operateToStock(params); } @ApiOperation("人工上架") @PreAuthorize("hasAuthority('manager:qlyInspect:update')") @PostMapping("/stock/operate") public R publicToStock(@RequestBody PublicToStockParams params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); } return mobileService.publicToStock(params); } @ApiOperation("获取任务信息") @PreAuthorize("hasAuthority('manager:qlyInspect:list')") @PostMapping("/task/stock/{code}") public R taskToStock(@PathVariable String code) { if (Objects.isNull(code)) { return R.error("参数不能为空!!"); } return mobileService.taskToStock(code); } @ApiOperation("任务上架") @PreAuthorize("hasAuthority('manager:qlyInspect:update')") @PostMapping("/task/stock") public R taskToLocs(@PathVariable String code) throws Exception { if (Objects.isNull(code)) { return R.error("参数不能为空!!"); } return mobileService.taskGetLocs(code); } } rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/OpStockParams.java
New file @@ -0,0 +1,19 @@ package com.vincent.rsf.server.api.controller.params; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; @Data @Accessors(chain = true) @ApiModel(value = "OpStockParams", description = "人工上架参数") public class OpStockParams { @ApiModelProperty("拖盘码") private String barcode; @ApiModelProperty("单号") private String asnCode; @ApiModelProperty("物料编码") private String matnrCode; } rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/PublicToStockParams.java
New file @@ -0,0 +1,22 @@ package com.vincent.rsf.server.api.controller.params; import com.vincent.rsf.server.manager.entity.AsnOrderItem; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.List; @Data @Accessors(chain = true) @ApiModel(value = "PublicToStockParams", description = "人工上架") public class PublicToStockParams implements Serializable { @ApiModelProperty("库位编码") private String locCode; @ApiModelProperty("单据明细") private List<AsnOrderItem> itemList; } rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/OperateStockDto.java
New file @@ -0,0 +1,8 @@ package com.vincent.rsf.server.api.entity.dto; import com.vincent.rsf.server.manager.entity.AsnOrderItem; public class OperateStockDto extends AsnOrderItem { } rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/TaskLocAreaDto.java
New file @@ -0,0 +1,25 @@ package com.vincent.rsf.server.api.entity.dto; import com.vincent.rsf.server.manager.entity.Loc; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.List; @Data @Accessors(chain = true) @ApiModel(value = "TaskLocAreaDto", description = "库位信息") public class TaskLocAreaDto implements Serializable { @ApiModelProperty("库位库区") private String areaCode; @ApiModelProperty("库区名称") private String areaName; @ApiModelProperty("库区ID") private Long areaId; @ApiModelProperty("库位信息") private List<Loc> locs; } rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/TaskQueueDto.java
New file @@ -0,0 +1,28 @@ package com.vincent.rsf.server.api.entity.dto; import com.vincent.rsf.server.manager.entity.Loc; import com.vincent.rsf.server.manager.entity.Task; import com.vincent.rsf.server.manager.entity.TaskItem; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.List; @Data @Accessors(chain = true) @ApiModel(value = "TaskQueueDto", description = "任务信息") public class TaskQueueDto implements Serializable { @ApiModelProperty("任务主单") private Task task; @ApiModelProperty("任务明细") private List<TaskItem> taskItems; @ApiModelProperty("库位信息") private TaskLocAreaDto locArea; } rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskStsType.java
@@ -2,16 +2,13 @@ public enum TaskStsType { //任务状态 GENERATE_IN(1L, "创建入库任务"), WCS_EXECUTE_IN(2L, "RCS任务已下发"), WCS_CONTAINER_RECEIVE(3L, "RCS容器到达"), WCS_CONVEYOR_START(4L, "RCS容器流动任务已下发"), WCS_TOTE_LOAD(5L, "RCS取箱完成"), WCS_TOTE_UNLOAD(6L, "RCS放箱完成"), WCS_PUTAWAY_SUCESS(7L, "RCS任务完成"), // WCS_PUTAWAY_FAILED(11L, "任务失败"), rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java
@@ -1,9 +1,7 @@ package com.vincent.rsf.server.api.service; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.server.api.controller.params.CheckObjParams; import com.vincent.rsf.server.api.controller.params.OtherReceiptParams; import com.vincent.rsf.server.api.controller.params.ReceiptParams; import com.vincent.rsf.server.api.controller.params.*; import com.vincent.rsf.server.manager.controller.params.WaitPakinParam; import com.vincent.rsf.server.manager.entity.AsnOrder; import com.vincent.rsf.server.manager.entity.QlyIsptItem; @@ -50,4 +48,12 @@ R checkObjs(CheckObjParams params); R checkUpdate(QlyIsptItem params); R operateToStock(OpStockParams params); R publicToStock(PublicToStockParams params); R taskToStock(String code); R taskGetLocs(String code) throws Exception; } rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
@@ -4,13 +4,8 @@ import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.api.controller.params.CheckObjParams; import com.vincent.rsf.server.api.controller.params.OtherReceiptParams; import com.vincent.rsf.server.api.controller.params.ReceiptParams; import com.vincent.rsf.server.api.entity.dto.CheckObjDto; import com.vincent.rsf.server.api.entity.dto.InspectDetlDto; import com.vincent.rsf.server.api.entity.dto.InspectItemDto; import com.vincent.rsf.server.api.entity.dto.ReceiptDetlsDto; import com.vincent.rsf.server.api.controller.params.*; import com.vincent.rsf.server.api.entity.dto.*; import com.vincent.rsf.server.api.entity.enums.OrderWorkType; import com.vincent.rsf.server.api.service.MobileService; import com.vincent.rsf.server.common.config.ConfigProperties; @@ -35,7 +30,7 @@ import com.vincent.rsf.server.system.service.FieldsService; import com.vincent.rsf.server.system.service.UserLoginService; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import org.apache.tika.utils.StringUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -48,6 +43,7 @@ import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * @author Ryan @@ -100,13 +96,28 @@ @Autowired private WaitPakinItemService waitPakinItemService; @Autowired private AsnOrderItemLogService asnOrderItemLogService; @Autowired private FieldsItemService fieldsItemService; @Autowired private LocService locService; @Autowired private PurchaseService purchaseService; @Autowired private StockService stockService; @Autowired private StockItemService stockItemService; @Autowired private TaskService taskService; @Autowired private TaskItemService taskItemService; @Autowired private LocAreaMatRelaMapper locAreaMatRelaMapper; @Autowired private LocAreaRelaMapper locAreaRelaMapper; @Autowired private LocAreaMapper locAreaMapper; /** * @author Ryan @@ -152,7 +163,7 @@ */ @Override public R getOrderByCode(String barcode) { if (StringUtils.isEmpty(barcode)) { if (StringUtils.isBlank(barcode)) { return R.error("标签码不能为空!!"); } List<AsnOrderItem> asnOrderItem = asnOrderItemMapper.selectList(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getTrackCode, barcode)); @@ -544,7 +555,7 @@ */ @Override public R checkUpdate(QlyIsptItem params) { if (Objects.isNull(params.getId()) || Objects.isNull(params.getIspectId())) { if (Objects.isNull(params.getId())) { throw new CoolException("参数不能为空!!"); } IsptItemsParams itemsParams = new IsptItemsParams(); @@ -559,6 +570,174 @@ } /** * @author Ryan * @description 人工上架 * @param * @return * @time 2025/4/2 16:33 */ @Override public R operateToStock(OpStockParams params) { if (org.apache.commons.lang3.StringUtils.isBlank(params.getBarcode())) { throw new CoolException("拖盘码不能为空!!"); } if (StringUtils.isBlank(params.getAsnCode())) { throw new CoolException("单据不能为空!!"); } if (StringUtils.isBlank(params.getMatnrCode())) { throw new CoolException("物料编码不能为空!!"); } AsnOrder asnOrders = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getCode, params.getAsnCode())); if (Objects.isNull(asnOrders)) { throw new CoolException("单据不存在!!"); } List<Loc> locs = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, params.getBarcode())); if (!locs.isEmpty()) { throw new CoolException("拖盘已使用"); } List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, params.getBarcode())); if (!waitPakins.isEmpty()) { throw new CoolException("拖盘已使用!!"); } AsnOrderItem orderItems = asnOrderItemMapper.selectOne(new LambdaQueryWrapper<AsnOrderItem>() .eq(AsnOrderItem::getAsnId, asnOrders.getId()) .eq(AsnOrderItem::getMatnrCode, params.getMatnrCode())); if (Objects.isNull(orderItems)) { return R.ok(null); } orderItems.setBarcode(params.getBarcode()); return R.ok(orderItems); } /** * 人工上架入库 * @param params * @return */ @Override @Transactional(rollbackFor = Exception.class) public R publicToStock(PublicToStockParams params) { if (Objects.isNull(params.getLocCode()) || StringUtils.isBlank(params.getLocCode())) { throw new CoolException("库位不能为空!!"); } if (Objects.isNull(params.getItemList()) || params.getItemList().isEmpty()) { throw new CoolException("单据明细不能为空!!"); } Long OrderId = params.getItemList().stream().findFirst().get().getAsnId(); AsnOrder order = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getId, OrderId)); if (Objects.isNull(order)) { throw new CoolException("单据不存在!!"); } Stock stock = new Stock(); stock.setAsnId(OrderId).setAsnCode(order.getCode()); if (!Objects.isNull(order.getPoCode()) && StringUtils.isNotBlank(order.getPoCode())) { Purchase purchase = purchaseService.getOne(new LambdaQueryWrapper<Purchase>().eq(Purchase::getCode, order.getPoCode())); stock.setPlatOrderNo(purchase.getPlatCode()).setPlatToken(purchase.getPlatId()); } String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null); if (StringUtils.isBlank(ruleCode)) { throw new CoolException("当前业务:" + SerialRuleCode.SYS_STOCK_CODE + ",编码规则不存在!!"); } if (!stockService.save(stock)) { throw new CoolException("库存保存失败!!"); } Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, params.getLocCode())); if (Objects.isNull(loc)) { throw new CoolException("库位不存在!!"); } List<StockItem> stockItems = new ArrayList<>(); params.getItemList().forEach(orderItem -> { StockItem stockItem = new StockItem(); BeanUtils.copyProperties(orderItem, stockItem); stockItem.setAsnItemId(orderItem.getId()) .setBarcode(orderItem.getBarcode()) .setLocId(loc.getId()) .setId(null) .setStockId(stock.getId()); stockItems.add(stockItem); }); if (!stockItemService.saveBatch(stockItems)) { throw new CoolException("任务上架失败!!"); } return R.ok(stock); } /** * 获取任务信息 * @param code * @return */ @Override public R taskToStock(String code) { if (StringUtils.isBlank(code)) { throw new CoolException("拖盘码不能为空!!"); } Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, code)); if (Objects.isNull(task)) { throw new CoolException("拖盘任务不存在!!"); } List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); if (!taskItems.isEmpty()) { throw new CoolException("拖盘任务明细不存在!!"); } TaskQueueDto queueDto = new TaskQueueDto(); queueDto.setTask(task).setTaskItems(taskItems); List<Long> list = taskItems.stream().map(TaskItem::getMatnrId).collect(Collectors.toList()); List<LocAreaMatRela> matRelas = locAreaMatRelaMapper.selectList(new LambdaQueryWrapper<LocAreaMatRela>().in(LocAreaMatRela::getMatnrId, list)); TaskLocAreaDto locAreaDto = new TaskLocAreaDto(); /**判断是否为空*/ if (matRelas.isEmpty()) { locAreaDto.setLocs(new ArrayList<>()); } else { Long ids = matRelas.stream().map(LocAreaMatRela::getLocId).collect(Collectors.toList()).stream().findFirst().get(); List<Loc> locs = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getId, ids)); if (locs.isEmpty()) { locAreaDto.setLocs(new ArrayList<>()); } else { LocArea locArea = locAreaMapper.selectById(new LambdaQueryWrapper<Loc>().in(Loc::getId, ids)); if (!Objects.isNull(locArea)) { locAreaDto.setAreaName(locArea.getName()).setAreaCode(locArea.getCode()).setAreaId(locArea.getId()); } locAreaDto.setLocs(locs); } } queueDto.setLocArea(locAreaDto); return R.ok(queueDto); } /** * @Author Ryan * @param code * @desc 任务上架 * @return */ @Override @Transactional(rollbackFor = Exception.class) public R taskGetLocs(String code) throws Exception { if (StringUtils.isBlank(code)) { throw new CoolException("拖盘码不能为空!!"); } Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, code)); if (Objects.isNull(task)) { throw new CoolException("拖盘任务不存在!!"); } List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); if (!taskItems.isEmpty()) { throw new CoolException("拖盘任务明细不存在!!"); } List<Task> tasks = new ArrayList<>(); tasks.add(task); taskService.completeTask(tasks); return R.ok(); } /** * 获取ReceiptDetlsDtos */ private R getAsnOrderItem(List<AsnOrderItem> items) { rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java
@@ -5,6 +5,7 @@ import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.api.entity.enums.TaskStsType; import com.vincent.rsf.server.common.utils.ExcelUtil; import com.vincent.rsf.server.common.annotation.OperationLog; import com.vincent.rsf.server.common.domain.BaseParam; @@ -93,12 +94,16 @@ if (Objects.isNull(ids) || ids.length < 1) { return R.error("参数不能为空!!"); } List<TaskItem> list = taskItemService.list(new LambdaQueryWrapper<TaskItem>().in(TaskItem::getTaskId, ids)); if (!list.isEmpty()) { return R.error("有明细列表存在 !!"); List<Long> longs = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id); List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().in(Task::getId, ids).in(Task::getTaskStatus, longs)); if (tasks.isEmpty()) { throw new CoolException("任务已处执行状态不可取消!!"); } if (!taskService.removeByIds(Arrays.asList(ids))) { return R.error("Delete Fail"); } if (!taskItemService.remove(new LambdaQueryWrapper<TaskItem>().in(TaskItem::getTaskId, ids))) { return R.error("Details delete Failed"); } return R.ok("Delete Success").add(ids); } @@ -131,7 +136,9 @@ if (Objects.isNull(id)) { throw new CoolException("参数不能为空!!"); } return taskService.completeTask(id); // return taskService.completeTask(id); return null; } } rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java
@@ -23,7 +23,6 @@ public class AsnOrderItem implements Serializable { private static final long serialVersionUID = 1L; /** * ID */ rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/QlyIsptItem.java
@@ -36,49 +36,41 @@ @ApiModelProperty(value= "ID") @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 主单ID */ @ApiModelProperty(value= "主单ID") private Long ispectId; @ApiModelProperty("质检单状态") private String isptStatus; @ApiModelProperty("单据明细ID") private Long asnItemId; /** * 编号 */ @ApiModelProperty(value= "编号") private String matnrCode; /** * 物料名称 */ @ApiModelProperty(value= "物料名称") private String maktx; /** * 标签 */ @ApiModelProperty(value= "标签") private String label; /**∂ * 供应商名称 */ @ApiModelProperty(value= "供应商名称") private String splrName; /** * 供应商批次 */ @ApiModelProperty(value= "供应商批次") private String splrBatch; /** * 库存批次 */ rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Stock.java
@@ -2,6 +2,8 @@ import java.text.SimpleDateFormat; import java.util.Date; import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; import com.baomidou.mybatisplus.annotation.TableLogic; import java.text.SimpleDateFormat; @@ -24,6 +26,7 @@ import java.util.Date; @Data @Accessors(chain = true) @TableName("man_stock") public class Stock implements Serializable { @@ -40,25 +43,27 @@ * ASN单据, 带出PO单 */ @ApiModelProperty(value= "ASN单据, 带出PO单") private String asnOrder; private Long asnId; @ApiModelProperty("订单编码") private String asnCode; /** * ERP凭证 */ @ApiModelProperty(value= "ERP凭证") private String erpToken; @ApiModelProperty(value= "plat凭证") private String platToken; /** * ERP单号 * plat单号 */ @ApiModelProperty(value= "ERP单号") private String erpOrder; @ApiModelProperty(value= "plat单号") private String platOrderNo; /** * ERP库存地址 * plat库存地址 */ @ApiModelProperty(value= "ERP库存地址") private String erpStkAdr; @ApiModelProperty(value= "plat库存地址") private String platStkAdr; /** * 合同标识 @@ -144,11 +149,11 @@ public Stock() {} public Stock(String asnOrder,String erpToken,String erpOrder,String erpStkAdr,String contractId,String lockReason,Short lockStatus,String locker,Date lockedTime,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { this.asnOrder = asnOrder; this.erpToken = erpToken; this.erpOrder = erpOrder; this.erpStkAdr = erpStkAdr; public Stock(String asnOrder,String platToken,String platOrder,String platStkAdr,String contractId,String lockReason,Short lockStatus,String locker,Date lockedTime,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { this.platOrderNo = asnOrder; this.platToken = platToken; this.platOrderNo = platOrder; this.platStkAdr = platStkAdr; this.contractId = contractId; this.lockReason = lockReason; this.lockStatus = lockStatus; rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/StockItem.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.*; import com.vincent.rsf.server.manager.service.*; import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; import java.text.SimpleDateFormat; @@ -22,6 +23,7 @@ import java.io.Serializable; @Data @Accessors(chain = true) @TableName("man_stock_item") public class StockItem implements Serializable { @@ -44,7 +46,7 @@ * 库存外键标识 */ @ApiModelProperty(value= "库存外键标识") private String stockId; private Long stockId; /** * 物料标识 @@ -190,29 +192,24 @@ * 锁定原因 */ @ApiModelProperty(value= "锁定原因") @TableField(exist = false) private String lockReason; /** * 锁定状态 */ @ApiModelProperty(value= "锁定状态") @TableField(exist = false) private Short lockStatus; /** * 锁定人 */ @ApiModelProperty(value= "锁定人") @TableField(exist = false) private String locker; /** * 锁定时间 */ @ApiModelProperty(value= "锁定时间") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") @TableField(exist = false) private Date lockedTime; /** @@ -268,7 +265,7 @@ public StockItem() {} public StockItem(String stockId,Long matnrId,Long asnItemId, String code,String matnrk,Double anfme,Double workQty,Double qty,Double weight,String unit,Long shipperId,String splrId,String brand,String batch,String prodTime,Long inspectId,String splrBtch,String asnOrder,String erpToken,String erpOrder,String erpStkAdr,Long locId,String barcode,Double purPrice,String lockReason,Short lockStatus,String locker,Date lockedTime,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { public StockItem(Long stockId,Long matnrId,Long asnItemId, String code,String matnrk,Double anfme,Double workQty,Double qty,Double weight,String unit,Long shipperId,String splrId,String brand,String batch,String prodTime,Long inspectId,String splrBtch,String asnOrder,String erpToken,String erpOrder,String erpStkAdr,Long locId,String barcode,Double purPrice,String lockReason,Short lockStatus,String locker,Date lockedTime,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { this.stockId = stockId; this.matnrId = matnrId; this.asnItemId = asnItemId; rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java
@@ -67,6 +67,11 @@ @ApiModelProperty("单据明细ID") private Long orderItemId; /** * 物料跟踪码 */ @ApiModelProperty("物料跟踪码") private String trackCode; /** * 物料编码 */ @ApiModelProperty(value= "物料编码") rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
@@ -1,17 +1,26 @@ package com.vincent.rsf.server.manager.schedules; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.api.entity.enums.TaskStsType; import com.vincent.rsf.server.manager.entity.Task; import com.vincent.rsf.server.manager.entity.TaskItem; import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.service.*; import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.enums.LocStsType; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.sql.Array; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; /** @@ -28,6 +37,12 @@ @Autowired private StockItemService stockItemService; @Autowired private PurchaseService purchaseService; @Autowired private AsnOrderService asnOrderService; @Autowired private AsnOrderItemService asnOrderItemService; @Autowired private StockService stockService; @Autowired private LocService locService; @@ -39,20 +54,13 @@ * @time 2025/4/2 12:37 */ @Scheduled(cron = "0 0/05 * * * ? ") // @Scheduled(cron = "0/5 * * * * ?") @Transactional(rollbackFor = Exception.class) public void completeInStock() { public void completeInStock() throws Exception { List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskStatus, TaskStsType.COMPLETE_IN.id)); if (tasks.isEmpty()) { return; } List<Long> list = tasks.stream().map(Task::getId).collect(Collectors.toList()); List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, list)); if (taskItems.isEmpty()) { throw new CoolException("任务明细为空!!"); } taskItems.forEach(item -> { }); taskService.completeTask(tasks); } } rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
@@ -11,5 +11,7 @@ R generateTasks(List<WaitPakin> waitPakin, Long loginUserId); R completeTask(String id); // R completeTask(String id); void completeTask(List<Task> task) throws Exception; } rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @@ -37,7 +38,16 @@ private WaitPakinItemService waitPakinItemService; @Autowired private LocService locService; @Autowired private PurchaseService purchaseService; @Autowired private AsnOrderService asnOrderService; @Autowired private AsnOrderItemService asnOrderItemService; @Autowired private StockService stockService; @Autowired private StockItemService stockItemService; @@ -96,6 +106,7 @@ taskItem.setTaskId(task.getId()) .setOrderType(OrderType.ORDER_RECEIPT.type) .setSource(item.getId()) .setTrackCode(item.getTrackCode()) .setCreateBy(loginUserId) .setUpdateBy(loginUserId) .setOrderId(item.getAsnId()) @@ -110,18 +121,74 @@ return R.ok("任务生成完毕!"); } /** * @author Ryan * @description 完成任务 * @param * @return * @time 2025/4/2 11:15 */ * 完成任务 * @param tasks * @throws Exception */ @Override @Transactional(rollbackFor = Exception.class) public R completeTask(String id) { return null; public void completeTask(List<Task> tasks) throws Exception { if (tasks.isEmpty()) { return; } List<Long> list = tasks.stream().map(Task::getId).collect(Collectors.toList()); List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, list)); if (taskItems.isEmpty()) { throw new CoolException("任务明细不能为空!!"); } /**对任务明细按订单进行分组*/ Map<Long, List<TaskItem>> orderMap = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getOrderId)); List<StockItem> stockItems = new ArrayList<>(); orderMap.keySet().forEach(key -> { AsnOrder order = asnOrderService.getOne(new LambdaQueryWrapper<AsnOrder>() .eq(AsnOrder::getId, key) .select(AsnOrder::getId, AsnOrder::getPoCode, AsnOrder::getCode)); Stock stock = new Stock(); if (!Objects.isNull(order.getPoCode()) && StringUtils.isNotBlank(order.getPoCode())) { Purchase purchase = purchaseService.getOne(new LambdaQueryWrapper<Purchase>().eq(Purchase::getCode, order.getPoCode())); stock.setPlatOrderNo(purchase.getPlatCode()).setPlatToken(purchase.getPlatId()); } String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null); if (StringUtils.isBlank(ruleCode)) { throw new CoolException("当前业务:" + SerialRuleCode.SYS_STOCK_CODE + ",编码规则不存在!!"); } stock.setAsnId(order.getId()).setAsnCode(order.getCode()); if (!stockService.save(stock)) { throw new CoolException("库存保存失败!!"); } List<TaskItem> items = orderMap.get(key); for (TaskItem item : items) { /**通过任务明细中的taskId查询,获取TASK的目标库位信息*/ Task taskServiceOne = this.getOne(new LambdaQueryWrapper<Task>() .select(Task::getId, Task::getTargLoc, Task::getOrgLoc, Task::getBarcode) .eq(Task::getId, item.getTaskId())); Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, taskServiceOne.getTargLoc())); if (Objects.isNull(loc)) { throw new CoolException("库位不存在!!"); } AsnOrderItem orderItem = asnOrderItemService.getOne(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getId, item.getOrderItemId())); if (Objects.isNull(orderItem)) { throw new CoolException("单据明细不存在!!"); } StockItem stockItem = new StockItem(); BeanUtils.copyProperties(orderItem, stockItem); stockItem.setAsnItemId(item.getOrderItemId()) .setBarcode(taskServiceOne.getBarcode()) .setLocId(loc.getId()) .setId(null) .setStockId(stock.getId()); stockItems.add(stockItem); } if (!stockItemService.saveBatch(stockItems)) { throw new CoolException("库存修改架失败!!"); } }); /**修改库位状态为F.在库*/ List<String> locCodes = tasks.stream().map(Task::getTargLoc).collect(Collectors.toList()); if (!locService.update(new LambdaUpdateWrapper<Loc>().set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type).in(Loc::getCode, locCodes))) { throw new CoolException("库位状态修改失败!!"); } } } rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java
@@ -48,4 +48,9 @@ * 任务编码生成规则 */ public final static String SYS_TASK_CODE = "sys_task_code"; /** * 仓库编码规则 */ public final static String SYS_STOCK_CODE = "sys_stock_code"; } rsf-server/src/main/resources/application-dev.yml
@@ -14,8 +14,9 @@ driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.4.24:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai username: root # url: jdbc:mysql://47.76.147.249:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai # url: jdbc:mysql://localhost:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai # username: rsf password: 34821015 type: com.alibaba.druid.pool.DruidDataSource druid: rsf-server/src/main/resources/application.yml
@@ -23,7 +23,7 @@ # global-config: # field-strategy: 0 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true cache-enabled: true call-setters-on-nulls: true