9、排班规则

2020-05-09  本文已影响0人  wqjcarnation

目标

需求整理

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

流程上分两步
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());
            }
        }
上一篇 下一篇

猜你喜欢

热点阅读