龙兴客户条码, 改动影响武汉

uat-temp-nht-chengdu-loading
王杰 2 months ago
parent 00cd582ce5
commit d1a18699c8

@ -39,7 +39,6 @@ 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;
@ -49,7 +48,6 @@ 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.*;
@ -206,8 +204,6 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
@Autowired
private MesBomRepository bomRao;
@Override
public MesWorkOrder insert(MesWorkOrder bean) {
// 数据校验
@ -2419,7 +2415,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
//顺序号
bean.setProductSeq(getMaxMesWorkOrderProductSeq(bean));
//生成客户条码
bean.setCustSn(getCustSn(bean.getCustPartNo(), bean.getOrganizeCode(), bean.getCreateUser()));
bean.setCustSn(getCustSnList(bean.getPartNo(), bean.getCustPartNo(), bean.getOrganizeCode(), bean.getCreateUser(), 1).get(0));
//生成工单零件 工单装配件
insertMesWorkOrder(bean, orderPartList);
// 创建工单打印队列
@ -2881,34 +2877,25 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
return count > 0;
}
private String getCustSn(String partNo,String organizeCode,String userName){
Calendar custCalendar = Calendar.getInstance();
custCalendar.setTime(new Date());
GenSerialNoModel custGenSerialNoModel= new GenSerialNoModel("WH_CUST_SN_RULE");
String prefix = partNo.substring(0, partNo.length() - 4);
String partNo4 = partNo.substring(partNo.length() - 4).toUpperCase();
custGenSerialNoModel.setPartNo(prefix+partNo4);
String year = custCalendar.get(Calendar.YEAR)+ MesExtConstWords.EMPTY;
custGenSerialNoModel.setYear(year.substring(2));
custGenSerialNoModel.setDay(String.format("%03d",custCalendar.get(Calendar.DAY_OF_YEAR)));
List<String> custNumRuleList = syncFuncService.syncSerialNo(custGenSerialNoModel, userName, organizeCode, 1).getResultList();
// [)>%RS%06%GS%Y,4110000000000X,%GS%P,%GS%12V,545238347,%GS%T1A,A2B4C,%RS%%EOT%
//截取替换为ascii码
String snOriginal = custNumRuleList.get(0);
String[] split = snOriginal.split("%RS%");
StringBuilder rsStr = new StringBuilder();
for (int i = 0; i < split.length-1; i++) {
rsStr.append(split[i]).append((char) 30);
}
rsStr.append(split[split.length - 1]);
StringBuilder gsStr = new StringBuilder();
String[] split1 = rsStr.toString().split("%GS%");
for (int i = 0; i < split1.length-1; i++) {
gsStr.append(split1[i]).append((char) 29);
}
gsStr.append(split1[split1.length-1]);
String[] split2 = gsStr.toString().split("%EOT%");
return split2[0]+(char)4;
//默认客户条码编码规则配置代码
private String getDefaultCustMatchRule(String organizeCode) {
MesConfig config = mesConfigService.getCfgValueByCode(organizeCode, MesExtConstWords.DEFAULT_CUST_MATCH_RULE);
return (null != config && !StringUtils.isEmpty(config.getCfgValue())) ? config.getCfgValue() : null;
}
private List<String> getCustSnList(String partNo, String custPartNo, String organizeCode, String userName, Integer num){
MesPart part = mesPartRDao.getByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.PART_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), partNo});
//获取物料的客户编码规则, 没有则取默认配置
String custMatchRule = (null != part && !StringUtils.isEmpty(part.getCustMatchRule())) ? part.getCustMatchRule() : getDefaultCustMatchRule(organizeCode);
if (StringUtils.isEmpty(custMatchRule)) MesException.throwBusiException("物料编码[%s]未配置客户编码规则!", partNo);
GenSerialNoModel genSerialNoModel = new GenSerialNoModel(custMatchRule).organizeCode(organizeCode).partNo(partNo);
genSerialNoModel.setCustPartNo(custPartNo);
genSerialNoModel.putDataMap(MesPart.class.getSimpleName(), part);
List<String> custNumRuleList = syncFuncService.syncSerialNo(genSerialNoModel, userName, organizeCode, 1).getResultList();
if (CollectionUtils.isEmpty(custNumRuleList)) MesException.throwBusiException("根据客户编码规则[%s]生成客户条码失败!", custMatchRule);
return custNumRuleList;
}
private List<MesWorkOrderPart> dismantleBom(List<MesBom> bomList, double qty,String organizeCode, String workCellCode, String workOrderNo) {
@ -3170,13 +3157,17 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
MesProduceSn newProduceSn = null;
MesQueueOrder newQueueOrder = null;
MesPrintQueue newPrintQueue = null;
//获取客户条码
List<String> custSnList = getCustSnList(workOrder.getPartNo(), workOrder.getCustPartNo(), workOrder.getOrganizeCode(), workOrder.getCreateUser(), generateQty.intValue() - 1);
for (int i = 1; i < generateQty; i++) {
//工单
MesWorkOrder newWorkOrder = new MesWorkOrder();
BeanUtils.copyProperties(workOrder, newWorkOrder, MesExtConstWords.ID, MesExtConstWords.SYSTEM_SYNC_STATUS);
newWorkOrder.setWorkOrderNo(getOrderNo(newWorkOrder));
newWorkOrder.setProductSeq(newWorkOrder.getProductSeq() + i);
newWorkOrder.setCustSn(getCustSn(workOrder.getCustPartNo(), workOrder.getOrganizeCode(), workOrder.getCreateUser()));
newWorkOrder.setCustSn(custSnList.get(i - 1));
newWorkOrder.setFid(UUID.randomUUID().toString());
newWrkOrderList.add(newWorkOrder);
//

@ -3,31 +3,27 @@ package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.roundness;
import cn.estsh.i3plus.ext.mes.api.base.IMesConfigService;
import cn.estsh.i3plus.ext.mes.api.base.IMesCustSoftInfoService;
import cn.estsh.i3plus.ext.mes.api.base.strategy.IRoundnessStrategy;
import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.MesBomService;
import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.MesPartSapService;
import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.MesWorkOrderService;
import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.busi.MesCreateWorkOrderImpl;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
import cn.estsh.i3plus.mes.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.bean.MesPartProdGroup;
import cn.estsh.i3plus.pojo.mes.bean.MesPartProdGroupDetail;
import cn.estsh.i3plus.pojo.mes.bean.MesPartSap;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesCustSortInfo;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.repository.*;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import org.apache.commons.lang.StringUtils;
import cn.estsh.i3plus.pojo.mes.repository.MesPartSapRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -43,64 +39,16 @@ public class MesPackageRoundnessService implements IRoundnessStrategy {
private static final Logger log = LoggerFactory.getLogger(MesPackageRoundnessService.class);
@Autowired
private MesPartSapRepository mesPartSapRao;
@Autowired
private MesProductVersionRepository mesProductVersionRao;
@Autowired
private MesWorkOrderRepository mesWorkOrderRao;
@Autowired
private MesShiftRepository mesShiftRao;
@Autowired
private MesBomService mesBomService;
@Autowired
private MesBomRepository bomRao;
@Autowired
private MesProdRuleSortCfgRepository mesProdRuleSortCfgRao;
@Autowired
private MesWorkOrderPartRepository workOrderPartRao;
@Autowired
private MesWorkOrderAssemblyRepository workOrderAssemblyRao;
@Autowired
private ISyncFuncService syncFuncService;
@Autowired
private IMesCustSoftInfoService custSoftInfoService;
@Autowired
private MesPartPtrRepository partPtrRao;
@Autowired
private MesPartSapService mesPartSapService;
@Autowired
private MesProduceSnRepository mesProduceSnRao;
@Autowired
private MesQueueOrderRepository queueOrderRao;
@Autowired
private MesWorkOrderService mesWorkOrderService;
@Autowired
private MesWorkCenterRepository workCenterRao;
@Autowired
private MesPartPtrDetailRepository partPtrDetailRao;
@Autowired
private MesCreateWorkOrderImpl mesCreateWorkOrder;
@Autowired
@ -201,8 +149,8 @@ public class MesPackageRoundnessService implements IRoundnessStrategy {
return;
}
mesCreateWorkOrder.createWorkOrder(partProdGroup, mesPartProdGroupDetail, mesPart, sortInfo,productSeq);
// doCreateWorkOrder(partProdGroup, mesPartProdGroupDetail, mesPart, sortInfo);
mesCreateWorkOrder.createWorkOrder(partProdGroup, mesPartProdGroupDetail, mesPart, sortInfo,productSeq);
qty -= custQty;
sortInfoList.remove(sortInfo);
proSeqResultList.remove(seq);
@ -215,625 +163,6 @@ public class MesPackageRoundnessService implements IRoundnessStrategy {
log.error("按包装圆整出错:MesPackageRoundnessService{}", e.getMessage());
}
}
private void doCreateWorkOrder(MesPartProdGroup partProdGroup, MesPartProdGroupDetail mesPartProdGroupDetail, MesPartSap partSap, MesCustSortInfo sortInfo) throws ParseException {
String organizeCode = partProdGroup.getOrganizeCode();
MesWorkOrder mesWorkOrder = new MesWorkOrder();
mesWorkOrder.setCustCode(partProdGroup.getCustCode());
//工单版本号
mesWorkOrder.setProductVersion("1");
//工单类型
mesWorkOrder.setWorkOrderType(MesExtEnumUtil.ORDER_TYPE.SORT.getValue());
//订单序号=客户排序信息的序号
mesWorkOrder.setWorkOrderSeq(sortInfo.getCustInfoSeq().toString());
mesWorkOrder.setOrganizeCode(sortInfo.getOrganizeCode());
mesWorkOrder.setWorkCenterCode(partProdGroup.getWorkCenterCode());
//根据产线查找区域代码
DdlPackBean centerPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(partProdGroup.getWorkCenterCode(),"workCenterCode", centerPackBean);
List<MesWorkCenter> workCenterList = workCenterRao.findByHqlTopWhere(centerPackBean, 1);
if (!workCenterList.isEmpty()){
mesWorkOrder.setAreaCode(workCenterList.get(0).getAreaCode());
}
mesWorkOrder.setWorkCellCode(mesPartProdGroupDetail.getWorkCellCode());
//来源
mesWorkOrder.setWorkOrderSource(sortInfo.getId().toString());
mesWorkOrder.setVinCode(sortInfo.getVinCode());
mesWorkOrder.setProductTime(sortInfo.getMatchTime());
mesWorkOrder.setProduceTime(sortInfo.getMatchTime());
mesWorkOrder.setPlanStartTime(sortInfo.getMatchTime());
mesWorkOrder.setPlanEndTime(sortInfo.getInfoPointTime());
mesWorkOrder.setPtrInfo(sortInfo.getRemark());
//客户订单号
mesWorkOrder.setCustOrderNo(sortInfo.getCustOrderCode());
//车型代码
mesWorkOrder.setCarModelCode(sortInfo.getVehicleCategory());
//车型描述 mesWorkOrder.setCarName = vehicleClassCode
//备注取自于车型配置表中
//todo 根据VehicleNo车型代码sortInfo.custCode,sortInfo.CustPlantCode,organizeCode 查询表TI_CIM_VEHICLE_MODEL的 remark 作为从车型配置表中获取打印备注信息
mesWorkOrder.setCustPartNo(sortInfo.getCustPartNo());
// mesWorkOrder.setCcrNo = sortInfo.CcrNo
// mesWorkOrder.AssyCode = sortInfo.AssyCode
// mesWorkOrder.setVehicleYear = sortInfo.getVehicleYear()
// 11. 是否将生成日期减一天
// 班次 根据产线+计划时间匹配班次
DdlPackBean shiftPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(mesPartProdGroupDetail.getWorkCenterCode(), "workCenterCode", shiftPackBean);
List<MesShift> shiftList = mesShiftRao.findByHqlWhere(shiftPackBean);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(sortInfo.getMatchTime());
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int hours = calendar.get(Calendar.HOUR_OF_DAY);
int minutes = calendar.get(Calendar.MINUTE);
long shiftTime = Long.parseLong(String.format("%02d:%02d:00", hours, minutes).replaceAll(":",""));
if (!shiftList.isEmpty()) {
for (MesShift shift : shiftList) {
long startTime = Long.parseLong(shift.getStartTime().replaceAll(":", ""));
long endTime = Long.parseLong(shift.getEndTime().replaceAll(":", ""));
if (startTime < endTime){
if (shiftTime > startTime && shiftTime < endTime) {
mesWorkOrder.setShiftName(shift.getShiftName());
mesWorkOrder.setShiftCode(shift.getShiftCode());
}
}else {
if (shiftTime < startTime && shiftTime > endTime) {
mesWorkOrder.setShiftName(shift.getShiftName());
mesWorkOrder.setShiftCode(shift.getShiftCode());
}
}
}
} else {
log.info("当前产线:{} 没有配置班次", mesPartProdGroupDetail.getWorkCenterCode());
}
//零件相关
mesWorkOrder.setPartNo(partSap.getPartNo());
mesWorkOrder.setPartName(partSap.getPartName());
//工单号生成规则 【工厂号+yyyyMMdd+5位流水】
// 13.生产版本 organizeCode + partNo
MesProductVersion prodVersion = getProdVersion(organizeCode, partSap.getPartNo());
if (prodVersion == null) {
log.info("请配置工厂:{},partNo:{}的生产版本", mesPartProdGroupDetail.organizeCode, partSap.getPartNo());
} else {
String productVersion = prodVersion.getProductVersion();
mesWorkOrder.setProductVersion(productVersion);
}
// bom prodVersion.alternativePartList bom版本
MesBom bom = mesBomService.findBom(organizeCode, prodVersion == null ? null : prodVersion.getAlternativePartList(), partSap.getPartNo());
if (bom != null){
mesWorkOrder.setBomCode(bom.getBomCode());
}
mesWorkOrder.setQty(sortInfo.getQty());
mesWorkOrder.setUnCompleteQty(sortInfo.getQty());
mesWorkOrder.setUnit(partSap.getUnit());
if (partProdGroup.getIsAutoRelease() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) {
mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
} else {
mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue());
}
mesWorkOrder.setPartProdGroupCode(partProdGroup.getPartProdGroupCode());
mesWorkOrder.setCarModelCode(sortInfo.getVehicleNo());
mesWorkOrder.setFid(UUID.randomUUID().toString());
mesWorkOrder.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
/**
* RS ASCII:30
* GS ASCII:29
* EOT ASCII:04
* {splitRule} [)>%RS%06%GS%Y
* {splitRule} vpps= 4110000000000X
* {splitRule} %GS%P
* {partNo} 8
* {splitRule} %GS%12V
* {splitRule} duns 545238347
* {splitRule} %GS%T1A
* {yydayofyear}
* {splitRule} A2B4C
* {serialNo} 4 1
* {splitRule}%RS%%EOT%
*{spiltRule}{spiltRule}{spiltRule}{partNo}{spiltRule}{spiltRule}{spiltRule}{year}{day}{spiltRule}{serialNo}{spiltRule}
* [)>%RS%06%GS%Y,4110000000000X,%GS%P,%GS%12V,545238347,%GS%T1A,A2B4C,%RS%%EOT%
* ('RS'ASCII:30'GS'ASCII:29,'EOT'ASCII:04)
* [)>+'RS'+06+'GS'+Y+vpps+'GS'+P+8+'GS'+12V+DUNS+'GS'+T+1line num+1+2+3+1(A@)+2+2+4+'RS'+'EOT'
* [)>+'RS'+06+'GS'+Y+4110000000000X+'GS'+P+12345678+'GS'+12V+545295227+'GS'+T+1A13304A2B4C0001+'RS'+'EOT'
*
* vpps = Y00000000000000
* 8=
* Duns
* 1lineNumber 1
* 1
* 2YY 24
* 3-~365/366
*
* A--
* @--
*
* 2
* 2
* 4
*
* WH_CUST_SN_RULE
*/
Calendar custCalendar = Calendar.getInstance();
custCalendar.setTime(new Date());
GenSerialNoModel custGenSerialNoModel= new GenSerialNoModel("WH_CUST_SN_RULE");
String partNo = mesWorkOrder.getCustPartNo();
String prefix = partNo.substring(0, partNo.length() - 4);
String partNo4 = partNo.substring(partNo.length() - 4).toUpperCase();
custGenSerialNoModel.setPartNo(prefix+partNo4);
String year = custCalendar.get(Calendar.YEAR)+"";
custGenSerialNoModel.setYear(year.substring(2));
custGenSerialNoModel.setDay(String.format("%03d",custCalendar.get(Calendar.DAY_OF_YEAR)));
List<String> custNumRuleList = syncFuncService.syncSerialNo(custGenSerialNoModel, "edi", organizeCode, 1).getResultList();
// [)>%RS%06%GS%Y,4110000000000X,%GS%P,%GS%12V,545238347,%GS%T1A,A2B4C,%RS%%EOT%
//截取替换为ascii码
String snOriginal = custNumRuleList.get(0);
String[] split = snOriginal.split("%RS%");
StringBuilder rsStr = new StringBuilder();
for (int i = 0; i < split.length-1; i++) {
rsStr.append(split[i]).append((char) 30);
}
rsStr.append(split[split.length - 1]);
StringBuilder gsStr = new StringBuilder();
String[] split1 = rsStr.toString().split("%GS%");
for (int i = 0; i < split1.length-1; i++) {
gsStr.append(split1[i]).append((char) 29);
}
gsStr.append(split1[split1.length-1]);
String[] split2 = gsStr.toString().split("%EOT%");
String sn = split2[0]+(char)4;
//保存条码
mesWorkOrder.setCustSn(sn);
// 打散bom
List<MesWorkOrderPart> workOrderPartList = new ArrayList<>();
if (partProdGroup.getIsDisassembleBom() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) {
workOrderPartList = dismantleBom(partSap.getPartNo(), mesWorkOrder.getQty(), sortInfo.getMatchTime(), bom.getBomCode(), sortInfo.getOrganizeCode(), mesPartProdGroupDetail.getWorkCellCode(), mesWorkOrder.getWorkOrderNo());
}
/**
* bom,
*
*/
Map<String,String> ptrRuleListMap = new HashMap<>();
//是否修改为P单
boolean isModifyPOrder = false;
//查询mes_part_ptr表根据物料清单查找ptr替换信息
if (!workOrderPartList.isEmpty()){
Map<String, MesWorkOrderPart> orderPartMap = workOrderPartList.stream().collect(Collectors.toMap(MesWorkOrderPart::getPartNo, Function.identity()));
//先替换客户的ptr信息
String ptrInfo = mesWorkOrder.getPtrInfo();
if (StringUtils.isNotBlank(ptrInfo)) {
List<String> ptrInfoList = Arrays.asList(ptrInfo.replace("_", "").split("\\|"));
if (!ptrInfoList.isEmpty()){
List<MesPartPtr> custPartPtrList = getCustPartPtrList(ptrInfoList, organizeCode);
for (MesPartPtr mesPartPtr : custPartPtrList) {
//根据mesPartPtr的目标零件号找到零件信息
String destPartNo = mesPartPtr.getDestPartNo();
MesPartSap mesPartSap = mesPartSapService.getMesPartSapByPartNo(destPartNo, organizeCode);
//更新物料清单
MesWorkOrderPart orderPart = orderPartMap.get(destPartNo);
if (orderPart != null) {
orderPart.setPartNo(mesPartSap.getPartNo());
orderPart.setPartName(mesPartSap.getPartName());
orderPart.setShippingPartNo(mesPartSap.getPartNo());
if (!isModifyPOrder){
isModifyPOrder = true;
}
}
}
}
}
List<String> partNoList = workOrderPartList.stream().map(MesWorkOrderPart::getPartNo).collect(Collectors.toList());
List<MesPartPtr> partPtrList = getPartPtrList(organizeCode, mesWorkOrder.getWorkCenterCode(), partNoList);
//装配件规则如果进行了零件替换 则使用ptr的规则 key 零件号value 是规则
for (MesPartPtr mesPartPtr : partPtrList) {
//根据mesPartPtr的目标零件号找到零件信息
String destPartNo = mesPartPtr.getDestPartNo();
String srcPartNo = mesPartPtr.getSrcPartNo();
MesPartSap mesPartSap = mesPartSapService.getMesPartSapByPartNo(destPartNo, organizeCode);
//更新物料清单
MesWorkOrderPart orderPart = orderPartMap.get(srcPartNo);
if (orderPart != null) {
orderPart.setPartNo(mesPartSap.getPartNo());
orderPart.setPartName(mesPartSap.getPartName());
orderPart.setShippingPartNo(mesPartSap.getPartNo());
ptrRuleListMap.put(mesPartSap.getPartNo(), mesPartPtr.getReplacePartSnRule());
if (!isModifyPOrder){
isModifyPOrder = true;
}
//更新mes_part_ptr的实际数量 + 1
mesPartPtr.setPrtVehicleActualCount(mesPartPtr.getPrtVehicleActualCount() + 1);
ConvertBean.saveOrUpdate(mesPartPtr,"JOB");
partPtrRao.update(mesPartPtr);
DdlPackBean partPtrDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(mesPartPtr.getId(),"ptrId",partPtrDetailPackBean);
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getPartNo(),"totalPartNo",partPtrDetailPackBean);
List<MesPartPtrDetail> partPtrDetailList = partPtrDetailRao.findByHqlWhere(partPtrDetailPackBean);
if (!partPtrDetailList.isEmpty()){
MesPartPtrDetail mesPartPtrDetail = partPtrDetailList.get(0);
mesPartPtrDetail.setQty(mesPartPtrDetail.getQty() + 1);
ConvertBean.saveOrUpdate(mesPartPtrDetail,"JOB");
partPtrDetailRao.update(mesPartPtrDetail);
}
//更新mes_part_ptr_detail 的workOrder.partNo 数量加 1 ;替换了几次还是什么
}
}
}
// 生成装配件清单
if (isModifyPOrder){
mesWorkOrder.setOrderFlag(MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.PTR.getValue());
}else {
mesWorkOrder.setOrderFlag(MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue());
}
/**
*
* {ORG}{dynamicRule}{dynamicRule}{dynamicrule}{serialNo}
* + +++
*/
GenSerialNoModel genSerialNoModel = new GenSerialNoModel("MES_WORK_ORDER_NO_WU_HAN");
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel.organizeCode(organizeCode), "edi", mesPartProdGroupDetail.getOrganizeCode(), 1).getResultList();
String serialNo = resultList.get(0).replace("MES_WORK_ORDER_NO_WU_HAN", "");
String orderNoWuHan=organizeCode+mesWorkOrder.getOrderFlag()+sortInfo.getCustOrderCode()+mesWorkOrder.getShiftCode() + serialNo;
mesWorkOrder.setWorkOrderNo(orderNoWuHan);
if (!workOrderPartList.isEmpty()) {
for (MesWorkOrderPart orderPart : workOrderPartList) {
orderPart.setOrganizeCode(organizeCode);
orderPart.setWorkOrderNo(mesWorkOrder.getWorkOrderNo());
ConvertBean.saveOrUpdate(orderPart, "MES-JOB");
}
workOrderPartRao.saveAll(workOrderPartList);
}
List<MesWorkOrderAssembly> assemblyList = getAssemblyList(mesWorkOrder.getWorkCenterCode(), mesWorkOrder.getCarModelCode(), workOrderPartList, partProdGroup);
/**
*
* -线-9,10
*/
GenSerialNoModel prodSeqSerialNoModel = new GenSerialNoModel("MES_WORK_ORDER_SEQ_WU_HAN");
prodSeqSerialNoModel.setProdLocation(mesWorkOrder.getWorkCenterCode());
List<String> proSeqResultList = syncFuncService.syncSerialNo(prodSeqSerialNoModel.organizeCode(organizeCode), "edi", mesPartProdGroupDetail.getOrganizeCode(), 1).getResultList();
String proSeqStr = proSeqResultList.get(0);
mesWorkOrder.setProductSeq(Long.parseLong(proSeqStr.replace("MES_WORK_ORDER_SEQ_WU_HAN", "")));
mesWorkOrder.setPartProdGroupName(partProdGroup.getPartProdGroupName());
ConvertBean.saveOrUpdate(mesWorkOrder, "MES-JOB");
mesWorkOrderRao.insert(mesWorkOrder);
/**
*
*/
mesWorkOrderService.doSaveWorkOrderPrintQueue(mesWorkOrder);
if (!assemblyList.isEmpty()) {
for (MesWorkOrderAssembly orderAssembly : assemblyList) {
if (ptrRuleListMap.get(orderAssembly.getPartNo()) != null){
orderAssembly.setMatchRule(ptrRuleListMap.get(orderAssembly.getPartNo()));
}
orderAssembly.setPartNo(mesWorkOrder.getPartNo());
orderAssembly.setPartName(mesWorkOrder.getPartName());
orderAssembly.setWorkOrderNo(mesWorkOrder.getWorkOrderNo());
orderAssembly.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue());
orderAssembly.setOrganizeCode(organizeCode);
orderAssembly.setProductSn(mesWorkOrder.getWorkOrderNo());
orderAssembly.setAreaCode(mesWorkOrder.getAreaCode());
ConvertBean.saveOrUpdate(orderAssembly, "MES-JOB");
}
workOrderAssemblyRao.saveAll(assemblyList);
List<String> cellCodeList = assemblyList.stream().map(MesWorkOrderAssembly::getWorkCellCode).distinct().collect(Collectors.toList());
Map<String, List<MesWorkOrderAssembly>> cellCodeMap = assemblyList.stream().collect(Collectors.groupingBy(MesWorkOrderAssembly::getWorkCellCode));
for (String cellCode : cellCodeList) {
MesQueueOrder mesQueueOrder = new MesQueueOrder();
mesQueueOrder.setCarModelCode(mesWorkOrder.getCarModelCode());
mesQueueOrder.setWorkOrderNo(mesWorkOrder.getWorkOrderNo());
mesQueueOrder.setOrganizeCode(organizeCode);
mesQueueOrder.setWorkCellCode(cellCode);
mesQueueOrder.setPartProdGroupCode(partProdGroup.getPartProdGroupCode());
mesQueueOrder.setPartProdGroupName(partProdGroup.getPartProdGroupName());
mesQueueOrder.setProcessSeq(cellCodeMap.get(cellCode).get(0).getProcessSeq());
mesQueueOrder.setPartNo(mesWorkOrder.getPartNo());
mesQueueOrder.setPartName(mesWorkOrder.getPartName());
mesQueueOrder.setWorkOrderNo(mesWorkOrder.getWorkOrderNo());
mesQueueOrder.setSerialNumber(mesWorkOrder.getWorkOrderNo());
mesQueueOrder.setProductSn(mesWorkOrder.getWorkOrderNo());
mesQueueOrder.setCustSn(mesWorkOrder.getCustSn());
mesQueueOrder.setStatus(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue());
mesQueueOrder.setProductSeq(mesWorkOrder.getProductSeq());
mesQueueOrder.setWorkOrderSeq(mesWorkOrder.getWorkOrderSeq());
mesQueueOrder.setCustPartNo(mesWorkOrder.getCustPartNo());
mesQueueOrder.setCustOrderNo(mesWorkOrder.getCustOrderNo());
mesQueueOrder.setWorkCenterCode(mesWorkOrder.getWorkCenterCode());
mesQueueOrder.setAreaCode(mesWorkOrder.getAreaCode());
mesQueueOrder.setOrderFlag(mesWorkOrder.getOrderFlag());
ConvertBean.saveOrUpdate(mesQueueOrder, "MES-JOB");
queueOrderRao.insert(mesQueueOrder);
}
}
//生成条码表
MesProduceSn mesProduceSn = new MesProduceSn();
mesProduceSn.setProductSn(mesWorkOrder.getWorkOrderNo());
mesProduceSn.setCustSn(mesWorkOrder.getCustSn());
mesProduceSn.setWorkOrderNo(mesWorkOrder.getWorkOrderNo());
mesProduceSn.setOrganizeCode(organizeCode);
mesProduceSn.setFid(UUID.randomUUID().toString());
mesProduceSn.setCustCode(mesWorkOrder.getCustCode());
mesProduceSn.setCustPartNo(mesWorkOrder.getCustPartNo());
mesProduceSn.setPartNo(mesWorkOrder.getPartNo());
mesProduceSn.setPartName(mesWorkOrder.getPartName());
mesProduceSn.setShiftCode(mesWorkOrder.getShiftCode());
mesProduceSn.setWorkCenterCode(mesWorkOrder.getWorkCenterCode());
mesProduceSn.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue());
mesProduceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
mesProduceSn.setQty(1.0);
mesProduceSn.setSerialNumber(mesWorkOrder.getWorkOrderNo());
mesProduceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue());
mesProduceSn.setSnType(MesExtEnumUtil.PRODUCE_SN_TYPE.STANDARD.getValue());
mesProduceSn.setFid(UUID.randomUUID().toString());
mesProduceSn.setAreaCode(mesWorkOrder.getAreaCode());
ConvertBean.saveOrUpdate(mesProduceSn, "MES-JOB");
mesProduceSnRao.insert(mesProduceSn);
}
private List<MesWorkOrderAssembly> getAssemblyList(String workCenterCode, String vehicleNo, List<MesWorkOrderPart> workOrderPartList, MesPartProdGroup mesPartProdGroup) {
//TM_BAS_WORK_ORDER_ASSEMBLY_SETTING 对应 mes_prod_rule_sort_cfg 排序生产规则
List<MesWorkOrderAssembly> workOrderAssemblyList = new ArrayList<>();
List<String> partNoList = workOrderPartList.stream().map(MesWorkOrderPart::getPartNo).collect(Collectors.toList());
DdlPackBean prodRuleSortPackBean = DdlPackBean.getDdlPackBean(mesPartProdGroup.getOrganizeCode());
// DdlPreparedPack.getStringEqualPack(mesPartProdGroup.getPartProdGroupCode(),"productGroupCode",prodRuleSortPackBean);
DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", prodRuleSortPackBean);
DdlPreparedPack.getInPackList(partNoList, "assemblyPartNo", prodRuleSortPackBean);
//查询当前产线的所有排序生产规则--分为当前工单清单的装配件
List<MesProdRuleSortCfg> sortCfgList = mesProdRuleSortCfgRao.findByHqlWhere(prodRuleSortPackBean);
List<MesProdRuleSortCfg> sortCfgListFilter = sortCfgList.stream().filter(item -> partNoList.contains(item.getAssemblyPartNo())).collect(Collectors.toList());
Map<String, List<MesWorkOrderPart>> orderPartMap = workOrderPartList.stream().collect(Collectors.groupingBy(MesWorkOrderPart::getPartNo));
//遍历排序生产规则
for (MesProdRuleSortCfg sortCfg : sortCfgListFilter) {
List<MesWorkOrderPart> orderPartList = orderPartMap.get(sortCfg.getAssemblyPartNo());
MesWorkOrderAssembly orderAssembly = new MesWorkOrderAssembly();
MesWorkOrderPart orderPart = orderPartList.get(0);
//1.逻辑储量程序sortCfg.isLogicNum
if ((sortCfg.getIsLogicNum() !=null && sortCfg.getIsLogicNum() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) && (sortCfg.getLogicNum()!=null && sortCfg.getLogicNum() >0 )){
Double total = orderPartList.stream().map(MesWorkOrderPart::getItemQty).reduce(Double::sum).get();
if (!total.equals(sortCfg.getLogicNum())){
log.info("零件号:{}的数量:{}对应排序规则{}的逻辑数量:{}不一致",orderPart.getPartNo(),total,sortCfg.getWorkCenterCode(),sortCfg.getLogicNum());
continue;
}
}
//2.当排序规则的车型不为空时,则需要与参数匹配,如果不符合 则不加这个装配项
if (StringUtils.isNotBlank(sortCfg.getVehicleNo()) && !sortCfg.getVehicleNo().equals(vehicleNo)){
continue;
}
orderAssembly.setAssemblyPartNo(sortCfg.getAssemblyPartNo());
orderAssembly.setAssemblyPartName(sortCfg.getAssemblyPartName());
orderAssembly.setProcessName(sortCfg.getProcessName());
orderAssembly.setWorkCenterCode(sortCfg.getWorkCenterCode());
orderAssembly.setDisplayRule(sortCfg.getDisplayRule());
orderAssembly.setMatchRule(sortCfg.getMatchRule());
orderAssembly.setMatchType(sortCfg.getMatchType());
orderAssembly.setPrintType(sortCfg.getPrintType());
orderAssembly.setProcessCode(sortCfg.getProcessCode());
orderAssembly.setDisplaySeq(sortCfg.getDisplaySeq());
orderAssembly.setDisplayValue(sortCfg.getDisplayValue());
orderAssembly.setProcessSeq(sortCfg.getProcessSeq());
orderAssembly.setCraftName(sortCfg.getCraftName());
orderAssembly.setCraftCode(sortCfg.getCraftCode());
orderAssembly.setRouteSeq(sortCfg.getRouteSeq());
// orderAssembly.setPartNo(orderPart.getPartNo());
// orderAssembly.setPartName(orderPart.getPartName());
orderAssembly.setWorkCellCode(sortCfg.getWorkCellCode());
orderAssembly.setOrderPartId(orderPart.getId().toString());
orderAssembly.setEquipmentCode(sortCfg.getEquipmentCode());
orderAssembly.setReportType(sortCfg.getReportType());
if (sortCfg.getReportType() != null && sortCfg.getReportType() == MesExtEnumUtil.MES_REPORT_TYPE.REPORT.getValue()){
orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_30.getValue());
}else {
orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue());
}
orderAssembly.setReportPartNo(sortCfg.getReportPartNo());
orderAssembly.setImageFileId(sortCfg.getImageFileId());
orderAssembly.setCraftCode(sortCfg.getCraftCode());
orderAssembly.setCraftName(sortCfg.getCraftName());
orderAssembly.setPartTypeCode(sortCfg.getPartTypeCode());
orderAssembly.setShowColor(sortCfg.getShowColor());
orderAssembly.setProductPartNo(sortCfg.getProductPartNo());
orderAssembly.setPid(sortCfg.getId());
orderAssembly.setWorkCenterCode(workCenterCode);
orderAssembly.setPreCraftCode(sortCfg.getPreCraftCode());
workOrderAssemblyList.add(orderAssembly);
}
//车型不为空的逻辑--用于报工
DdlPackBean reportRuleSortPackBean = DdlPackBean.getDdlPackBean(mesPartProdGroup.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", reportRuleSortPackBean);
DdlPreparedPack.getStringEqualPack(vehicleNo, "vehicleNo", reportRuleSortPackBean);
DdlPreparedPack.getNotInPack(partNoList, "assemblyPartNo", reportRuleSortPackBean);
//查询当前产线的所有排序生产规则--分为当前工单清单的装配件
List<MesProdRuleSortCfg> prodCfgList = mesProdRuleSortCfgRao.findByHqlWhere(reportRuleSortPackBean);
for (MesProdRuleSortCfg ruleSortCfg : prodCfgList) {
MesWorkOrderAssembly orderAssembly = new MesWorkOrderAssembly();
orderAssembly.setAssemblyPartNo(ruleSortCfg.getAssemblyPartNo());
orderAssembly.setAssemblyPartName(ruleSortCfg.getAssemblyPartName());
orderAssembly.setProcessName(ruleSortCfg.getProcessName());
orderAssembly.setWorkCenterCode(ruleSortCfg.getWorkCenterCode());
orderAssembly.setDisplayRule(ruleSortCfg.getDisplayRule());
orderAssembly.setMatchRule(ruleSortCfg.getMatchRule());
orderAssembly.setMatchType(ruleSortCfg.getMatchType());
orderAssembly.setPrintType(ruleSortCfg.getPrintType());
orderAssembly.setProcessCode(ruleSortCfg.getProcessCode());
orderAssembly.setWorkCellCode(ruleSortCfg.getWorkCellCode());
orderAssembly.setProcessCode(ruleSortCfg.getProcessCode());
orderAssembly.setProcessName(ruleSortCfg.getProcessName());
orderAssembly.setCraftCode(ruleSortCfg.getCraftCode());
orderAssembly.setRouteSeq(ruleSortCfg.getRouteSeq());
orderAssembly.setEquipmentCode(ruleSortCfg.getEquipmentCode());
orderAssembly.setReportType(ruleSortCfg.getReportType());
if (ruleSortCfg.getReportType() != null && ruleSortCfg.getReportType() == MesExtEnumUtil.MES_REPORT_TYPE.REPORT.getValue()){
orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_30.getValue());
}else {
orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue());
}
orderAssembly.setReportPartNo(ruleSortCfg.getReportPartNo());
orderAssembly.setProcessSeq(ruleSortCfg.getProcessSeq());
orderAssembly.setPid(ruleSortCfg.getId());
orderAssembly.setImageFileId(ruleSortCfg.getImageFileId());
orderAssembly.setPartTypeCode(ruleSortCfg.getPartTypeCode());
orderAssembly.setMaxValue(ruleSortCfg.getMaxValue());
orderAssembly.setMinValue(ruleSortCfg.getMinValue());
orderAssembly.setProductPartNo(ruleSortCfg.getProductPartNo());
orderAssembly.setPreCraftCode(ruleSortCfg.getPreCraftCode());
workOrderAssemblyList.add(orderAssembly);
}
//查询所有共用的零件 且没有零件号,多用于螺钉---查询排序加工规则
DdlPackBean prodRuleSortPublicPackBean = DdlPackBean.getDdlPackBean(mesPartProdGroup.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", prodRuleSortPublicPackBean);
DdlPreparedPack.getIsNull("assemblyPartNo", prodRuleSortPublicPackBean);
List<MesProdRuleSortCfg> ruleSortCfgs = mesProdRuleSortCfgRao.findByHqlWhere(prodRuleSortPublicPackBean);
for (MesProdRuleSortCfg ruleSortCfg : ruleSortCfgs) {
MesWorkOrderAssembly orderAssembly = new MesWorkOrderAssembly();
orderAssembly.setAssemblyPartNo(ruleSortCfg.getAssemblyPartNo());
orderAssembly.setAssemblyPartName(ruleSortCfg.getAssemblyPartName());
orderAssembly.setProcessName(ruleSortCfg.getProcessName());
orderAssembly.setWorkCenterCode(ruleSortCfg.getWorkCenterCode());
orderAssembly.setDisplayRule(ruleSortCfg.getDisplayRule());
orderAssembly.setMatchRule(ruleSortCfg.getMatchRule());
orderAssembly.setMatchType(ruleSortCfg.getMatchType());
orderAssembly.setPrintType(ruleSortCfg.getPrintType());
orderAssembly.setProcessCode(ruleSortCfg.getProcessCode());
orderAssembly.setWorkCellCode(ruleSortCfg.getWorkCellCode());
orderAssembly.setProcessCode(ruleSortCfg.getProcessCode());
orderAssembly.setProcessName(ruleSortCfg.getProcessName());
orderAssembly.setCraftCode(ruleSortCfg.getCraftCode());
orderAssembly.setRouteSeq(ruleSortCfg.getRouteSeq());
orderAssembly.setEquipmentCode(ruleSortCfg.getEquipmentCode());
orderAssembly.setReportType(ruleSortCfg.getReportType());
if (ruleSortCfg.getReportType() != null && ruleSortCfg.getReportType() == MesExtEnumUtil.MES_REPORT_TYPE.REPORT.getValue()){
orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_30.getValue());
}else {
orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue());
}
orderAssembly.setReportPartNo(ruleSortCfg.getReportPartNo());
orderAssembly.setProcessSeq(ruleSortCfg.getProcessSeq());
orderAssembly.setPid(ruleSortCfg.getId());
orderAssembly.setImageFileId(ruleSortCfg.getImageFileId());
orderAssembly.setPartTypeCode(ruleSortCfg.getPartTypeCode());
orderAssembly.setMaxValue(ruleSortCfg.getMaxValue());
orderAssembly.setMinValue(ruleSortCfg.getMinValue());
orderAssembly.setProductPartNo(ruleSortCfg.getProductPartNo());
orderAssembly.setPreCraftCode(ruleSortCfg.getPreCraftCode());
workOrderAssemblyList.add(orderAssembly);
}
return workOrderAssemblyList;
}
private List<MesWorkOrderPart> dismantleBom(String partNo, double qty, String productTime, String bomCode, String organizeCode, String workCellCode, String workOrderNo) {
List<MesWorkOrderPart> orderPartList = new ArrayList<>();
//1.根据bomCode,partNo productTime organizeCode 查询bom清单 bomList
List<MesBom> bomList = getPlatBom(partNo, productTime, bomCode, organizeCode);
//2.根据bomList中的subPartNo 查询零件清单 partList
List<String> partNoList = bomList.stream().map(MesBom::getItemPartNo).distinct().collect(Collectors.toList());
DdlPackBean partPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getInPackList(partNoList, "partNo", partPackBean);
List<MesPartSap> partSapList = mesPartSapRao.findByHqlWhere(partPackBean);
Map<String, MesPartSap> partMap = partSapList.stream().collect(Collectors.toMap(MesPartSap::getPartNo, Function.identity()));
for (MesBom bom : bomList) {
MesWorkOrderPart orderPart = new MesWorkOrderPart();
MesPartSap partSap = partMap.get(bom.getItemPartNo());
if (partSap == null) {
log.info("工厂:{},零件号:{}未查到零件信息", organizeCode, bom.getItemPartNo());
return new ArrayList<>();
}
List<MesWorkOrderPart> orderParts = orderPartList.stream().filter(item -> item.getPartNo().equals(partSap.getPartNo())).collect(Collectors.toList());
if (!orderParts.isEmpty()) {
MesWorkOrderPart tempPart = orderParts.get(0);
tempPart.setItemQty(tempPart.getItemQty() + bom.getItemQty() * qty);
continue;
}
orderPart.setPartName(partSap.getPartName());
orderPart.setPartNo(partSap.getPartNo());
orderPart.setItemQty(bom.getItemQty() * qty);
orderPart.setItemUnit(partSap.getUnit());
orderPart.setSourceId(bom.getId());
orderPart.setShippingPartNo(partSap.getPartNo());
orderPart.setWorkOrderNo(workOrderNo);
orderPart.setWorkCellCode(workCellCode);
orderPartList.add(orderPart);
}
//3.遍历bomList
return orderPartList;
}
private List<MesBom> getPlatBom(String partNo, String effectiveTime, String bomCode, 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 (bomCode == 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<>();
}
bomCode = bomList.get(0).getBomCode();
}
List<MesBom> bomResultList = new ArrayList<>();
DdlPackBean bomPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(bomCode, "bomCode", bomPackBean);
DdlPreparedPack.getStringEqualPack(partNo, MesExtConstWords.PART_NO, bomPackBean);
DdlPreparedPack.getStringSmallerPack(effectiveTime, MesExtConstWords.EFF_START_TIME, bomPackBean);
if (isWithEffEndTime) DdlPreparedPack.getStringBiggerPack(effectiveTime, MesExtConstWords.EFF_END_TIME, bomPackBean);
List<MesBom> bomList = bomRao.findByHqlWhere(bomPackBean);
for (MesBom bom : bomList) {
if (bom.getPartType() != null && bom.getPartType().equalsIgnoreCase("X")) {
getPlatBom(bom.getItemPartNo(), effectiveTime, null, organizeCode);
} else {
bom.setBomCode(bom.getBomCode().toLowerCase());
bomResultList.add(bom);
}
}
return bomResultList;
}
private MesPartSap getMesPart(String productPartNo, String organizeCode) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
@ -842,32 +171,4 @@ public class MesPackageRoundnessService implements IRoundnessStrategy {
return parts.isEmpty() ? null : parts.get(0);
}
private MesProductVersion getProdVersion(String organizeCode, String partNo) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean);
List<MesProductVersion> mesProductVersionList = mesProductVersionRao.findByHqlWhere(ddlPackBean);
return mesProductVersionList.isEmpty() ? null : mesProductVersionList.get(0);
}
private List<MesPartPtr> getPartPtrList(String organizeCode,String workCenterCode, List<String> partNoList) {
DdlPackBean partPtrPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", partPtrPackBean);
DdlPreparedPack.getInPackList(partNoList, "srcPartNo", partPtrPackBean);
DdlPreparedPack.getStringSmallerPack(TimeTool.getNowTime("yyyy-MM-dd HH:mm:ss"), "startTime", partPtrPackBean);
DdlPreparedPack.getStringBiggerPack(TimeTool.getNowTime("yyyy-MM-dd HH:mm:ss"), "endTime", partPtrPackBean);
DdlPreparedPack.getIsNotNull("prtVehicleCount", partPtrPackBean);
List<MesPartPtr> partPtrList = partPtrRao.findByHqlWhere(partPtrPackBean);
partPtrList = partPtrList.stream().filter(item -> item.getPrtVehicleCount() != null && item.getPrtVehicleCount() > 0)
.filter(item-> item.getPrtVehicleCount() > item.getPrtVehicleActualCount())
.collect(Collectors.toList());
return partPtrList;
}
//根据排序信息PTR零件号 获取 ptr信息
private List<MesPartPtr> getCustPartPtrList(List<String> ptrInfoList,String organizeCode){
DdlPackBean partPtrPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getInPackList(ptrInfoList, "seqInfoPrtPart", partPtrPackBean);
return partPtrRao.findByHqlWhere(partPtrPackBean);
}
}

