# police_dispatch **Repository Path**: zhangrongyu0101/police_dispatch ## Basic Information - **Project Name**: police_dispatch - **Description**: 调度引擎 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-07-26 - **Last Updated**: 2023-08-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # police_dispatch ## 项目需求 - 数据驾驶舱:可视化整个警察局的人力资源数据 - 警力调度:在满足约束条件的情况下实现警力的抽调 > 未来还需要考虑车辆的调度 ## 用户故事 - 例子:我们有一个维稳的任务要抽调十个人,但是我们在抽调之后不能影响到各个部门和派出所的正常工作,如部分人数不能过少,不能抽调走业务骨干等等。 - 例子:有一个外派的任务,地点在广东,我们在福建有警员力量,我们要优先抽调福建的警员。这是一个远距离的任务,但是这种距离的因素在威海市内就不必考虑。 - 例子:我们有一个警察有伤病,有警察酗酒,有警察已经要退休了,年龄比较大,我们在抽调的时候要考虑到不优先抽调这部分人。 - 作为警力调度系统管理员,当我进行警力调度时,如果发现警力不足,我希望系统能自动建议我调度那些即将结束休假的警员,以便我能更快地找到合适的警力。 - 作为警力调度系统管理员,我希望系统能记录并显示每个警员的值班时长和次数,以便我在进行警力调度时能充分考虑这些信息。 。 - 作为警力调度系统管理员,当我创建新的调度任务时,如果任务地点和时间与已有任务重合,我希望系统能提醒我,以便我能根据实际情况决定是否合并这些任务。 - 作为警力调度系统管理员,当我为办案任务选择警员时,我希望系统能自动推荐合适的警员,同时我也希望能有选项让我指定某个警员。 - 作为警力调度系统管理员,我希望能在系统中进行值班排班,并能进行增删改查操作。 - 作为警力调度系统的分局和派出所用户,我希望能有一个账号让我登录系统,并且能进行值班上报、修改、再次上报等操作,同时我希望分局端能看到我的上报并给出同意或驳回的意见。 ## 架构设计 - 优先级规则:例如"优先考虑离任务地点最近的警员","优先考虑技能匹配的警员"等。 - 限制规则:例如"每个部门的警力不能低于一定数量","不能抽调过多的高级警员"等。 - 特殊条件规则:例如"如果警员即将结束休假,可以考虑调度","如果警员即将出差到外地,需要提前通知"等。 ### 任务表 - 任务开始时间 - 任务结束时间 - 任务类型 - 任务地点 ### 每种类型的规则创建一个表 或者是每种任务一个规则表 - 优先级规则表:存储优先级规则的具体内容,可能包括规则ID,规则名称,规则描述等。 - 限制规则表:存储限制规则的具体内容,可能包括规则ID,规则名称,规则描述等。 > 每条规则有一个类型和一个表达式。例如,你可能有一个"AgeRule",其表达式为"age > 30"。这个表达式可以用Java的表达式语言(Expression Language,EL) - 特殊条件规则表:存储特殊条件规则的具体内容,可能包括规则ID,规则名称,规则描述等。 > 当你需要获取所有的规则时,你可以从每个表中查询规则,然后在程序中组合所有的规则。当你需要添加或修改规则时,你只需要在相应的表中进行操作。 ### 解析这些规则并把它们应用到警力调度中,需要一种灵活的方式,因为规则的数量和复杂性可能会变化。一种可能的方法是使用“规则引擎”。 规则引擎是一种软件系统,用于执行一组规则,并在给定的情况下输出决策。它通常被设计为可以处理复杂的规则和规则集。 加载规则:规则引擎从数据库中读取所有的规则,包括优先级规则、限制规则和特殊条件规则。 解析规则:规则引擎解析每条规则的内容,确定如何应用这些规则。这可能涉及到解析规则描述,或者如果规则被存储为代码或脚本,可能涉及到执行这些代码或脚本。 应用规则:规则引擎应用规则到警员信息上,产生调度决策。这可能涉及到对每个警员评分,或者对警员进行排名,或者其他决策方法。 输出决策:规则引擎输出调度决策,这可能是一个警员列表,按照优先级排序,或者是一个调度计划,指示每个警员的任务。 ## 规范文档 ### 命名规范 > ——请为今后维护你代码的人着想 > 评判标准:团队新成员是否能理解这个名字的含义 1. Java Spring Boot后端: - 类名:应使用大驼峰命名法,首字母大写,如UserService。 - 方法名:应使用小驼峰命名法,首字母小写,如getUserName()。 - 变量名:应使用小驼峰命名法,如firstName。 - 常量名:全部大写,单词之间用下划线分隔,如MAX_COUNT。 2. Vue 2前端: - 组件名:推荐使用大驼峰命名法,如UserComponent。 > 除了App组件外,其他组件都应该是多个单词的组合。 - 方法名:推荐使用小驼峰命名法,如getUserData()。 - 变量名:推荐使用小驼峰命名法,如userName。 3. MySQL数据库: - 数据库名、表名:全部小写,多个单词之间用下划线连接,如user_table。 - 字段名:全部小写,多个单词之间用下划线连接,如user_name。 ### 后端代码组织 在Java Spring Boot项目中,源码文件放在src/main/java/目录下。在com/后面,组织的名称SDU,然后是项目的名称。 在这个目录下,按照功能模块或者架构来组织代码。 - src/main/java/com/SDU/policedispatch/controller - 用于存放Controller类。 - src/main/java/com/SDU/policedispatch/service - 用于存放Service类。 - src/main/java/com/SDU/policedispatch/mapper - 用于存放DAO类。 - src/main/java/com/SDU/policedispatch/model - 用于存放实体(Entity)或模型(Model)类。 > 此结构不是强制性的,但是它是被广泛采用的一种Spring Boot项目的标准结构。 ## Todo List - 数据库已经更新成了MySQL - 算法部分:继续设计服务类 - 数据库部分:完成于数据库的后端交互mapping层 - UI部分: 开始编码 ## UI部分说明 ### 介绍 悄悄开源,应该没人看吧 ### 软件架构 "控制器-服务-仓库"模式。控制器负责处理HTTP请求,并调用服务层的方法来实现业务逻辑。服务层方法则调用数据访问层的方法来实现与数据库的交互。这样做的好处是将业务逻辑和数据访问逻辑分离,使得代码更易于维护和扩展。 ### 安装教程 ```sh npm install npm run serve mvn spring-boot:run ``` ### 使用说明 Enter [localhost:8000](http://localhost:8000) ### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request ## 接口文档 ### POST Register POST /api/register #### 请求参数 |名称|位置|类型|必选|说明| |---|---|---|---|---| |username|query|string| 否 |none| |password|query|string| 否 |none| |confirmed_password|query|string| 否 |none| |department_id|query|string| 否 |none| |type|query|string| 否 |none| > 返回示例 > 200 Response ```json { "error_message":"success" } ``` ### POST Login POST /api/login #### 请求参数 |名称| 位置 |类型|必选|说明| |---|-------|---|---|---| |username| query |string| 否 |none| |password| query |string| 否 |none| > 返回示例 > 200 Response ```json { "error_message": "success", "token": "eyJhbGciOM......" } ``` ### POST UserInfo POST /api/info #### 请求参数 |名称|位置|类型|必选|说明| |---|---|---|---|---| |Authorization|header|string| 否 |none| **Authorization 的值为 "Bearer " + token,下列需提供 token 的接口亦然。** > 返回示例 > 200 Response ```json { "account_type": "1", "department_id": "1", "username": "test" } ``` ### GET GetSchedule GET /api/get/schedule #### 请求参数 |名称|位置|类型|必选|说明| |---|---|---|---|---| |Authorization|header|string| 否 |none| > 返回示例 > 200 Response ```json [ { "name": "陈嘉伦 ", "id": "518 ", "gender": "女", "departmentName": "龙山派出所", "position": null, "phoneNumber": "18643101512", "carNumber": "鲁K19298", "intercomId": "28", "startTime": null, "endTime": null, "times": null, "dayOrNight": "白班", "scheduleDate": "2023-07-01", "mainOrAlternate": "主班", "leader": null }, { "name": "蒋杰宏 ", "id": "687 ", "gender": "女", "departmentName": "龙山派出所", "position": null, "phoneNumber": "18965264521", "carNumber": null, "intercomId": "28", "startTime": null, "endTime": null, "times": null, "dayOrNight": "夜班", "scheduleDate": "2023-07-01", "mainOrAlternate": "副班", "leader": null } ] ``` ### GET GetScheduleHistory GET /api/get/history_schedule #### 请求参数 | 名称 |位置|类型|必选|说明| |---------------|---|---|---|---| | Authorization |header|string| 否 |none| | date | query |string| 否 |"yyyy-MM-dd"| > 返回示例同上一个接口 > 200 Response