@ -2,11 +2,15 @@ package com.win.module.wms.service.productionscrapRequest;
import cn.hutool.core.collection.CollUtil ;
import cn.hutool.core.collection.CollUtil ;
import cn.hutool.json.JSONUtil ;
import cn.hutool.json.JSONUtil ;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper ;
import com.google.gson.Gson ;
import com.google.gson.GsonBuilder ;
import com.win.framework.common.pojo.CustomConditions ;
import com.win.framework.common.pojo.CustomConditions ;
import com.win.framework.common.pojo.PageResult ;
import com.win.framework.common.pojo.PageResult ;
import com.win.framework.mybatis.core.query.LambdaQueryWrapperX ;
import com.win.framework.mybatis.core.query.LambdaQueryWrapperX ;
import com.win.module.infra.api.trends.TrendsApi ;
import com.win.module.infra.api.trends.TrendsApi ;
import com.win.module.infra.enums.TrendsTypeEnum ;
import com.win.module.infra.enums.TrendsTypeEnum ;
import com.win.module.qms.api.InspectionQ3.InspectionQ3Api ;
import com.win.module.system.api.serialnumber.SerialNumberApi ;
import com.win.module.system.api.serialnumber.SerialNumberApi ;
import com.win.module.system.api.user.AdminUserApi ;
import com.win.module.system.api.user.AdminUserApi ;
import com.win.module.system.enums.serialNumber.RuleCodeEnum ;
import com.win.module.system.enums.serialNumber.RuleCodeEnum ;
@ -17,27 +21,42 @@ import com.win.module.wms.convert.productionscrapRequest.ProductionscrapRequestM
import com.win.module.wms.dal.dataobject.areabasic.AreabasicDO ;
import com.win.module.wms.dal.dataobject.areabasic.AreabasicDO ;
import com.win.module.wms.dal.dataobject.balance.BalanceDO ;
import com.win.module.wms.dal.dataobject.balance.BalanceDO ;
import com.win.module.wms.dal.dataobject.businesstype.BusinesstypeDO ;
import com.win.module.wms.dal.dataobject.businesstype.BusinesstypeDO ;
import com.win.module.wms.dal.dataobject.interfaceinfo.InterfaceInfoDO ;
import com.win.module.wms.dal.dataobject.itembasic.ItembasicDO ;
import com.win.module.wms.dal.dataobject.itembasic.ItembasicDO ;
import com.win.module.wms.dal.dataobject.location.LocationDO ;
import com.win.module.wms.dal.dataobject.location.LocationDO ;
import com.win.module.wms.dal.dataobject.mstr.MstrDO ;
import com.win.module.wms.dal.dataobject.productionscrapRecord.ProductionscrapRecordDetailDO ;
import com.win.module.wms.dal.dataobject.productionscrapRecord.ProductionscrapRecordDetailDO ;
import com.win.module.wms.dal.dataobject.productionscrapRecord.ProductionscrapRecordMainDO ;
import com.win.module.wms.dal.dataobject.productionscrapRecord.ProductionscrapRecordMainDO ;
import com.win.module.wms.dal.dataobject.productionscrapRequest.ProductionscrapRequestDetailDO ;
import com.win.module.wms.dal.dataobject.productionscrapRequest.ProductionscrapRequestDetailDO ;
import com.win.module.wms.dal.dataobject.productionscrapRequest.ProductionscrapRequestMainDO ;
import com.win.module.wms.dal.dataobject.productionscrapRequest.ProductionscrapRequestMainDO ;
import com.win.module.wms.dal.dataobject.qadCostcentre.QadCostcentreDO ;
import com.win.module.wms.dal.dataobject.qadProject.QadProjectDO ;
import com.win.module.wms.dal.dataobject.recordsetting.RecordsettingDO ;
import com.win.module.wms.dal.dataobject.recordsetting.RecordsettingDO ;
import com.win.module.wms.dal.dataobject.requestsetting.RequestsettingDO ;
import com.win.module.wms.dal.dataobject.requestsetting.RequestsettingDO ;
import com.win.module.wms.dal.dataobject.stdcostprice.StdcostpriceDO ;
import com.win.module.wms.dal.dataobject.stdcostprice.StdcostpriceDO ;
import com.win.module.wms.dal.dataobject.subjectaccount.SubjectAccountDO ;
import com.win.module.wms.dal.dataobject.transactiontype.TransactiontypeDO ;
import com.win.module.wms.dal.dataobject.transactiontype.TransactiontypeDO ;
import com.win.module.wms.dal.dataobject.workshop.WorkshopDO ;
import com.win.module.wms.dal.dataobject.workshop.WorkshopDO ;
import com.win.module.wms.dal.dataobject.workstation.WorkstationDO ;
import com.win.module.wms.dal.dataobject.workstation.WorkstationDO ;
import com.win.module.wms.dal.mysql.balance.BalanceMapper ;
import com.win.module.wms.dal.mysql.balance.BalanceMapper ;
import com.win.module.wms.dal.mysql.location.LocationMapper ;
import com.win.module.wms.dal.mysql.location.LocationMapper ;
import com.win.module.wms.dal.mysql.mstr.MstrMapper ;
import com.win.module.wms.dal.mysql.productionscrapRecord.ProductionscrapRecordDetailMapper ;
import com.win.module.wms.dal.mysql.productionscrapRecord.ProductionscrapRecordDetailMapper ;
import com.win.module.wms.dal.mysql.productionscrapRecord.ProductionscrapRecordMainMapper ;
import com.win.module.wms.dal.mysql.productionscrapRecord.ProductionscrapRecordMainMapper ;
import com.win.module.wms.dal.mysql.productionscrapRequest.ProductionscrapRequestDetailMapper ;
import com.win.module.wms.dal.mysql.productionscrapRequest.ProductionscrapRequestDetailMapper ;
import com.win.module.wms.dal.mysql.productionscrapRequest.ProductionscrapRequestMainMapper ;
import com.win.module.wms.dal.mysql.productionscrapRequest.ProductionscrapRequestMainMapper ;
import com.win.module.wms.dal.mysql.qadCostcentre.QadCostcentreMapper ;
import com.win.module.wms.dal.mysql.qadProject.QadProjectMapper ;
import com.win.module.wms.dal.mysql.subjectaccount.SubjectAccountMapper ;
import com.win.module.wms.dal.mysql.workstation.WorkstationMapper ;
import com.win.module.wms.enums.common.InterfaceTypeEnum ;
import com.win.module.wms.enums.common.InventoryStatusEnum ;
import com.win.module.wms.enums.common.InventoryStatusEnum ;
import com.win.module.wms.enums.request.RequestStatusEnum ;
import com.win.module.wms.enums.request.RequestStatusEnum ;
import com.win.module.wms.enums.request.RequestStatusState ;
import com.win.module.wms.enums.request.RequestStatusState ;
import com.win.module.wms.service.accountcalendar.AccountcalendarService ;
import com.win.module.wms.service.balance.BalanceService ;
import com.win.module.wms.service.interfaceinfo.InterfaceInfoService ;
import com.win.module.wms.service.interfaceinfo.dto.UnplannedissueRecordDTO ;
import com.win.module.wms.service.itembasic.ItembasicService ;
import com.win.module.wms.service.itembasic.ItembasicService ;
import com.win.module.wms.service.itempackage.ItempackageService ;
import com.win.module.wms.service.itempackage.ItempackageService ;
import com.win.module.wms.service.location.LocationService ;
import com.win.module.wms.service.location.LocationService ;
@ -51,6 +70,8 @@ import com.win.module.wms.service.transaction.TransactionService;
import com.win.module.wms.service.workshop.WorkshopService ;
import com.win.module.wms.service.workshop.WorkshopService ;
import com.win.module.wms.service.workstation.WorkstationService ;
import com.win.module.wms.service.workstation.WorkstationService ;
import com.win.module.wms.util.JobUtils ;
import com.win.module.wms.util.JobUtils ;
import com.win.module.wms.util.LocalDateTimeAdapter ;
import lombok.extern.slf4j.Slf4j ;
import org.apache.commons.lang3.StringUtils ;
import org.apache.commons.lang3.StringUtils ;
import org.springframework.beans.BeanUtils ;
import org.springframework.beans.BeanUtils ;
import org.springframework.context.annotation.Lazy ;
import org.springframework.context.annotation.Lazy ;
@ -59,6 +80,8 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated ;
import org.springframework.validation.annotation.Validated ;
import javax.annotation.Resource ;
import javax.annotation.Resource ;
import java.math.BigDecimal ;
import java.math.RoundingMode ;
import java.time.LocalDateTime ;
import java.time.LocalDateTime ;
import java.util.ArrayList ;
import java.util.ArrayList ;
import java.util.HashSet ;
import java.util.HashSet ;
@ -74,6 +97,7 @@ import static com.win.module.wms.enums.ErrorCodeConstants.*;
*
*
* @author 超级管理员
* @author 超级管理员
* /
* /
@Slf4j
@Service
@Service
@Validated
@Validated
public class ProductionscrapRequestMainServiceImpl implements ProductionscrapRequestMainService {
public class ProductionscrapRequestMainServiceImpl implements ProductionscrapRequestMainService {
@ -132,6 +156,28 @@ public class ProductionscrapRequestMainServiceImpl implements ProductionscrapReq
@Lazy
@Lazy
@Resource
@Resource
private StdcostpriceService stdcostpriceService ;
private StdcostpriceService stdcostpriceService ;
@Resource
private SubjectAccountMapper subjectAccountMapper ;
@Resource
private MstrMapper mstrMapper ;
@Lazy
@Resource
private AccountcalendarService accountcalendarService ;
@Lazy
@Resource
private InterfaceInfoService interfaceInfoService ;
@Resource
private InspectionQ3Api inspectionQ3Api ;
@Resource
private QadCostcentreMapper qadCostcentreMapper ;
@Resource
private WorkstationMapper workstationMapper ;
@Resource
private QadProjectMapper qadProjectMapper ;
@Lazy
@Resource
private BalanceService balanceService ;
@Override
@Override
@Transactional
@Transactional
@ -166,11 +212,63 @@ public class ProductionscrapRequestMainServiceImpl implements ProductionscrapReq
if ( itembasicDO ! = null ) {
if ( itembasicDO ! = null ) {
itemTypeSet . add ( itembasicDO . getType ( ) ) ;
itemTypeSet . add ( itembasicDO . getType ( ) ) ;
}
}
// 如果生产线不为空
if ( StringUtils . isNotEmpty ( detailDO . getProductionLineCode ( ) ) ) {
// 校验生产线代码
// 校验生产线代码
validatorProductionline ( detailDO . getProductionLineCode ( ) ) ;
validatorProductionline ( detailDO . getProductionLineCode ( ) ) ;
}
// 校验工位是否存在
// 校验工位是否存在
validatorWorkStation ( mainDo . getWorkshopCode ( ) , detailDO . getProductionLineCode ( ) , detailDO . getWorkStationCode ( ) ) ;
validatorWorkStation ( mainDo . getWorkshopCode ( ) , detailDO . getProductionLineCode ( ) , detailDO . getWorkStationCode ( ) ) ;
String reasonCodeRequisition = mainDo . getReasonCodeRequisition ( ) ;
if ( StringUtils . isNotEmpty ( reasonCodeRequisition ) ) {
LambdaQueryWrapperX < SubjectAccountDO > lambdaQueryWrapperX = new LambdaQueryWrapperX < > ( ) ;
lambdaQueryWrapperX . eq ( SubjectAccountDO : : getCode , reasonCodeRequisition ) ;
lambdaQueryWrapperX . eq ( SubjectAccountDO : : getCostcentreType , mainDo . getCostCenterType ( ) ) ;
SubjectAccountDO subjectAccountDO = subjectAccountMapper . selectOne ( lambdaQueryWrapperX ) ;
mainDo . setQadTtunrcisAcc ( subjectAccountDO . getAccountingAccount ( ) ) ;
if ( subjectAccountDO ! = null ) {
if ( "TRUE" . equals ( subjectAccountDO . getIsFromPlMstr ( ) ) ) {
// 产品类
String prodCla = itembasicDO . getProdCla ( ) ;
if ( StringUtils . isNotEmpty ( prodCla ) ) {
LambdaQueryWrapperX < MstrDO > mstrDOLambdaQueryWrapperX = new LambdaQueryWrapperX < > ( ) ;
mstrDOLambdaQueryWrapperX . eq ( MstrDO : : getPlProdLine , prodCla ) ;
List < MstrDO > mstrDOS = mstrMapper . selectList ( mstrDOLambdaQueryWrapperX ) ;
if ( mstrDOS ! = null & & mstrDOS . size ( ) > 0 ) {
MstrDO mstrDO = mstrDOS . get ( 0 ) ;
if ( "A" . equals ( subjectAccountDO . getPlMstrType ( ) ) ) {
detailDO . setQadTtunrcisAcc ( mstrDO . getPlMvarAcct ( ) ) ;
detailDO . setQadPlCostCenter ( mstrDO . getPlMvarCc ( ) ) ;
} else if ( "B" . equals ( subjectAccountDO . getPlMstrType ( ) ) ) {
detailDO . setQadTtunrcisAcc ( mstrDO . getPlCchgAcct ( ) ) ;
detailDO . setQadPlCostCenter ( mstrDO . getPlCchgCc ( ) ) ;
} else if ( "C" . equals ( subjectAccountDO . getPlMstrType ( ) ) ) {
detailDO . setQadTtunrcisAcc ( mstrDO . getPlScrpAcct ( ) ) ;
detailDO . setQadPlCostCenter ( mstrDO . getPlScrpCc ( ) ) ;
} else if ( "D" . equals ( subjectAccountDO . getPlMstrType ( ) ) ) {
detailDO . setQadTtunrcisAcc ( mstrDO . getPlDscrAcct ( ) ) ;
detailDO . setQadPlCostCenter ( mstrDO . getPlDscrCc ( ) ) ;
} else {
log . debug ( "计划外出库,客户账户产品类型不存在的类型" ) ;
}
}
}
} else {
// 不是来自产品类取科目账户配置表的会计账户
detailDO . setQadTtunrcisAcc ( subjectAccountDO . getAccountingAccount ( ) ) ;
detailDO . setQadPlCostCenter ( mainDo . getCostCenterCode ( ) ) ; //成本中心
}
}
}
}
detailDO . setQadProjectCode ( detailDO . getProjectCode ( ) ) ;
if ( detailDO . getSinglePrice ( ) ! = null ) {
detailDO . setSinglePrice ( detailDO . getSinglePrice ( ) . setScale ( 2 , RoundingMode . HALF_UP ) ) ;
}
if ( detailDO . getAmount ( ) ! = null ) {
detailDO . setAmount ( detailDO . getAmount ( ) . setScale ( 2 , RoundingMode . HALF_UP ) ) ;
}
}
if ( itemTypeSet . size ( ) > 1 ) {
if ( itemTypeSet . size ( ) > 1 ) {
// 校验 子表数据 物料类型要一致性(创建标签时 前端好判断 否则前端无法实现)
// 校验 子表数据 物料类型要一致性(创建标签时 前端好判断 否则前端无法实现)
// 线边原料报废子列物料类型不是统一的一个类型不能处理
// 线边原料报废子列物料类型不是统一的一个类型不能处理
@ -201,45 +299,6 @@ public class ProductionscrapRequestMainServiceImpl implements ProductionscrapReq
detailDO . setUpdateTime ( LocalDateTime . now ( ) ) ;
detailDO . setUpdateTime ( LocalDateTime . now ( ) ) ;
detailDO . setRemark ( null ) ;
detailDO . setRemark ( null ) ;
subDOListPack . add ( detailDO ) ;
subDOListPack . add ( detailDO ) ;
// BigDecimal itemPackagingDOQty = BigDecimal.ZERO;
// if(StringUtils.isEmpty(detailDO.getPackUnit())){
// // 修改 包装规格及包装数量 从前端选择来 20240326 cxm -----取消
// // 获取标包信息
// ItempackageDO itemPackagingDO = jobUtils.getItempackageDOByItemCodeAndLocationCodeAndInOrOut(detailDO.getItemCode(), detailDO.getFromLocationCode(), "in");
// // 获取标包数量
// itemPackagingDOQty = itemPackagingDO.getPackQty();
// detailDO.setPackUnit(itemPackagingDO.getPackUnit());
// detailDO.setPackQty(itemPackagingDOQty);
// }else {
// // 20240729 zxb 如果页面选择了包装和数量,则用用户选择的
// itemPackagingDOQty = detailDO.getPackQty();
// detailDO.setPackQty(itemPackagingDOQty);
// }
// // 库存余额输入数量
// BigDecimal detailDOQty = detailDO.getQty();
// // 判断 库存余额输入的数量 大于 标包数 进行拆分
// if (detailDO.getQty().compareTo(itemPackagingDOQty) == 1) {
// // 库存余额 除以 标包 保留0位 具体子表 例如:保留1位 1.60-1.6 1.61-1.7 1.66-1.7 -1.62--1.7
// // 拆分数据总条数 bdCount
// BigDecimal bdCount = detailDOQty.divide(itemPackagingDOQty, 0, BigDecimal.ROUND_UP);
// int forInt = bdCount.intValue();
// // 最后一条数据 插入数量 residueQty = 库存余额数 - (拆分数据总条数-1)*标包数
// BigDecimal residueQty = detailDOQty.subtract(itemPackagingDOQty.multiply(bdCount.subtract(new BigDecimal(1))));
// for (int i = 0; i < forInt; i++) {
// ProductionscrapRequestDetailDO detailDOPack = new ProductionscrapRequestDetailDO();
// BeanUtils.copyProperties(detailDO, detailDOPack);
// // 最后一条数据 插入数量
// if (i == (forInt - 1)) {
// detailDOPack.setQty(residueQty);
// } else {
// detailDOPack.setQty(detailDO.getPackQty());
// }
// subDOListPack.add(detailDOPack);
// }
// } else {
// // 判断 库存余额输入的数量 小于等于 标包数
// subDOListPack.add(detailDO);
// }
}
}
productionscrapRequestDetailMapper . insertBatch ( subDOListPack ) ;
productionscrapRequestDetailMapper . insertBatch ( subDOListPack ) ;
return mainDo ;
return mainDo ;
@ -250,7 +309,6 @@ public class ProductionscrapRequestMainServiceImpl implements ProductionscrapReq
detailDO . setItemDesc1 ( itembasicDO . getDesc1 ( ) ) ;
detailDO . setItemDesc1 ( itembasicDO . getDesc1 ( ) ) ;
detailDO . setItemDesc2 ( itembasicDO . getDesc2 ( ) ) ;
detailDO . setItemDesc2 ( itembasicDO . getDesc2 ( ) ) ;
detailDO . setItemName ( itembasicDO . getName ( ) ) ;
detailDO . setItemName ( itembasicDO . getName ( ) ) ;
detailDO . setProjectCode ( itembasicDO . getProject ( ) ) ;
detailDO . setUom ( itembasicDO . getUom ( ) ) ;
detailDO . setUom ( itembasicDO . getUom ( ) ) ;
}
}
@ -274,7 +332,14 @@ public class ProductionscrapRequestMainServiceImpl implements ProductionscrapReq
// 更新
// 更新
ProductionscrapRequestMainDO updateObj = ProductionscrapRequestMainConvert . INSTANCE . convert ( updateReqVO ) ;
ProductionscrapRequestMainDO updateObj = ProductionscrapRequestMainConvert . INSTANCE . convert ( updateReqVO ) ;
trendsApi . createTrends ( updateObj . getId ( ) , "request_productionscrap_main" , JSONUtil . toJsonStr ( oldObj ) , "修改了线边原料报废申请" , JSONUtil . toJsonStr ( updateObj ) , TrendsTypeEnum . UPDATE , String . valueOf ( getLoginUserId ( ) ) ) ;
trendsApi . createTrends ( updateObj . getId ( ) , "request_productionscrap_main" , JSONUtil . toJsonStr ( oldObj ) , "修改了线边原料报废申请" , JSONUtil . toJsonStr ( updateObj ) , TrendsTypeEnum . UPDATE , String . valueOf ( getLoginUserId ( ) ) ) ;
return productionscrapRequestMainMapper . updateById ( updateObj ) ;
int cnt = productionscrapRequestMainMapper . updateById ( updateObj ) ;
if ( StringUtils . isNotEmpty ( updateReqVO . getProductionLineCode ( ) ) ) {
LambdaUpdateWrapper < ProductionscrapRequestDetailDO > updateWrapper = new LambdaUpdateWrapper < > ( ) ;
updateWrapper . set ( ProductionscrapRequestDetailDO : : getProductionLineCode , updateReqVO . getProductionLineCode ( ) ) ;
updateWrapper . eq ( ProductionscrapRequestDetailDO : : getMasterId , updateObj . getId ( ) ) ;
productionscrapRequestDetailMapper . update ( new ProductionscrapRequestDetailDO ( ) , updateWrapper ) ;
}
return cnt ;
}
}
@Override
@Override
@ -429,6 +494,7 @@ public class ProductionscrapRequestMainServiceImpl implements ProductionscrapReq
@Transactional
@Transactional
public void generateJob ( ProductionscrapRequestMainDO mainDO , List < ProductionscrapRequestDetailDO > detailList ) {
public void generateJob ( ProductionscrapRequestMainDO mainDO , List < ProductionscrapRequestDetailDO > detailList ) {
Long loginUserId = getLoginUserId ( ) ;
// 跳过任务直接生成记录
// 跳过任务直接生成记录
if ( "TRUE" . equals ( mainDO . getDirectCreateRecord ( ) ) ) {
if ( "TRUE" . equals ( mainDO . getDirectCreateRecord ( ) ) ) {
ProductionscrapRecordMainDO productionscrapRecordMainDO = new ProductionscrapRecordMainDO ( ) ;
ProductionscrapRecordMainDO productionscrapRecordMainDO = new ProductionscrapRecordMainDO ( ) ;
@ -455,7 +521,7 @@ public class ProductionscrapRequestMainServiceImpl implements ProductionscrapReq
productionscrapRecordMainDO . setCreator ( null ) ;
productionscrapRecordMainDO . setCreator ( null ) ;
productionscrapRecordMainDO . setUpdateTime ( null ) ;
productionscrapRecordMainDO . setUpdateTime ( null ) ;
productionscrapRecordMainDO . setUpdater ( null ) ;
productionscrapRecordMainDO . setUpdater ( null ) ;
productionscrapRecordMainDO . setDepartmentCode ( userApi . getUser ( getLoginUserId ( ) ) . getDeptId ( ) . toString ( ) ) ;
productionscrapRecordMainDO . setDepartmentCode ( userApi . getUser ( loginUserId ) . getDeptId ( ) . toString ( ) ) ;
productionscrapRecordMainMapper . insert ( productionscrapRecordMainDO ) ;
productionscrapRecordMainMapper . insert ( productionscrapRecordMainDO ) ;
// 库存事务
// 库存事务
@ -593,6 +659,62 @@ public class ProductionscrapRequestMainServiceImpl implements ProductionscrapReq
mainDO . setStatus ( RequestStatusEnum . COMPLETED . getCode ( ) ) ;
mainDO . setStatus ( RequestStatusEnum . COMPLETED . getCode ( ) ) ;
productionscrapRequestMainMapper . updateById ( mainDO ) ;
productionscrapRequestMainMapper . updateById ( mainDO ) ;
trendsApi . createTrends ( productionscrapRecordMainDO . getId ( ) , "record_productionscrap_main" , null , "线边原料报废直接生成记录" , JSONUtil . toJsonStr ( productionscrapRecordMainDO ) , TrendsTypeEnum . CREATE , String . valueOf ( getLoginUserId ( ) ) ) ;
trendsApi . createTrends ( productionscrapRecordMainDO . getId ( ) , "record_productionscrap_main" , null , "线边原料报废直接生成记录" , JSONUtil . toJsonStr ( productionscrapRecordMainDO ) , TrendsTypeEnum . CREATE , String . valueOf ( getLoginUserId ( ) ) ) ;
List < UnplannedissueRecordDTO > dtoList = new ArrayList < > ( ) ;
List < ProductionscrapRecordDetailDO > detailDOList = productionscrapRecordDetailMapper . selectListByMasterId ( productionscrapRecordMainDO . getId ( ) ) ;
for ( ProductionscrapRecordDetailDO productionscrapRecordDetailDO : detailDOList ) {
UnplannedissueRecordDTO unplannedissueRecordDTO = new UnplannedissueRecordDTO ( ) ;
BeanUtils . copyProperties ( productionscrapRecordMainDO , unplannedissueRecordDTO ) ;
BeanUtils . copyProperties ( productionscrapRecordDetailDO , unplannedissueRecordDTO ) ;
String qadUnplannedissueNumber = serialNumberApi . generateCode ( RuleCodeEnum . QAD_UNPLANNEDISSUE_NUMBER . getCode ( ) ) ;
unplannedissueRecordDTO . setQadNumber ( qadUnplannedissueNumber ) ;
LocationDO locationDO = locationService . selectLocation ( productionscrapRecordDetailDO . getFromLocationCode ( ) ) ;
if ( StringUtils . isEmpty ( locationDO . getQadLocationCode ( ) ) ) {
throw exception ( LOCATION_QAD_EXCEPTION , locationDO . getCode ( ) + "该库位QAD不存在" ) ;
}
unplannedissueRecordDTO . setProjectCode ( productionscrapRecordDetailDO . getQadProjectCode ( ) ) ;
unplannedissueRecordDTO . setQadLocationCode ( locationDO . getQadLocationCode ( ) ) ;
unplannedissueRecordDTO . setRemark ( productionscrapRecordMainDO . getLineScrapReason ( ) ) ;
dtoList . add ( unplannedissueRecordDTO ) ;
}
if ( dtoList . size ( ) > 0 ) {
// 过来物料是否为ERP管理
List < UnplannedissueRecordDTO > filterList = new ArrayList < > ( ) ;
for ( UnplannedissueRecordDTO unplannedissueRecordDTO : dtoList ) {
ItembasicDO itembasicDO = itembasicService . getItembasicBycode ( unplannedissueRecordDTO . getItemCode ( ) ) ;
if ( itembasicDO = = null ) {
continue ;
}
if ( "TRUE" . equals ( itembasicDO . getIsOutErp ( ) ) ) {
continue ;
} else {
filterList . add ( unplannedissueRecordDTO ) ;
}
}
if ( filterList . size ( ) > 0 ) {
// 添加到接口记录表
Gson gson = new GsonBuilder ( ) . registerTypeAdapter ( LocalDateTime . class , new LocalDateTimeAdapter ( ) ) . serializeNulls ( ) . create ( ) ;
InterfaceInfoDO interfaceInfoDO = new InterfaceInfoDO ( ) ;
interfaceInfoDO . setNumber ( "post" + "_" + InterfaceTypeEnum . RECORD_UNPLANNEDISSUE_MAIN . getCode ( ) + '_' + productionscrapRecordMainDO . getId ( ) ) ;
interfaceInfoDO . setInterfaceType ( "WMS-QAD" ) ;
interfaceInfoDO . setInterfaceName ( "推送计划外出库记录" ) ;
interfaceInfoDO . setUrl ( "/wms/unplannedissue-job-main/execute" ) ;
// 根据当前时间调用账期日历获取有效时间
LocalDateTime activeTime = accountcalendarService . getAccountCalendar ( ) ;
for ( UnplannedissueRecordDTO dto : filterList ) {
dto . setSystemCreateTime ( LocalDateTime . now ( ) ) ;
dto . setActiveDate ( activeTime ) ;
}
interfaceInfoDO . setReqBody ( gson . toJson ( filterList ) ) ;
interfaceInfoDO . setCreator ( loginUserId . toString ( ) ) ;
interfaceInfoDO . setCreateTime ( LocalDateTime . now ( ) ) ;
interfaceInfoDO . setInterfaceStatus ( "3" ) ;
interfaceInfoDO . setBusinessNumber ( productionscrapRecordMainDO . getNumber ( ) ) ;
interfaceInfoDO . setBusinessId ( productionscrapRecordMainDO . getId ( ) ) ;
interfaceInfoDO . setRemark ( "功能模块--线边报废申请--生成记录" ) ;
interfaceInfoService . insertInterfaceData ( interfaceInfoDO ) ;
}
}
return ;
return ;
}
}
}
}
@ -682,38 +804,119 @@ public class ProductionscrapRequestMainServiceImpl implements ProductionscrapReq
private String validatorProductionscrapRequestDetailImport ( ProductionscrapRequestDetailDO detailDO , ProductionscrapRequestMainDO mainDo ) {
private String validatorProductionscrapRequestDetailImport ( ProductionscrapRequestDetailDO detailDO , ProductionscrapRequestMainDO mainDo ) {
StringBuilder message = new StringBuilder ( ) ;
StringBuilder message = new StringBuilder ( ) ;
// 生产线校验
if ( StringUtils . isNotEmpty ( detailDO . getProductionLineCode ( ) ) ) {
try {
try {
this . validatorProductionline ( detailDO . getProductionLineCode ( ) ) ;
this . validatorProductionline ( detailDO . getProductionLineCode ( ) ) ;
} catch ( Exception ex ) {
} catch ( Exception ex ) {
message . append ( ex . getMessage ( ) ) . append ( "," ) ;
message . append ( ex . getMessage ( ) ) . append ( "," ) ;
}
}
try {
}
WorkstationDO workstationDO = validatorWorkStation ( mainDo . getWorkshopCode ( ) , detailDO . getProductionLineCode ( ) , detailDO . getWorkStationCode ( ) ) ;
// 工位代码
if ( workstationDO ! = null ) {
if ( StringUtils . isEmpty ( detailDO . getWorkStationCode ( ) ) ) {
message . append ( "工位代码不能为空" ) . append ( "," ) ;
} else {
LambdaQueryWrapperX < WorkstationDO > lambdaQueryWrapperX = new LambdaQueryWrapperX < > ( ) ;
lambdaQueryWrapperX . eq ( WorkstationDO : : getCode , detailDO . getWorkStationCode ( ) ) ;
if ( StringUtils . isNotEmpty ( detailDO . getProductionLineCode ( ) ) ) {
lambdaQueryWrapperX . eq ( WorkstationDO : : getProductionLineCode , detailDO . getProductionLineCode ( ) ) ;
}
lambdaQueryWrapperX . eq ( WorkstationDO : : getWorkshopCode , mainDo . getWorkshopCode ( ) ) ;
WorkstationDO workstationDO = workstationMapper . selectOne ( lambdaQueryWrapperX , false ) ;
if ( workstationDO = = null ) {
message . append ( "工位代码不存在" ) . append ( "," ) ;
} else {
detailDO . setFromLocationCode ( workstationDO . getRawLocationCode ( ) ) ;
detailDO . setFromLocationCode ( workstationDO . getRawLocationCode ( ) ) ;
}
}
} catch ( Exception ex ) {
message . append ( ex . getMessage ( ) ) . append ( "," ) ;
}
}
// try {
// // 校验 物料包装规格关系
// ItempackageDO itempackageDO = itempackageService.getItempackageDO(detailDO.getItemCode(), detailDO.getPackUnit());
// detailDO.setPackQty(itempackageDO.getPackQty());
// detailDO.setPackUnit(itempackageDO.getPackUnit());
// } catch (Exception ex) {
// message.append(ex.getMessage()).append(",");
// }
try {
try {
ItembasicDO itembasicDO = validatorItembasic ( detailDO . getItemCode ( ) ) ;
ItembasicDO itembasicDO = validatorItembasic ( detailDO . getItemCode ( ) ) ;
detailDO . setUom ( itembasicDO . getUom ( ) ) ;
detailDO . setUom ( itembasicDO . getUom ( ) ) ;
detailDO . setItemDesc1 ( itembasicDO . getDesc1 ( ) ) ;
detailDO . setItemDesc1 ( itembasicDO . getDesc1 ( ) ) ;
detailDO . setItemDesc2 ( itembasicDO . getDesc2 ( ) ) ;
detailDO . setItemDesc2 ( itembasicDO . getDesc2 ( ) ) ;
detailDO . setItemName ( itembasicDO . getName ( ) ) ;
detailDO . setItemName ( itembasicDO . getName ( ) ) ;
detailDO . setProjectCode ( itembasicDO . getProject ( ) ) ;
} catch ( Exception ex ) {
} catch ( Exception ex ) {
message . append ( ex . getMessage ( ) ) . append ( "," ) ;
message . append ( ex . getMessage ( ) ) . append ( "," ) ;
}
}
// 校验项目代码
if ( StringUtils . isNotEmpty ( detailDO . getProjectCode ( ) ) ) {
LambdaQueryWrapperX < QadProjectDO > qadProjectDOLambdaQueryWrapperX = new LambdaQueryWrapperX < > ( ) ;
qadProjectDOLambdaQueryWrapperX . eq ( QadProjectDO : : getProjectCode , detailDO . getProjectCode ( ) ) ;
QadProjectDO qadProjectDO = qadProjectMapper . selectOne ( qadProjectDOLambdaQueryWrapperX ) ;
if ( qadProjectDO = = null ) {
message . append ( "项目代码不存在" ) . append ( "," ) ;
}
}
try {
String reasonCodeRequisition = mainDo . getReasonCodeRequisition ( ) ;
if ( StringUtils . isNotEmpty ( reasonCodeRequisition ) ) {
ItembasicDO itembasicDO = validatorItembasic ( detailDO . getItemCode ( ) ) ;
LambdaQueryWrapperX < SubjectAccountDO > lambdaQueryWrapperX = new LambdaQueryWrapperX < > ( ) ;
lambdaQueryWrapperX . eq ( SubjectAccountDO : : getCode , reasonCodeRequisition ) ;
lambdaQueryWrapperX . eq ( SubjectAccountDO : : getCostcentreType , mainDo . getCostCenterType ( ) ) ;
SubjectAccountDO subjectAccountDO = subjectAccountMapper . selectOne ( lambdaQueryWrapperX ) ;
mainDo . setQadTtunrcisAcc ( subjectAccountDO . getAccountingAccount ( ) ) ;
if ( subjectAccountDO ! = null ) {
if ( "TRUE" . equals ( subjectAccountDO . getIsFromPlMstr ( ) ) ) {
// 产品类
String prodCla = itembasicDO . getProdCla ( ) ;
if ( StringUtils . isNotEmpty ( prodCla ) ) {
LambdaQueryWrapperX < MstrDO > mstrDOLambdaQueryWrapperX = new LambdaQueryWrapperX < > ( ) ;
mstrDOLambdaQueryWrapperX . eq ( MstrDO : : getPlProdLine , prodCla ) ;
List < MstrDO > mstrDOS = mstrMapper . selectList ( mstrDOLambdaQueryWrapperX ) ;
if ( mstrDOS ! = null & & mstrDOS . size ( ) > 0 ) {
MstrDO mstrDO = mstrDOS . get ( 0 ) ;
if ( "A" . equals ( subjectAccountDO . getPlMstrType ( ) ) ) {
detailDO . setQadTtunrcisAcc ( mstrDO . getPlMvarAcct ( ) ) ;
detailDO . setQadPlCostCenter ( mstrDO . getPlMvarCc ( ) ) ;
} else if ( "B" . equals ( subjectAccountDO . getPlMstrType ( ) ) ) {
detailDO . setQadTtunrcisAcc ( mstrDO . getPlCchgAcct ( ) ) ;
detailDO . setQadPlCostCenter ( mstrDO . getPlCchgCc ( ) ) ;
} else if ( "C" . equals ( subjectAccountDO . getPlMstrType ( ) ) ) {
detailDO . setQadTtunrcisAcc ( mstrDO . getPlScrpAcct ( ) ) ;
detailDO . setQadPlCostCenter ( mstrDO . getPlScrpCc ( ) ) ;
} else if ( "D" . equals ( subjectAccountDO . getPlMstrType ( ) ) ) {
detailDO . setQadTtunrcisAcc ( mstrDO . getPlDscrAcct ( ) ) ;
detailDO . setQadPlCostCenter ( mstrDO . getPlDscrCc ( ) ) ;
} else {
log . debug ( "计划外出库,客户账户产品类型不存在的类型" ) ;
}
}
}
} else {
// 不是来自产品类取科目账户配置表的会计账户
detailDO . setQadTtunrcisAcc ( subjectAccountDO . getAccountingAccount ( ) ) ;
detailDO . setQadPlCostCenter ( mainDo . getCostCenterCode ( ) ) ; //成本中心
}
}
}
detailDO . setQadProjectCode ( detailDO . getProjectCode ( ) ) ;
if ( detailDO . getSinglePrice ( ) ! = null ) {
detailDO . setSinglePrice ( detailDO . getSinglePrice ( ) . setScale ( 2 , RoundingMode . HALF_UP ) ) ;
} else {
// 查询标准成本价
StdcostpriceDO stdcostpriceDO = stdcostpriceService . queryStdcostpriceByItemCode ( detailDO . getItemCode ( ) ) ;
detailDO . setSinglePrice ( stdcostpriceDO . getPrice ( ) . setScale ( 2 , RoundingMode . HALF_UP ) ) ;
}
if ( detailDO . getAmount ( ) ! = null ) {
detailDO . setAmount ( detailDO . getAmount ( ) . setScale ( 2 , RoundingMode . HALF_UP ) ) ;
} else {
BigDecimal amount = detailDO . getSinglePrice ( ) . multiply ( detailDO . getQty ( ) ) ;
detailDO . setAmount ( amount . setScale ( 2 , RoundingMode . HALF_UP ) ) ;
}
} catch ( Exception ex ) {
message . append ( ex . getMessage ( ) ) . append ( "," ) ;
}
// 校验库存余额是否存在
BalanceDO balanceDo = balanceService . getBalanceListByStatusList ( "" , detailDO . getItemCode ( ) , detailDO . getBatch ( ) , null , detailDO . getFromLocationCode ( ) ) ;
if ( balanceDo = = null ) {
message . append ( "库存余额不存在,物料代码:" + detailDO . getItemCode ( ) + ",批次:" + detailDO . getBatch ( ) + ",库位代码(工位对应的原料库位):" + detailDO . getFromLocationCode ( ) ) . append ( "," ) ;
} else {
BigDecimal qty = balanceDo . getQty ( ) ;
if ( qty . compareTo ( detailDO . getQty ( ) ) < 0 ) {
message . append ( "库存余额数量:" + balanceDo . getQty ( ) + ",数量:" + detailDO . getQty ( ) ) . append ( "," ) ;
}
}
return message . toString ( ) ;
return message . toString ( ) ;
}
}
@ -723,11 +926,50 @@ public class ProductionscrapRequestMainServiceImpl implements ProductionscrapReq
private String validatorProductionscrapRequestMainImport ( ProductionscrapRequestMainDO mainDo , BusinesstypeDO businesstypeDO , RequestsettingDO requestsettingDO ) {
private String validatorProductionscrapRequestMainImport ( ProductionscrapRequestMainDO mainDo , BusinesstypeDO businesstypeDO , RequestsettingDO requestsettingDO ) {
StringBuilder message = new StringBuilder ( ) ;
StringBuilder message = new StringBuilder ( ) ;
// 必填字段校验
if ( StringUtils . isNotEmpty ( mainDo . getQ3Number ( ) ) ) {
boolean q3Flag = inspectionQ3Api . checkInspectionQ3 ( mainDo . getQ3Number ( ) ) ;
if ( q3Flag ) {
message . append ( "Q3通知单号不存在:" + mainDo . getQ3Number ( ) ) . append ( "," ) ;
}
}
// 报废原因
if ( StringUtils . isEmpty ( mainDo . getLineScrapReason ( ) ) ) {
message . append ( "报废原因不能为空" ) . append ( "," ) ;
}
if ( StringUtils . isEmpty ( mainDo . getCostCenterCode ( ) ) ) {
message . append ( "成本中心代码不能为空" ) . append ( "," ) ;
} else {
//校验成本中心是否存在
LambdaQueryWrapperX < QadCostcentreDO > lambdaQueryWrapperX = new LambdaQueryWrapperX < > ( ) ;
lambdaQueryWrapperX . eq ( QadCostcentreDO : : getCostcentreCode , mainDo . getCostCenterCode ( ) ) ;
QadCostcentreDO subjectAccountDO = qadCostcentreMapper . selectOne ( lambdaQueryWrapperX , false ) ;
if ( subjectAccountDO = = null ) {
message . append ( "成本中心代码不存在" ) . append ( "," ) ;
} else {
mainDo . setCostCenterType ( subjectAccountDO . getCostcentreType ( ) ) ;
}
}
if ( StringUtils . isEmpty ( mainDo . getReasonCodeRequisition ( ) ) ) {
message . append ( "原因代码不能为空" ) . append ( "," ) ;
} else {
LambdaQueryWrapperX < SubjectAccountDO > lambdaQueryWrapperX = new LambdaQueryWrapperX < > ( ) ;
lambdaQueryWrapperX . eq ( SubjectAccountDO : : getCode , mainDo . getReasonCodeRequisition ( ) ) ;
lambdaQueryWrapperX . eq ( SubjectAccountDO : : getCostcentreType , mainDo . getCostCenterType ( ) ) ;
SubjectAccountDO subjectAccountDO = subjectAccountMapper . selectOne ( lambdaQueryWrapperX ) ;
if ( subjectAccountDO = = null ) {
message . append ( "原因代码不存在" ) . append ( "," ) ;
}
}
if ( StringUtils . isEmpty ( mainDo . getWorkshopCode ( ) ) ) {
message . append ( "车间代码不能为空" ) . append ( "," ) ;
} else {
try {
try {
validatorWorkshop ( mainDo . getWorkshopCode ( ) ) ;
validatorWorkshop ( mainDo . getWorkshopCode ( ) ) ;
} catch ( Exception ex ) {
} catch ( Exception ex ) {
message . append ( ex . getMessage ( ) ) . append ( "," ) ;
message . append ( ex . getMessage ( ) ) . append ( "," ) ;
}
}
}
mainDo . setBusinessType ( businesstypeDO . getCode ( ) ) ;
mainDo . setBusinessType ( businesstypeDO . getCode ( ) ) ;
mainDo . setFromAreaTypes ( businesstypeDO . getOutAreaTypes ( ) ) ;
mainDo . setFromAreaTypes ( businesstypeDO . getOutAreaTypes ( ) ) ;
mainDo . setToAreaTypes ( businesstypeDO . getInAreaTypes ( ) ) ;
mainDo . setToAreaTypes ( businesstypeDO . getInAreaTypes ( ) ) ;