目标
- 需求整理
需求整理
医生门诊排班信息
临床科室参与排班(*)
医技科室不参与排班
流程上分两步
1、设置排班规则
时间:周1-7 分上下午(14个节点)
人物:选定临床科室 挂号级别 --->医生
限制条件 :普通号30 专家号 20
规则名称:
存储到:排班规则表
**为每一个选中的医生生成一条记录
记录中的星期以下列格式进行存储14位字符串
11111011111111
11111111110000
2、根据规则生成排班计划(个人独立完成,自由发挥,最后选择优)
输入条件:选择时间段 选择排班规则
王秋菊 5.1-5.6 星期规则:11 11 10 11 11 11 11
输出条件:
5.1 ---》计算他是星期几(5)--》1 1
王秋菊 2020-05-01 上午
王秋菊 2020-05-01 下午
(科室id) 医生id 日期 上午/下午 (规则id)
难点:
1、规则页面 (批量选择人和星期 批量新增加到规则表里)
2、根据日期推算星期几
3、每一天 给定星期几 ,如何截取14位的串的指定部分
关键技术
table扩展

执行流程:
1、科室和挂号级别选定后,执行查询----》更新tableData
tableData里的x0-x13与界面上的x0-x13进行绑定
2、填写规则名称,选中每行checkbox 点击保存 multipleSelection(所有被选中的行的数据)
循环multipleSelection的每行的x0-x13拼成14位的串
静态代码样例
<template>
<div>
<el-form :model="form" ref="form" label-width="100px">
<el-row>
<el-col :span="5"> </el-col>
<el-col :span="5">
<el-form-item label="所在科室" prop="deptID">
<!--科室下拉列表-->
<el-select size="mini" v-model="form.deptID">
<!--[{"id":1,"deptCode":"XXGNK","deptName":"心血管内科","deptCategoryId":"402880ed71ecf9f30171ecff858d0000","deptType":1}]-->
<el-option v-for="item in deptOptions" :key="item.id" :value="item.id" :label="item.deptName"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="挂号级别" prop="registLeID" >
<!--挂号级别下拉 -->
<el-select v-model="form.registLeID" size="mini">
<el-option v-for="item in registLevelOptions" :key="item.id" :value="item.id" :label="item.registName"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="5" >
<el-form-item>
<el-button type="primary" @click="submitForm('form')" size="mini">查询</el-button>
<el-button @click="resetForm('form')" size="mini">重置</el-button>
</el-form-item>
</el-col>
<el-col :span="4"> </el-col>
</el-row>
<el-row>
<el-col :span="24" >
<el-table
ref="multipleTable"
:data="tableData"
height="250"
border
style="width: 100%"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" @selection-change="handleSelectionChange"></el-table-column>
<el-table-column
label="医生"
width="70" prop="userName">
</el-table-column>
<el-table-column
label="1"
width="70">
<template slot-scope="scope">
<!-- table[i].x0-->
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x0"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="2"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x1"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="3"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x2"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="3"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x3"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="4"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x4"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="5"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x5"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="6"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x6"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="7"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x7"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="7"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x8"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="7"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x9"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="7"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x10"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="7"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x11"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="7"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x12"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="14"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x13"></el-checkbox>
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
规则名称:
<el-input size="mini" placeholder="规则名称" v-model="form.gzmc" align="left" style="width:120px"></el-input>
<br>
<el-button type="primary" @click="gzSave()">保存</el-button>
<!-- <el-button @click="resetForm('form')">清空</el-button> -->
</el-form>
</div>
</template>
<script>
export default {
data() {
return {
registLevelOptions: [], //挂号级别下拉数据
multipleSelection: [],
deptOptions: [],
tableData:[{userId:1,userName:'张三',x0:0,x1:0,x2:0,x3:0,x4:0,x5:0,x6:0,x7:0,x8:0,x9:0,x10:0,x11:0,x12:0,x13:0},
{userId:2,userName:'李四',x0:0,x1:0,x2:0,x3:0,x4:0,x5:0,x6:0,x7:0,x8:0,x9:0,x10:0,x11:0,x12:0,x13:0}
],
form: {
gzmc:'',
registLeID:'',
deptID:''
}
}
},
mounted() {
//查询部门信息,下拉列表用
this.$axios.get("http://localhost:8080/department/findAll")
.then(response => {
this.deptOptions = response.data;
})
this.registLevelfindRegistLevel();
},
methods: {
registLevelfindRegistLevel() {
this.$axios.get("http://localhost:8080/registLevel/findRegistLevel")
.then(response => {
this.registLevelOptions = response.data;
})
},
handleSelectionChange(val) {
this.multipleSelection=val;
},
gzSave() {
alert(this.form.deptID);
//selItems是对象数组{}
let selItems=this.multipleSelection;//选中的排班人员
console.log("选中的行:",selItems)
for(var i=0;i<selItems.length;i++){
console.log("循环到的userid",selItems[i].userId);
console.log("循环到的checkList",""+selItems[i].x0+selItems[i].x1+selItems[i].x2+selItems[i].x3+selItems[i].x4+selItems[i].x5+selItems[i].x6+selItems[i].x7+selItems[i].x8+selItems[i].x9+selItems[i].x10+selItems[i].x11+selItems[i].x12+selItems[i].x13);
//未来存储再想办法
}
}
,
getDeptId(deptid){
//alert("父类收到的id"+deptid);
this.form.deptID=deptid;
}
}
}
</script>
<style>
</style>
开发排班规则功能
step 1:根据科室和挂号级别查询排班医生
<template>
<div>
<el-form :model="form" ref="form" label-width="100px">
<el-row>
<el-col :span="5"> </el-col>
<el-col :span="5">
<el-form-item label="所在科室" prop="deptID">
<!--科室下拉列表-->
<el-select size="mini" v-model="form.deptID">
<!--[{"id":1,"deptCode":"XXGNK","deptName":"心血管内科","deptCategoryId":"402880ed71ecf9f30171ecff858d0000","deptType":1}]-->
<el-option v-for="item in deptOptions" :key="item.id" :value="item.id" :label="item.deptName"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="挂号级别" prop="registLeID" >
<!--挂号级别下拉 -->
<el-select v-model="form.registLeID" size="mini">
<el-option v-for="item in registLevelOptions" :key="item.id" :value="item.id" :label="item.registName"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="5" >
<el-form-item>
<el-button type="primary" @click="submitForm('form')" size="mini">查询</el-button>
<el-button @click="resetForm('form')" size="mini">重置</el-button>
</el-form-item>
</el-col>
<el-col :span="4"> </el-col>
</el-row>
<el-row>
<el-col :span="24" >
<el-table
ref="multipleTable"
:data="tableData"
height="250"
border
style="width: 100%"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" @selection-change="handleSelectionChange"></el-table-column>
<el-table-column
label="医生"
width="70" prop="realName">
</el-table-column>
<el-table-column
label="1"
width="70">
<template slot-scope="scope">
<!-- table[i].x0-->
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x0"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="2"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x1"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="3"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x2"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="3"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x3"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="4"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x4"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="5"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x5"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="6"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x6"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="7"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x7"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="7"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x8"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="7"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x9"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="7"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x10"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="7"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x11"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="7"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x12"></el-checkbox>
</template>
</el-table-column>
<el-table-column
label="14"
width="70">
<template slot-scope="scope">
<el-checkbox true-label="1" false-label="0" v-model="tableData[scope.$index].x13"></el-checkbox>
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
规则名称:
<el-input size="mini" placeholder="规则名称" v-model="form.gzmc" align="left" style="width:120px"></el-input>
<br>
<el-button type="primary" @click="gzSave()">保存</el-button>
<!-- <el-button @click="resetForm('form')">清空</el-button> -->
</el-form>
</div>
</template>
<script>
export default {
data() {
return {
registLevelOptions: [], //挂号级别下拉数据
multipleSelection: [],
deptOptions: [],
tableData:[],
form: {
gzmc:'',
registLeID:'',
deptID:''
}
}
},
mounted() {
//查询部门信息,下拉列表用
this.$axios.get("http://localhost:8080/department/findAll")
.then(response => {
this.deptOptions = response.data;
})
this.registLevelfindRegistLevel();
},
methods: {
registLevelfindRegistLevel() {
this.$axios.get("http://localhost:8080/registLevel/findRegistLevel")
.then(response => {
this.registLevelOptions = response.data;
})
},
handleSelectionChange(val) {
this.multipleSelection=val;
},
gzSave() {
alert(this.form.deptID);
//selItems是对象数组{}
let selItems=this.multipleSelection;//选中的排班人员
console.log("选中的行:",selItems)
for(var i=0;i<selItems.length;i++){
console.log("循环到的userid",selItems[i].userId);
console.log("循环到的checkList",""+selItems[i].x0+selItems[i].x1+selItems[i].x2+selItems[i].x3+selItems[i].x4+selItems[i].x5+selItems[i].x6+selItems[i].x7+selItems[i].x8+selItems[i].x9+selItems[i].x10+selItems[i].x11+selItems[i].x12+selItems[i].x13);
//未来存储再想办法
}
}
,
getDeptId(deptid){
//alert("父类收到的id"+deptid);
this.form.deptID=deptid;
}
,
submitForm(form){
//alert("submit");
this.$axios.get("http://localhost:8080/user/findUserByDeptAndLid?deptid="+this.form.deptID+"®Lid="+this.form.registLeID)
.then(response=>{
this.tableData=response.data;
})
}
}
}
</script>
<style>
</style>
@RequestMapping("findUserByDeptAndLid")
public List<Map<String,Object>> findUserByDeptAndLid(String deptid,String regLid) {
List<Map<String,Object>> userlist = userService.findUserByDeptAndLid(deptid,regLid);
return userlist;
}
@Query(value=" select a.*, "+
" '0' as x0, "+
" '0' as x1, "+
" '0' as x2, "+
" '0' as x3, "+
" '0' as x4, "+
" '0' as x5, "+
" '0' as x6, "+
" '0' as x7, "+
" '0'as x8, "+
" '0' as x9, "+
" '0' as x10, "+
" '0' as x11, "+
" '0' as x12, "+
" '0' as x13 "+
" from t_user a "+
" where a.deptID=?1 "+
" and a.registLeID=?2"+
" and a.isScheduling=1",nativeQuery=true)
List<Map<String, Object>> findUserByDeptAndLid(String deptid, String regLid);
执行效果:

