From 490e1845f6cde3888ec9a6a10c2ae141a4b85ab0 Mon Sep 17 00:00:00 2001 From: zhaichao Date: Wed, 16 Sep 2026 11:04:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=BA=E6=89=8D=E5=9F=B9=E5=85=BB=E6=96=B9?= =?UTF-8?q?=E6=A1=88=E6=96=B0=E5=A2=9E=E8=87=AA=E5=8A=A8=E7=94=9F=E6=88=90?= =?UTF-8?q?=E4=BB=A3=E5=8F=B7=EF=BC=8C=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/roomroot/jwgl/mapper/ZYBMapper.java | 5 + .../com/roomroot/jwgl/mapper/ZYBMapper.xml | 10 +- frontend/src/api/teachBusiness/training.js | 4 +- .../teachBusiness/trainingPlan/index.vue | 94 +++++++++++++++++-- frontend/vue.config.js | 4 +- 5 files changed, 104 insertions(+), 13 deletions(-) diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/ZYBMapper.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/ZYBMapper.java index 2c09d78f..2cabd138 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/ZYBMapper.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/ZYBMapper.java @@ -29,4 +29,9 @@ public interface ZYBMapper extends BaseMapper { * @return 分页对象 */ Page selectPageList(Page page, @Param("zyb") ZYB zyb); + + /** + * 当前最大序号标识,用于新增时排到列表最前且顺序连续。 + */ + Integer selectMaxXhbs(); } diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/ZYBMapper.xml b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/ZYBMapper.xml index 63480254..1e4bec2f 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/ZYBMapper.xml +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/ZYBMapper.xml @@ -50,8 +50,8 @@ FROM "专业表" WHERE 1=1 - - AND 停用 = #{zyb.ty}, + + AND 停用 = #{zyb.ty} AND 专业名称 LIKE CONCAT('%', #{zyb.zymc}, '%') @@ -68,7 +68,11 @@ AND 专业方向 LIKE CONCAT('%', #{zyb.zyfx}, '%') - ORDER BY 序号标识 + ORDER BY 序号标识 DESC NULLS LAST, 启用时间 DESC NULLS LAST + + + diff --git a/frontend/src/api/teachBusiness/training.js b/frontend/src/api/teachBusiness/training.js index 9ef78173..3bf5be02 100644 --- a/frontend/src/api/teachBusiness/training.js +++ b/frontend/src/api/teachBusiness/training.js @@ -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({ diff --git a/frontend/src/views/teachBusiness/trainingPlan/index.vue b/frontend/src/views/teachBusiness/trainingPlan/index.vue index 7ccb0ebf..e8e1bd9b 100644 --- a/frontend/src/views/teachBusiness/trainingPlan/index.vue +++ b/frontend/src/views/teachBusiness/trainingPlan/index.vue @@ -151,6 +151,16 @@ + + + + + + + + + + - - + + - - + + @@ -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: '', diff --git a/frontend/vue.config.js b/frontend/vue.config.js index dc91ec3d..047ea0fa 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -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