|
|
@ -1,10 +1,48 @@ |
|
|
|
package com.win.module.wms.service.packageovermain; |
|
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
|
|
|
import com.win.framework.common.pojo.CustomConditions; |
|
|
|
import com.win.module.infra.api.trends.TrendsApi; |
|
|
|
import com.win.module.infra.enums.TrendsTypeEnum; |
|
|
|
import com.win.module.system.api.serialnumber.SerialNumberApi; |
|
|
|
import com.win.module.system.api.user.AdminUserApi; |
|
|
|
import com.win.module.system.api.user.dto.AdminUserRespDTO; |
|
|
|
import com.win.module.system.enums.serialNumber.RuleCodeEnum; |
|
|
|
import com.win.module.wms.controller.packageMassage.vo.PackageCreateReqVO; |
|
|
|
import com.win.module.wms.controller.transaction.vo.TransactionCreateReqVO; |
|
|
|
import com.win.module.wms.convert.packageMassage.PackageConvert; |
|
|
|
import com.win.module.wms.convert.packagemergemain.PackagemergeDetailConvert; |
|
|
|
import com.win.module.wms.convert.packageovermain.PackageoverDetailConvert; |
|
|
|
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.itembasic.ItembasicDO; |
|
|
|
import com.win.module.wms.dal.dataobject.itempackaging.ItempackagingDO; |
|
|
|
import com.win.module.wms.dal.dataobject.location.LocationDO; |
|
|
|
import com.win.module.wms.dal.dataobject.packageMassage.PackageDO; |
|
|
|
import com.win.module.wms.dal.dataobject.packagemergemain.PackagemergeDetailDO; |
|
|
|
import com.win.module.wms.dal.dataobject.packageovermain.PackageoverDetailDO; |
|
|
|
import com.win.module.wms.dal.dataobject.recordsetting.RecordsettingDO; |
|
|
|
import com.win.module.wms.dal.dataobject.transactiontype.TransactiontypeDO; |
|
|
|
import com.win.module.wms.dal.mysql.packageMassage.PackageMapper; |
|
|
|
import com.win.module.wms.dal.mysql.packagemergemain.PackagemergeDetailMapper; |
|
|
|
import com.win.module.wms.dal.mysql.packagemergemain.PackagemergeMainMapper; |
|
|
|
import com.win.module.wms.dal.mysql.packageovermain.PackageoverDetailMapper; |
|
|
|
import com.win.module.wms.service.itembasic.ItembasicService; |
|
|
|
import com.win.module.wms.service.itempackaging.ItempackagingService; |
|
|
|
import com.win.module.wms.service.location.LocationService; |
|
|
|
import com.win.module.wms.service.packageMassage.PackageService; |
|
|
|
import com.win.module.wms.service.recordsetting.RecordsettingService; |
|
|
|
import com.win.module.wms.service.transaction.TransactionService; |
|
|
|
import com.win.module.wms.util.JobUtils; |
|
|
|
import org.springframework.beans.BeanUtils; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import javax.annotation.Resource; |
|
|
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
import org.springframework.validation.annotation.Validated; |
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.time.LocalDateTime; |
|
|
|
import java.util.*; |
|
|
|
import com.win.module.wms.controller.packageovermain.vo.*; |
|
|
|
import com.win.module.wms.dal.dataobject.packageovermain.PackageoverMainDO; |
|
|
@ -14,6 +52,7 @@ import com.win.module.wms.convert.packageovermain.PackageoverMainConvert; |
|
|
|
import com.win.module.wms.dal.mysql.packageovermain.PackageoverMainMapper; |
|
|
|
|
|
|
|
import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; |
|
|
|
import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
|
|
|
import static com.win.module.wms.enums.ErrorCodeConstants.*; |
|
|
|
|
|
|
|
/** |
|
|
@ -25,16 +64,216 @@ import static com.win.module.wms.enums.ErrorCodeConstants.*; |
|
|
|
@Validated |
|
|
|
public class PackageoverMainServiceImpl implements PackageoverMainService { |
|
|
|
|
|
|
|
@Resource |
|
|
|
private PackageService packageService; |
|
|
|
@Resource |
|
|
|
private ItempackagingService itempackagingService; |
|
|
|
@Resource |
|
|
|
private TransactionService transactionService; |
|
|
|
@Resource |
|
|
|
private PackagemergeDetailMapper packagemergeDetailMapper; |
|
|
|
@Resource |
|
|
|
private PackageMapper packageMapper; |
|
|
|
@Resource |
|
|
|
private PackagemergeMainMapper packagemergeMainMapper; |
|
|
|
@Resource |
|
|
|
private TrendsApi trendsApi; |
|
|
|
@Resource |
|
|
|
private JobUtils jobUtils; |
|
|
|
@Resource |
|
|
|
private SerialNumberApi serialNumberApi; |
|
|
|
@Resource |
|
|
|
private AdminUserApi userApi; |
|
|
|
@Resource |
|
|
|
private RecordsettingService recordsettingService; |
|
|
|
@Resource |
|
|
|
private LocationService locationService; |
|
|
|
@Resource |
|
|
|
private ItembasicService itembasicService; |
|
|
|
@Resource |
|
|
|
private PackageoverMainMapper packageoverMainMapper; |
|
|
|
@Resource |
|
|
|
private PackageoverDetailMapper packageoverDetailMapper; |
|
|
|
|
|
|
|
@Override |
|
|
|
public Long createPackageoverMain(PackageoverMainCreateReqVO createReqVO) { |
|
|
|
@Transactional |
|
|
|
public String createPackageoverMain(PackageoverMainCreateReqVO createReqVO) { |
|
|
|
// 插入
|
|
|
|
PackageoverMainDO packageoverMain = PackageoverMainConvert.INSTANCE.convert(createReqVO); |
|
|
|
packageoverMainMapper.insert(packageoverMain); |
|
|
|
Long userId = getLoginUserId(); |
|
|
|
AdminUserRespDTO userRespDTO = userApi.getUser(userId); |
|
|
|
PackageoverMainDO mainDO = PackageoverMainConvert.INSTANCE.convert(createReqVO); |
|
|
|
List<PackageoverDetailDO> subDOList = PackageoverDetailConvert.INSTANCE.convertList03(createReqVO.getSubList()); |
|
|
|
String number = serialNumberApi.generateCode(RuleCodeEnum.OVER_PACKAGE_RECORD.getCode()); |
|
|
|
mainDO.setNumber(number); |
|
|
|
mainDO.setDepartmentCode(String.valueOf(userRespDTO.getDeptId())); |
|
|
|
mainDO.setExecuteTime(LocalDateTime.now()); |
|
|
|
mainDO.setActiveDate(LocalDateTime.now()); |
|
|
|
mainDO.setAvailable("TRUE"); |
|
|
|
mainDO.setId(null); |
|
|
|
// 业务类型
|
|
|
|
BusinesstypeDO businesstypeDO = jobUtils.selectDocumentSettingFromBusinessType("OverPackageRecord"); |
|
|
|
mainDO.setBusinessType(businesstypeDO.getCode()); |
|
|
|
mainDO.setInTransactionType(businesstypeDO.getInTransactionType()); |
|
|
|
mainDO.setOutTransactionType(businesstypeDO.getOutTransactionType()); |
|
|
|
// 接口类型
|
|
|
|
RecordsettingDO recordsettingDO = recordsettingService.selectRecordsettingExist("OverPackageRecord"); |
|
|
|
mainDO.setInterfaceType(recordsettingDO.getInterfaceType()); |
|
|
|
packageoverMainMapper.insert(mainDO); |
|
|
|
//库存事务
|
|
|
|
List<TransactionCreateReqVO> transactionCreateReqVOList = new ArrayList<>(); |
|
|
|
for (PackageoverDetailDO detailDO : subDOList) { |
|
|
|
detailDO.setMasterId(mainDO.getId()); |
|
|
|
detailDO.setNumber(number); |
|
|
|
LocationDO locationDOFrom = locationService.selectLocation(detailDO.getLocationCode()); |
|
|
|
if(locationDOFrom != null) { |
|
|
|
detailDO.setAreaCode(locationDOFrom.getAreaCode()); |
|
|
|
detailDO.setLocationGroupCode(locationDOFrom.getLocationGroupCode()); |
|
|
|
} else { |
|
|
|
throw exception(LOCATION_NOT_EXISTS); |
|
|
|
} |
|
|
|
ItembasicDO itembasicDO = itembasicService.selectItembasic(detailDO.getItemCode()); |
|
|
|
if (itembasicDO != null) { |
|
|
|
detailDO.setItemName(itembasicDO.getName()); |
|
|
|
detailDO.setItemDesc1(itembasicDO.getDesc1()); |
|
|
|
detailDO.setItemDesc2(itembasicDO.getDesc2()); |
|
|
|
detailDO.setProjectCode(itembasicDO.getProject()); |
|
|
|
detailDO.setUom(itembasicDO.getUom()); |
|
|
|
} else { |
|
|
|
throw exception(ITEMBASIC_NOT_EXISTS); |
|
|
|
} |
|
|
|
//查询库存余额
|
|
|
|
List<String> inventoryStatusList = new ArrayList<>(); |
|
|
|
inventoryStatusList.add(detailDO.getFromInventoryStatus()); |
|
|
|
List<BalanceDO> balanceDO = jobUtils.selectlocationReturnManagementAccuracyToBalance(detailDO.getItemCode(),detailDO.getFromPackingNumber(),detailDO.getFromBatch(),detailDO.getLocationCode(), inventoryStatusList); |
|
|
|
if (balanceDO == null || balanceDO.size() == 0) { |
|
|
|
throw exception(BALANCE_NOT_EXISTS); |
|
|
|
} |
|
|
|
// 库存事务——出
|
|
|
|
TransactionCreateReqVO transactionCreateReqVOOut = new TransactionCreateReqVO(); |
|
|
|
BeanUtils.copyProperties(detailDO, transactionCreateReqVOOut); |
|
|
|
transactionCreateReqVOOut.setBusinessType(businesstypeDO.getCode()); |
|
|
|
TransactiontypeDO transactiontypeDOOut = jobUtils.selectDocumentFromTransactionType(businesstypeDO.getOutTransactionType()); |
|
|
|
transactionCreateReqVOOut.setInventoryAction(transactiontypeDOOut.getInventoryAction()); |
|
|
|
transactionCreateReqVOOut.setTransactionType(transactiontypeDOOut.getCode()); |
|
|
|
transactionCreateReqVOOut.setRecordNumber(number); |
|
|
|
transactionCreateReqVOOut.setInventoryStatus(detailDO.getFromInventoryStatus()); |
|
|
|
transactionCreateReqVOOut.setWorker(String.valueOf(userRespDTO.getId())); |
|
|
|
transactionCreateReqVOOut.setBatch(detailDO.getFromBatch()); |
|
|
|
transactionCreateReqVOOut.setPackingNumber(detailDO.getFromPackingNumber()); |
|
|
|
transactionCreateReqVOOut.setLocationCode(detailDO.getLocationCode()); |
|
|
|
transactionCreateReqVOOut.setSinglePrice(balanceDO.get(0).getSinglePrice()); |
|
|
|
transactionCreateReqVOOut.setAmount(balanceDO.get(0).getAmount()); |
|
|
|
transactionCreateReqVOOut.setArriveDate(balanceDO.get(0).getArriveDate()); |
|
|
|
transactionCreateReqVOOut.setProduceDate(balanceDO.get(0).getProduceDate()); |
|
|
|
transactionCreateReqVOOut.setExpireDate(balanceDO.get(0).getExpireDate()); |
|
|
|
transactionCreateReqVOOut.setWarehouseCode(mainDO.getWarehouseCode()); |
|
|
|
transactionCreateReqVOOut.setQty(detailDO.getFromQty()); |
|
|
|
transactionCreateReqVOOut.setId(null); |
|
|
|
transactionCreateReqVOList.add(transactionCreateReqVOOut); |
|
|
|
// 更新包装信息——来源包装
|
|
|
|
updatePackageDO(detailDO.getFromPackingNumber(),detailDO.getFromQty()); |
|
|
|
// 查询一翻几的规则 在基础包装中 翻几 = 标包数量/替代标包数量 库存余额中不够分配的 向上取整
|
|
|
|
// 例如:库存余额24 翻3包 每包10 那么第一包数量10 第二包数量10 第三包数量4
|
|
|
|
// 例如:库存余额5 翻3包 每包10 那么第一包数量5
|
|
|
|
// 查询基础包装信息
|
|
|
|
ItempackagingDO itempackagingDO = itempackagingService.selectItemPackagingExist(detailDO.getItemCode()); |
|
|
|
if (itempackagingDO == null) { |
|
|
|
throw exception(ITEMPACKAGING_NOT_EXISTS); |
|
|
|
} |
|
|
|
List<PackageoverDetailDO> packageoverDetailDOList = new ArrayList<>(); |
|
|
|
// 判断替代标包数量不为空 并且 大于 0 并且 标包数大于等于替代标包数
|
|
|
|
if (itempackagingDO.getAltPackQty1() != null && itempackagingDO.getAltPackQty1().compareTo(BigDecimal.ZERO) == 1 && itempackagingDO.getStdPackQty().compareTo(itempackagingDO.getAltPackQty1()) != -1 ) { |
|
|
|
// 翻几包 overCount = 标包数量/替代标包数量
|
|
|
|
BigDecimal overCount = itempackagingDO.getStdPackQty().divide(itempackagingDO.getAltPackQty1(),0, BigDecimal.ROUND_UP); |
|
|
|
// 替代标包数量
|
|
|
|
BigDecimal altPackQty = itempackagingDO.getAltPackQty1(); |
|
|
|
// 库存余额数量
|
|
|
|
BigDecimal balanceQty = balanceDO.get(0).getQty(); |
|
|
|
for (int i =0; i< overCount.intValue();i++) { |
|
|
|
// 创建 子表数据
|
|
|
|
PackageoverDetailDO packageoverDetailDO = new PackageoverDetailDO(); |
|
|
|
BeanUtils.copyProperties(detailDO,packageoverDetailDO); |
|
|
|
packageoverDetailDO.setId(null).setCreator(null).setCreateTime(null).setUpdater(null).setUpdateTime(null); |
|
|
|
packageoverDetailDO.setMasterId(mainDO.getId()); |
|
|
|
packageoverDetailDO.setToBatch(packageoverDetailDO.getFromBatch()); |
|
|
|
packageoverDetailDO.setToContainerNumber(packageoverDetailDO.getFromContainerNumber()); |
|
|
|
packageoverDetailDO.setToOwnerCode(packageoverDetailDO.getFromOwnerCode()); |
|
|
|
packageoverDetailDO.setToInventoryStatus(packageoverDetailDO.getFromInventoryStatus()); |
|
|
|
// 创建 包装及标签
|
|
|
|
PackageCreateReqVO packagecreateReqVO = PackageConvert.INSTANCE.convert01(packageService.LabelExist(detailDO.getFromPackingNumber())); |
|
|
|
packagecreateReqVO.setId(null); |
|
|
|
packagecreateReqVO.setCreator(null); |
|
|
|
PackageDO packageDO; |
|
|
|
// 替代标包数量 >= 库存余额数量 只能创建一个包装标签 结束循环
|
|
|
|
if (itempackagingDO.getAltPackQty1().compareTo(balanceQty) != -1) { |
|
|
|
packagecreateReqVO.setQty(balanceQty); |
|
|
|
packageDO = packageService.createPackageLabel(packagecreateReqVO); |
|
|
|
packageoverDetailDO.setToPackingNumber(packageDO.getNumber()); |
|
|
|
packageoverDetailDO.setToQty(balanceQty); |
|
|
|
break; |
|
|
|
} else { |
|
|
|
//库存余额数量 < 替代标包数量
|
|
|
|
packagecreateReqVO.setQty(altPackQty); |
|
|
|
packageDO = packageService.createPackageLabel(packagecreateReqVO); |
|
|
|
packageoverDetailDO.setToPackingNumber(packageDO.getNumber()); |
|
|
|
packageoverDetailDO.setToQty(altPackQty); |
|
|
|
balanceQty = balanceQty.subtract(altPackQty); |
|
|
|
} |
|
|
|
packageoverDetailDOList.add(packageoverDetailDO); |
|
|
|
// 库存事务——入
|
|
|
|
TransactionCreateReqVO transactionCreateReqVOIn = new TransactionCreateReqVO(); |
|
|
|
BeanUtils.copyProperties(packageoverDetailDO, transactionCreateReqVOIn); |
|
|
|
transactionCreateReqVOIn.setBusinessType(businesstypeDO.getCode()); |
|
|
|
TransactiontypeDO transactiontypeDOIn = jobUtils.selectDocumentFromTransactionType(businesstypeDO.getInTransactionType()); |
|
|
|
transactionCreateReqVOIn.setInventoryAction(transactiontypeDOIn.getInventoryAction()); |
|
|
|
transactionCreateReqVOIn.setTransactionType(transactiontypeDOIn.getCode()); |
|
|
|
transactionCreateReqVOIn.setWorker(String.valueOf(userRespDTO.getId())); |
|
|
|
transactionCreateReqVOIn.setBatch(packageoverDetailDO.getToBatch()); |
|
|
|
transactionCreateReqVOIn.setPackingNumber(packageoverDetailDO.getToPackingNumber()); |
|
|
|
transactionCreateReqVOIn.setInventoryStatus(packageoverDetailDO.getToInventoryStatus()); |
|
|
|
transactionCreateReqVOIn.setLocationCode(packageoverDetailDO.getLocationCode()); |
|
|
|
transactionCreateReqVOIn.setSinglePrice(BigDecimal.ZERO); |
|
|
|
transactionCreateReqVOIn.setAmount(BigDecimal.ZERO); |
|
|
|
transactionCreateReqVOIn.setArriveDate(LocalDateTime.now()); |
|
|
|
transactionCreateReqVOIn.setProduceDate(LocalDateTime.now()); |
|
|
|
transactionCreateReqVOIn.setExpireDate(LocalDateTime.now()); |
|
|
|
transactionCreateReqVOIn.setWarehouseCode(mainDO.getWarehouseCode()); |
|
|
|
transactionCreateReqVOIn.setRecordNumber(number); |
|
|
|
transactionCreateReqVOIn.setQty(packageoverDetailDO.getToQty()); |
|
|
|
transactionCreateReqVOIn.setId(null); |
|
|
|
transactionCreateReqVOList.add(transactionCreateReqVOIn); |
|
|
|
} |
|
|
|
// 更新旧包装信息
|
|
|
|
updatePackageDO(detailDO.getFromPackingNumber(),BigDecimal.ZERO); |
|
|
|
} else { |
|
|
|
throw exception(PACKAGEOVER_DETAIL_PACKING_ERROR); |
|
|
|
} |
|
|
|
if (packageoverDetailDOList != null && packageoverDetailDOList.size() > 0) { |
|
|
|
packageoverDetailMapper.insertBatch(packageoverDetailDOList); |
|
|
|
} |
|
|
|
} |
|
|
|
//增加库存事务
|
|
|
|
transactionService.createTransaction(transactionCreateReqVOList); |
|
|
|
//增加操作记录
|
|
|
|
trendsApi.createTrends(mainDO.getId(), "packageoverMain", "增加了翻包记录", TrendsTypeEnum.CREATE); |
|
|
|
// 返回
|
|
|
|
return packageoverMain.getId(); |
|
|
|
return mainDO.getNumber(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 更新包装信息 |
|
|
|
* @param number |
|
|
|
* @param qty |
|
|
|
*/ |
|
|
|
private void updatePackageDO(String number, BigDecimal qty) { |
|
|
|
QueryWrapper queryWrapper = new QueryWrapper<>(); |
|
|
|
queryWrapper.eq("number", number); |
|
|
|
PackageDO packageDO = packageMapper.selectOne(queryWrapper); |
|
|
|
if (packageDO == null) { |
|
|
|
throw exception(PACKAGE_NOT_EXISTS); |
|
|
|
} |
|
|
|
packageDO.setQty(qty); |
|
|
|
packageMapper.updateById(packageDO); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|