@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@ -93,6 +94,9 @@ public class MesCreateWorkOrderImpl implements IMesCreateWorkOrder {
@Autowired
private IMesConfigService mesConfigService;
@Autowired
private MesPartRepository partRepository;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void createWorkOrder(MesPartProdGroup partProdGroup, MesPartProdGroupDetail mesPartProdGroupDetail, MesPartSap partSap, MesCustSortInfo sortInfo,Long productSeq) {
@ -255,80 +259,27 @@ public class MesCreateWorkOrderImpl implements IMesCreateWorkOrder {
mesWorkOrder.setCarModelCode(sortInfo.getVehicleNo());
mesWorkOrder.setFid(UUID.randomUUID().toString());
mesWorkOrder.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
/**
* RS ASCII:30
* GS ASCII:29
* EOT ASCII:04
* {splitRule} [)>%RS%06%GS%Y
* {splitRule} vpps= 4110000000000X
* {splitRule} %GS%P
* {partNo} 8
* {splitRule} %GS%12V
* {splitRule} duns 545238347
* {splitRule} %GS%T1A
* {yydayofyear}
* {splitRule} A2B4C
* {serialNo} 4 1
* {splitRule}%RS%%EOT%
*{spiltRule}{spiltRule}{spiltRule}{partNo}{spiltRule}{spiltRule}{spiltRule}{year}{day}{spiltRule}{serialNo}{spiltRule}
* [)>%RS%06%GS%Y,4110000000000X,%GS%P,%GS%12V,545238347,%GS%T1A,A2B4C,%RS%%EOT%
* ('RS'ASCII:30'GS'ASCII:29,'EOT'ASCII:04)
* [)>+'RS'+06+'GS'+Y+vpps+'GS'+P+8+'GS'+12V+DUNS+'GS'+T+1line num+1+2+3+1(A@)+2+2+4+'RS'+'EOT'
* [)>+'RS'+06+'GS'+Y+4110000000000X+'GS'+P+12345678+'GS'+12V+545295227+'GS'+T+1A13304A2B4C0001+'RS'+'EOT'
*
* vpps = Y00000000000000
* 8=
* Duns
* 1lineNumber 1
* 1
* 2YY 24
* 3-~365/366
*
* A--
* @--
*
* 2
* 2
* 4
*
* WH_CUST_SN_RULE
*/
Calendar custCalendar = Calendar.getInstance();
custCalendar.setTime(new Date());
GenSerialNoModel custGenSerialNoModel = new GenSerialNoModel("WH_CUST_SN_RULE");
// String partNo = mesWorkOrder.getCustPartNo();
/**
* 2024/11/20
*
*/
String partNo = mesPartProdGroupDetail.getCustPartNo();
String prefix = partNo.substring(0, partNo.length() - 4);
String partNo4 = partNo.substring(partNo.length() - 4).toUpperCase();
custGenSerialNoModel.setPartNo(prefix + partNo4);
String year = custCalendar.get(Calendar.YEAR) + "";
custGenSerialNoModel.setYear(year.substring(2));
custGenSerialNoModel.setDay(String.format("%03d", custCalendar.get(Calendar.DAY_OF_YEAR)));
List<String> custNumRuleList = syncFuncService.syncSerialNo(custGenSerialNoModel, "edi", organizeCode, 1).getResultList();
// [)>%RS%06%GS%Y,4110000000000X,%GS%P,%GS%12V,545238347,%GS%T1A,A2B4C,%RS%%EOT%
//截取替换为ascii码
String snOriginal = custNumRuleList.get(0);
String[] split = snOriginal.split("%RS%");
StringBuilder rsStr = new StringBuilder();
for (int i = 0; i < split.length - 1; i++) {
rsStr.append(split[i]).append((char) 30);
MesPart part = partRepository.getByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.PART_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), mesWorkOrder.getPartNo()});
//获取物料的客户编码规则, 没有则取默认配置
String custMatchRule = (null != part && !StringUtils.isEmpty(part.getCustMatchRule())) ? part.getCustMatchRule() : getDefaultCustMatchRule(organizeCode);
if (StringUtils.isEmpty(custMatchRule)) {
sortInfo.setDescription("未配置客户编码规则!");
return;
}
rsStr.append(split[split.length - 1]);
StringBuilder gsStr = new StringBuilder();
String[] split1 = rsStr.toString().split("%GS%");
for (int i = 0; i < split1.length - 1; i++) {
gsStr.append(split1[i]).append((char) 29);
GenSerialNoModel genSerialNoModelCustSn = new GenSerialNoModel(custMatchRule).organizeCode(organizeCode).partNo(mesWorkOrder.getPartNo());
genSerialNoModelCustSn.setCustPartNo(mesPartProdGroupDetail.getCustPartNo());
genSerialNoModelCustSn.putDataMap(MesPart.class.getSimpleName(), part);
List<String> custNumRuleList = syncFuncService.syncSerialNo(genSerialNoModelCustSn, "edi", organizeCode, 1).getResultList();
if (CollectionUtils.isEmpty(custNumRuleList)) {
sortInfo.setDescription(String.format("根据客户编码规则[%s]生成客户条码失败!", custMatchRule));
return;
}
gsStr.append(split1[split1.length - 1]);
String[] split2 = gsStr.toString().split("%EOT%");
String sn = split2[0] + (char) 4;
//保存条码
mesWorkOrder.setCustSn(sn);
mesWorkOrder.setCustSn(custNumRuleList.get(0));
// 打散bom
List<MesWorkOrderPart> workOrderPartList = new ArrayList<>();
@ -969,4 +920,10 @@ public class MesCreateWorkOrderImpl implements IMesCreateWorkOrder {
return partPtrRao.findByHqlWhere(partPtrPackBean);
}
//默认客户条码编码规则配置代码
private String getDefaultCustMatchRule(String organizeCode) {
MesConfig config = mesConfigService.getCfgValueByCode(organizeCode, MesExtConstWords.DEFAULT_CUST_MATCH_RULE);
return (null != config && !org.springframework.util.StringUtils.isEmpty(config.getCfgValue())) ? config.getCfgValue() : null;
}
}

@ -0,0 +1,76 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.numberrule;
import cn.estsh.i3plus.ext.mes.apiservice.utils.MesException;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
import cn.estsh.i3plus.mes.api.iservice.busi.INumberRulePackAttributeStrategyService;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.repository.MesPartRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.Date;
/**
*
*/
@Component
public class CqLxCustSnNumberRuleStrategyService implements INumberRulePackAttributeStrategyService {
@Autowired
private MesPartRepository partRepository;
@Override
public GenSerialNoModel execute(GenSerialNoModel genSerialNoModel) {
if (null == genSerialNoModel) {
MesException.throwBusiException("入参缺少[GenSerialNoModel]!");
}
if (StringUtils.isEmpty(genSerialNoModel.getOrganizeCode())) {
MesException.throwBusiException("入参缺少[organizeCode]!");
}
MesPart part = (null != genSerialNoModel.getDataMap() && genSerialNoModel.getDataMap().containsKey(MesPart.class.getSimpleName()))
? (MesPart) genSerialNoModel.getDataMap().get(MesPart.class.getSimpleName())
: getMesPart(genSerialNoModel.getOrganizeCode(), genSerialNoModel.getPartNo());
if (null == part) {
MesException.throwBusiException("入参缺少[part]!");
}
if (StringUtils.isEmpty(part.getPartSnParam())) {
MesException.throwBusiException("零件编码[%s]未维护零件条码参数!", part.getPartNo());
}
genSerialNoModel.setPartSnParam(part.getPartSnParam());
//年月日缩写
Date date = new Date();
genSerialNoModel.setYear(getYearShort(date));
genSerialNoModel.setMonth(getMonthShort(date));
genSerialNoModel.setDay(getDayShort(date));
return genSerialNoModel;
}
private String getYearShort(Date date) {
return MesExtEnumUtil.YEAR_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getYear(date)));
}
private String getMonthShort(Date date) {
return MesExtEnumUtil.MONTH_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getMonth(date)));
}
private String getDayShort(Date date) {
return MesExtEnumUtil.DAY_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getDay(date)));
}
private MesPart getMesPart(String orgaizeCode, String partNo) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(orgaizeCode);
DdlPreparedPack.getStringEqualPack(partNo, MesExtConstWords.PART_NO, ddlPackBean);
return partRepository.getByProperty(ddlPackBean);
}
}

