美文网首页
9、排班规则

9、排班规则

作者: wqjcarnation | 来源:发表于2020-05-09 09:28 被阅读0次

目标

  • 需求整理

需求整理

医生门诊排班信息
临床科室参与排班(*)
医技科室不参与排班

流程上分两步
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扩展

image.png

执行流程:
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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</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+"&regLid="+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);

执行效果:

image.png

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());
            }
        }

相关文章

  • 9、排班规则

    目标 需求整理 需求整理 医生门诊排班信息临床科室参与排班(*)医技科室不参与排班 流程上分两步1、设置排班规则时...

  • 12、医生排班

    目标 查询医生排班 新增排班规则 生成排班计划 重要知识 批量添加 查询医生排班 页面 1、查询医生排班前台Sch...

  • Drools规则引擎介绍

    目录 1. 排班中遇到的烦恼 2. 规则引擎介绍 3. 解决排班中的烦恼 4. drools应用扩展 排班中遇到的...

  • 10、根据规则生成排班

    表名: Scheduling(排班表) 前台 0、整合两个功能为一个页 1、SchedulingMgr.vue中增...

  • 4🈷️9号楼面排班

    早班:王爱荣、魏冬丽、郑玉丽、马文娟、安沙沙、张彩萍、李龙、孙虎宾、段友强。 晚班:赵小萍,李倩文。 休假人员...

  • SpringBoot入门建站全系列(三十四)使用Drools规则

    SpringBoot入门建站全系列(三十四)使用Drools规则引擎做排班系统 一、概述 Drools 是用 Ja...

  • 排班

    国庆的前三天,我全天待在家里涂涂写写,捣实捣实,不知不觉就这么浑浑噩噩的过去了。为啥我这三天不出去溜达溜达呢?因为...

  • 排班

    这边的护理员多多少少来干这个工作,都是因为金钱的压力比较大,今天早上就听到,护理员在那里诉说着什么? 一听说又是排...

  • 排班

    【本故事纯属虚构,如有雷同,纯属巧合,请勿对号入座!】 A队“一把手”王小波出差已经第三天了,这几天,队里...

  • 团队构建-团建5-难管人员 2017-11-27

    一:一起规则的制定 上月发生一事,仓库遇到了没有排班规则能够处理的情况,于是仓管和工人僵在那里,含谁都不敢去。差点...

网友评论

      本文标题:9、排班规则

      本文链接:https://www.haomeiwen.com/subject/addhnhtx.html