rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskType.java
@@ -8,21 +8,23 @@ * @create 2025/3/29 17:02 */ public enum TaskType { TASK_TYPE_EMPITY_IN(10L, "空板入库"), TASK_TYPE_LOC_MOVE(11L, "库格移载"), TASK_TYPE_PICK_IN(53L, "拣料再入库"), TASK_TYPE_MERGE_IN(54L, "并板再入库"), TASK_TYPE_CHECK_IN(57L, "盘点再入库"), TASK_TYPE_OUT(101L, "出库"), TASK_TYPE_PICK_AGAIN_IN(103L, "拣料入库"), TASK_TYPE_MERGE_OUT(104L, "并板出库"), TASK_TYPE_CHECK_OUT(107L, "盘点出库"), TASK_TYPE_EMPITY_OUT(110L, "空板出库"), TASK_TYPE_IN(1, "入库"), TASK_TYPE_EMPITY_IN(10, "空板入库"), TASK_TYPE_LOC_MOVE(11, "库格移载"), TASK_TYPE_PICK_IN(53, "拣料再入库"), TASK_TYPE_MERGE_IN(54, "并板再入库"), TASK_TYPE_CHECK_IN(57, "盘点再入库"), TASK_TYPE_OUT(101, "出库"), TASK_TYPE_PICK_AGAIN_IN(103, "拣料入库"), TASK_TYPE_MERGE_OUT(104, "并板出库"), TASK_TYPE_CHECK_OUT(107, "盘点出库"), TASK_TYPE_EMPITY_OUT(110, "空板出库"), ; public Long type; public Integer type; public String desc; TaskType(Long type, String desc) { TaskType(Integer type, String desc) { this.type = type; this.desc = desc; } rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/QlyInspectController.java
@@ -10,6 +10,7 @@ import com.vincent.rsf.server.common.domain.BaseParam; import com.vincent.rsf.server.common.domain.KeyValVo; import com.vincent.rsf.server.common.domain.PageParam; import com.vincent.rsf.server.manager.controller.params.IsptOrderParam; import com.vincent.rsf.server.manager.controller.params.QlyInspectAndItem; import com.vincent.rsf.server.manager.entity.QlyInspect; import com.vincent.rsf.server.manager.service.QlyInspectService; @@ -58,6 +59,24 @@ return R.ok(qlyInspectService.listByAsn(map)); } @GetMapping("/qlyInspect/asn/list") @ApiOperation("获取待质检单") @PreAuthorize("hasAuthority('manager:qlyInspect:list')") public R getUnInspect() { return R.ok(qlyInspectService.getUnInspect()); } @PostMapping("/qlyInspect/reports") @ApiOperation("选择质检单据") @PreAuthorize("hasAuthority('manager:qlyInspect:update')") public R selectedOrder(IsptOrderParam param) { if (Objects.isNull(param)) { throw new CoolException("参数不能为空!!"); } return qlyInspectService.saveSelected(param); } @PreAuthorize("hasAuthority('manager:qlyInspect:list')") @PostMapping("/qlyInspect/list") public R list(@RequestBody Map<String, Object> map) { rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/IsptOrderParam.java
New file @@ -0,0 +1,20 @@ package com.vincent.rsf.server.manager.controller.params; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import jdk.jpackage.internal.Log; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.List; @Data @Accessors(chain = true) @ApiModel(value = "IsptOrderParam", description = "质检单参数") public class IsptOrderParam implements Serializable { @ApiModelProperty("收货单ID") List<Long> ids; } rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/QlyInspect.java
@@ -4,18 +4,26 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.SpringUtils; import com.vincent.rsf.server.system.constant.DictTypeCode; import com.vincent.rsf.server.system.entity.DictData; import com.vincent.rsf.server.system.entity.User; import com.vincent.rsf.server.system.service.DictDataService; import com.vincent.rsf.server.system.service.UserService; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import org.apache.commons.lang3.StringUtils; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @Data @Accessors(chain = true) @@ -37,9 +45,14 @@ @ApiModelProperty(value= "编码") private String code; @ApiModelProperty("单据ID") private Long asnId; @ApiModelProperty("通知单明细ID") private Long asnItemId; @ApiModelProperty("单据编码") private String asnCode; @ApiModelProperty("质检状态") private String isptStatus; /** * 业务类型 @@ -158,6 +171,19 @@ // null // 备注 // ); public String getIsptStatus$() { if (null == this.isptStatus) {return null;} DictDataService dictDataService = SpringUtils.getBean(DictDataService.class); DictData dictDatas = dictDataService.getOne(new LambdaQueryWrapper<DictData>() .eq(DictData::getDictTypeCode, DictTypeCode.DICT_SYS_TASK_TYPE) .eq(DictData::getValue, this.isptStatus)); if (Objects.isNull(dictDatas) || Objects.isNull(dictDatas.getLabel())) { return null; } return dictDatas.getLabel(); } public String getStatus$(){ if (null == this.status){ return null; } switch (this.status){ rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/QlyIsptItem.java
@@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.annotation.TableLogic; import java.text.SimpleDateFormat; import java.util.Date; import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; import com.baomidou.mybatisplus.annotation.IdType; @@ -17,6 +19,7 @@ import java.io.Serializable; @Data @Accessors(chain = true) @TableName("man_qly_ispt_item") public class QlyIsptItem implements Serializable { @@ -34,6 +37,9 @@ */ @ApiModelProperty(value= "主单ID") private Long ispectId; @ApiModelProperty("单据明细ID") private Long asnItemId; /** * 编号 @@ -101,6 +107,9 @@ @ApiModelProperty(value= "图片路径") private String picPath; @ApiModelProperty("质检结论") private String isptResult; /** * 状态 1: 正常 0: 冻结 */ rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
@@ -72,6 +72,18 @@ private String targLoc; /** * 源站点 */ @ApiModelProperty("源站点") private String orgSite; /** * 目标站点 */ @ApiModelProperty("目标站点") private String targSite; /** * 托盘码 */ @ApiModelProperty(value= "托盘码") rsf-server/src/main/java/com/vincent/rsf/server/manager/service/QlyInspectService.java
@@ -2,7 +2,9 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.server.manager.controller.params.IsptOrderParam; import com.vincent.rsf.server.manager.controller.params.QlyInspectAndItem; import com.vincent.rsf.server.manager.entity.AsnOrder; import com.vincent.rsf.server.manager.entity.AsnOrderItem; import com.vincent.rsf.server.manager.entity.QlyInspect; @@ -14,4 +16,8 @@ List<AsnOrderItem> listByAsn(Map<String, Object> map); R allSave(QlyInspectAndItem params); List<AsnOrder> getUnInspect(); R saveSelected(IsptOrderParam param); } rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/QlyInspectServiceImpl.java
@@ -3,6 +3,7 @@ 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.manager.controller.params.IsptOrderParam; import com.vincent.rsf.server.manager.controller.params.QlyInspectAndItem; import com.vincent.rsf.server.manager.entity.AsnOrder; import com.vincent.rsf.server.manager.entity.AsnOrderItem; @@ -16,13 +17,17 @@ import com.vincent.rsf.server.manager.service.QlyIsptItemService; import com.vincent.rsf.server.system.constant.SerialRuleCode; 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.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @Service("qlyInspectService") public class QlyInspectServiceImpl extends ServiceImpl<QlyInspectMapper, QlyInspect> implements QlyInspectService { @@ -65,7 +70,7 @@ if (Objects.isNull(inspect.getWkType())) { throw new CoolException("业务类型不能为空!!"); } String code = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_INSPECT_WK_TYPE, inspect); String code = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_INSPECT_CODE, inspect); inspect.setCode(code); if (!this.saveOrUpdate(inspect)) { throw new CoolException("质检单保存失败!!"); @@ -87,4 +92,71 @@ } return R.ok("保存成功!!"); } /** * @author Ryan * @description 获取未质检单据 * @param * @return * @time 2025/3/31 10:12 */ @Override public List<AsnOrder> getUnInspect() { List<AsnOrder> asnOrders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getStatus, 1).eq(AsnOrder::getNtyStatus, 0)); return asnOrders; } @Override @Transactional(rollbackFor = Exception.class) public R saveSelected(IsptOrderParam param) { if (Objects.isNull(param.getIds()) || param.getIds().isEmpty()) { throw new CoolException("单据ID不能为空!!"); } List<AsnOrder> asnOrders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>().in(AsnOrder::getId, param.getIds()).eq(AsnOrder::getNtyStatus, 1)); if (asnOrders.isEmpty()) { throw new CoolException("单据不存在!!"); } List<AsnOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().in(AsnOrderItem::getAsnId, param.getIds())); if (orderItems.isEmpty()) { throw new CoolException("单据明细不存在!!"); } Map<Long, List<AsnOrderItem>> listMap = orderItems.stream().collect(Collectors.groupingBy(AsnOrderItem::getAsnId)); List<QlyInspect> qlyInspects = new ArrayList<>(); for (AsnOrder asnOrder : asnOrders) { QlyInspect inspect = new QlyInspect(); String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_INSPECT_CODE, null); if (StringUtils.isBlank(ruleCode)) { throw new CoolException("策略错误:请检查策略「" + SerialRuleCode.SYS_INSPECT_CODE + "」是否设置正确!!"); } inspect.setCode(ruleCode).setWkType(asnOrder.getWkType()).setAsnId(asnOrder.getId()).setCode(asnOrder.getCode()); /**获取单据明细*/ List<AsnOrderItem> asnOrderItems = listMap.get(asnOrder.getId()); if (Objects.isNull(asnOrderItems) || asnOrderItems.isEmpty()) { continue; } double rcptQty = asnOrderItems.stream().mapToDouble(AsnOrderItem::getQty).sum(); double anfme = asnOrderItems.stream().mapToDouble(AsnOrderItem::getAnfme).sum(); inspect.setRcptQty(rcptQty).setDlyQty(anfme); if (!this.save(inspect)) { throw new CoolException("单据" + asnOrder.getCode() + "保存失败!!"); } List<QlyIsptItem> items = new ArrayList<>(); for (AsnOrderItem orderItem : asnOrderItems) { QlyIsptItem isptItem = new QlyIsptItem(); BeanUtils.copyProperties(orderItem, isptItem); isptItem.setAsnItemId(orderItem.getId()) .setRcptQty(orderItem.getQty()) .setDlyQty(orderItem.getAnfme()); items.add(isptItem); } if (!qlyIsptItemService.saveBatch(items)) { throw new CoolException("明细保存失败!!"); } } if (!this.saveBatch(qlyInspects)) { throw new CoolException("质检单保存失败!!"); } return R.ok("保存成功!!"); } } rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -1,22 +1,27 @@ package com.vincent.rsf.server.manager.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.common.SpringUtils; import com.vincent.rsf.server.api.entity.enums.TaskStsType; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.manager.entity.WaitPakin; import com.vincent.rsf.server.manager.entity.WaitPakinItem; import com.vincent.rsf.server.api.entity.enums.TaskType; import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.mapper.TaskMapper; import com.vincent.rsf.server.manager.entity.Task; import com.vincent.rsf.server.manager.service.LocService; import com.vincent.rsf.server.manager.service.TaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vincent.rsf.server.manager.service.WaitPakinItemService; import com.vincent.rsf.server.manager.service.WaitPakinService; import com.vincent.rsf.server.manager.utils.LocManageUtil; 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.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -53,10 +58,37 @@ if (waitPakinItems.isEmpty()) { throw new CoolException("数据错误:组拖明细不存在"); } Task task = new Task(); String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null); task.setTaskCode(ruleCode).setTaskStatus(TaskStsType.GENERATE_IN.id.shortValue()); if (StringUtils.isBlank(ruleCode)) { throw new CoolException("编码错误:请确认编码「SYS_TASK_CODE」是否已生成!!"); } List<Task> tasks = new ArrayList<>(); List<TaskItem> taskItems = new ArrayList<>(); waitPakins.forEach(pakin -> { Task task = new Task(); task.setTaskCode(ruleCode) .setTaskStatus(TaskStsType.GENERATE_IN.id.shortValue()) .setTaskStatus(TaskType.TASK_TYPE_IN.type.shortValue()) .setTargLoc(LocManageUtil.getTargetLoc()) .setBarcode(pakin.getBarcode()) .setTargSite(LocManageUtil.getTargetSite()); tasks.add(task); }); if (!this.saveBatch(tasks)) { throw new CoolException("任务保存失败!!"); } //TODO 保存任务档明细 waitPakinItems.forEach(item -> { TaskItem taskItem = new TaskItem(); taskItems.add(taskItem); }); return null; } } rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java
New file @@ -0,0 +1,47 @@ package com.vincent.rsf.server.manager.utils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.common.SpringUtils; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.manager.entity.DeviceSite; import com.vincent.rsf.server.manager.entity.Loc; import com.vincent.rsf.server.manager.service.DeviceSiteService; import com.vincent.rsf.server.manager.service.LocService; import com.vincent.rsf.server.system.enums.LocStsType; import org.apache.commons.lang3.StringUtils; import java.util.Objects; public class LocManageUtil { /** * @author Ryan * @description 获取目标库位, 包含库位获取策略 * @param * @return * @time 2025/3/31 08:50 */ public static String getTargetLoc() { //TODO 库位策略后续排期 LocService locService = SpringUtils.getBean(LocService.class); Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_D.type), false); return Objects.isNull(loc) ? loc.getCode() : null; } /** * @author Ryan * @description 获取目标站点 * @param * @return * @time 2025/3/31 09:49 */ public static String getTargetSite() { //TODO 站点策略后续排期 DeviceSiteService deviceSite = SpringUtils.getBean(DeviceSiteService.class); DeviceSite loc = deviceSite.getOne(new LambdaQueryWrapper<DeviceSite>().eq(DeviceSite::getStatus, 1), false); return Objects.isNull(loc) ? loc.getSite() : null; } } rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java
@@ -32,7 +32,7 @@ /** * 质检单业务类型 */ public final static String SYS_INSPECT_WK_TYPE = "sys_inspect_wk_type"; public final static String SYS_INSPECT_CODE = "sys_inspect_code"; /** * 物料编码生成规则 rsf-server/src/main/java/com/vincent/rsf/server/system/enums/LocStsType.java
@@ -17,9 +17,9 @@ LOC_STS_TYPE_R("R", "出库预约"), ; private String type; public String type; private String desc; public String desc; LocStsType(String type, String desc) { this.type = type;