/* * Copyright (c) 2018-2025, ztt All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the pig4cloud.com developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: ztt */ package com.chinaztt.mes.plan.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.chinaztt.ifs.api.feign.IfsFeignClient; import com.chinaztt.mes.basic.util.BigDecimalUtils; import com.chinaztt.mes.common.wrapper.QueryWrapperUtil; import com.chinaztt.mes.plan.dto.ManufacturingOrderMatIssueDTO; import com.chinaztt.mes.plan.dto.MoStructureComponentDTO; import com.chinaztt.mes.plan.entity.ManufacturingOrder; import com.chinaztt.mes.plan.entity.ManufacturingOrderMatIssue; import com.chinaztt.mes.plan.entity.MoStructureComponent; import com.chinaztt.mes.plan.mapper.ManufacturingOrderMapper; import com.chinaztt.mes.plan.mapper.ManufacturingOrderMatIssueMapper; import com.chinaztt.mes.plan.mapper.MoStructureComponentMapper; import com.chinaztt.mes.plan.service.ManufacturingOrderMatIssueService; import com.chinaztt.mes.plan.state.manufacturing.constant.ManufacturingOrderStates; import com.chinaztt.mes.warehouse.entity.Stock; import com.chinaztt.mes.warehouse.mapper.StockMapper; import com.chinaztt.mes.warehouse.util.StockUtils; import com.chinaztt.ztt.common.core.util.R; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** * 客户订单主表 * * @author sunxl * @date 2021-08-16 10:55:28 */ @Service @AllArgsConstructor public class ManufacturingOrderMatIssueServiceImpl extends ServiceImpl implements ManufacturingOrderMatIssueService { private IfsFeignClient ifsFeignClient; private ManufacturingOrderMapper manufacturingOrderMapper; private MoStructureComponentMapper moStructureComponentMapper; private StockMapper stockMapper; private StockUtils stockUtils; /** * 根据零件号从库存查询发料数量 * * @param moId * @return */ @Override public R getMatIssueFromStock(Long moId, String wdrNo, String lotBatchNo) { try { MoStructureComponent moStructureComponent = moStructureComponentMapper.selectOne(Wrappers.lambdaQuery() .eq(MoStructureComponent::getPlanManufacturingOrderId, moId) .isNull(MoStructureComponent::getParent)); List manufacturingOrderMatIssueDTOS = new ArrayList<>(); if (moStructureComponent != null) { getMatIssue(moStructureComponent.getId(), wdrNo, lotBatchNo, manufacturingOrderMatIssueDTOS); } return R.ok(manufacturingOrderMatIssueDTOS); } catch (Exception e) { return R.failed("获取异常"); } } private void getMatIssue(Long parentId, String wdrNo, String lotBatchNo, List manufacturingOrderMatIssueDTOS) { List manufacturingOrderMatIssueList = baseMapper.getMatIssueFromStock(parentId); Map> manufacturingOrderMatIssueMap = manufacturingOrderMatIssueList.stream().collect(Collectors.groupingBy(ManufacturingOrderMatIssueDTO::getStrucId)); for (Map.Entry> entry : manufacturingOrderMatIssueMap.entrySet()) { List list = entry.getValue(); for (ManufacturingOrderMatIssueDTO manufacturingOrderMatIssueDTO : list) { if (checkMatIssue(wdrNo, lotBatchNo, manufacturingOrderMatIssueDTO)) { manufacturingOrderMatIssueDTOS.add(manufacturingOrderMatIssueDTO); } } getMatIssue(entry.getKey(), wdrNo, lotBatchNo, manufacturingOrderMatIssueDTOS); } } /** * 根据wdrNo 和 SN号 判断筛选条件 * * @param wdrNo * @param lotBatchNo * @param manufacturingOrderMatIssueDTO * @return */ private boolean checkMatIssue(String wdrNo, String lotBatchNo, ManufacturingOrderMatIssueDTO manufacturingOrderMatIssueDTO) { if (StringUtils.isNotBlank(wdrNo)) { if (!manufacturingOrderMatIssueDTO.getWdrNo().equals(wdrNo)) { return false; } } if (StringUtils.isNotBlank(lotBatchNo)) { if (!manufacturingOrderMatIssueDTO.getLotBatchNo().equals(lotBatchNo)) { return false; } } return true; } /** * 根据零件号从库存查询发料数量 * * @param moId * @return */ @Override public R getMatIssueFromIfs(Long moId) { try { List moStructureComponentDTOList = baseMapper.getMatIssuePartNoFromIfs(moId); List manufacturingOrderMatIssueList = new ArrayList<>(); String partNos = ""; Map map = new HashMap<>(); for (MoStructureComponentDTO moStructureComponentDTO : moStructureComponentDTOList) { partNos += moStructureComponentDTO.getPartNo() + ";"; map.put(moStructureComponentDTO.getPartNo(), moStructureComponentDTO.getIfsLineItemNo()); } if (StringUtils.isBlank(partNos)) { return R.ok(manufacturingOrderMatIssueList); } JSONObject jsonObject = new JSONObject().fluentPut("PART_NO", partNos); R result = ifsFeignClient.queryInventoryInfoStd(jsonObject, true); if (result.getCode() == 0) { JSONObject data = (JSONObject) JSON.toJSON(result.getData()); JSONArray jsonArray = data.getJSONArray("LIST_INFO"); for (int i = 0; i < jsonArray.size(); i++) { JSONObject info = jsonArray.getJSONObject(i); if (BigDecimalUtils.getBigDecimalValue(info.getBigDecimal("QTY_AVAILABLE")).compareTo(BigDecimal.ZERO) <= 0) { continue; } ManufacturingOrderMatIssue manufacturingOrderMatIssue = new ManufacturingOrderMatIssue(); String partNo = info.getString("PART_NO"); //零件编号 manufacturingOrderMatIssue.setPartNo(partNo); //行项号 manufacturingOrderMatIssue.setIfsLineItemNo(map.get(partNo)); //零件描述 manufacturingOrderMatIssue.setPartName(info.getString("PART_DESC")); //单位 manufacturingOrderMatIssue.setUnit(info.getString("UNIT_MEAS")); //版本号 manufacturingOrderMatIssue.setEngChgLevel(info.getString("ENG_CHG_LEVEL")); //库位编号 manufacturingOrderMatIssue.setLocationNo(info.getString("LOCATION_NO")); //库位描述 manufacturingOrderMatIssue.setLocationName(info.getString("LOCATION_DESC")); //批次号 manufacturingOrderMatIssue.setLotBatchNo(info.getString("LOT_BATCH_NO")); //WDR 号码 manufacturingOrderMatIssue.setWdrNo(info.getString("WAIV_DEV_REJ_NO")); //库位id manufacturingOrderMatIssue.setWarehouse(info.getString("WAREHOUSE_ID")); //序列号 manufacturingOrderMatIssue.setSerialNo(info.getString("SERIAL_NO")); //可用数量 manufacturingOrderMatIssue.setQtyIssue(info.getBigDecimal("QTY_AVAILABLE")); //可用数量 manufacturingOrderMatIssue.setQtyRequired(info.getBigDecimal("QTY_AVAILABLE")); manufacturingOrderMatIssue.setMatFrom("IFS"); manufacturingOrderMatIssueList.add(manufacturingOrderMatIssue); } return R.ok(manufacturingOrderMatIssueList); } else { return R.failed("IFS错误——" + result.getMsg()); } } catch (Exception e) { return R.failed("获取异常"); } } @Override public List getMatIssueList(Long moId) { return baseMapper.selectList(Wrappers.lambdaQuery().eq(ManufacturingOrderMatIssue::getMoId, moId)); } /** * 车间订单发料 * * @param manufacturingOrderMatIssues * @param moId 车间订单编号 * @return */ @Override public R addMatIssue(List manufacturingOrderMatIssues, Long moId) { try { ManufacturingOrder manufacturingOrder = manufacturingOrderMapper.selectById(moId); if (!manufacturingOrder.getState().equals(ManufacturingOrderStates.ISSUED.getValue())) { return R.failed("非已下达订单不可进行发料"); } JSONObject param = new JSONObject().fluentPut("RECORD_ID", UUID.randomUUID().toString()).fluentPut("SYSCODE", "LMES").fluentPut("SYSMODEL", "车间订单发料"); JSONArray infoArray = new JSONArray(); for (ManufacturingOrderMatIssue manufacturingOrderMatIssue : manufacturingOrderMatIssues) { JSONObject info = new JSONObject(); //如果是从库存来的得先删除库存 if (manufacturingOrderMatIssue.getStockId() != null) { Stock stock = stockMapper.selectById(manufacturingOrderMatIssue.getStockId()); if (stock == null) { throw new RuntimeException("库存丢失"); } if (stock.getAvailableStockQuantity().compareTo(manufacturingOrderMatIssue.getQtyIssue()) == -1) { throw new RuntimeException("库存不够"); } } info.put("ORDER_NO", manufacturingOrder.getIfsOrderNo()); //订单号 info.put("RELEASE_NO", manufacturingOrder.getIfsReleaseNo()); //下达号 info.put("SEQUENCE_NO", manufacturingOrder.getIfsSequenceNo()); //序列号 if (StringUtils.isNotBlank(manufacturingOrderMatIssue.getIfsLineItemNo())) { info.put("LINE_ITEM_NO", new Long(manufacturingOrderMatIssue.getIfsLineItemNo()));//行项号 } info.put("PART_NO", manufacturingOrderMatIssue.getPartNo()); //零件编号 info.put("LOCATION_NO", manufacturingOrderMatIssue.getLocationNo()); //库位号 info.put("LOT_BATCH_NO", manufacturingOrderMatIssue.getLotBatchNo()); //批次号 info.put("SERIAL_NO", manufacturingOrderMatIssue.getSerialNo()); //序列号 默认是 info.put("ENG_CHG_LEVEL", manufacturingOrderMatIssue.getEngChgLevel()); //版本号 info.put("WAIV_DEV_REJ_NO", manufacturingOrderMatIssue.getWdrNo()); //WDR编号 info.put("QTY_TO_ISSUE", manufacturingOrderMatIssue.getQtyIssue()); //要下发数量 infoArray.add(info); } param.put("BATCH_INFO", infoArray); param.put("mesParams", new JSONObject() .fluentPut("manufacturingOrderId", moId) .fluentPut("SYSMODEL", "车间订单发料") .fluentPut("manufacturingOrderMatIssuesList", manufacturingOrderMatIssues) .fluentPut("manufacturingOrderMatIssueArray", infoArray)); R result = ifsFeignClient.importSoMaterialIssueStd(param, true); if (result.getCode() == 0) { for (ManufacturingOrderMatIssue manufacturingOrderMatIssue : manufacturingOrderMatIssues) { if (manufacturingOrderMatIssue.getStockId() != null) { stockUtils.updateById(manufacturingOrderMatIssue.getStockId(), manufacturingOrderMatIssue.getQtyIssue().negate(), BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, manufacturingOrder.getMoNo(), "MOMATISSUE"); } manufacturingOrderMatIssue.setMoId(moId); baseMapper.insert(manufacturingOrderMatIssue); } return R.ok().setMsg("成功"); } else { return R.failed("IFS错误——" + result.getMsg()); } } catch (Exception e) { return R.failed("同步异常"); } } /** * 车间订单取消发料 * * @param ids 发料数据的ids * @return */ @Override public R delMatUnIssue(List ids) { try { if (CollectionUtil.isEmpty(ids)) { throw new RuntimeException("参数不能为空"); } List manufacturingOrderMatIssues = baseMapper.selectList(Wrappers.lambdaQuery().in(ManufacturingOrderMatIssue::getId, ids)); if (CollectionUtil.isEmpty(manufacturingOrderMatIssues)) { throw new RuntimeException("无发料明细"); } ManufacturingOrder manufacturingOrder = manufacturingOrderMapper.selectById(manufacturingOrderMatIssues.get(0).getMoId()); if (!manufacturingOrder.getState().equals(ManufacturingOrderStates.ISSUED.getValue())) { return R.failed("非已下达订单不可进行取消发料"); } // 获取发料明细对应库存是工序库存的数据 List stockIdList = manufacturingOrderMatIssues.stream().map(ManufacturingOrderMatIssue::getStockId).collect(Collectors.toList()); List operationStockIdList = stockMapper.selectObjs(Wrappers.lambdaQuery().select(Stock::getId).in(Stock::getId, stockIdList).eq(Stock::getOperationStockStatus, Boolean.TRUE)); JSONObject param = new JSONObject().fluentPut("RECORD_ID", UUID.randomUUID().toString()).fluentPut("SYSCODE", "LMES").fluentPut("SYSMODEL", "车间订单取消发料"); JSONArray infoArray = new JSONArray(); for (ManufacturingOrderMatIssue manufacturingOrderMatIssue : manufacturingOrderMatIssues) { // 如果是工序库存,则不对接IFS if (CollectionUtil.isNotEmpty(operationStockIdList) && operationStockIdList.stream().anyMatch(i -> i.equals(manufacturingOrderMatIssue.getStockId()))) { continue; } JSONObject info = new JSONObject(); info.put("ORDER_NO", manufacturingOrder.getIfsOrderNo()); //订单号 info.put("RELEASE_NO", manufacturingOrder.getIfsReleaseNo()); //下达号 info.put("SEQUENCE_NO", manufacturingOrder.getIfsSequenceNo()); //序列号 if (StringUtils.isNotBlank(manufacturingOrderMatIssue.getIfsLineItemNo())) { info.put("LINE_ITEM_NO", new Long(manufacturingOrderMatIssue.getIfsLineItemNo()));//行项号 } info.put("PART_NO", manufacturingOrderMatIssue.getPartNo()); //零件编号 info.put("LOCATION_NO", manufacturingOrderMatIssue.getLocationNo()); //库位号 info.put("LOT_BATCH_NO", manufacturingOrderMatIssue.getLotBatchNo()); //批次号 info.put("SERIAL_NO", manufacturingOrderMatIssue.getSerialNo()); //序列号 默认是 info.put("ENG_CHG_LEVEL", manufacturingOrderMatIssue.getEngChgLevel()); //版本号 info.put("WAIV_DEV_REJ_NO", manufacturingOrderMatIssue.getWdrNo()); //WDR编号 info.put("QTY_TO_UNISSUE", manufacturingOrderMatIssue.getQtyIssue()); //要下发数量 infoArray.add(info); } param.put("BATCH_INFO", infoArray); param.put("mesParams", new JSONObject() .fluentPut("manufacturingOrderId", manufacturingOrderMatIssues.get(0).getMoId()) .fluentPut("SYSMODEL", "车间订单取消发料") .fluentPut("manufacturingOrderMatIssueArray", infoArray)); R result = ifsFeignClient.importSoMaterialUnissueStd(param, true); if (result.getCode() == 0) { manufacturingOrderMatIssues.forEach(manufacturingOrderMatIssue -> { if (manufacturingOrderMatIssue.getStockId() != null) { stockUtils.updateById(manufacturingOrderMatIssue.getStockId(), manufacturingOrderMatIssue.getQtyIssue(), BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, manufacturingOrder.getMoNo(), "MOMATUNISSUE"); } }); baseMapper.delete(Wrappers.lambdaQuery().in(ManufacturingOrderMatIssue::getId, ids)); return R.ok().setMsg("成功"); } else { return R.failed("IFS错误——" + result.getMsg()); } } catch (Exception e) { return R.failed("同步异常"); } } /** * 不分页查询 * * @param manufacturingOrderMatIssue * @return */ @Override public List list(ManufacturingOrderMatIssue manufacturingOrderMatIssue) { return baseMapper.selectList(QueryWrapperUtil.gen(manufacturingOrderMatIssue)); } }