feat(heli): 新增新中大入出单功能并优化物料编码选择逻辑
This commit is contained in:
parent
b62e2023e5
commit
b4ed055dca
@ -56,6 +56,8 @@ public enum CodeEnum {
|
|||||||
|
|
||||||
UNQUALIFIED_NOTIFICATION("品质异常通知单", "RN", 4, "yyyyMMdd"),
|
UNQUALIFIED_NOTIFICATION("品质异常通知单", "RN", 4, "yyyyMMdd"),
|
||||||
MATERIAL("物料", 6),
|
MATERIAL("物料", 6),
|
||||||
|
XZD_STORAGE("新中大入出单", "X", 3, "yyyyMM"),
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -43,7 +43,7 @@ public interface StorageLogMapper extends BaseMapperX<StorageLogDO> {
|
|||||||
.like(!StringUtils.isEmpty(reqVO.getMatName()), MaterialDO::getName, reqVO.getMatName())
|
.like(!StringUtils.isEmpty(reqVO.getMatName()), MaterialDO::getName, reqVO.getMatName())
|
||||||
.like(!StringUtils.isEmpty(reqVO.getCodeNo()), StorageLogDO::getCodeNo, reqVO.getCodeNo())
|
.like(!StringUtils.isEmpty(reqVO.getCodeNo()), StorageLogDO::getCodeNo, reqVO.getCodeNo())
|
||||||
.like(!StringUtils.isEmpty(reqVO.getMatSpec()), MaterialDO::getSpec, reqVO.getMatSpec())
|
.like(!StringUtils.isEmpty(reqVO.getMatSpec()), MaterialDO::getSpec, reqVO.getMatSpec())
|
||||||
.notIn(StorageLogDO::getStockMode,24,14)
|
.notIn(StorageLogDO::getStockMode, 24, 14)
|
||||||
.eq(!ObjectUtil.isEmpty(reqVO.getWhId()), StorageLogDO::getWhId, reqVO.getWhId());
|
.eq(!ObjectUtil.isEmpty(reqVO.getWhId()), StorageLogDO::getWhId, reqVO.getWhId());
|
||||||
return selectPage(reqVO,query);
|
return selectPage(reqVO,query);
|
||||||
}
|
}
|
||||||
@ -67,6 +67,7 @@ public interface StorageLogMapper extends BaseMapperX<StorageLogDO> {
|
|||||||
.orderByDesc(StorageLogDO::getId);
|
.orderByDesc(StorageLogDO::getId);
|
||||||
|
|
||||||
query
|
query
|
||||||
|
.notIn(StorageLogDO::getStockMode,24,14)
|
||||||
.like(!StringUtils.isEmpty(reqVO.getMatName()), StorageLogDO::getMatName, reqVO.getMatName())
|
.like(!StringUtils.isEmpty(reqVO.getMatName()), StorageLogDO::getMatName, reqVO.getMatName())
|
||||||
.like(!StringUtils.isEmpty(reqVO.getMatCode()), MaterialDO::getCode, reqVO.getMatCode())
|
.like(!StringUtils.isEmpty(reqVO.getMatCode()), MaterialDO::getCode, reqVO.getMatCode())
|
||||||
.eq(!StringUtils.isEmpty(reqVO.getStockType()), StorageLogDO::getStockType, reqVO.getStockType())
|
.eq(!StringUtils.isEmpty(reqVO.getStockType()), StorageLogDO::getStockType, reqVO.getStockType())
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
package com.chanko.yunxi.mes.module.heli.service.storagelog;
|
package com.chanko.yunxi.mes.module.heli.service.storagelog;
|
||||||
|
|
||||||
import cn.hutool.core.util.IdUtil;
|
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
@ -13,6 +12,7 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.StorageLo
|
|||||||
import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.StorageNowAllReqVO;
|
import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.StorageNowAllReqVO;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.bdgzsomthing.bdgzsomthingDO;
|
import com.chanko.yunxi.mes.module.heli.dal.dataobject.bdgzsomthing.bdgzsomthingDO;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO;
|
import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO;
|
||||||
|
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO;
|
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO;
|
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageMaterialDO;
|
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageMaterialDO;
|
||||||
@ -27,8 +27,7 @@ import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageMaterialMapp
|
|||||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.wmsconfig.WmsConfigMapper;
|
import com.chanko.yunxi.mes.module.heli.dal.mysql.wmsconfig.WmsConfigMapper;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.wmsstorage.WmsStorageMapper;
|
import com.chanko.yunxi.mes.module.heli.dal.mysql.wmsstorage.WmsStorageMapper;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.wmsstoragedetail.WmsStorageDetailMapper;
|
import com.chanko.yunxi.mes.module.heli.dal.mysql.wmsstoragedetail.WmsStorageDetailMapper;
|
||||||
import com.chanko.yunxi.mes.module.system.service.dict.DictDataService;
|
import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService;
|
||||||
import com.chanko.yunxi.mes.module.system.service.dict.DictTypeService;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
@ -37,12 +36,14 @@ import reactor.util.function.Tuples;
|
|||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
|
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.XZD_STORAGE;
|
||||||
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.STORAGE_LOG_NOT_EXISTS;
|
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.STORAGE_LOG_NOT_EXISTS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -75,10 +76,7 @@ public class StorageLogServiceImpl implements StorageLogService {
|
|||||||
private WmsConfigMapper wmsConfigMapper;
|
private WmsConfigMapper wmsConfigMapper;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private DictTypeService dictTypeService;
|
private SerialNumberService serialNumberService;
|
||||||
|
|
||||||
@Resource
|
|
||||||
private DictDataService dictDataService;
|
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private com.chanko.yunxi.mes.module.heli.dal.mysql.bdgzsomthing.bdgzsomthingMapper bdgzsomthingMapper;
|
private com.chanko.yunxi.mes.module.heli.dal.mysql.bdgzsomthing.bdgzsomthingMapper bdgzsomthingMapper;
|
||||||
@ -157,18 +155,15 @@ public class StorageLogServiceImpl implements StorageLogService {
|
|||||||
idSet = new HashSet<>(pageReqVO.getIds());
|
idSet = new HashSet<>(pageReqVO.getIds());
|
||||||
}
|
}
|
||||||
for (StorageLogDO logDO : pageResult.getList()) {
|
for (StorageLogDO logDO : pageResult.getList()) {
|
||||||
if (logDO.getGoodsType() == 2) {
|
|
||||||
if (ObjectUtil.isNotEmpty(logDO.getMatName())) {
|
|
||||||
LambdaQueryWrapper<MaterialDO> queryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<MaterialDO> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
queryWrapper.eq(MaterialDO::getName, logDO.getMatName());
|
queryWrapper.like(logDO.getMatName() != null, MaterialDO::getName, logDO.getMatName());
|
||||||
|
queryWrapper.like(logDO.getMatSpec() != null, MaterialDO::getSpec, logDO.getMatSpec());
|
||||||
List<MaterialDO> materialDOS = materialMapper.selectList(queryWrapper);
|
List<MaterialDO> materialDOS = materialMapper.selectList(queryWrapper);
|
||||||
logDO.setMaterialDOList(materialDOS);
|
logDO.setMaterialDOList(materialDOS);
|
||||||
if (idSet.contains(logDO.getId()) && materialDOS.size() == 1) {
|
if (idSet.contains(logDO.getId()) && materialDOS.size() == 1) {
|
||||||
logDO.setMatId(materialDOS.get(0).getId());
|
logDO.setMatId(materialDOS.get(0).getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
return pageResult;
|
return pageResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -466,7 +461,11 @@ public class StorageLogServiceImpl implements StorageLogService {
|
|||||||
storageDO.setStockType(stockType);
|
storageDO.setStockType(stockType);
|
||||||
storageDO.setBusiType(stockType == 1 ? configDO.getBusiTypeIn() : configDO.getBusiTypeOut());
|
storageDO.setBusiType(stockType == 1 ? configDO.getBusiTypeIn() : configDO.getBusiTypeOut());
|
||||||
storageDO.setWhName(configDO.getWhName());
|
storageDO.setWhName(configDO.getWhName());
|
||||||
storageDO.setStockNo(IdUtil.getSnowflakeNextIdStr());
|
// 生成订单号 X202604+3位流水号 001 002
|
||||||
|
SerialNumberDO serialNumberDO = serialNumberService.getSerialNumber(XZD_STORAGE.name(), new SimpleDateFormat("yyyyMM").format(new Date()));
|
||||||
|
serialNumberDO.setSerialNumber(serialNumberDO.getSerialNumber() + 1);
|
||||||
|
serialNumberService.updateSerialNumber(serialNumberDO);
|
||||||
|
storageDO.setStockNo(XZD_STORAGE.getCode(serialNumberDO.getSerialNumber().toString()));
|
||||||
storageDO.setBusiDate(LocalDate.now());
|
storageDO.setBusiDate(LocalDate.now());
|
||||||
storageDO.setSupplierName(supplierName);
|
storageDO.setSupplierName(supplierName);
|
||||||
storageDO.setPriceType(priceType);
|
storageDO.setPriceType(priceType);
|
||||||
|
|||||||
@ -163,7 +163,7 @@
|
|||||||
|
|
||||||
<el-table-column label="物料编码" align="center" prop="matCode" min-width="200">
|
<el-table-column label="物料编码" align="center" prop="matCode" min-width="200">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<template v-if="scope.row.goodsType == 2">
|
<template v-if="scope.row.goodsType == 2 || scope.row.goodsType == 1">
|
||||||
<el-form-item class="mb-0px!">
|
<el-form-item class="mb-0px!">
|
||||||
<el-select
|
<el-select
|
||||||
v-model="scope.row.matId"
|
v-model="scope.row.matId"
|
||||||
@ -307,10 +307,15 @@ const getList = async () => {
|
|||||||
list.value = data.list
|
list.value = data.list
|
||||||
total.value = data.total
|
total.value = data.total
|
||||||
// 如果没有价格类型,默认选择 1|临时暂估价
|
// 如果没有价格类型,默认选择 1|临时暂估价
|
||||||
|
// 如果只有一个物料类型,默认选中
|
||||||
list.value.forEach((item) => {
|
list.value.forEach((item) => {
|
||||||
if (!item.priceType) {
|
if (!item.priceType) {
|
||||||
item.priceType = '1|临时暂估价'
|
item.priceType = '1|临时暂估价'
|
||||||
}
|
}
|
||||||
|
// 如果只有一个物料类型,默认选中
|
||||||
|
if (item.materialDOList && item.materialDOList.length === 1) {
|
||||||
|
item.matId = item.materialDOList[0].id
|
||||||
|
}
|
||||||
})
|
})
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false
|
loading.value = false
|
||||||
@ -401,12 +406,25 @@ const generateBill = async () => {
|
|||||||
message.warning('请选择同一单据类型的数据')
|
message.warning('请选择同一单据类型的数据')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// 3. 检查物料编码:根据goodsType判断
|
||||||
|
const rowWithoutMat = multipleSelection.value.find((row) => {
|
||||||
|
if (row.goodsType == 1 || row.goodsType == 2) {
|
||||||
|
return !row.matId
|
||||||
|
} else {
|
||||||
|
return !row.matCode
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (rowWithoutMat) {
|
||||||
|
const tableRowIndex = list.value.findIndex((r) => r.id === rowWithoutMat.id) + 1
|
||||||
|
message.error(`行 (${tableRowIndex} )没有选择物料编码,请确认!`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 3. 调用后端生成单据接口
|
// 4. 调用后端生成单据接口
|
||||||
await StorageLogApi.generateBill(multipleSelection.value)
|
await StorageLogApi.generateBill(multipleSelection.value)
|
||||||
message.success(`成功生成 ${multipleSelection.value.length} 条单据`)
|
message.success(`成功生成 ${multipleSelection.value.length} 条单据`)
|
||||||
// 4. 刷新列表,显示最新状态
|
// 5. 刷新列表,显示最新状态
|
||||||
await getList()
|
await getList()
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
// 获取错误码和错误信息中的 ID 列表
|
// 获取错误码和错误信息中的 ID 列表
|
||||||
@ -470,9 +488,16 @@ const submitForm = async () => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 2.物料编码不能为空 提示 行(具体序列号)没有选择物料编码,请确认! 使用表格中的实际行号
|
// 2.物料编码不能为空 提示 行(具体序列号)没有选择物料编码,请确认! 使用表格中的实际行号
|
||||||
if (selectedList.some((row) => !row.matId)) {
|
// 根据goodsType判断:goodsType为1或2时需要选择matId,否则检查matCode
|
||||||
const rowWithoutMatId = selectedList.find((row) => !row.matId)
|
const rowWithoutMat = selectedList.find((row) => {
|
||||||
const tableRowIndex = list.value.findIndex((r) => r.id === rowWithoutMatId.id) + 1
|
if (row.goodsType == 1 || row.goodsType == 2) {
|
||||||
|
return !row.matId
|
||||||
|
} else {
|
||||||
|
return !row.matCode
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (rowWithoutMat) {
|
||||||
|
const tableRowIndex = list.value.findIndex((r) => r.id === rowWithoutMat.id) + 1
|
||||||
message.error(`行 (${tableRowIndex} )没有选择物料编码,请确认!`)
|
message.error(`行 (${tableRowIndex} )没有选择物料编码,请确认!`)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user