/*
|
* 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<ManufacturingOrderMatIssueMapper, ManufacturingOrderMatIssue> 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.<MoStructureComponent>lambdaQuery()
|
.eq(MoStructureComponent::getPlanManufacturingOrderId, moId)
|
.isNull(MoStructureComponent::getParent));
|
List<ManufacturingOrderMatIssueDTO> 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<ManufacturingOrderMatIssueDTO> manufacturingOrderMatIssueDTOS) {
|
List<ManufacturingOrderMatIssueDTO> manufacturingOrderMatIssueList = baseMapper.getMatIssueFromStock(parentId);
|
Map<Long, List<ManufacturingOrderMatIssueDTO>> manufacturingOrderMatIssueMap =
|
manufacturingOrderMatIssueList.stream().collect(Collectors.groupingBy(ManufacturingOrderMatIssueDTO::getStrucId));
|
for (Map.Entry<Long, List<ManufacturingOrderMatIssueDTO>> entry :
|
manufacturingOrderMatIssueMap.entrySet()) {
|
List<ManufacturingOrderMatIssueDTO> 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<MoStructureComponentDTO> moStructureComponentDTOList = baseMapper.getMatIssuePartNoFromIfs(moId);
|
List<ManufacturingOrderMatIssue> manufacturingOrderMatIssueList = new ArrayList<>();
|
String partNos = "";
|
Map<String, String> 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<ManufacturingOrderMatIssue> getMatIssueList(Long moId) {
|
return baseMapper.selectList(Wrappers.<ManufacturingOrderMatIssue>lambdaQuery().eq(ManufacturingOrderMatIssue::getMoId, moId));
|
}
|
|
/**
|
* 车间订单发料
|
*
|
* @param manufacturingOrderMatIssues
|
* @param moId 车间订单编号
|
* @return
|
*/
|
@Override
|
public R addMatIssue(List<ManufacturingOrderMatIssue> 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<Long> ids) {
|
try {
|
if (CollectionUtil.isEmpty(ids)) {
|
throw new RuntimeException("参数不能为空");
|
}
|
List<ManufacturingOrderMatIssue> manufacturingOrderMatIssues =
|
baseMapper.selectList(Wrappers.<ManufacturingOrderMatIssue>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<Long> stockIdList =
|
manufacturingOrderMatIssues.stream().map(ManufacturingOrderMatIssue::getStockId).collect(Collectors.toList());
|
List<Object> operationStockIdList =
|
stockMapper.selectObjs(Wrappers.<Stock>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.<ManufacturingOrderMatIssue>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<ManufacturingOrderMatIssue> list(ManufacturingOrderMatIssue manufacturingOrderMatIssue) {
|
return baseMapper.selectList(QueryWrapperUtil.gen(manufacturingOrderMatIssue));
|
}
|
}
|