车辆管理编号功能

This commit is contained in:
XaoLi717 2025-01-06 08:24:35 +08:00
parent 4d09f9d0dc
commit 858111c596
2 changed files with 353 additions and 2 deletions

View File

@ -24,6 +24,32 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="编号选择" >
<el-select
v-model="formData.numberType"
placeholder="请选择是否启用编号"
@change="getNumberByType()"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.OA_NUMBERS_NUM)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" v-if="formData.numberType != 2">
<el-form-item
prop="serialNumber"
:label="formData.numberType == 0 ? '流水号' : '文号'"
>
{{ formData.serialNumber }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="标题" prop="title">
<el-input v-model="formData.title" placeholder="请输入标题" />
</el-form-item>
@ -146,6 +172,39 @@
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="saveDraft" type="warning" :disabled="draftButton">存为草稿</el-button>
<el-popover :visible="visible" placement="top" :width="300" trigger="click">
<template #reference>
<el-button
v-if="formData.numberType == 1&&OpenNumber&&total>1"
type="success"
@click="visible=true"
>
选择文号
</el-button>
</template>
<el-table
:data="ListNumber"
highlight-current-row
:height="150"
@current-change="handleCurrentChange"
>
<el-table-column width="60" label="序号" align="center" type="index" />
<el-table-column label="文号" >
<template #default="scope">
{{
(scope.row.fastCode || "") + (scope.row.fastBrackets || "") + (scope.row.year || "") +
((scope.row.month != null&&scope.row.month!=0) ? scope.row.month.toString().padStart(2,"0") : "") +
((scope.row.lastBrackets) || "") +
((scope.row.docOrder || "").toString().padStart(scope.row.lengthSelection,"0")) +
(scope.row.lastCode || "")
}}
</template>
</el-table-column>
</el-table>
<div style="text-align: right;padding-top: 5px" >
<el-button type="primary" @click="visible=false">确定</el-button>
</div>
</el-popover>
</template>
</el-card>
<SelectCarForm ref="selectRef" @success="changeForm"/>
@ -162,7 +221,7 @@ import {FormProcessMappingApi} from "@/api/bpm/formprocessmapping";
import SelectCarForm from "@/views/Home/clnr/carinfo/SelectCarForm.vue";
import SelectDriverForm from "@/views/Home/clnr/driver/SelectDriverForm.vue";
import {Edit} from "@element-plus/icons-vue";
import {numbersApi, numbersVO} from "@/api/home/numbers";
/** 车辆管理 表单 */
defineOptions({ name: 'ClglCreate' })
@ -191,6 +250,8 @@ const formData = ref({
carDriverInfo: undefined,
carMileage: undefined,
carStatus: undefined,
serialNumber: undefined as string | undefined,
numberType: undefined as number | undefined,
carReason: undefined,
carRemark: undefined,
})
@ -223,6 +284,17 @@ const formRules = reactive({
carAddress: [{ required: true, message: '目的地不能为空', trigger: 'blur' }],
carStatus: [{ required: true, message: '车辆状态不能为空', trigger: 'blur' }],
carReason: [{ required: true, message: '用车原因不能为空', trigger: 'blur' }],
numberType: [{ required: true, message: '编号类型不能为空', trigger: 'blur' }],
serialNumber: [{
required: true, message: '编号不能为空', trigger: 'blur',
validator: (rule, value, callback) => {
if (OpenNumber.value && !value) {
callback(new Error('编号不能为空'));
} else {
callback();
}
},
}],
})
const formRef = ref() // Ref
@ -312,7 +384,10 @@ const submitForm = async () => {
if ( processKey) {
data.processDefinitionKey = processKey
}
//
if (formData.value.numberType == 0 || (formData.value.numberType&&OpenNumber.value)) {
await numbersApi.updatenumbers(listNumbers.value)
}
await ClglApi.createClgl(data)
message.success(t('common.createSuccess'))
delView(unref(currentRoute))
@ -344,6 +419,98 @@ const getUserInfo = async () => {
userInfo.value = formData.value.carUserName
}
}
const listNumbers = ref(); //
const ListNumber = ref<numbersVO[]>([]) //
const total = ref(0) //
// vo
const queryParamsNumbers = reactive({
pageNo: 1,
pageSize: 10,
id: undefined,
fastCode: undefined,
fastBrackets: undefined,
year: undefined,
month: undefined,
lastBrackets: undefined,
docOrder: undefined,
lastCode: undefined,
enableMonth: undefined,
numbersType: undefined as number | undefined,
lengthSelection: undefined,
mappingData1: undefined as string | undefined ,
mappingData2: undefined,
annotation: undefined,
createTime: [],
})
const visible = ref(false) //
const OpenNumber = ref(false) //
//
const getNumberByType = async ()=> {
listNumbers.value = formData.value.serialNumber = undefined;
queryParamsNumbers.numbersType = formData.value.numberType
const data = await numbersApi.getnumbersPage(queryParamsNumbers)
// ,,
if (formData.value.numberType == 0) {
if (data.total == 0) {
message.error("找不到流水号数据!请配置流水号")
}
listNumbers.value = data.list[0]
await changeNumbers();
} else if (formData.value.numberType == 1&&OpenNumber.value) {
if (data.total == 0) {
message.error("找不到文号数据!请配置文号!")
}
total.value = data.total;
//,
if (data.total == 1 ) {
listNumbers.value = data.list[0]
await changeNumbers();
} else {
ListNumber.value = data.list;
}
}
}
//
const changeNumbers = async ()=> {
const currentYear = new Date().getFullYear();
const currentMonth = new Date().getMonth() + 1;
listNumbers.value.docOrder+=1
// ,
if (currentYear != listNumbers.value.year) {
listNumbers.value.year = currentYear;
listNumbers.value.docOrder = 1;
}
// , ,
if (currentMonth != listNumbers.value.month && listNumbers.value.month!==0) {
listNumbers.value.month = currentMonth;
listNumbers.value.docOrder = 1;
}
// 便使
const {fastCode, fastBrackets, year, month, lastBrackets, docOrder, lengthSelection, lastCode } = listNumbers.value
//
formData.value.serialNumber =
`${fastCode || ""}${fastBrackets || ""}${year || ""}`+
`${(month != null&&month!=0) ? month.toString().padStart(2,"0") : ""}`+
`${lastBrackets || ""}${(docOrder || "").toString().padStart(lengthSelection,"0")}${lastCode || ""}`;
}
//
const handleCurrentChange = async (val: any | undefined) => {
listNumbers.value = JSON.parse(JSON.stringify(val)); //
formData.value.serialNumber = undefined
await changeNumbers();
}
/** 初始化 */
onMounted(async () => {
await getUserInfo()
@ -360,6 +527,9 @@ onMounted(async () => {
draftButton.value= true
}
}
formData.value.numberType = 2;
queryParamsNumbers.mappingData1 = curFullPath;
await getNumberByType()
const processKey = await FormProcessMappingApi.selectProcessKey( curFullPath )

View File

@ -25,6 +25,33 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="编号选择" prop="numberType">
<el-select
v-model="formData.numberType"
placeholder="请选择是否启用编号"
@change="getNumberByType()"
:disabled="!isEditable('numberType')"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.OA_NUMBERS_NUM)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" v-if="formData.numberType != 2">
<el-form-item
prop="serialNumber"
:label="formData.numberType == 0 ? '流水号' : '文号'"
>
{{formData.serialNumber}}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="标题" prop="title">
<el-input v-model="formData.title" placeholder="请输入标题" :disabled="!isEditable('title')" />
</el-form-item>
@ -115,6 +142,41 @@
<el-input autosize v-model="formData.carRemark" type="textarea" placeholder="请输入备注" :disabled="!isEditable('carRemark')" />
</el-form-item>
</el-form>
<template #footer>
<!-- 数据多条时通过这个组件选择 -->
<el-popover :visible="visible" placement="top" :width="300" trigger="click">
<template #reference>
<el-button
v-if="formData.numberType == 1&&OpenNumber&&total>1"
type="success"
@click="visible=true"
>
选择文号
</el-button>
</template>
<el-table
:data="ListNumber"
highlight-current-row
@current-change="handleCurrentChange"
>
<el-table-column width="60" label="序号" align="center" type="index" />
<el-table-column label="文号" >
<template #default="scope">
{{
(scope.row.fastCode || "") + (scope.row.fastBrackets || "") + (scope.row.year || "") +
((scope.row.month != null&&scope.row.month!=0) ? scope.row.month.toString().padStart(2,"0") : "") +
((scope.row.lastBrackets) || "") +
((scope.row.docOrder || "").toString().padStart(scope.row.lengthSelection,"0")) +
(scope.row.lastCode || "")
}}
</template>
</el-table-column>
</el-table>
<div style="text-align: right;padding-top: 5px" >
<el-button type="primary" @click="visible=false">确定</el-button>
</div>
</el-popover>
</template>
</el-card>
</template>
<script setup lang="ts">
@ -124,6 +186,7 @@ import {propTypes} from "@/utils/propTypes";
import {getUserProfile} from "@/api/system/user/profile";
import * as TaskApi from "@/api/bpm/task";
import {useUserStore} from "@/store/modules/user";
import {numbersApi, numbersVO} from "@/api/home/numbers";
/** 车辆管理 表单 */
defineOptions({ name: 'ClglDetail' })
@ -153,12 +216,15 @@ const formData = ref({
carDriverInfo: undefined,
carMileage: undefined,
carStatus: undefined,
serialNumber: undefined as string | undefined,
numberType: undefined as number | undefined,
carReason: undefined,
carRemark: undefined,
})
//
const { query } = useRoute() //
const { currentRoute } = useRouter() //
const props = defineProps({
id: propTypes.number.def(undefined)
})
@ -228,6 +294,106 @@ const itemControl = async () => {
}
}
const listNumbers = ref(); //
const ListNumber = ref<numbersVO[]>([]) //
const total = ref(0) //
// vo
const queryParamsNumbers = reactive({
pageNo: 1,
pageSize: 10,
id: undefined,
fastCode: undefined,
fastBrackets: undefined,
year: undefined,
month: undefined,
lastBrackets: undefined,
docOrder: undefined,
lastCode: undefined,
enableMonth: undefined,
numbersType: undefined as number | undefined,
lengthSelection: undefined,
mappingData1: undefined as string | undefined,
mappingData2: undefined as string | undefined,
annotation: undefined,
createTime: [],
})
const visible = ref(false) //
const OpenNumber = ref(true) //
const message = useMessage() //
//
const getNumberByType = async ()=> {
listNumbers.value = formData.value.serialNumber = undefined;
// ,,
if (formData.value.numberType == 1&&OpenNumber.value) {
//
queryParamsNumbers.numbersType = formData.value.numberType
const data = await numbersApi.getnumbersPage(queryParamsNumbers)
if (data.total == 0) {
message.error("找不到文号数据!请配置文号")
}
total.value = data.total;
//,
if (data.total == 1 ) {
listNumbers.value = data.list[0]
await changeNumbers();
} else {
// ,,
ListNumber.value = data.list;
}
}
}
//
const changeNumbers = async ()=> {
const currentYear = new Date().getFullYear();
const currentMonth = new Date().getMonth() + 1;
listNumbers.value.docOrder+=1
// ,
if (currentYear != listNumbers.value.year) {
listNumbers.value.year = currentYear;
listNumbers.value.docOrder = 1;
}
// , ,
if (currentMonth != listNumbers.value.month&&listNumbers.value.month!==0) {
listNumbers.value.month = currentMonth;
listNumbers.value.docOrder = 1;
}
// 便使
const {fastCode, fastBrackets, year, month, lastBrackets, docOrder, lengthSelection, lastCode } = listNumbers.value
//
formData.value.serialNumber =
`${fastCode || ""}${fastBrackets || ""}${year || ""}`+
`${(month != null&&month!=0) ? month.toString().padStart(2,"0") : ""}`+
`${lastBrackets || ""}${(docOrder || "").toString().padStart(lengthSelection,"0")}${lastCode || ""}`;
}
//
const handleCurrentChange = async (val: any | undefined) => {
listNumbers.value = JSON.parse(JSON.stringify(val)); //
formData.value.serialNumber = undefined
await changeNumbers();
}
const numbersOpen = async ()=> {
//
if (!formData.value.serialNumber) {
let curFullPath = currentRoute.value.fullPath
//
if (curFullPath.includes("?")) {
curFullPath = curFullPath.split("?")[0];
}
queryParamsNumbers.mappingData2 = "/Home/clnr/clgl/ClglDetail"; //
await getNumberByType()
}
}
const editableFields = ref<string[]>([])
const isEditable = (field:string) => {
return editableFields.value.includes(field); // editableFields true
@ -239,6 +405,10 @@ const updateForm = async () => {
//
formLoading.value = true
try {
//
if (formData.value.numberType&&OpenNumber.value) {
await numbersApi.updatenumbers(listNumbers.value)
}
const data = formData.value as unknown as ClglVO
await ClglApi.updateClgl(data)
} finally {
@ -253,9 +423,20 @@ onMounted(async () => {
await getUserInfo()
await getInfo()
await itemControl()
await numbersOpen()
})
const formRules = reactive({
// carUser: [{ required: true, message: '', trigger: 'blur' }],
serialNumber: [{
required: true, message: '编号不能为空', trigger: 'blur',
validator: (rule, value, callback) => {
if (OpenNumber.value && !value) {
callback(new Error('编号不能为空'));
} else {
callback();
}
},
}],
})
const formRef = ref() // Ref