| | |
| | | * 业务类型 |
| | | */ |
| | | @ApiModelProperty(value= "业务类型") |
| | | private Short wkType; |
| | | private String wkType; |
| | | |
| | | /** |
| | | * 物料ID |
| | |
| | | |
| | | public LocItem() {} |
| | | |
| | | public LocItem(Long locId, Long orderId, String type, Long orderItemId, Short wkType, Long matnrId, String maktx, String matnrCode, String trackCode, String unit, Double anfme, String batch, String splrBatch, String spec, String model, String fieldsIndex, Integer status, Integer deleted, Integer tenantId, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo) { |
| | | public LocItem(Long locId, Long orderId, String type, Long orderItemId, String wkType, Long matnrId, String maktx, String matnrCode, String trackCode, String unit, Double anfme, String batch, String splrBatch, String spec, String model, String fieldsIndex, Integer status, Integer deleted, Integer tenantId, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo) { |
| | | this.locId = locId; |
| | | this.orderId = orderId; |
| | | this.type = type; |
| | |
| | | @ApiModelProperty(value = "订单类型:1 出库单;2 入库单;3 调拨单", required = true) |
| | | private Integer orderType; |
| | | |
| | | @ApiModelProperty(value = "业务类型,如:采购入库单、销售出库单、调拨申请单等", required = true) |
| | | @ApiModelProperty(value = "业务类型 wk_type 字典/枚举对应", required = true) |
| | | private String wkType; |
| | | |
| | | @ApiModelProperty(value = "添加时间,支持 yyyy-MM-dd HH:mm:ss 或时间戳(秒/毫秒)") |
| | |
| | | @ApiModelProperty("条形码") |
| | | private String barcode; |
| | | |
| | | @ApiModelProperty("批次(空则无批次,仅按物料编码唯一;有值则物料编码+批次唯一)") |
| | | @JsonAlias({"batchNo", "charg", "lot"}) |
| | | private String batch; |
| | | |
| | | |
| | | } |
| | |
| | | .setType(order.getType()) |
| | | .setUpdateBy(loginUserId) |
| | | .setCreateBy(loginUserId) |
| | | .setWkType(Short.parseShort(order.getWkType())); |
| | | .setWkType(order.getWkType()); |
| | | if (!stockService.save(stock)) { |
| | | throw new CoolException("库存保存失败!!"); |
| | | } |
| | |
| | | .setUpdateBy(loginUserId) |
| | | .setUpdateBy(loginUserId) |
| | | .setOrderItemId(asnOrderItem.getId()) |
| | | .setWkType(Short.parseShort(order.getWkType())) |
| | | .setWkType(order.getWkType()) |
| | | .setType(order.getType()); |
| | | locItems.add(item); |
| | | }); |
| | |
| | | taskItem.setTaskId(task.getId()) |
| | | .setOrderType(OrderType.ORDER_CHECK.type) |
| | | .setSourceCode(diffItem.getOrderCode()) |
| | | .setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.type)) |
| | | .setWkType(OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.type) |
| | | .setAnfme(diffItem.getCheckQty()) |
| | | .setWorkQty(0.0) |
| | | .setBatch(diffItem.getBatch()) |
| | |
| | | .setBarcode(task.getBarcode()) |
| | | .setLocCode(task.getOrgLoc()) |
| | | .setType(order.getType()) |
| | | .setWkType(Short.parseShort(order.getWkType())) |
| | | .setWkType(order.getWkType()) |
| | | .setSourceId(orderItem.getOrderId()) |
| | | .setSourceCode(orderItem.getOrderCode()) |
| | | .setUpdateTime(new Date()) |
| | |
| | | import com.vincent.rsf.server.manager.entity.*; |
| | | import com.vincent.rsf.server.manager.enums.*; |
| | | import com.vincent.rsf.server.manager.service.*; |
| | | import com.vincent.rsf.server.manager.service.impl.MatnrServiceImpl; |
| | | import com.vincent.rsf.server.system.constant.DictTypeCode; |
| | | import com.vincent.rsf.server.system.constant.GlobalConfigCode; |
| | | import com.vincent.rsf.server.system.constant.SerialRuleCode; |
| | |
| | | @Autowired |
| | | private MatnrGroupService matnrGroupService; |
| | | @Autowired |
| | | private MatnrServiceImpl matnrService; |
| | | private MatnrService matnrService; |
| | | @Autowired |
| | | private AsnOrderService asnOrderService; |
| | | @Autowired |
| | |
| | | public void syncMatnrs(List<BaseMatParms> matnrs) { |
| | | List<Matnr> syncMatnrs = new ArrayList<>(); |
| | | if (!matnrs.isEmpty()) { |
| | | assertUniqueMatnrInSyncList(matnrs); |
| | | matnrs.forEach(matnr -> { |
| | | Matnr mat = new Matnr(); |
| | | if (Objects.isNull(matnr.getMatnr())) { |
| | | throw new RuntimeException("物料编码不能为空!!"); |
| | | } |
| | | BeanUtils.copyProperties(matnr, mat); |
| | | mat.setCode(matnr.getMatnr()).setName(matnr.getMaktx()); |
| | | mat.setCode(matnr.getMatnr()).setName(matnr.getMaktx()) |
| | | .setBatch(matnrService.normalizeMatnrBatchValue(matnr.getBatch())); |
| | | if (!Objects.isNull(matnr.getGroupName())) { |
| | | MatnrGroup matnrGroup = matnrGroupService.getOne(new LambdaQueryWrapper<MatnrGroup>().eq(MatnrGroup::getName, matnr.getGroupName()), false); |
| | | if (Objects.isNull(matnrGroup)) { |
| | | if (!Objects.isNull(matnrGroup)) { |
| | | mat.setGroupCode(matnrGroup.getCode()).setGroupId(matnrGroup.getId()); |
| | | } |
| | | } |
| | |
| | | |
| | | if (!matnrService.saveOrUpdateBatch(syncMatnrs)) { |
| | | throw new CoolException("物料信息保存成功!!"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void assertUniqueMatnrInSyncList(List<BaseMatParms> matnrs) { |
| | | Set<String> keys = new HashSet<>(); |
| | | for (BaseMatParms p : matnrs) { |
| | | if (StringUtils.isBlank(p.getMatnr())) { |
| | | continue; |
| | | } |
| | | String key = p.getMatnr().trim() + "\u0000" + matnrService.normalizeMatnrBatchValue(p.getBatch()); |
| | | if (!keys.add(key)) { |
| | | throw new CoolException("同步列表中物料编码与批次重复:" + p.getMatnr().trim() |
| | | + (StringUtils.isNotBlank(matnrService.normalizeMatnrBatchValue(p.getBatch())) |
| | | ? " / " + matnrService.normalizeMatnrBatchValue(p.getBatch()) : "")); |
| | | } |
| | | } |
| | | } |
| | |
| | | Integer operateType = baseMatParms.getOperateType(); |
| | | // 3 禁用 / 4 启用:仅更新状态(status 1 正常 0 冻结) |
| | | if (Integer.valueOf(3).equals(operateType) || Integer.valueOf(4).equals(operateType)) { |
| | | Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, baseMatParms.getMatnr())); |
| | | Matnr matnr = matnrService.getOneByCodeAndBatch(baseMatParms.getMatnr(), baseMatParms.getBatch()); |
| | | if (matnr == null) { |
| | | throw new CoolException("物料不存在,无法执行禁用/启用!!"); |
| | | } |
| | |
| | | return R.ok(); |
| | | } |
| | | // 1 新增 / 2 修改 / 不传:有则更新、无则新增 |
| | | Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, baseMatParms.getMatnr())); |
| | | Matnr matnr = matnrService.getOneByCodeAndBatch(baseMatParms.getMatnr(), baseMatParms.getBatch()); |
| | | if (Objects.isNull(matnr)) { |
| | | Matnr matnr1 = new Matnr(); |
| | | BeanUtils.copyProperties(baseMatParms, matnr1); |
| | | matnr1.setCode(baseMatParms.getMatnr()); |
| | | matnr1.setName(baseMatParms.getMaktx()); |
| | | matnr1.setBatch(matnrService.normalizeMatnrBatchValue(baseMatParms.getBatch())); |
| | | if (!Objects.isNull(baseMatParms.getGroupName())) { |
| | | MatnrGroup matnrGroup = matnrGroupService.getOne(new LambdaQueryWrapper<MatnrGroup>() |
| | | .eq(MatnrGroup::getName, baseMatParms.getGroupName())); |
| | |
| | | matnr.setName(baseMatParms.getMaktx()) |
| | | .setColor(baseMatParms.getColor()) |
| | | .setModel(baseMatParms.getModel()) |
| | | .setSpec(baseMatParms.getSpec()); |
| | | .setSpec(baseMatParms.getSpec()) |
| | | .setBatch(matnrService.normalizeMatnrBatchValue(baseMatParms.getBatch())); |
| | | |
| | | if (!matnrService.updateById(matnr)) { |
| | | throw new CoolException("物料更新失败!!"); |
| | |
| | | * 业务类型 |
| | | */ |
| | | @ApiModelProperty(value= "业务类型") |
| | | private Short wkType; |
| | | private String wkType; |
| | | |
| | | /** |
| | | * 物料ID |
| | |
| | | |
| | | public LocItem() {} |
| | | |
| | | public LocItem(Long locId,Long orderId,String type,Long orderItemId,Short wkType,Long matnrId,String maktx,String matnrCode,String trackCode,String unit,Double anfme,String batch,String splrBatch,String spec,String model,String fieldsIndex,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { |
| | | public LocItem(Long locId,Long orderId,String type,Long orderItemId,String wkType,Long matnrId,String maktx,String matnrCode,String trackCode,String unit,Double anfme,String batch,String splrBatch,String spec,String model,String fieldsIndex,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { |
| | | this.locId = locId; |
| | | this.orderId = orderId; |
| | | this.type = type; |
| | |
| | | * 业务类型 |
| | | */ |
| | | @ApiModelProperty(value= "业务类型") |
| | | private Short wkType; |
| | | private String wkType; |
| | | |
| | | /** |
| | | * 物料ID |
| | |
| | | |
| | | public LocItemWorking() {} |
| | | |
| | | public LocItemWorking(Long locId,String locCode,Long orderId,String type,Long orderItemId,Short wkType,Long matnrId,String maktx,String platItemId,String platOrderCode,String platWorkCode,String projectCode,String matnrCode,String trackCode,String unit,Double anfme,Double qty,Double workQty,String batch,String splrBatch,Long splrId,String spec,String model,String fieldsIndex,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { |
| | | public LocItemWorking(Long locId,String locCode,Long orderId,String type,Long orderItemId,String wkType,Long matnrId,String maktx,String platItemId,String platOrderCode,String platWorkCode,String projectCode,String matnrCode,String trackCode,String unit,Double anfme,Double qty,Double workQty,String batch,String splrBatch,Long splrId,String spec,String model,String fieldsIndex,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { |
| | | this.locId = locId; |
| | | this.locCode = locCode; |
| | | this.orderId = orderId; |
| | |
| | | @ApiModelProperty(value= "物料编码") |
| | | private String code; |
| | | |
| | | /** 批次;空串表示无批次,此时物料编码全局唯一;非空时物料编码+批次组合唯一 */ |
| | | @ApiModelProperty(value = "批次") |
| | | private String batch; |
| | | |
| | | /** |
| | | * 货主ID |
| | | */ |
| | |
| | | * 业务类型 |
| | | */ |
| | | @ApiModelProperty(value= "业务类型") |
| | | private Short wkType; |
| | | private String wkType; |
| | | |
| | | /** |
| | | * 库存数量 |
| | |
| | | |
| | | public Stock() {} |
| | | |
| | | public Stock(String code,String sourceCode,Long sourceId,String type,Short wkType,Double anfme,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { |
| | | public Stock(String code,String sourceCode,Long sourceId,String type,String wkType,Double anfme,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { |
| | | this.code = code; |
| | | this.sourceCode = sourceCode; |
| | | this.sourceId = sourceId; |
| | |
| | | private String orderType; |
| | | |
| | | @ApiModelProperty("业务类型") |
| | | private Short wkType; |
| | | private String wkType; |
| | | |
| | | @ApiModelProperty("单据明细ID") |
| | | private Long orderItemId; |
| | |
| | | private String type; |
| | | |
| | | @ApiModelProperty("业务类型") |
| | | private Short wkType; |
| | | private String wkType; |
| | | |
| | | @ApiModelProperty("订单明细ID") |
| | | private Long orderItemId; |
| | |
| | | private String type; |
| | | |
| | | @ApiModelProperty("业务类型") |
| | | private Short wkType; |
| | | private String wkType; |
| | | |
| | | @ApiModelProperty("组拖明细ID") |
| | | private Long source; |
| | |
| | | @ExcelComment(example = "matnr123") |
| | | private String code; |
| | | |
| | | @Excel(name = "批次") |
| | | @ExcelComment(notNull = false, example = "留空表示无批次") |
| | | private String batch; |
| | | |
| | | |
| | | @Excel(name = "货主标识") |
| | | @ExcelComment(example = "123") |
| | |
| | | ORDER_WORK_TYPE_PROD("2", "生产入库单"), |
| | | ORDER_WORK_TYPE_PURCHASE("3", "领料退回入库单"), |
| | | ORDER_WORK_TYPE_SALE("4", "销售退回入库单"), |
| | | ORDER_WORK_TYPE_SALES_RETURN_D004("D004", "销售退货"), |
| | | ORDER_WORK_TYPE_OTHER_IN("5", "其它入库单"), |
| | | ORDER_WORK_TYPE_OTHER_TERANSFER_IN("6", "调拔入库单"), |
| | | ORDER_WORK_TYPE_OTHER_TERANSFER("8", "调拔入库单"),//项目临时修改 |
| | |
| | | return OrderWorkType.ORDER_WORK_TYPE_PURCHASE.type; |
| | | } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_SALE.desc)) { |
| | | return OrderWorkType.ORDER_WORK_TYPE_SALE.type; |
| | | } else if (desc.equalsIgnoreCase(OrderWorkType.ORDER_WORK_TYPE_SALES_RETURN_D004.type)) { |
| | | return OrderWorkType.ORDER_WORK_TYPE_SALES_RETURN_D004.type; |
| | | } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_SALES_RETURN_D004.desc)) { |
| | | return OrderWorkType.ORDER_WORK_TYPE_SALES_RETURN_D004.type; |
| | | } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_OTHER_IN.desc)) { |
| | | return OrderWorkType.ORDER_WORK_TYPE_OTHER_IN.type; |
| | | } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_SUPPLIER.desc)) { |
| | |
| | | return OrderType.ORDER_IN.type; |
| | | } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_SALE.desc)) { |
| | | return OrderType.ORDER_IN.type; |
| | | } else if (desc.equalsIgnoreCase(OrderWorkType.ORDER_WORK_TYPE_SALES_RETURN_D004.type)) { |
| | | return OrderType.ORDER_IN.type; |
| | | } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_SALES_RETURN_D004.desc)) { |
| | | return OrderType.ORDER_IN.type; |
| | | } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_OTHER_IN.desc)) { |
| | | return OrderType.ORDER_IN.type; |
| | | } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_SUPPLIER.desc)) { |
| | |
| | | return OrderWorkType.ORDER_WORK_TYPE_PURCHASE.desc; |
| | | } else if (type.equals(OrderWorkType.ORDER_WORK_TYPE_SALE.type)) { |
| | | return OrderWorkType.ORDER_WORK_TYPE_SALE.desc; |
| | | } else if (type.equalsIgnoreCase(OrderWorkType.ORDER_WORK_TYPE_SALES_RETURN_D004.type)) { |
| | | return OrderWorkType.ORDER_WORK_TYPE_SALES_RETURN_D004.desc; |
| | | } else if (type.equals(OrderWorkType.ORDER_WORK_TYPE_OTHER_IN.type)) { |
| | | return OrderWorkType.ORDER_WORK_TYPE_OTHER_IN.desc; |
| | | } else if (type.equals(OrderWorkType.ORDER_WORK_TYPE_SUPPLIER.type)) { |
| | |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | PageParam<Matnr, BaseParam> getPages(Map<String, Object> map); |
| | | |
| | | List<Matnr> getMatnrTempletes(List<MatnrsTemplate> list); |
| | | |
| | | /** 无批次统一为空串,便于 (code,batch) 唯一 */ |
| | | String normalizeMatnrBatchValue(String batch); |
| | | |
| | | Matnr getOneByCodeAndBatch(String code, String batchNullable); |
| | | } |
| | |
| | | if (Objects.isNull(matnr)) { |
| | | throw new CoolException("数据错误:物料" + wkOrderItem.getMatnrCode() + "不存在!!"); |
| | | } |
| | | // 复制时排除 id,避免物料 id 覆盖单据明细 id,导致 saveOrUpdate 误判为新增而重复插入(出库单编辑保存后 1 条变 2 条) |
| | | BeanUtils.copyProperties(matnr, wkOrderItem, "id"); |
| | | // 复制时排除 id、batch、splr_batch:明细批次来自通知单行,不与物料主数据 batch 混用 |
| | | BeanUtils.copyProperties(matnr, wkOrderItem, "id", "batch", "splrBatch"); |
| | | wkOrderItem.setMatnrCode(matnr.getCode()) |
| | | .setSplrBatch(!Objects.isNull(wkOrderItem.getBatch()) ? wkOrderItem.getBatch() : null) |
| | | .setSplrBatch(StringUtils.isNotBlank(wkOrderItem.getBatch()) ? wkOrderItem.getBatch() : null) |
| | | .setMatnrId(matnr.getId()) |
| | | .setMaktx(matnr.getName()); |
| | | |
| | |
| | | TaskItem taskItem = new TaskItem(); |
| | | taskItem.setTaskId(task.getId()) |
| | | .setOrderType(OrderType.ORDER_CHECK.type) |
| | | .setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.type)) |
| | | .setWkType(OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.type) |
| | | .setAnfme(item.getAnfme()) |
| | | .setWorkQty(0.0) |
| | | .setBatch(checkParam.getBatch()) |
| | |
| | | .setUpdateTime(new Date()) |
| | | .setOrderType(OrderType.ORDER_OUT.type); |
| | | if (map.getType().equals(Constants.TASK_TYPE_ORDER_OUT_STOCK)) { |
| | | taskItem.setWkType(Short.parseShort(order.getWkType())) |
| | | taskItem.setWkType(order.getWkType()) |
| | | .setSourceCode(order.getCode()) |
| | | .setSourceId(order.getId()) |
| | | .setOrderItemId(item.getOrderItemId()); |
| | | } else if (map.getType().equals(Constants.TASK_TYPE_WAVE_OUT_STOCK)) { |
| | | taskItem.setSourceId(wave.getId()) |
| | | .setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_OTHER.type)) |
| | | .setWkType(OrderWorkType.ORDER_WORK_TYPE_OTHER.type) |
| | | .setSourceCode(wave.getCode()) |
| | | .setSource(item.getSource()); |
| | | } else if (map.getType().equals(Constants.TASK_TYPE_OUT_CHECK) || map.getType().equals(Constants.TASK_TYPE_OUT_STOCK)) { |
| | | taskItem.setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type)) |
| | | taskItem.setWkType(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type) |
| | | .setSource(item.getId()) |
| | | .setSourceId(item.getLocId()) |
| | | .setSourceCode(item.getLocCode()); |
| | |
| | | .setSource(item.getId()) |
| | | .setUpdateTime(new Date()) |
| | | .setOrderType(OrderType.ORDER_IN.type) |
| | | .setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_OTHER_IN.type)); |
| | | .setWkType(OrderWorkType.ORDER_WORK_TYPE_OTHER_IN.type); |
| | | taskItems.add(taskItem); |
| | | } |
| | | if (!taskItemService.saveBatch(taskItems)) { |
| | |
| | | import com.vincent.rsf.server.system.service.FieldsService; |
| | | import com.vincent.rsf.server.system.utils.SerialRuleUtils; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Collection; |
| | | import java.util.HashSet; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Slf4j |
| | | @Service("matnrService") |
| | | public class MatnrServiceImpl extends ServiceImpl<MatnrMapper, Matnr> implements MatnrService { |
| | | |
| | |
| | | |
| | | @Autowired |
| | | private FieldsService fieldsService; |
| | | |
| | | @Override |
| | | public String normalizeMatnrBatchValue(String batch) { |
| | | return StringUtils.isBlank(batch) ? "" : batch.trim(); |
| | | } |
| | | |
| | | @Override |
| | | public Matnr getOneByCodeAndBatch(String code, String batchNullable) { |
| | | if (StringUtils.isBlank(code)) { |
| | | return null; |
| | | } |
| | | String nb = normalizeMatnrBatchValue(batchNullable); |
| | | return this.getOne(new LambdaQueryWrapper<Matnr>() |
| | | .eq(Matnr::getCode, code.trim()) |
| | | .eq(Matnr::getBatch, nb), false); |
| | | } |
| | | |
| | | private void normalizeMatnrBatchOnEntity(Matnr entity) { |
| | | if (entity == null) { |
| | | return; |
| | | } |
| | | entity.setBatch(normalizeMatnrBatchValue(entity.getBatch())); |
| | | } |
| | | |
| | | private void assertUniqueMatnr(Matnr entity) { |
| | | if (entity == null || StringUtils.isBlank(entity.getCode())) { |
| | | return; |
| | | } |
| | | normalizeMatnrBatchOnEntity(entity); |
| | | LambdaQueryWrapper<Matnr> w = new LambdaQueryWrapper<Matnr>() |
| | | .eq(Matnr::getCode, entity.getCode().trim()) |
| | | .eq(Matnr::getBatch, entity.getBatch()); |
| | | if (entity.getId() != null) { |
| | | w.ne(Matnr::getId, entity.getId()); |
| | | } |
| | | if (this.count(w) > 0) { |
| | | String nb = entity.getBatch(); |
| | | throw new CoolException(StringUtils.isBlank(nb) |
| | | ? "物料编码已存在(无批次):" + entity.getCode().trim() |
| | | : "物料编码与批次组合已存在:" + entity.getCode().trim() + " / " + nb); |
| | | } |
| | | } |
| | | |
| | | private void assertNoDuplicateMatnrKeysInList(List<Matnr> list) { |
| | | if (list == null || list.isEmpty()) { |
| | | return; |
| | | } |
| | | Set<String> keys = new HashSet<>(); |
| | | for (Matnr m : list) { |
| | | if (m == null || StringUtils.isBlank(m.getCode())) { |
| | | continue; |
| | | } |
| | | normalizeMatnrBatchOnEntity(m); |
| | | String key = m.getCode().trim() + "\u0000" + m.getBatch(); |
| | | if (!keys.add(key)) { |
| | | throw new CoolException("导入数据中物料编码与批次重复:" + m.getCode().trim() |
| | | + (StringUtils.isNotBlank(m.getBatch()) ? " / " + m.getBatch() : "")); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public boolean save(Matnr entity) { |
| | | normalizeMatnrBatchOnEntity(entity); |
| | | assertUniqueMatnr(entity); |
| | | return super.save(entity); |
| | | } |
| | | |
| | | @Override |
| | | public boolean updateById(Matnr entity) { |
| | | normalizeMatnrBatchOnEntity(entity); |
| | | assertUniqueMatnr(entity); |
| | | return super.updateById(entity); |
| | | } |
| | | |
| | | @Override |
| | | public boolean saveOrUpdate(Matnr entity) { |
| | | normalizeMatnrBatchOnEntity(entity); |
| | | assertUniqueMatnr(entity); |
| | | return super.saveOrUpdate(entity); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean saveBatch(Collection<Matnr> entityList) { |
| | | if (entityList == null || entityList.isEmpty()) { |
| | | return true; |
| | | } |
| | | for (Matnr m : entityList) { |
| | | normalizeMatnrBatchOnEntity(m); |
| | | assertUniqueMatnr(m); |
| | | } |
| | | return super.saveBatch(entityList); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean saveBatch(Collection<Matnr> entityList, int batchSize) { |
| | | if (entityList == null || entityList.isEmpty()) { |
| | | return true; |
| | | } |
| | | for (Matnr m : entityList) { |
| | | normalizeMatnrBatchOnEntity(m); |
| | | assertUniqueMatnr(m); |
| | | } |
| | | return super.saveBatch(entityList, batchSize); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean saveOrUpdateBatch(Collection<Matnr> entityList, int batchSize) { |
| | | if (entityList == null || entityList.isEmpty()) { |
| | | return true; |
| | | } |
| | | for (Matnr m : entityList) { |
| | | normalizeMatnrBatchOnEntity(m); |
| | | assertUniqueMatnr(m); |
| | | } |
| | | return super.saveOrUpdateBatch(entityList, batchSize); |
| | | } |
| | | |
| | | /** |
| | | * @return |
| | |
| | | * 获取导入物料模板 |
| | | */ |
| | | List<Matnr> matnrs = getMatnrTempletes(list); |
| | | assertNoDuplicateMatnrKeysInList(matnrs); |
| | | |
| | | if (!this.saveBatch(matnrs)) { |
| | | throw new CoolException("导入失败!!"); |
| | |
| | | Matnr matnr = new Matnr(); |
| | | matnr.setBarcode(template.getBarcode()) |
| | | .setCode(template.getCode()) |
| | | .setBatch(normalizeMatnrBatchValue(template.getBatch())) |
| | | .setName(template.getName()) |
| | | .setId(null) |
| | | .setDescrible(template.getDescrible()) |
| | |
| | | String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_MATNR_CODE, null); |
| | | matnr1.setCode(ruleCode); |
| | | } |
| | | normalizeMatnrBatchOnEntity(matnr1); |
| | | /** |
| | | * 扩展字段存入库 |
| | | */ |
| | |
| | | if (label == null || label.isEmpty()) { |
| | | return null; |
| | | } |
| | | String trim = label.trim(); |
| | | for (DictData d : listAll()) { |
| | | if (label.equals(d.getLabel())) { |
| | | if (trim.equals(d.getLabel())) { |
| | | return d.getValue(); |
| | | } |
| | | } |
| | | // 回退到枚举 |
| | | return OrderWorkType.getWorkType(label); |
| | | return OrderWorkType.getWorkType(trim); |
| | | } |
| | | |
| | | @Override |
| | |
| | | throw new CoolException("出库单据不存在!!"); |
| | | } |
| | | boolean isStockRevise = locItem.getWkType() != null |
| | | && locItem.getWkType().equals(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_REVISE.type)); |
| | | && Objects.equals(locItem.getWkType(), OrderWorkType.ORDER_WORK_TYPE_STOCK_REVISE.type); |
| | | if (isStockRevise) { |
| | | log.info("库存调整产生的库存,自动创建WkOrderItem - 出库单ID:{},物料ID:{},批次:{}", |
| | | outId, locItem.getMatnrId(), locItem.getBatch()); |
| | |
| | | BeanUtils.copyProperties(logItem, locDetl); |
| | | locDetl.setLocId(finalLoc.getId()) |
| | | .setType(OrderType.ORDER_REVISE.type) |
| | | .setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_REVISE.type)) |
| | | .setWkType(OrderWorkType.ORDER_WORK_TYPE_STOCK_REVISE.type) |
| | | .setLocCode(finalLoc.getCode()) |
| | | .setAnfme(logItem.getReviseQty()) |
| | | // 如果batch不为空,同时设置splrBatch,以便查询时能匹配 |
| | |
| | | throw new CoolException("库位信息修改失败!!"); |
| | | } |
| | | //出库 |
| | | if (item.getWkType().equals(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type))) { |
| | | if (Objects.equals(item.getWkType(), OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type)) { |
| | | //库存出库 |
| | | } else if (task.getResource().equals(TaskResouceType.TASK_RESOUCE_WAVE_TYPE.val)) { |
| | | WaveItem waveItem = waveItemService.getById(item.getSource()); |
| | |
| | | throw new CoolException("波次更新失败!!"); |
| | | } |
| | | |
| | | } else if (item.getWkType().equals(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_OTHER.type))) { |
| | | } else if (Objects.equals(item.getWkType(), OrderWorkType.ORDER_WORK_TYPE_OTHER.type)) { |
| | | //其它出库 |
| | | |
| | | } else { |
| | |
| | | } |
| | | |
| | | //添加出入库记录信息 |
| | | Map<Short, List<TaskItem>> listMap = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getWkType)); |
| | | Map<String, List<TaskItem>> listMap = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getWkType)); |
| | | /***获取库存出库值,如果为空表示正常单据出库,非空表明是库存出库 |
| | | * 1. 库存出库没有单据信息,单据信息默认为空 |
| | | * 2. 单据库存需通过波次查询原始单据信息,将单据信息填入stock中 |
| | | * */ |
| | | List<TaskItem> list = listMap.get(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type)); |
| | | List<TaskItem> list = listMap.get(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type); |
| | | if (Objects.isNull(list) || list.isEmpty()) { |
| | | Map<Long, List<TaskItem>> maps = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getSource)); |
| | | maps.keySet().forEach(key -> { |
| | |
| | | if (!asnOrderService.updateById(wkOrder)) { |
| | | throw new CoolException("出库单更新失败!!"); |
| | | } |
| | | stock.setWkType(Short.parseShort(wkOrder.getWkType())) |
| | | stock.setWkType(wkOrder.getWkType()) |
| | | .setType(OrderType.ORDER_OUT.type); |
| | | } else if (!Objects.isNull(diffItem)) { |
| | | stock.setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.type)) |
| | | stock.setWkType(OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.type) |
| | | .setType(OrderType.ORDER_CHECK.type); |
| | | } else { |
| | | stock.setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type)) |
| | | stock.setWkType(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type) |
| | | .setMemo("库存出库,无单据信息!!") |
| | | .setType(OrderType.ORDER_OUT.type); |
| | | } |
| | |
| | | * @return |
| | | */ |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public synchronized void saveStockItems(List<TaskItem> items, Task task, Long id, String code, Short wkType, String type, Long loginUserId) { |
| | | public synchronized void saveStockItems(List<TaskItem> items, Task task, Long id, String code, String wkType, String type, Long loginUserId) { |
| | | Stock stock = new Stock(); |
| | | String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null); |
| | | if (StringUtils.isBlank(ruleCode)) { |
| | |
| | | .setMatnrCode(areaItem.getMatnrCode()); |
| | | WkOrder order = asnOrderService.getById(areaItem.getAsnId()); |
| | | if (order != null) { |
| | | pakinItem.setType(order.getType()).setWkType(StringUtils.isNotBlank(order.getWkType()) ? Short.parseShort(order.getWkType()) : null); |
| | | pakinItem.setType(order.getType()).setWkType(order.getWkType()); |
| | | } |
| | | if (pakinItem1.getReceiptQty() == null || pakinItem1.getReceiptQty().compareTo(0.0) <= 0) { |
| | | throw new CoolException("组托数量不能小于等于零!!"); |
| | |
| | | .setCreateBy(userId) |
| | | .setMatnrCode(orderItem.getMatnrCode()); |
| | | pakinItem.setType(null == order.getType() ? null : order.getType()) |
| | | .setWkType(StringUtils.isNotBlank(order.getWkType()) ? Short.parseShort(order.getWkType()) : null); |
| | | .setWkType(order.getWkType()); |
| | | |
| | | for (PakinItem waitPakinItem : waitPakin.getItems()) { |
| | | if (waitPakinItem.getId().equals(orderItem.getId())) { |