Merge remote-tracking branch 'origin/uat-temp-castle-2502071033-kitting' into test

tags/yfai-mes-ext-v3.11 yfai-mes-ext-v3.11
王杰 3 months ago
commit 3de53d476a

@ -74,4 +74,10 @@ public interface IMesWorkOrderService extends IBaseMesService<MesWorkOrder> {
@ApiOperation(value = "BTO工单看板")
List<MesWorkOrderBoardResModel> orderBoard(MesWorkOrderBoardReqModel workOrderBoardReqModel);
@ApiOperation(value = "根据工单状态改变--生成拉动单")
void doCreateKittingOrder(List<MesWorkOrder> workOrderListNew,MesPartPull mesPartPull,MesWorkCenter mesWorkCenter);
@ApiOperation(value = "根据工单状态改变--关闭拉动但")
void doCloseKittingOrder(MesWorkOrder mesWorkOrder,String userName);
}

@ -0,0 +1,97 @@
import cn.estsh.i3plus.platform.common.tool.TimeTool
import cn.estsh.i3plus.pojo.mes.dbinterface.MesInterfaceDataMapper
import cn.estsh.i3plus.pojo.mes.repository.MesPullingOrderInfoRepository
import cn.estsh.i3plus.pojo.mes.repository.MesPullingOrderPartInfoRepository
import lombok.Getter
import lombok.Setter
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
import org.springframework.util.CollectionUtils
import cn.estsh.i3plus.platform.plugin.datasource.DynamicDataSourceProxy
import javax.annotation.Resource
import java.sql.Connection
/**
* @Description :meswms kitting
* @Reference :
* @Author : castle
* @CreateDate 2024/7/5 10:43
* @Modify:
* */
class MesKittingOrderToWms {
public static final Logger LOGGER = LoggerFactory.getLogger(MesKittingOrderToWms.class)
@Resource(name = "yfasDataSource")
private DynamicDataSourceProxy yfasDataSource;
@Resource(name = "mesDataSource")
private DynamicDataSourceProxy mesDataSource;
@Getter
@Setter
private Connection mesConn;
@Resource
private MesPullingOrderPartInfoRepository mesPullingOrderPartInfoRao;
@Resource
private MesPullingOrderInfoRepository mesPullingOrderInfoRao;
def readData(MesInterfaceDataMapper mapper) throws Exception {
LOGGER.info("-------- Read Start 读取kitting拉动单 ---------------")
List<String> updateList = new ArrayList<>();
Map<String, Object> params = new HashMap<>();
String sql = "select * from " + mapper.getSrcTableName() + " where " + mapper.getSrcWhere() + " order by " + mapper.getSrcOrderBy() + " limit " + mapper.getSrcGetLimit()
//
List<Map<String, Object>> dataList = queryDataTable(sql, params);
List<Map<String,Object>> result = new ArrayList<>();
for (Map<String,Object> map in dataList){
Map<String, Object> params1 = new HashMap<>();
def pullingOrderNo = map.get("pulling_order_no")
def organizeCode = map.get("organize_code")
params1.put("pullingOrderNo",pullingOrderNo);
params1.put("srcOrganizeCode",organizeCode)
String detailSql = "select * from mes_pulling_order_part_info where organize_code = :srcOrganizeCode and pulling_order_no = :pullingOrderNo";
List<Map<String, Object>> dataDetailList = queryDataTable(detailSql, params1);
for (Map<String,Object> detail in dataDetailList){
Map<String, Object> params2 = new HashMap<>();
def workOrderNo = map.get("work_order_no")
params2.put("workOrderNo",workOrderNo);
params2.put("srcOrganizeCode",organizeCode)
String workOrderSql = "select * from mes_work_order where organize_code = :srcOrganizeCode and work_order_no = :workOrderNo";
List<Map<String, Object>> workOrderList = queryDataTable(workOrderSql, params2)
def mesWorkOrder = workOrderList.get(0)
detail.put("pull_part_no",detail.get("part_no"))
detail.put("pull_part_name",detail.get("part_name"))
detail.put("part_no",map.get("part_no"))
detail.put("part_name",map.get("part_name"))
detail.put("work_center_code",map.get("work_center_code"))
detail.put("status",map.get("pull_order_status"))
detail.put("shift",mesWorkOrder.get("shift_code")+":"+mesWorkOrder.get("shift_name"))
result.add(detail);
}
updateList.add("update "+mapper.getSrcTableName()+" set system_sync_status=1 , system_sync_date_time = '"+ TimeTool.getNowTime(true)+"' where pulling_order_no= '" + pullingOrderNo + "' ;")
}
//
if (!CollectionUtils.isEmpty(updateList) && updateList.size() > 0) {
this.mesConn = mesDataSource.getWriteConnectionWithoutPool();
mesDataSource.executeAsBatch(updateList, mesConn)
mesDataSource.closeConnectionWithoutPoll(this.mesConn)
}
return result;
}
private List<Map<String, Object>> queryDataTable(String sql, Map<String, Object> params) {
NamedParameterJdbcTemplate namedJdbcTemplate = new NamedParameterJdbcTemplate(mesDataSource.getDataSource())
List<Map<String, Object>> dataMap = namedJdbcTemplate.queryForList(sql, params)
return dataMap;
}
}

