人才培养方案新增自动生成代号,代码
This commit is contained in:
@@ -29,4 +29,9 @@ public interface ZYBMapper extends BaseMapper<ZYB> {
|
||||
* @return 分页对象
|
||||
*/
|
||||
Page<ZYB> selectPageList(Page<ZYB> page, @Param("zyb") ZYB zyb);
|
||||
|
||||
/**
|
||||
* 当前最大序号标识,用于新增时排到列表最前且顺序连续。
|
||||
*/
|
||||
Integer selectMaxXhbs();
|
||||
}
|
||||
|
||||
@@ -50,8 +50,8 @@
|
||||
<include refid="Base_Column_List" />
|
||||
FROM "专业表"
|
||||
WHERE 1=1
|
||||
<if test="zyb.ty != null and zyb.ty != ''">
|
||||
AND 停用 = #{zyb.ty},
|
||||
<if test="zyb.ty != null">
|
||||
AND 停用 = #{zyb.ty}
|
||||
</if>
|
||||
<if test="zyb.zymc != null and zyb.zymc != ''">
|
||||
AND 专业名称 LIKE CONCAT('%', #{zyb.zymc}, '%')
|
||||
@@ -68,7 +68,11 @@
|
||||
<if test="zyb.zyfx != null and zyb.zyfx != ''">
|
||||
AND 专业方向 LIKE CONCAT('%', #{zyb.zyfx}, '%')
|
||||
</if>
|
||||
ORDER BY 序号标识
|
||||
ORDER BY 序号标识 DESC NULLS LAST, 启用时间 DESC NULLS LAST
|
||||
</select>
|
||||
|
||||
<select id="selectMaxXhbs" resultType="java.lang.Integer">
|
||||
SELECT MAX("序号标识") FROM "专业表"
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
||||
@@ -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: '',
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user