step 2:填写规则名称,并将排班规则批量入库
思路定义一个数组,放多个规则对象(第行产生一个对象)
data() {
return {
registLevelOptions: [], //挂号级别下拉数据
multipleSelection: [],
deptOptions: [],
tableData:[],
gzArray:[],//step1定义一个数组,用于存放多条规则对象
form: {
gzmc:'',
registLeID:'',
deptID:''
}
}
}
gzSave() {
//step2 每次先清空这个规则数组,防止无限累加
this.gzArray=[];
console.log("form:",this.form);
//selItems是对象数组{}
let selItems=this.multipleSelection;//选中的排班人员
console.log("选中的行:",selItems)
for(var i=0;i<selItems.length;i++){
console.log("循环到的userid",selItems[i].id);
console.log("循环到的checkList",""+selItems[i].x0+selItems[i].x1+selItems[i].x2+selItems[i].x3+selItems[i].x4+selItems[i].x5+selItems[i].x6+selItems[i].x7+selItems[i].x8+selItems[i].x9+selItems[i].x10+selItems[i].x11+selItems[i].x12+selItems[i].x13);
let weekStr=""+selItems[i].x0+selItems[i].x1+selItems[i].x2+selItems[i].x3+selItems[i].x4+selItems[i].x5+selItems[i].x6+selItems[i].x7+selItems[i].x8+selItems[i].x9+selItems[i].x10+selItems[i].x11+selItems[i].x12+selItems[i].x13;
//未来存储再想办法
this.gzArray.push({ruleName:this.form.gzmc,deptID:this.form.deptID,userID:selItems[i].id,week:weekStr});
}
this.$axios.post("http://localhost:8080/rule/addRule",{rules:this.gzArray})
.then(response=>{
this.$message.info(response.data);
})
.catch()
}
@RestController
@RequestMapping("rule")
public class RuleController {
@RequestMapping("addRule")
public String addRule(@RequestBody RulesVo vo){
System.out.println(vo.getRules());
return "success";
}
}
public class RulesVo {
private List<Rule> rules;
public List<Rule> getRules() {
return rules;
}
public void setRules(List<Rule> rules) {
this.rules = rules;
}
}
@Entity
@Table(name = "t_rule")
@GenericGenerator(name = "jpa-uuid", strategy = "uuid")
public class Rule {
@Id
@GeneratedValue(generator = "jpa-uuid")
@Column(name = "id", nullable = false, length = 32)
private String id;
@Column(name = "ruleName", nullable = false, length = 64)
private String ruleName;
private int deptID;
@Column(name = "userID", nullable = false, length = 32)
private String userID;
@Column(name = "week", nullable = false, length = 14)
private String week;
private int delMark=1;
....此处省略get/set
}
学生练习:上面的程序,并把入库补充完整
规则入库
@RequestMapping("addRule")
public String addRule(@RequestBody RulesVo vo){
System.out.println(vo.getRules());
//排班规则在vo.rules
System.out.println("得到的数据为"+vo.getRules());
List<Rule> rules=vo.getRules();
try {
//后台将来做批量添加,注意事务控制
ruleService.addRule(rules);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "保存失败";
}
return "保存成功";
}
@Service
@Transactional(rollbackOn = { RuntimeException.class, Exception.class })
public class RuleService implements IRuleService {
@Autowired
IRuleRepository ruleRepository;
@Autowired
ISchedulingRepository schedulingRepository;
@Override
public void addRule(List<Rule> rules) throws Exception {
try {
for (Rule rule : rules) {
ruleRepository.save(rule);
}
} catch (Exception e) {
throw new Exception(e.getMessage());
}
}
网友评论