@ -0,0 +1,122 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.numberrule;
import cn.estsh.i3plus.ext.mes.apiservice.utils.MesException;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
import cn.estsh.i3plus.mes.api.iservice.busi.INumberRulePackAttributeStrategyService;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesCustomerPart;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.repository.MesCustomerPartRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.Calendar;
import java.util.Date;
/**
*
*/
@Component
public class WuHanCustSnNumberRuleStrategyService implements INumberRulePackAttributeStrategyService {
@Autowired
private MesCustomerPartRepository customerPartRepository;
@Override
public GenSerialNoModel execute(GenSerialNoModel genSerialNoModel) {
if (null == genSerialNoModel) {
MesException.throwBusiException("入参缺少[GenSerialNoModel]!");
}
if (StringUtils.isEmpty(genSerialNoModel.getOrganizeCode())) {
MesException.throwBusiException("入参缺少[organizeCode]!");
}
if (StringUtils.isEmpty(genSerialNoModel.getPartNo()) && StringUtils.isEmpty(genSerialNoModel.getCustPartNo())) {
MesException.throwBusiException("入参缺少[custPartNo]!");
}
if (StringUtils.isEmpty(genSerialNoModel.getCustPartNo())) {
genSerialNoModel.setCustPartNo(getMesCustomerPart(genSerialNoModel.getOrganizeCode(), genSerialNoModel.getPartNo()));
}
Calendar custCalendar = Calendar.getInstance();
custCalendar.setTime(new Date());
String prefix = genSerialNoModel.getCustPartNo().substring(0, genSerialNoModel.getCustPartNo().length() - 4);
String partNo4 = genSerialNoModel.getCustPartNo().substring(genSerialNoModel.getCustPartNo().length() - 4).toUpperCase();
genSerialNoModel.setPartNo(prefix + partNo4);
genSerialNoModel.setCustPartNo(prefix + partNo4);
String year = custCalendar.get(Calendar.YEAR)+ MesExtConstWords.EMPTY;
genSerialNoModel.setYear(year.substring(2));
genSerialNoModel.setDay(String.format("%03d",custCalendar.get(Calendar.DAY_OF_YEAR)));
return genSerialNoModel;
}
private String getMesCustomerPart(String orgaizeCode, String partNo) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(orgaizeCode);
DdlPreparedPack.getStringEqualPack(partNo, MesExtConstWords.ERP_PART_NO, ddlPackBean);
MesCustomerPart customerPart = customerPartRepository.getByProperty(ddlPackBean);
if (null != customerPart) return customerPart.getCustPartNo();
return partNo;
}
@Override
public String transform(GenSerialNoModel genSerialNoModel, String serialNo) {
// [)>%RS%06%GS%Y,4110000000000X,%GS%P,%GS%12V,545238347,%GS%T1A,A2B4C,%RS%%EOT%
//截取替换为ascii码
String[] split = serialNo.split("%RS%");
StringBuilder rsStr = new StringBuilder();
for (int i = 0; i < split.length-1; i++) {
rsStr.append(split[i]).append((char) 30);
}
rsStr.append(split[split.length - 1]);
StringBuilder gsStr = new StringBuilder();
String[] split1 = rsStr.toString().split("%GS%");
for (int i = 0; i < split1.length-1; i++) {
gsStr.append(split1[i]).append((char) 29);
}
gsStr.append(split1[split1.length-1]);
String[] split2 = gsStr.toString().split("%EOT%");
return split2[0]+(char)4;
}
}
/**
* RS ASCII:30
* GS ASCII:29
* EOT ASCII:04
* {splitRule} [)>%RS%06%GS%Y
* {splitRule} vpps= 4110000000000X
* {splitRule} %GS%P
* {partNo} 8
* {splitRule} %GS%12V
* {splitRule} duns 545238347
* {splitRule} %GS%T1A
* {yydayofyear}
* {splitRule} A2B4C
* {serialNo} 4 1
* {splitRule}%RS%%EOT%
*{spiltRule}{spiltRule}{spiltRule}{partNo}{spiltRule}{spiltRule}{spiltRule}{year}{day}{spiltRule}{serialNo}{spiltRule}
* [)>%RS%06%GS%Y,4110000000000X,%GS%P,%GS%12V,545238347,%GS%T1A,A2B4C,%RS%%EOT%
* ('RS'ASCII:30'GS'ASCII:29,'EOT'ASCII:04)
* [)>+'RS'+06+'GS'+Y+vpps+'GS'+P+8+'GS'+12V+DUNS+'GS'+T+1line num+1+2+3+1(A@)+2+2+4+'RS'+'EOT'
* [)>+'RS'+06+'GS'+Y+4110000000000X+'GS'+P+12345678+'GS'+12V+545295227+'GS'+T+1A13304A2B4C0001+'RS'+'EOT'
*
* vpps = Y00000000000000
* 8=
* Duns
* 1lineNumber 1
* 1
* 2YY 24
* 3-~365/366
*
* A--
* @--
*
* 2
* 2
* 4
*
* WH_CUST_SN_RULE
*/

@ -463,4 +463,7 @@ public class MesExtConstWords {
//排序线不能做报工调整ESD属性类型
public static final String NOT_ALLOW_WRITE_OFF = "NOT_ALLOW_WRITE_OFF";
// 默认客户条码编码规则配置代码
public static final String DEFAULT_CUST_MATCH_RULE = "DEFAULT_CUST_MATCH_RULE";
}

Loading…
Cancel
Save