人才培养方案新增自动生成代号,代码

This commit is contained in:
2026-09-16 11:04:18 +08:00
parent bbf54c26a3
commit 490e1845f6
5 changed files with 104 additions and 13 deletions
+2 -2
View File
@@ -6,8 +6,8 @@ import request from '@/utils/request'
/**
* 新增培养方案(专业)
* POST /training/add
* 请求体(ZYB):zydh/zymc/zydm/pxcc/pxlx 必填;
* 主键 zydh 需手动传入(留空时后端自动生成 UUID,后端同时置 ty=false、qysj=当前时间
* 请求体(ZYB):zymc/pxcc/pxlx 必填;
* zydh 留空时按 ZYSEED01 规则生成;zydm 留空时按 ZSY001 规则生成;后端同时置 ty=false、qysj=当前时间
*/
export function addTraining(data) {
return request({
@@ -151,6 +151,16 @@
<el-input v-model="dialog.form.zymc" placeholder="请输入专业名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="专业代号">
<el-input v-model="dialog.form.zydh" :disabled="dialog.isEdit" placeholder="可留空,自动生成如 ZYSEED01" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="专业代码">
<el-input v-model="dialog.form.zydm" placeholder="可留空,自动生成如 ZSY001" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="专业方向">
<el-select
@@ -227,13 +237,13 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学年制">
<el-input v-model="dialog.form.xnz" placeholder="请输入学年制" />
<el-form-item label="学年制" prop="xnz">
<el-input v-model="dialog.form.xnz" placeholder="请输入学年制,如 4" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学期数">
<el-input-number v-model="dialog.form.xqs" :min="1" :max="20" controls-position="right" class="w-full" />
<el-form-item label="学期数" prop="xqs">
<el-input-number v-model="dialog.form.xqs" :min="1" :max="20" controls-position="right" class="w-full" @change="onXqsChange" />
</el-form-item>
</el-col>
<el-col :span="12">
@@ -407,7 +417,9 @@ export default {
rules: {
zymc: [{ required: true, message: '请输入专业名称', trigger: 'blur' }],
pxcc: [{ required: true, message: '请选择培训层次', trigger: 'change' }],
pxlx: [{ required: true, message: '请选择培训类型', trigger: 'change' }]
pxlx: [{ required: true, message: '请选择培训类型', trigger: 'change' }],
xnz: [{ required: true, message: '请输入学年制', trigger: 'blur' }],
xqs: [{ required: true, message: '请输入学期数', trigger: 'change' }]
}
}
},
@@ -536,6 +548,7 @@ export default {
this.dialog.title = '新建人才培养方案'
this.dialog.isEdit = false
this.dialog.form = this.createEmptyForm()
this.fillGeneratedCodes(this.dialog.form, this.tableData)
this.dialog.visible = true
this.$nextTick(() => {
if (this.$refs.trainingForm) this.$refs.trainingForm.clearValidate()
@@ -554,8 +567,8 @@ export default {
this.$refs.trainingForm.validate(valid => {
if (!valid) return
this.dialog.submitting = true
const payload = this.cleanPayload(this.dialog.form)
const isEdit = this.dialog.isEdit
const payload = this.cleanPayload(this.applyNotNullDefaults(this.dialog.form, isEdit))
const req = isEdit ? updateTraining(payload) : addTraining(payload)
req.then(() => {
this.$message.success(isEdit ? '修改成功' : '新增成功')
@@ -632,6 +645,75 @@ export default {
},
/* ---------- 工具 ---------- */
onXqsChange(xqs) {
if (!this.dialog.form.xnz && xqs) {
this.dialog.form.xnz = String(Math.max(1, Math.round(xqs / 2)))
}
},
/** 达梦非空列必须带真实值,空串会被当成 NULL;提交前补默认值。 */
applyNotNullDefaults(form, isEdit) {
const payload = Object.assign({}, form)
if (!isEdit) {
this.fillGeneratedCodes(payload, this.tableData)
}
if (!payload.xnz && payload.xqs) {
payload.xnz = String(Math.max(1, Math.round(payload.xqs / 2)))
}
if (!payload.xnz) {
payload.xnz = '4'
}
if (payload.xqs == null) {
payload.xqs = Number(payload.xnz) * 2 || 8
}
const name = payload.zymc || '-'
payload.gfmc = payload.gfmc || name
payload.zybsh = payload.zybsh || payload.zydh
payload.jc = payload.jc || name
payload.zyfx = payload.zyfx || '-'
payload.zybb = payload.zybb || '-'
payload.pxlx2 = payload.pxlx2 || '其他'
payload.xylb = payload.xylb || '其他'
payload.jclb = payload.jclb || '双节次'
payload.xtms = payload.xtms || '军校模式'
if (payload.zgzy !== true) {
payload.zgzy = false
}
return payload
},
fillGeneratedCodes(target, records) {
if (!target.zydh) {
target.zydh = this.nextSerialFrom(records, 'zydh', 'ZYSEED', 2)
}
if (!target.zydm) {
target.zydm = this.nextSerialFrom(records, 'zydm', 'ZSY', 3)
}
},
nextSerialFrom(records, field, prefix, width) {
let max = 0
const used = new Set()
;(records || []).forEach(row => {
const code = row && row[field]
if (!code) {
return
}
const text = String(code)
used.add(text)
if (text.indexOf(prefix) !== 0) {
return
}
const digits = text.slice(prefix.length)
if (/^\d+$/.test(digits)) {
max = Math.max(max, parseInt(digits, 10))
}
})
for (let seq = max + 1; seq <= max + 500; seq++) {
const candidate = prefix + String(seq).padStart(width, '0')
if (!used.has(candidate)) {
return candidate
}
}
return prefix + String(max + 1).padStart(width, '0')
},
createEmptyForm() {
return {
zydh: '',
+2 -2
View File
@@ -9,9 +9,9 @@ const CompressionPlugin = require('compression-webpack-plugin')
const name = process.env.VUE_APP_TITLE || '教学管理信息系统' // 网页标题
const baseUrl = 'http://127.10.0.193:8080' // 后端接口
const baseUrl = 'http://10.1.1.193:8080' // 后端接口
const port = 80 // 固定开发服务器端口,避免多实例端口混乱
const port = 1024 // 固定开发服务器端口,避免多实例端口混乱
// vue.config.js 配置说明
//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions