refactor(heli): 重构物料编码管理功能
- 将物料大类编码字段从 matCatCode 统一改为 matTypeCode - 移除前端界面中的删除按钮功能 - 更新表单验证逻辑,对最大流水号进行数字格式和长度校验 - 修改物料编码生成算法,优化流水号递增逻辑 - 在物料更新时自动同步更新对应物料大类的最大流水号
This commit is contained in:
parent
dad15fb31e
commit
7f269c516f
@ -14,9 +14,6 @@ import static com.chanko.yunxi.mes.framework.common.util.date.DateUtils.FORMAT_Y
|
||||
@ToString(callSuper = true)
|
||||
public class MatCodePageReqVO extends PageParam {
|
||||
|
||||
@Schema(description = "物料大类编码")
|
||||
private String matCatCode;
|
||||
|
||||
@Schema(description = "物料物料大类名称", example = "芋艿")
|
||||
private String matCatName;
|
||||
|
||||
|
||||
@ -13,10 +13,6 @@ public class MatCodeSaveReqVO {
|
||||
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED, example = "20351")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "物料大类编码", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
// @NotEmpty(message = "物料大类编码不能为空")
|
||||
private String matCatCode;
|
||||
|
||||
@Schema(description = "物料大类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "刚材")
|
||||
// @NotEmpty(message = "大类名称不能为空")
|
||||
private String matCatName;
|
||||
|
||||
@ -24,10 +24,6 @@ public class MatCodeDO extends BaseDO {
|
||||
*/
|
||||
@TableId
|
||||
private Long id;
|
||||
/**
|
||||
* 物料大类编码
|
||||
*/
|
||||
private String matCatCode;
|
||||
/**
|
||||
* 物料物料大类名称
|
||||
*/
|
||||
|
||||
@ -19,7 +19,7 @@ public interface MatCodeMapper extends BaseMapperX<MatCodeDO> {
|
||||
|
||||
default PageResult<MatCodeDO> selectPage(MatCodePageReqVO reqVO) {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<MatCodeDO>()
|
||||
.eqIfPresent(MatCodeDO::getMatCatCode, reqVO.getMatCatCode())
|
||||
.eqIfPresent(MatCodeDO::getMatTypeCode, reqVO.getMatTypeCode())
|
||||
.likeIfPresent(MatCodeDO::getMatCatName, reqVO.getMatCatName())
|
||||
.eqIfPresent(MatCodeDO::getMatTypeCode, reqVO.getMatTypeCode())
|
||||
.eqIfPresent(MatCodeDO::getCurMaxSeq, reqVO.getCurMaxSeq())
|
||||
@ -30,12 +30,12 @@ public interface MatCodeMapper extends BaseMapperX<MatCodeDO> {
|
||||
|
||||
default MatCodeDO selectByMatCatCode(String matCatCode) {
|
||||
return selectOne(new LambdaQueryWrapperX<MatCodeDO>()
|
||||
.eq(MatCodeDO::getMatCatCode, matCatCode));
|
||||
.eq(MatCodeDO::getMatTypeCode, matCatCode));
|
||||
}
|
||||
|
||||
default MatCodeDO selectByMatCatCodeAndIdNot(String matCatCode, Long id) {
|
||||
return selectOne(new LambdaQueryWrapperX<MatCodeDO>()
|
||||
.eq(MatCodeDO::getMatCatCode, matCatCode)
|
||||
.eq(MatCodeDO::getMatTypeCode, matCatCode)
|
||||
.ne(MatCodeDO::getId, id));
|
||||
}
|
||||
|
||||
|
||||
@ -30,6 +30,9 @@ public interface MatCodeService {
|
||||
*/
|
||||
void updateMatCode(@Valid MatCodeSaveReqVO updateReqVO);
|
||||
|
||||
|
||||
void updateCurMaxSeq(String matTypeCode);
|
||||
|
||||
/**
|
||||
* 删除物料大类编码维护
|
||||
*
|
||||
|
||||
@ -35,23 +35,24 @@ public class MatCodeServiceImpl implements MatCodeService {
|
||||
|
||||
public static String generateMaterialCode(String matTypeCode, String curMaxSeq) {
|
||||
try {
|
||||
int matCode = Integer.parseInt(matTypeCode);
|
||||
// curMaxSeq 转换为数字
|
||||
int curMaxSeqNum = Integer.parseInt(curMaxSeq) + 1;
|
||||
int ss = matCode + curMaxSeqNum;
|
||||
|
||||
// ss 转为字符串,不足 5 位补 前面补充0
|
||||
return String.format("%05d", ss);
|
||||
String curMax = getString(curMaxSeq);
|
||||
return matTypeCode + curMax;
|
||||
} catch (Exception e) {
|
||||
throw exception(ErrorCodeConstants.MAT_CAT_CODE_ERROR);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static String getString(String curMaxSeq) {
|
||||
int length = curMaxSeq.length();
|
||||
int curMaxSeqNum = Integer.parseInt(curMaxSeq) + 1;
|
||||
return String.format("%0" + length + "d", curMaxSeqNum);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long createMatCode(MatCodeSaveReqVO createReqVO) {
|
||||
// 校验 matCatCode 唯一性
|
||||
validateMatCatCodeUnique(null, createReqVO.getMatCatCode());
|
||||
validateMatCatCodeUnique(null, createReqVO.getMatTypeCode());
|
||||
// 插入
|
||||
MatCodeDO matCode = BeanUtils.toBean(createReqVO, MatCodeDO.class);
|
||||
matCodeMapper.insert(matCode);
|
||||
@ -64,12 +65,21 @@ public class MatCodeServiceImpl implements MatCodeService {
|
||||
// 校验存在
|
||||
validateMatCodeExists(updateReqVO.getId());
|
||||
// 校验 matCatCode 唯一性(更新时允许更新自己)
|
||||
validateMatCatCodeUnique(updateReqVO.getId(), updateReqVO.getMatCatCode());
|
||||
validateMatCatCodeUnique(updateReqVO.getId(), updateReqVO.getMatTypeCode());
|
||||
// 更新
|
||||
MatCodeDO updateObj = BeanUtils.toBean(updateReqVO, MatCodeDO.class);
|
||||
matCodeMapper.updateById(updateObj);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void updateCurMaxSeq(String matTypeCode) {
|
||||
MatCodeDO matCode = getByMatCatCode(matTypeCode);
|
||||
String string = getString(matCode.getCurMaxSeq());
|
||||
matCode.setCurMaxSeq(string);
|
||||
matCodeMapper.updateById(matCode);
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验物料大类编码唯一性
|
||||
*
|
||||
|
||||
@ -23,6 +23,7 @@ import com.chanko.yunxi.mes.module.heli.dal.mysql.material.MaterialMapper;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.storageinventory.StorageInventoryMapper;
|
||||
import com.chanko.yunxi.mes.module.heli.enums.CodeEnum;
|
||||
import com.chanko.yunxi.mes.module.heli.enums.MaterialTypeEnum;
|
||||
import com.chanko.yunxi.mes.module.heli.service.matcode.MatCodeService;
|
||||
import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService;
|
||||
import com.chanko.yunxi.mes.module.heli.service.storage.StorageService;
|
||||
import com.chanko.yunxi.mes.module.heli.service.storagelog.StorageLogService;
|
||||
@ -65,6 +66,9 @@ public class MaterialServiceImpl implements MaterialService {
|
||||
@Resource
|
||||
private StorageInventoryMapper storageInventoryMapper;
|
||||
|
||||
@Resource
|
||||
private MatCodeService matCodeService;
|
||||
|
||||
|
||||
@PostConstruct
|
||||
public void init(){
|
||||
@ -131,6 +135,7 @@ public class MaterialServiceImpl implements MaterialService {
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Override
|
||||
public void updateMaterial(MaterialSaveReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
@ -140,6 +145,8 @@ public class MaterialServiceImpl implements MaterialService {
|
||||
// 重复性判断
|
||||
validateMaterialRepeat(updateObj.getCode(), updateReqVO.getId());
|
||||
materialMapper.updateById(updateObj);
|
||||
// 更新物料大类最大流水
|
||||
matCodeService.updateCurMaxSeq(updateObj.getMatCate());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -8,8 +8,8 @@
|
||||
label-width="180px"
|
||||
v-loading="formLoading"
|
||||
>
|
||||
<el-form-item label="物料大类" prop="matCatCode">
|
||||
<el-select v-model="formData.matCatCode" clearable placeholder="请选择物料大类" @change="handleMatCatChange" >
|
||||
<el-form-item label="物料大类" prop="matTypeCode">
|
||||
<el-select v-model="formData.matTypeCode" clearable placeholder="请选择物料大类" @change="handleMatCatChange" >
|
||||
<el-option
|
||||
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_MATERIAL_CODE)"
|
||||
:key="dict.value"
|
||||
@ -18,11 +18,12 @@
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="物料分类编码" prop="matTypeCode" >
|
||||
<el-input v-model="formData.matTypeCode" placeholder="请输入物料分类编码" maxlength="10" show-word-limit/>
|
||||
<el-input v-model="formData.matTypeCode" placeholder="请输入物料分类编码" show-word-limit disabled/>
|
||||
</el-form-item>
|
||||
<el-form-item label="最大流水号" prop="curMaxSeq" >
|
||||
<el-input v-model="formData.curMaxSeq" placeholder="请输入当前最大流水号" maxlength="5" show-word-limit/>
|
||||
<el-input v-model="formData.curMaxSeq" placeholder="请输入当前最大流水号" maxlength="6" show-word-limit/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-radio-group v-model="formData.status">
|
||||
@ -38,6 +39,7 @@
|
||||
</Dialog>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { nextTick } from 'vue'
|
||||
import * as MatCodeApi from '@/api/heli/matcode'
|
||||
import {DICT_TYPE, getStrDictOptions} from "@/utils/dict";
|
||||
|
||||
@ -64,7 +66,28 @@ const formRules = reactive({
|
||||
],
|
||||
curMaxSeq: [
|
||||
{ required: true, message: '最大流水号不能为空', trigger: 'blur' },
|
||||
{ max: 5, message: '最大流水号最多5个字符', trigger: 'blur' }
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
if (value === '' || value === null || value === undefined) {
|
||||
callback()
|
||||
return
|
||||
}
|
||||
// 验证只能输入数字
|
||||
if (!/^\d+$/.test(value)) {
|
||||
callback(new Error('最大流水号只能输入数字'))
|
||||
return
|
||||
}
|
||||
// 验证:最大流水号长度 + 物料分类编码长度 = 8
|
||||
const matTypeCode = formData.value.matTypeCode || ''
|
||||
const curMaxSeqStr = String(value)
|
||||
if (matTypeCode.length + curMaxSeqStr.length !== 8) {
|
||||
callback(new Error('最大流水号格式不正确!'))
|
||||
return
|
||||
}
|
||||
callback()
|
||||
},
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }],
|
||||
})
|
||||
@ -116,7 +139,6 @@ const submitForm = async () => {
|
||||
const resetForm = () => {
|
||||
formData.value = {
|
||||
id: undefined,
|
||||
matCatCode: undefined,
|
||||
matCatName: undefined,
|
||||
matTypeCode: undefined,
|
||||
curMaxSeq: undefined,
|
||||
@ -134,8 +156,12 @@ const handleMatCatChange = (value) => {
|
||||
const dictOptions = getStrDictOptions(DICT_TYPE.HELI_MATERIAL_CODE)
|
||||
const selected = dictOptions.find(dict => dict.value === value)
|
||||
if (selected) {
|
||||
formData.value.matCatCode = selected.value
|
||||
formData.value.matTypeCode = selected.value
|
||||
formData.value.matCatName = selected.label
|
||||
}
|
||||
// 重新验证最大流水号
|
||||
nextTick(() => {
|
||||
formRef.value?.validateField('curMaxSeq')
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -8,8 +8,8 @@
|
||||
:inline="true"
|
||||
label-width="90px"
|
||||
>
|
||||
<el-form-item label="物料大类" prop="matCatCode">
|
||||
<el-select v-model="queryParams.matCatCode" clearable placeholder="请选择物料大类" class="!w-250px">
|
||||
<el-form-item label="物料大类" prop="matTypeCode">
|
||||
<el-select v-model="queryParams.matTypeCode" clearable placeholder="请选择物料大类" class="!w-250px">
|
||||
<el-option
|
||||
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_MATERIAL_CODE)"
|
||||
:key="dict.value"
|
||||
@ -49,7 +49,6 @@
|
||||
<ContentWrap>
|
||||
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||
<el-table-column label="序号" type="index" align="center" width="60px"/>
|
||||
<el-table-column label="物料大类编码" align="center" prop="matCatCode" />
|
||||
<el-table-column label="物料大类名称" align="center" prop="matCatName" />
|
||||
<el-table-column label="物料分类编码" align="center" prop="matTypeCode" />
|
||||
<el-table-column label="当前最大流水号" align="center" prop="curMaxSeq" />
|
||||
@ -78,14 +77,7 @@
|
||||
>
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
link
|
||||
type="danger"
|
||||
@click="handleDelete(scope.row.id)"
|
||||
v-hasPermi="['heli:mat-code:delete']"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@ -120,7 +112,6 @@ const total = ref(0) // 列表的总页数
|
||||
const queryParams = reactive({
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
matCatCode: undefined,
|
||||
matCatName: undefined,
|
||||
matTypeCode: undefined,
|
||||
curMaxSeq: undefined,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user