| | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Collection; |
| | | import java.util.Collections; |
| | | import java.util.Date; |
| | | import java.util.LinkedHashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * cus_barcode_sync_view 与 man_matnr 同步(云仓通知单、无订单组托等共用) |
| | | * cus_barcode_sync_view 与 man_matnr 同步(云仓通知单、无订单组托等共用)。 |
| | | * 副库读无事务({@link CusBarcodeSyncViewQueryService} {@code NOT_SUPPORTED}),主库写 {@link CusBarcodeSyncMatnrApplyService} {@code REQUIRES_NEW}。 |
| | | */ |
| | | @Service |
| | | @Slf4j |
| | |
| | | private MatnrService matnrService; |
| | | @Autowired |
| | | private ConfigService configService; |
| | | @Autowired |
| | | private CusBarcodeSyncMatnrApplyService cusBarcodeSyncMatnrApplyService; |
| | | |
| | | /** 与云仓通知单同步:按明细 matnr 查视图并写入/更新物料 */ |
| | | public void syncFromOrderItems(List<SyncOrdersItem> orderItems, Long loginUserId) { |
| | |
| | | throw new CoolException("物料未在视图 cus_barcode_sync_view 中:" + code); |
| | | } |
| | | } |
| | | applyCusBarcodeSyncViewRowsToMatnr(viewItems, orderItemByCode, loginUserId); |
| | | cusBarcodeSyncMatnrApplyService.applyFromViewRows(viewItems, orderItemByCode, loginUserId); |
| | | } |
| | | |
| | | private void syncMatnrNonForceFromView(List<String> matnrCodes, Map<String, SyncOrdersItem> orderItemByCode, Long loginUserId) { |
| | |
| | | } |
| | | if (viewItems != null && !viewItems.isEmpty()) { |
| | | try { |
| | | applyCusBarcodeSyncViewRowsToMatnr(viewItems, orderItemByCode, loginUserId); |
| | | cusBarcodeSyncMatnrApplyService.applyFromViewRows(viewItems, orderItemByCode, loginUserId); |
| | | } catch (Exception ex) { |
| | | log.warn("按条码视图写入物料主数据失败:{}", ex.getMessage()); |
| | | } |
| | |
| | | return matnrService.getOneByCodeAndBatch(t, ""); |
| | | } |
| | | |
| | | private static SyncOrdersItem resolveSyncOrderItem(Map<String, SyncOrdersItem> orderItemByCode, String matCode) { |
| | | return matCode == null ? null : orderItemByCode.get(matCode); |
| | | } |
| | | |
| | | private static List<Map<String, Object>> dedupeCusBarcodeViewRows(List<Map<String, Object>> viewItems) { |
| | | Map<String, Map<String, Object>> firstByCode = new LinkedHashMap<>(); |
| | | if (viewItems == null) { |
| | | return Collections.emptyList(); |
| | | } |
| | | for (Map<String, Object> row : viewItems) { |
| | | String matCode = CusBarcodeSyncViewQueryService.matnrCodeFromBarcode(Objects.toString(row.get("barcode"), null)); |
| | | if (matCode == null) { |
| | | continue; |
| | | } |
| | | firstByCode.putIfAbsent(matCode, row); |
| | | } |
| | | return new ArrayList<>(firstByCode.values()); |
| | | } |
| | | |
| | | private void applyCusBarcodeSyncViewRowsToMatnr(List<Map<String, Object>> viewItems, Map<String, SyncOrdersItem> orderItemByCode, Long loginUserId) { |
| | | if (viewItems == null || viewItems.isEmpty()) { |
| | | return; |
| | | } |
| | | for (Map<String, Object> row : dedupeCusBarcodeViewRows(viewItems)) { |
| | | String matCode = CusBarcodeSyncViewQueryService.matnrCodeFromBarcode(Objects.toString(row.get("barcode"), null)); |
| | | if (matCode == null) { |
| | | continue; |
| | | } |
| | | SyncOrdersItem syncItem = resolveSyncOrderItem(orderItemByCode, matCode); |
| | | String viewSpec = StringUtils.trimToEmpty(Objects.toString(row.get("item_spec"), "")); |
| | | String viewUnit = StringUtils.trimToNull(Objects.toString(row.get("unit_no"), null)); |
| | | String viewItemName = StringUtils.trimToNull(Objects.toString(row.get("item_name"), null)); |
| | | String incomingName = syncItem == null ? null : StringUtils.trimToNull(syncItem.getMaktx()); |
| | | Matnr local = matnrService.getOneByCodeAndBatch(matCode, ""); |
| | | if (local == null) { |
| | | Matnr matnr = new Matnr(); |
| | | matnr.setCode(matCode) |
| | | .setBatch("") |
| | | .setName(incomingName != null ? incomingName : (viewItemName != null ? viewItemName : matCode)) |
| | | .setSpec(viewSpec) |
| | | .setUnit(viewUnit) |
| | | .setStockUnit(viewUnit) |
| | | .setStatus(1) |
| | | .setCreateBy(loginUserId) |
| | | .setUpdateBy(loginUserId) |
| | | .setCreateTime(new Date()) |
| | | .setUpdateTime(new Date()); |
| | | matnrService.save(matnr); |
| | | continue; |
| | | } |
| | | boolean nameDiff = incomingName != null |
| | | && !StringUtils.equals(StringUtils.trimToEmpty(local.getName()), incomingName); |
| | | boolean specDiff = !StringUtils.equals(StringUtils.trimToEmpty(local.getSpec()), viewSpec); |
| | | boolean unitDiff = viewUnit != null |
| | | && (!StringUtils.equals(StringUtils.trimToEmpty(local.getUnit()), viewUnit) |
| | | || !StringUtils.equals(StringUtils.trimToEmpty(local.getStockUnit()), viewUnit)); |
| | | if (!nameDiff && !specDiff && !unitDiff) { |
| | | continue; |
| | | } |
| | | Matnr update = new Matnr(); |
| | | update.setId(local.getId()); |
| | | if (nameDiff) { |
| | | update.setName(incomingName); |
| | | } |
| | | if (specDiff) { |
| | | update.setSpec(viewSpec); |
| | | } |
| | | if (unitDiff) { |
| | | update.setUnit(viewUnit).setStockUnit(viewUnit); |
| | | } |
| | | update.setUpdateBy(loginUserId).setUpdateTime(new Date()); |
| | | matnrService.updateById(update); |
| | | } |
| | | } |
| | | } |