@ -39,6 +39,7 @@ import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.map.CaseInsensitiveMap;
import org.apache.commons.collections.map.HashedMap;
import org.python.antlr.ast.While;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
@ -48,6 +49,7 @@ import org.springframework.util.StringUtils;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalTime;
import java.util.*;
@ -186,6 +188,26 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
@Autowired
private MesPartProdGroupRepository mesPartProdGroupRao;
@Autowired
private MesPullingOrderInfoRepository mesPullingOrderInfoRao;
@Autowired
private MesPullingOrderPartInfoRepository pullingOrderPartInfoRao;
@Autowired
private MesPartPullRepository partPullRao;
@Autowired
private MesWorkCenterRepository workCenterRao;
@Autowired
private MesPartPullDetailRepository partPullDetailRao;
@Autowired
private MesBomRepository bomRao;
@Override
public MesWorkOrder insert(MesWorkOrder bean) {
// 数据校验
@ -220,6 +242,10 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
//非排序
} else if (bean.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()) {
insertUnSortWorkOrder(bean, mesWorkCenter);
//创建kitting
List<MesWorkOrder> kittingList = new ArrayList<>();
kittingList.add(bean);
doCreateKitting(kittingList,bean.getOrganizeCode());
//bto
} else {
insertBtoWorkOrder(bean);
@ -269,15 +295,53 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
closeMesPrintQueue(bean.getWorkOrderNo(), bean.getOrganizeCode(), AuthUtilExt.getUserName());
}
result.setWorkOrderStatus(bean.getWorkOrderStatus());
//非排序关闭订单 需要关闭kitting
doCloseKittingOrder(bean,bean.getModifyUser());
List<MesWorkOrder> list = new ArrayList<>();
list.add(bean);
doCreateKitting(list,bean.getOrganizeCode());
}
updateMesWorkOrder(result,MesExtEnumUtil.WORK_ORDER_LOG_TYPE.UPDATE,0);
if (isSavePrintQueue) insertPrintQueue(result);
if (isSavePrintQueue) {
insertPrintQueue(result);
//发布时 校验是否需要生成拉动单
List<MesWorkOrder> list = new ArrayList<>();
list.add(result);
doCreateKitting(list,result.getOrganizeCode());
}
return result;
}
public void doCloseKittingOrder(MesWorkOrder mesWorkOrder,String userName){
String organizeCode = mesWorkOrder.getOrganizeCode();
DdlPackBean pullOrderPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkOrderNo(),"workOrderNo",pullOrderPackBean);
List<MesPullingOrderInfo> pullingOrderInfoList = pullingOrderInfoRepository.findByHqlWhere(pullOrderPackBean);
if (pullingOrderInfoList != null && !pullingOrderInfoList.isEmpty()) {
List<MesPullingOrderInfo> infoList = pullingOrderInfoList.stream().filter(item -> item.getPullOrderStatus() != MesExtEnumUtil.PULL_ORDER_STATUS.PULL_ORDER_STATUS_50.getValue()).collect(Collectors.toList());
if (!infoList.isEmpty()) {
MesPullingOrderInfo info = infoList.get(0);
String pullCode = info.getPullCode();
//查询出拉动组,判断是否需要关闭拉动单
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(pullCode,"pullCode",ddlPackBean);
List<MesPartPull> mesPartPullList = partPullRao.findByHqlWhere(ddlPackBean);
if (mesPartPullList!= null && !mesPartPullList.isEmpty()) {
MesPartPull mesPartPull = mesPartPullList.get(0);
String pullOrderCloseState = mesPartPull.getPullOrderCloseState();
if (!StringUtils.isEmpty(pullOrderCloseState)){
List<String> closeState = Arrays.asList(pullOrderCloseState.split(","));
if (closeState.contains(mesWorkOrder.getWorkOrderStatus().toString())){
mesPullingOrderInfoRao.updateByProperties(new String[]{"workOrderNo"}, new Object[]{mesWorkOrder.getWorkOrderNo()}, new String[]{"pullOrderStatus","modifyUser"}, new Object[]{ MesExtEnumUtil.PULL_ORDER_STATUS.PULL_ORDER_STATUS_50.getValue(),userName});
}
}
}
}
}
}
@Override
protected void setPackQueryBean(MesWorkOrder bean, DdlPackBean packBean) {
DdlPreparedPack.getStringLikerPack(bean.getWorkOrderNo(), MesExtConstWords.WORK_ORDER_NO, packBean);
@ -665,6 +729,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
seqList = syncFuncService.syncSerialNo(orderSeqSerialNoModel.organizeCode(next.getOrganizeCode()), next.getCreateUser(), next.getOrganizeCode(), mesWorkOrderList.size()).getResultList();
}
List<MesWorkOrderLog> mesWorkOrderLogList = new ArrayList<>();
List<MesWorkOrder> workOrderListForKitting = new ArrayList<>();
int index = 0;
for (MesWorkOrder item : mesWorkOrderList) {
//获取相同类型 相同标识 生产序号最大值的
@ -687,6 +752,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
ConvertBean.serviceModelInitialize(copyMesWorkOrder, item.getCreateUser());
index++;
baseRDao.insert(copyMesWorkOrder);
//保存记录
MesWorkOrderLog workOrderLog = new MesWorkOrderLog();
BeanUtils.copyProperties(item, workOrderLog,MesExtConstWords.ID,MesExtConstWords.SYSTEM_SYNC_STATUS);
@ -713,6 +779,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
item.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
ConvertBean.serviceModelInitialize(item, item.getCreateUser());
baseRDao.insert(item);
workOrderListForKitting.add(item);
index++;
//保存记录
MesWorkOrderLog workOrderLog = new MesWorkOrderLog();
@ -723,6 +790,328 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
if (!CollectionUtils.isEmpty(mesWorkOrderLogList)) {
workOrderLogService.insertBatch(mesWorkOrderLogList);
}
//创建kitting
doCreateKitting(workOrderListForKitting, next.organizeCode);
}
private void doCreateKitting(List<MesWorkOrder> mesWorkOrderList,String organizeCode) {
mesWorkOrderList = mesWorkOrderList.stream().filter(item ->item.getPullingStatus()!=MesExtEnumUtil.WORK_ORDER_PULLING_STATUS.SUBMIT.getValue()).collect(Collectors.toList());
if (mesWorkOrderList.isEmpty()){
return;
}
//1.拉动组获取 -- 根据拉动组类型获取kitting,需要判断是否生成是否生成拉动单开关
DdlPackBean partPullPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PART_PULL_ORDER_TYPE.KITTING_PULL.getValue(),"pullOrderType", partPullPackBean);
DdlPreparedPack.getNumEqualPack(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(),"isAutoCreatePullOrder", partPullPackBean);
List<MesPartPull> mesPartPullList = partPullRao.findByHqlWhere(partPullPackBean);
//2.工单 过滤出未生成拉动单的工单pullingStatus,按照拉动组产线分组,每组按照工单序号排序
Map<String, List<MesWorkOrder>> workOrderMap = mesWorkOrderList.stream().filter(item -> item.getPullingStatus() == MesExtEnumUtil.WORK_ORDER_PULLING_STATUS.NOTCREATE.getValue()).collect(Collectors.groupingBy(MesWorkOrder::getWorkCenterCode));
//3.查询2中所有的产线信息 ,判断生成拉动单的工单状态 generateStatus 与工单状态对比 是否生成拉动单 MesExtEnumUtil.GENERATE_STATUS需要和工单类型一致才生成拉动单
List<String> workOrderCenterList = new ArrayList<>(workOrderMap.keySet());
DdlPackBean workCenterPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getInPackList(workOrderCenterList,"workCenterCode", workCenterPackBean);
List<MesWorkCenter> workCenterList = workCenterRao.findByHqlWhere(workCenterPackBean);
Map<String, List<MesWorkCenter>> workCenterMap = workCenterList.stream().collect(Collectors.groupingBy(MesWorkCenter::getWorkCenterCode));
//4.遍历拉动组
for (MesPartPull mesPartPull : mesPartPullList) {
String workCenterCode = mesPartPull.getWorkCenterCode();
//按数量圆整
if(mesPartPull.getRoundMethod() == MesExtEnumUtil.PART_PULL_ROUND_METHOD.ROUND_BY_QUANTITY.getValue()){
List<MesWorkOrder> workOrderList = workOrderMap.get(workCenterCode);
//遍历工单打散成bom 生成拉动单
List<MesWorkCenter> mesWorkCenters = workCenterMap.get(workCenterCode);
if (CollectionUtils.isEmpty(workOrderList) || CollectionUtils.isEmpty(mesWorkCenters)) {
continue;
}
//判断当前产线是否需要生成拉动单
MesWorkCenter mesWorkCenter = mesWorkCenters.get(0);
Integer generateStatus = mesWorkCenter.getGenerateStatus();
if (generateStatus == null){
generateStatus = MesExtEnumUtil.GENERATE_STATUS.GENERATE_STATUS_20.getValue();
}
Map<String, List<MesWorkOrder>> orderMap = workOrderList.stream().collect(Collectors.groupingBy(MesWorkOrder::getPartNo));
for (String producePartNoAndTime : orderMap.keySet()) {
List<MesWorkOrder> workOrderListNew = orderMap.get(producePartNoAndTime);
Integer finalGenerateStatus = generateStatus;
//过滤掉不生成拉动单的工单
workOrderListNew = workOrderListNew.stream().filter(item -> item.getWorkOrderStatus().equals(finalGenerateStatus)).collect(Collectors.toList());
if (!workOrderListNew.isEmpty()) {
doCreateKittingOrder(workOrderListNew,mesPartPull,mesWorkCenter);
}
}
//按成套圆整
} else if (mesPartPull.getRoundMethod() == MesExtEnumUtil.PART_PULL_ROUND_METHOD.ROUND_DOOR_PANELS_NUMBER.getValue()) {
//按成套圆整 会是同一个拉动组 生成拉动单
List<MesWorkOrder> workOrderList1 = workOrderMap.get(workCenterCode);
if (CollectionUtils.isEmpty(workOrderList1)) {
continue;
}
Map<Long, List<MesWorkOrder>> groupCodeMap = workOrderList1.stream().collect(Collectors.groupingBy(MesWorkOrder::getGroupCode));
for (Long l : groupCodeMap.keySet()) {
List<MesWorkOrder> workOrderList = groupCodeMap.get(l);
List<MesWorkCenter> mesWorkCenters = workCenterMap.get(workCenterCode);
if (CollectionUtils.isEmpty(workOrderList) || CollectionUtils.isEmpty(mesWorkCenters)) {
continue;
}
doCreateGroupKittingOrder(workOrderList,mesPartPull,mesWorkCenters.get(0));
}
}
}
}
//按成套圆整
private void doCreateGroupKittingOrder(List<MesWorkOrder> workOrderListNew,MesPartPull mesPartPull,MesWorkCenter mesWorkCenter){
String organizeCode = mesPartPull.getOrganizeCode();
List<MesBom> list = new ArrayList<>();
//1.查询拉动组详情
DdlPackBean pullPartDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(mesPartPull.getPullCode(),"pullCode", pullPartDetailPackBean);
List<MesPartPullDetail> mesPartPullDetailList = partPullDetailRao.findByHqlWhere(pullPartDetailPackBean);
if (CollectionUtils.isEmpty(mesPartPullDetailList)) {
return;
}
// 打散所有的工单的bom
List<String> pullPartNoList = mesPartPullDetailList.stream().map(MesPartPullDetail::getPullPartNo).collect(Collectors.toList());
Map<String, MesPartPullDetail> pullDetailMap = mesPartPullDetailList.stream().collect(Collectors.toMap(MesPartPullDetail::getPullPartNo, Function.identity()));
for (MesWorkOrder mesWorkOrder : workOrderListNew) {
List<MesBom> bomList = getPlatBom(null, mesWorkOrder.getPartNo(), TimeTool.getNowTime(true), organizeCode);
List<MesBom> collect = bomList.stream().filter(item -> pullPartNoList.contains(item.getItemPartNo())).collect(Collectors.toList());
mesBomRDao.detachList(collect);
collect.forEach(item -> item.setItemQty(item.getItemQty() * mesWorkOrder.getQty()));
list.addAll(collect);
}
if (list.isEmpty()){
return;
}
// 计算所有拉动单的数量,生成拉动单
String kittingOrderNoRuleCode = mesConfigService.getCfgValue(organizeCode, "KITTING_ORDER_NO_RULE_CODE");
GenSerialNoModel genSerialNoModel = new GenSerialNoModel(kittingOrderNoRuleCode);
genSerialNoModel.setDynamicRule(mesPartPull.getPullCode());
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel.organizeCode(organizeCode), AuthUtil.getSessionUser().getUserName(), organizeCode, 1).getResultList();
String serialNo = resultList.get(0);
String workOrderStr = workOrderListNew.stream().map(MesWorkOrder::getWorkOrderNo).collect(Collectors.joining("/r/n"));
String workOrderPartNoStr = workOrderListNew.stream().map(MesWorkOrder::getPartNo).collect(Collectors.joining("/r/n"));
String workOrderPartNameStr = workOrderListNew.stream().map(MesWorkOrder::getPartName).collect(Collectors.joining("/r/n"));
String custPartNo = workOrderListNew.stream().map(MesWorkOrder::getCustPartNo).collect(Collectors.joining("/r/n"));
MesPullingOrderInfo pullingOrder = new MesPullingOrderInfo();
pullingOrder.setOrganizeCode(organizeCode);
pullingOrder.setPullingOrderNo(serialNo); //拉动单号 + 8位年月日 + 5位流水号
pullingOrder.setPullOrderType(mesPartPull.getPullOrderType());
pullingOrder.setPullGroupFid(mesPartPull.getId());
pullingOrder.setWorkOrderNo(workOrderStr);
pullingOrder.setIsPrint(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
pullingOrder.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue());
pullingOrder.setPullOrderStatus(MesExtEnumUtil.PULL_ORDER_STATUS.PULL_ORDER_STATUS_10.getValue());
pullingOrder.setWorkCenterCode(mesPartPull.getWorkCenterCode());
pullingOrder.setPullCode(mesPartPull.getPullCode());
pullingOrder.setPartNo(workOrderPartNoStr);
pullingOrder.setPartName(workOrderPartNameStr);
pullingOrder.setCustPartNo(custPartNo);
pullingOrder.setCarModelCode(workOrderListNew.get(0).getCarModelCode());
pullingOrder.setOrderFlag(workOrderListNew.get(0).getOrderFlag());
ConvertBean.serviceModelInitialize(pullingOrder, AuthUtil.getSessionUser().getUserName());
mesPullingOrderInfoRao.insert(pullingOrder);
// 需要合并同类项
Map<String, List<MesBom>> itemBomMap = list.stream().collect(Collectors.groupingBy(MesBom::getItemPartNo));
for (String itemPartNo : itemBomMap.keySet()) {
List<MesBom> mesBoms = itemBomMap.get(itemPartNo);
double sum = mesBoms.stream().collect(Collectors.summarizingDouble(MesBom::getItemQty)).getSum();
MesPullingOrderPartInfo detail = new MesPullingOrderPartInfo();
detail.setOrganizeCode(organizeCode);
detail.setPullCode(pullingOrder.getPullCode());
detail.setPullingOrderNo(pullingOrder.getPullingOrderNo());
detail.setWorkOrderNo(pullingOrder.getWorkOrderNo());
detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq());
detail.setCustOrderNo(pullingOrder.getCustOrderNo());
MesBom mesBom = mesBoms.get(0);
detail.setPartNo(mesBom.getItemPartNo());
detail.setPartName(mesBom.getItemPartName());
detail.setPullQty(sum);
detail.setCustOrderNo(pullingOrder.getCustOrderNo());
detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq());
detail.setWaterSeq(pullingOrder.getProductSeq());
detail.setWorkCellCode(mesWorkCenter.getWorkCenterCode());
detail.setStatus(MesExtEnumUtil.PULL_ORDER_PART_STATUS.UN_SENTED.getValue());///明细已送料为1未送料为0
detail.setCustPartNo(pullingOrder.getCustPartNo());
detail.setCarSeries(pullDetailMap.get(itemPartNo) == null ? "" : pullDetailMap.get(itemPartNo).getCarSeries());
detail.setOrderFlag(pullingOrder.getOrderFlag());
ConvertBean.serviceModelInitialize(detail, AuthUtil.getSessionUser().getUserName());
pullingOrderPartInfoRao.insert(detail);
}
}
public void doCreateKittingOrder(List<MesWorkOrder> workOrderListNew,MesPartPull mesPartPull,MesWorkCenter mesWorkCenter) {
String organizeCode = mesWorkCenter.getOrganizeCode();
//1.查询拉动组详情
DdlPackBean pullPartDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(mesPartPull.getPullCode(),"pullCode", pullPartDetailPackBean);
List<MesPartPullDetail> mesPartPullDetailList = partPullDetailRao.findByHqlWhere(pullPartDetailPackBean);
if (CollectionUtils.isEmpty(mesPartPullDetailList)) {
return;
}
//拉动组详情中的零件号
List<String> partNoList = mesPartPullDetailList.stream().map(MesPartPullDetail::getPartNo).collect(Collectors.toList());
//深汕按照数量圆整
if (mesPartPull.getRoundMethod() == MesExtEnumUtil.PART_PULL_ROUND_METHOD.ROUND_BY_QUANTITY.getValue()){
int packRoundQty =(int)Double.parseDouble(mesPartPull.getPackRoundQty());
String partNo = workOrderListNew.get(0).getPartNo();
//打散bom
List<MesBom> bomList = getPlatBom(null, partNo, TimeTool.getNowTime(true), organizeCode);
//需要生成拉动单的零件
List<MesBom> bomPullList = bomList.stream().filter(item -> partNoList.contains(item.getItemPartNo())).collect(Collectors.toList());
mesBomRDao.detachList(bomPullList);
for (MesWorkOrder mesWorkOrder : workOrderListNew) {
Double qty = mesWorkOrder.getQty();
bomPullList.forEach(item -> item.setItemQty(item.getItemQty() * qty));
DoubleSummaryStatistics summaryStatistics = bomPullList.stream().collect(Collectors.summarizingDouble(MesBom::getItemQty));
double max = summaryStatistics.getMax();
int multiple = (int)Math.ceil(max / packRoundQty); //生成的拉动的数量
for (int i = 1; i <= multiple; i++) {
insertPullOrderInfo( mesWorkOrder, bomPullList, mesPartPull, mesPartPullDetailList, organizeCode, i, packRoundQty);
}
workOrderRepository.updateByProperties("workOrderNo",mesWorkOrder.getWorkOrderNo(),"pullingStatus",MesExtEnumUtil.WORK_ORDER_PULLING_STATUS.SUBMIT.getValue());
}
// /**
// * 满足一个拉动组就生成一个拉动单
// * 分类
// * 1.当前bom 子零件数量 * 工单需求数量 > packRoundQty multiple是多少是否有余数 取模
// * 2.当前bom 子零件数量 * 工单需求数量 = packRoundQty 直接整除看看是否大于1 大于1需要拆分多个拉动单
// * 3.当前bom 子零件数量 * 工单需求数量 < packRoundQty 需要增加一个工单来补充当前的数量,补不齐继续补充
// */
// Map<String,Double> partNoRemainder = new HashMap<>();
// for (int i = 0; i < workOrderListNew.size(); i++) {
// MesWorkOrder mesWorkOrder = workOrderListNew.get(0);
// Double qty = mesWorkOrder.getQty();
// bomPullList.forEach(item -> item.setItemQty(item.getItemQty() * qty));
// for (int j = 0; j < bomPullList.size(); j++) {
// double m = bomPullList.get(j).getItemQty() % packRoundQty;
// double n = bomPullList.get(j).getItemQty() / packRoundQty;
// if (m == 0 && n != 0){
// //子零件数量 * 工单需求数量 = packRoundQty
// //证明当前零件需要拉动的数量是圆整数量的倍数,需要拆分多个拉动单,或者一个拉动单就满足了
//
// }else if (m != 0 && n == 0) {
// //子零件数量 * 工单需求数量 < packRoundQty
// //证明需要凑下一个工单的当前零件
// } else if (m !=0 && n > 0) {
// //子零件数量 * 工单需求数量 > packRoundQty
// //够一个拉动单以上的数据,还有余数给
//
// }
// }
// }
}
}
private void insertPullOrderInfo(MesWorkOrder mesWorkOrder,List<MesBom> bomPullList,MesPartPull mesPartPull,List<MesPartPullDetail> mesPartPullDetailList,String organizeCode,int i, int roundPackQty){
//校验当前工单是否已经生成过拉动单,如果已经生成过则不在生成
// DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
// DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkOrderNo(),"workOrderNo", ddlPackBean);
// int count = mesPullingOrderInfoRao.findByHqlWhereCount(ddlPackBean);
// if (count >0){
// return;
// }
// 计算所有拉动单的数量,生成拉动单
Map<String, List<MesPartPullDetail>> pullDetailMap = mesPartPullDetailList.stream().filter(item->!StringUtils.isEmpty(item.getPullPartNo())).collect(Collectors.groupingBy(MesPartPullDetail::getPullPartNo));
List<String> pullDetailPartList = mesPartPullDetailList.stream().map(MesPartPullDetail::getPullPartNo).collect(Collectors.toList());
String kittingOrderNoRuleCode = mesConfigService.getCfgValue(organizeCode, "KITTING_ORDER_NO_RULE_CODE");
GenSerialNoModel genSerialNoModel = new GenSerialNoModel(kittingOrderNoRuleCode);
genSerialNoModel.setDynamicRule(mesPartPull.getPullCode());
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel.organizeCode(organizeCode), AuthUtil.getSessionUser().getUserName(), organizeCode, 1).getResultList();
String serialNo = resultList.get(0);
MesPullingOrderInfo pullingOrder = new MesPullingOrderInfo();
pullingOrder.setOrganizeCode(organizeCode);
pullingOrder.setPullingOrderNo(serialNo); //拉动单号 + 8位年月日 + 5位流水号
pullingOrder.setPullOrderType(mesPartPull.getPullOrderType());
pullingOrder.setPullGroupFid(mesPartPull.getId());
pullingOrder.setWorkOrderNo(mesWorkOrder.getWorkOrderNo());
pullingOrder.setIsPrint(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
pullingOrder.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue());
pullingOrder.setPullOrderStatus(MesExtEnumUtil.PULL_ORDER_STATUS.PULL_ORDER_STATUS_10.getValue());
pullingOrder.setWorkCenterCode(mesPartPull.getWorkCenterCode());
pullingOrder.setPullCode(mesPartPull.getPullCode());
pullingOrder.setPartNo(mesWorkOrder.getPartNo());
pullingOrder.setPartName(mesWorkOrder.getPartName());
pullingOrder.setCustPartNo(mesWorkOrder.getCustPartNo());
pullingOrder.setCarModelCode(mesWorkOrder.getCarModelCode());
pullingOrder.setOrderFlag(mesWorkOrder.getOrderFlag());
ConvertBean.serviceModelInitialize(pullingOrder, AuthUtil.getSessionUser().getUserName());
mesPullingOrderInfoRao.insert(pullingOrder);
List<MesBom> filterBomList = bomPullList.stream().filter(item -> pullDetailPartList.contains(item.getItemPartNo())).collect(Collectors.toList());
for (MesBom mesBom : filterBomList) {
MesPullingOrderPartInfo detail = new MesPullingOrderPartInfo();
List<MesPartPullDetail> mesPartPullDetailList1 = pullDetailMap.get(mesBom.getItemPartNo());
for (MesPartPullDetail mesPartPullDetail : mesPartPullDetailList1) {
detail.setOrganizeCode(organizeCode);
detail.setPullCode(pullingOrder.getPullCode());
detail.setPullingOrderNo(pullingOrder.getPullingOrderNo());
detail.setWorkOrderNo(pullingOrder.getWorkOrderNo());
detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq());
detail.setCustOrderNo(pullingOrder.getCustOrderNo());
detail.setPartNo(mesBom.getItemPartNo());
detail.setPartName(mesBom.getItemPartName());
double remainingQty = mesBom.getItemQty() - i * roundPackQty;
if (remainingQty < -roundPackQty){
continue;
}
detail.setPullQty(remainingQty > 0 ? roundPackQty : (mesBom.getItemQty() - (i-1) * roundPackQty));
detail.setCustOrderNo(pullingOrder.getCustOrderNo());
detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq());
detail.setWaterSeq(pullingOrder.getProductSeq());
detail.setWorkCellCode(mesPartPullDetail.getWorkCellCode());
// detail.setStatus(MesExtEnumUtil.PULL_ORDER_PART_STATUS.UN_SENTED.getValue());///明细已送料为1未送料为0
detail.setCustPartNo(pullingOrder.getCustPartNo());
detail.setCarSeries(mesPartPullDetail.getCarSeries() == null ? "" : mesPartPullDetail.getCarSeries());
detail.setOrderFlag(pullingOrder.getOrderFlag());
ConvertBean.serviceModelInitialize(detail, AuthUtil.getSessionUser().getUserName());
pullingOrderPartInfoRao.insert(detail);
}
}
}
private List<MesBom> getPlatBom(MesBom mesBom,String partNo, String effectiveTime,String organizeCode) {
//MES汇报查询BOM是否携带结束查询条件
MesConfig config = mesConfigService.getCfgValueByCode(organizeCode, MesExtConstWords.MES_REPORT_FIND_BOM_WITH_EFFENDTIME);
Boolean isWithEffEndTime = (null != config && !org.springframework.util.StringUtils.isEmpty(config.getCfgValue()) && config.getCfgValue().equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr())) ? true : false;
if (mesBom == null) {
//首先根据虚结构的零件号查询出最新的一条bom信息作为bomCode
DdlPackBean bomCodePackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(partNo, MesExtConstWords.PART_NO, bomCodePackBean);
DdlPreparedPack.getStringSmallerPack(effectiveTime, MesExtConstWords.EFF_START_TIME, bomCodePackBean);
if (isWithEffEndTime) DdlPreparedPack.getStringBiggerPack(effectiveTime, MesExtConstWords.EFF_END_TIME, bomCodePackBean);
DdlPreparedPack.getOrderBy(MesExtConstWords.EFF_START_TIME, CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), bomCodePackBean);
List<MesBom> bomList = bomRao.findByHqlTopWhere(bomCodePackBean, 1);
if (bomList == null || bomList.isEmpty()) {
return new ArrayList<>();
}
mesBom = bomList.get(0);
}
List<MesBom> bomResultList = new ArrayList<>();
DdlPackBean bomPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(mesBom.getBomCode(), "bomCode", bomPackBean);
DdlPreparedPack.getStringEqualPack(partNo, MesExtConstWords.PART_NO, bomPackBean);
DdlPreparedPack.getStringEqualPack(mesBom.getEffStartTime(), MesExtConstWords.EFF_START_TIME, bomPackBean);
List<MesBom> bomList = bomRao.findByHqlWhere(bomPackBean);
for (MesBom bom : bomList) {
if (bom.getPartType() != null && bom.getPartType().equalsIgnoreCase("X")) {
bomResultList.addAll(getPlatBom(null,bom.getItemPartNo(), effectiveTime, organizeCode));
} else {
bom.setBomCode(bom.getBomCode().toLowerCase());
bomResultList.add(bom);
}
}
return bomResultList;
}
private void checkData(List<MesWorkOrder> mesWorkOrderList, String organizeCode) {
@ -970,6 +1359,8 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
@Override
public void doProductReport(MesWorkOrder mesWorkOrder) {
//初始的工单状态
Integer workOrderStatusInit = mesWorkOrder.getWorkOrderStatus();
MesWorkOrder mesWorkOrderDb = getMesWorkOrder(mesWorkOrder.getWorkOrderNo(),mesWorkOrder.getOrganizeCode());
mesWorkOrderDb.setDescription(mesWorkOrder.getDescription());
//查询物料信息
@ -1033,6 +1424,14 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
mesWorkOrderDb.setRemark(mesWorkOrder.getRemark());
//更新工单
updateMesWorkOrder(mesWorkOrderDb,(MesExtEnumUtil.REPORT_TYPE.REPORT.getValue() == mesWorkOrder.getReportType()) ? MesExtEnumUtil.WORK_ORDER_LOG_TYPE.REPORT : MesExtEnumUtil.WORK_ORDER_LOG_TYPE.REPORT_ADJUST,mesWorkOrder.getNum());
//2025/2/19 状态改变了需要校验是否生成拉动单,是否关闭拉动单
if (!Objects.equals(mesWorkOrderDb.getWorkOrderStatus(), workOrderStatusInit)){
doCloseKittingOrder(mesWorkOrderDb,mesWorkOrderDb.getModifyUser());
List<MesWorkOrder> list = new ArrayList<>();
list.add(mesWorkOrderDb);
doCreateKitting(list,mesWorkOrderDb.getOrganizeCode());
}
//试制单不报工
if(Objects.isNull(mesWorkOrderDb.getOrderFlag()) || !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(mesWorkOrderDb.getOrderFlag())){
String sn = getStringList(mesWorkOrder.getOrganizeCode(), AuthUtilExt.getUserName());
@ -1248,6 +1647,17 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
//关闭工单
baseRDao.updateByProperties(new String[]{MesExtConstWords.MODIFY_USER, MesExtConstWords.MODIFY_DATE_TIME, MesExtConstWords.WORK_ORDER_STATUS, MesExtConstWords.SYSTEM_SYNC_STATUS},
new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()}, ddlPackBean);
//关闭工单后校验是否生成拉动单,是否关闭拉动单
List<MesWorkOrder> mesWorkOrderListNew = new ArrayList<>();
for (MesWorkOrder mesWorkOrder : mesWorkOrderList) {
MesWorkOrder mesWorkOrderNew = new MesWorkOrder();
BeanUtils.copyProperties(mesWorkOrder, mesWorkOrderNew);
mesWorkOrderNew.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue());
mesWorkOrderListNew.add(mesWorkOrderNew);
doCloseKittingOrder(mesWorkOrderNew,userName);
}
doCreateKitting(mesWorkOrderListNew,organizeCode);
}

@ -1,7 +1,7 @@
#\u9879\u76EE\u540D\u79F0
spring.application.name=i3mes
#\u4F7F\u7528\u914D\u7F6E
spring.profiles.active=docker,cus-docker
spring.profiles.active=6,cus-71
######### \u81EA\u5B9A\u4E49\u53C2\u6570 #########
#\u9879\u76EE\u63CF\u8FF0\u4FE1\u606F\uFF08swagger\u4E2D\u663E\u5F0F\uFF09\uFF0C\u4E2D\u6587\u4F7F\u7528uncode\u8F6C
desc.application.name=\u751F\u4EA7\u6267\u884C\u7CFB\u7EDF

Loading…
Cancel
Save