Commit 93ec3e8784faa0673cec64c7d73d28a01aceb74e

Authored by 徐烜
2 parents 87c559a7 d9e30c6e

PSM-9

README.md
  1 +<<<<<<< HEAD
1 2 公交调度系统BS版 0.1
2 3 ======
3 4 ----------
... ... @@ -336,4 +337,372 @@
336 337 {
337 338 "errCode":0
338 339 }
339   -```
340 340 \ No newline at end of file
  341 +```
  342 +=======
  343 +公交调度系统BS版 0.1
  344 +======
  345 +----------
  346 +## 目录
  347 +---------
  348 + * [字典表](#字典表)
  349 + * [动态jpa查询实现](#动态jpa查询实现)
  350 + * [车载 gps 相关数据](#gps)
  351 + * [实时gps数据接口 http](#实时gps接口)
  352 + * [进出站数据表结构](#进站数据)
  353 + * [异常警报表结构](#异常警报)
  354 + * [大间隔](#大间隔)
  355 + * [超速](#超速)
  356 + * [越界](#越界)
  357 + * [越站](#越站)
  358 + * [聚集](#聚集)
  359 + * [掉线](#掉线)
  360 + * [调度消息下发接口HTTP](#调度消息下发接口)
  361 + * [调度消息上传接口HTTP](#调度消息上传接口)
  362 + * [车辆历史GPS数据](#车辆历史GPS)
  363 +
  364 +----------
  365 +
  366 +## 字典表
  367 +----------
  368 +字典操作全部由前端负责,主要有2种。
  369 +
  370 +1、转换字典代码。
  371 + 当pjax的`pjax:success`事件被触发(片段加载完成)
  372 + 扫描容器内所有有 `$(".nt-dictionary")` 元素进行字典转换
  373 +``` html
  374 +--dom标签为span div p h1 h2 h3 h4 h5 h6 等等文本元素时,如下写法,text为要转换的代码
  375 +<span class="nt-dictionary" data-group="ScheduleType">out</span>
  376 +--to
  377 +<span>出场</span>
  378 +
  379 +<!- dom标签为input时,如下 data-code为要转换的代码 -->
  380 +<input class="nt-dictionary" data-group="ScheduleType" data-code="out">
  381 +--to
  382 +<input value="出场">
  383 +
  384 +<!- dom标签为select时 如下 data-code为要选中的项 -->
  385 +<select class="nt-dictionary" data-group="ScheduleType" data-code="out"></select>
  386 +--to
  387 +<select>
  388 + <option value="normal">正常班次</option>
  389 + <option value="out" selected>出场</option>
  390 + <option value="in">进场</option>
  391 + <option value="oil">加油</option>
  392 + <option value="temp">临加</option>
  393 + <option value="region">区间</option>
  394 + <option value="venting">放空</option>
  395 + <option value="major">放大站</option>
  396 +</select>
  397 +```
  398 +*原标签的class 除nt-dictionary 外,其余均会被保留*
  399 +
  400 +2、dictionary.js提供如下方法自行使用
  401 +| 方法名 | 参数|返回|
  402 +| ---- | ---- | ---- | ---- |
  403 +| groups (获取所有字典组) | 无| | {LineTrend: 线路走向, ScheduleType: 班次类型} |
  404 +| getByGroup (获取字典组下的字典)| (group) |{0: 上行, 1: 下行}|
  405 +| transformCode (转换字典代码)| (group, code) | 上行 |
  406 +
  407 +## 动态jpa查询实现
  408 +----------
  409 +*参考调度系统枚举com.bsth.entity.search.SearchOperator*
  410 +
  411 +
  412 +## gps
  413 +----------
  414 +### 实时gps接口
  415 +
  416 +所有在线GPS: [http://192.168.168.192:8080/transport_server/rtgps](http://192.168.168.192:8080/transport_server/rtgps/)
  417 +根据设备号查询:[http://192.168.168.192:8080/transport_server/rtgps/05B01901](http://192.168.168.192:8080/transport_server/rtgps/05B01901)
  418 +
  419 +<span style="color: red">Response</span>:
  420 +```json
  421 +{
  422 + "data":[
  423 + {
  424 + "companyCode":5,
  425 + "lineId":10329,
  426 + "deviceId":"05B01901",
  427 + "carparkNo":"00000000",
  428 + "stopNo":"7C890002",
  429 + "lon":121.549866,
  430 + "lat":31.238798,
  431 + "timestamp":1397104499000,
  432 + "speed":42.0,
  433 + "direction":245.9,
  434 + "state":0,
  435 + "upDown":0
  436 + }]
  437 +}
  438 +```
  439 +
  440 +| -- | --|--|
  441 +| ---- | ---- | ---- |
  442 +| companyCode | int | 公司代码 |
  443 +| lineId | int | 线路编码 |
  444 +| deviceId | String | 设备编号 |
  445 +| carparkNo | String | 停车场编码 |
  446 +| stopNo | String | 站点编码 |
  447 +| lon | float | 经度 |
  448 +| lat | float | 纬度 |
  449 +| timestamp | long | 时间戳 |
  450 +| speed | float | 速度|
  451 +| direction | float | 方向(角度) |
  452 +| state | int | 营运状态( 0 营运 ,1 非营运, -1 无效) |
  453 +| upDown | int | 上下行(0 上行 , 1 下行 , -1 无效)|
  454 +
  455 +
  456 +### 进站数据
  457 +----------
  458 +表名:
  459 +
  460 +| .. | .. | .. |
  461 +| ---- | ---- | ---- |
  462 +| id | int | 主键 |
  463 +| deviceId | String | 设备号 |
  464 +| lineId | int | 线路编码 |
  465 +| stopNo | long | 站点编码 |
  466 +| timestamp | long | 时间戳 |
  467 +| upDown | int | 上下行(0 上行 , 1 下行 , -1 无效) |
  468 +| createDate | Date | 创建时间 |
  469 +
  470 +
  471 +### 异常警报
  472 +----------
  473 +
  474 +### 大间隔
  475 +----------
  476 +表名:
  477 +
  478 +| .. | .. | .. |
  479 +| ---- | ---- | ---- |
  480 +| id | int | 主键 |
  481 +| line | int | 线路编码 |
  482 +| station | String | 站点编码 |
  483 +| cVehicle | String | 当前车辆编码 |
  484 +| lastVehicle | String | 上一个车辆编码 |
  485 +| interval | long | 间隔时间(秒) |
  486 +| timestamp | long | 时间戳 |
  487 +| createDate | Date | 创建时间 |
  488 +
  489 +### 超速
  490 +----------
  491 +表名:
  492 +
  493 +| .. | .. | .. |
  494 +| ---- | ---- | ---- |
  495 +| id | int | 主键 |
  496 +| vehicle | String | 车辆编码 |
  497 +| line | int | 线路编码 |
  498 +| upDown | int | 上下行(0 上行 , 1 下行 , -1 无效) |
  499 +| lon | float | 经度 |
  500 +| lat | float | 纬度|
  501 +| speed | float | 速度 |
  502 +| timestamp | long | 时间戳 |
  503 +| createDate | Date | 时间 |
  504 +
  505 +### 越界
  506 +----------
  507 +表名:
  508 +
  509 +| .. | .. | .. |
  510 +| ---- | ---- | ---- |
  511 +| id | int | 主键 |
  512 +| vehicle | String | 车辆编码 |
  513 +| line | int | 线路编码 |
  514 +| upDown | int | 上下行(0 上行 , 1 下行 , -1 无效) |
  515 +| lon | float | 经度 |
  516 +| lat | float | 纬度|
  517 +| location | String | 越界位置(由线调页面进行初始转换)意思是该字段默认为空,页面第一次查看时会写入值|
  518 +| timestamp | long | 时间戳 |
  519 +| createDate | Date | 时间 |
  520 +
  521 +
  522 +### 越站
  523 +----------
  524 +表名:
  525 +
  526 +| .. | .. | .. |
  527 +| ---- | ---- | ---- |
  528 +| id | int | 主键 |
  529 +| line | int | 线路编码 |
  530 +| upDown | int | 上下行(0 上行 , 1 下行 , -1 无效) |
  531 +| station | String | 站点编码 |
  532 +| vehicle | String | 车辆编码 |
  533 +| inData | Date | 进站时间 |
  534 +| outDate | Date | 出站时间 |
  535 +
  536 +
  537 +### 聚集
  538 +----------
  539 +表名:
  540 +
  541 +| .. | .. | .. |
  542 +| ---- | ---- | ---- |
  543 +| id | int | 主键 |
  544 +| line | int | 线路编码 |
  545 +| upDown | int | 上下行(0 上行 , 1 下行 , -1 无效) |
  546 +| stations | String | 站点(多个用 , 号分隔。应该是连续站点) |
  547 +| vehicles | String | 车辆编码(多个用 , 号分隔) |
  548 +| timestamp | long | 时间戳 |
  549 +| createDate | Date | 时间 |
  550 +
  551 +
  552 +### 掉线
  553 +----------
  554 +表名:
  555 +
  556 +| .. | .. | .. |
  557 +| ---- | ---- | ---- |
  558 +| id | int | 主键 |
  559 +| line | int | 线路编码 |
  560 +| upDown | int | 上下行(0 上行 , 1 下行 , -1 无效) |
  561 +| vehicle | String | 车辆编码 |
  562 +| lon | float | 经度 |
  563 +| lat | float | 纬度|
  564 +| timestamp | long | 时间戳 |
  565 +| createDate | Date | 时间 |
  566 +
  567 +
  568 +### 调度消息下发接口
  569 +----------
  570 +[http://192.168.168.192:8080/transport_server/message](http://192.168.168.192:8080/transport_server/message/)
  571 +
  572 +<span style="color: red">Request</span>:
  573 +```json
  574 +{
  575 + "deviceId":12345,
  576 + "timestamp":44324,
  577 + "operCode":0x60,
  578 + "data":{
  579 + "companyCode":22,
  580 + "deviceId":"029L2222",
  581 + "timestamp":134326,
  582 + "instructType":00,
  583 + "dispatchInstruct":0x00,
  584 + "msgId":12345,
  585 + "alarmTime":201606012000,
  586 + "serviceState":00000000,
  587 + "txtContent":"你好"
  588 + }
  589 +}
  590 +```
  591 +| .. | .. | .. |
  592 +| ---- | ---- | ---- |
  593 +| deviceId | string | 设备编号 |
  594 +| timestamp | long | 时间戳(ms) |
  595 +| operCode | short | 一级协议 |
  596 +| data.companyCode | short | 公司代码 |
  597 +| data.deviceId | string | 设备编号 |
  598 +| data.timestamp | long | 时间戳 |
  599 +| data.instructType | short | 保留 默认0 |
  600 +| data.dispatchInstruct | short | 调度指令 调度指令。0X00表示信息短语,0X01表示取消上次指令+调度指令(闹钟有效),0x02表示为调度指令(闹钟有效); 0x03表示运营状态指令(闹钟无效);0x04表示其他指令。|
  601 +| data.msgId | long | 同上 |
  602 +| data.alarmTime | long | 闹钟 MMddhhmm|
  603 +| data.serviceState | long | 多状态字节   先由车载发起车辆故障、事故报告、扣证、纠纷、加油等审请,经调度确认后,下发调度指令与运营状态。当调度指令为0X00终端需要提示信息。当调度指令为0x01和0x02,终端需要收到后提示信息。并且必须在闹钟结束后进行终端相关状态更新。在闹钟时间前120秒开始提示。当调度指令为0x03,收到后进行终端相关状态更新,终端不需要提示信息。当调度指令为0x04,暂不需要提示信息。|
  604 +| data.txtContent | string | 下发的消息文本 |
  605 +```json
  606 +{
  607 + "deviceId":12345,
  608 + "timestamp":44324,
  609 + "operCode":0x64,
  610 + "data":{
  611 + "cityCode":22,
  612 + "deviceId":"029L2222",
  613 + "lineId":"134326"
  614 + }
  615 +}
  616 +```
  617 +| .. | .. | .. |
  618 +| ---- | ---- | ---- |
  619 +| deviceId | string | 设备编号 |
  620 +| timestamp | long | 时间戳(ms) |
  621 +| operCode | short | 一级协议 |
  622 +| data.cityCode | short | 城市区号 |
  623 +| data.deviceId | string | 设备编号 |
  624 +| data.lineId | string | 线路编号 6位 不足6位前面补0 如编号890 用000890表示 |
  625 +
  626 +```json
  627 +{
  628 + "deviceId":12345,
  629 + "timestamp":44324,
  630 + "operCode":0xC0,
  631 + "data":{
  632 + "operCode":0x86,
  633 + "requestAck":0x06
  634 + }
  635 +}
  636 +```
  637 +| .. | .. | .. |
  638 +| ---- | ---- | ---- |
  639 +| deviceId | string | 设备编号 |
  640 +| timestamp | long | 时间戳(ms) |
  641 +| operCode | short | 一级协议 |
  642 +| data.operCode | short | 二级协议 |
  643 +| data.requestAck | short | 请求应答字 0x06同意 0x15不同意|
  644 +
  645 +<span style="color: red">Response</span>:
  646 +```json
  647 +{
  648 + "errCode":0
  649 +}
  650 +```
  651 +
  652 +
  653 +### 调度消息上传接口
  654 +----------
  655 +上行POST地址:[http://192.168.168.120:9088/control/upstream](http://192.168.168.120:9088/control/upstream)
  656 +<span style="color: red">Request</span>:
  657 +```json
  658 +{
  659 + "deviceId":12345,
  660 + "timestamp":44324,
  661 + "status":0,
  662 + "operCode":0x80,
  663 + "data":{
  664 + "operCode":0x26,
  665 + "requestCode":22
  666 + }
  667 +}
  668 +```
  669 +| .. | .. | .. |
  670 +| ---- | ---- | ---- |
  671 +| deviceId | string | 设备编号 |
  672 +| timestamp | long | 时间戳(ms) |
  673 +| status | int | 0x80时无数据 0表示失败 1表示成功或设备确认 2表示驾驶员阅读 |
  674 +| operCode | short | 一级协议 消息确认将无数据 |
  675 +| data.operCode | short | 二级协议 |
  676 +| data.requestCode | short | 请求代码0xa1 恢复运营 0xa2 申请调档 0xa3 出场请求 0xa5 进场请求 0xa7 加油请求 0x50 车辆故障 0x70 路阻报告 0x60 事故报告 0x11 扣证纠纷 0x12 报警 |
  677 +<span style="color: red">Response</span>:
  678 +```json
  679 +{
  680 + "errCode":0
  681 +}
  682 +```
  683 +
  684 +### 车辆历史GPS
  685 +----------
  686 +表名:BSTH_C_GPS_INFO
  687 +
  688 +| .. | .. | .. |
  689 +| ---- | ---- | ---- |
  690 +| cityCode | int | 城市代码 |
  691 +| industryCode | int | 行业代码 |
  692 +| companyCode | int | 企业代码 |
  693 +| lineId | int | 线路编号 |
  694 +| deviceId | string | 设备编号 |
  695 +| driverNo | int | 驾驶员工号 |
  696 +| carparkSerialNo | int | 停车场序列号 |
  697 +| carparkNo | string | 停车场编号 |
  698 +| stopSerialNo | int | 站点序列号 |
  699 +| stopNo | string | 停车场编号 |
  700 +| lon | float | 经度 |
  701 +| lat | float | 维度 |
  702 +| ts | long | 时间戳 |
  703 +| speedSensor | float | 发动机速度 |
  704 +| speedGps | float | gps速度 |
  705 +| direction | float | 角度0-359 |
  706 +| inTemp | int | 车内温度 |
  707 +| serviceState | long | 设备状态字 |
  708 +| daysYear | int | 对应年中的天数 为分区字段 查询一定要用此字段过滤 |
  709 +>>>>>>> PSM-9
... ...
src/main/resources/static/pages/scheduleApp/module/common/dt/MyEmployeeGroupWrapTemplate.html
1   -<div name="{{$saEmployeegroupCtrl.$name_attr}}"
2   - ng-model="$saEmployeegroupCtrl.$$internalmodel">
3   -
4   - <style>
5   - .employee-select {
6   - min-height: 180px;
7   - border: 1px solid #ddd;
8   - }
9   - .employee-select .employee-input {
10   - margin: 2px 5px 5px 5px;
11   - padding-left: 0;
12   - }
13   - .employee-select .employee-select-cont {
14   - text-align: left;
15   - min-height: 60px;
16   - padding-right: 0px;
17   - }
18   - .employee-select .employee-select-body {
19   - margin-top: 10px;
20   - overflow: auto;
21   - width: auto;
22   - min-height: 5px;
23   - }
24   - .employee-select .employee {
25   - display: inline-block;
26   - padding: 8px;
27   - min-width: 50px;
28   - text-align: center;
29   - border: 1px solid #C1C1C1;
30   - color: #666;
31   - border-radius: 5px !important;
32   - margin: 5px;
33   - }
34   - .employee-select .employee.active {
35   - color: white;
36   - background: #4095E8;
37   - border: 1px solid #4095E8;
38   - }
39   - .employee-select .employee.start {
40   - color: white;
41   - background: #32C5D2;
42   - border: 1px solid #32C5D2;
43   - }
44   -
45   - </style>
46   -
47   - <div class="col-md-12 employee-select">
48   - <div class="col-md-12 employee-input">
49   - <div class="col-md-9">
50   - 人员列表
51   - <span ng-bind="$saEmployeegroupCtrl.$$dataDesc"></span>
52   - </div>
53   - </div>
54   - <div class="col-md-12 employee-select-cont">
55   - <div class="employee-select-body">
56   - <div class="employee active"
57   - ng-repeat="$d in $saEmployeegroupCtrl.$$data track by $index"
58   - ng-click="$saEmployeegroupCtrl.$$internal_rylist_click($index)">
59   - {{$d.jsy}}-{{$d.spy}}
60   - </div>
61   - </div>
62   - </div>
63   - <div class="col-md-12 employee-input">
64   - <div class="col-md-9">
65   - 已经选中的人员列表
66   - <span ng-bind="$saEmployeegroupCtrl.$$dataSelectDesc"></span>
67   - </div>
68   - </div>
69   - <div class="col-md-12 employee-select-cont">
70   - <div class="employee-select-body">
71   - <div ng-class="{employee: true, active: true, start: $d.isstart}"
72   - ng-repeat="$d in $saEmployeegroupCtrl.$$dataSelected track by $index"
73   - ng-click="$saEmployeegroupCtrl.$$internal_selrylist_click($index)"
74   - ng-dblclick="$saEmployeegroupCtrl.$$internal_selrylist_dbclick($index)">
75   - {{$d.jsy}}-{{$d.spy}}
76   - </div>
77   - </div>
78   - </div>
79   - </div>
80   -
81   -
  1 +<div name="{{$saEmployeegroupCtrl.$name_attr}}"
  2 + ng-model="$saEmployeegroupCtrl.$$internalmodel">
  3 +
  4 + <style>
  5 + .employee-select {
  6 + min-height: 180px;
  7 + border: 1px solid #ddd;
  8 + }
  9 + .employee-select .employee-input {
  10 + margin: 5px 5px 0px 5px;
  11 + padding-left: 0;
  12 + }
  13 + .employee-select .employee-select-cont {
  14 + text-align: left;
  15 + min-height: 60px;
  16 + padding-right: 0px;
  17 + }
  18 + .employee-select .employee-select-body {
  19 + margin-top: 5px;
  20 + overflow: auto;
  21 + width: auto;
  22 + min-height: 5px;
  23 + }
  24 + .employee-select .employee {
  25 + display: inline-block;
  26 + padding: 8px;
  27 + min-width: 50px;
  28 + text-align: center;
  29 + border: 1px solid #C1C1C1;
  30 + color: #666;
  31 + border-radius: 5px !important;
  32 + margin: 5px;
  33 + }
  34 + .employee-select .employee.active {
  35 + color: white;
  36 + background: #5A81A7;
  37 + border: 1px solid #5A81A7;
  38 + }
  39 + .employee-select .employee.start {
  40 + color: white;
  41 + background: #32C5D2;
  42 + border: 1px solid #32C5D2;
  43 + }
  44 +
  45 + .employee-select .employeeGroup {
  46 + display: inline-block;
  47 + padding: 8px;
  48 + min-width: 50px;
  49 + text-align: center;
  50 + border: 1px solid #C1C1C1;
  51 + color: #666;
  52 + border-radius: 5px !important;
  53 + margin: 5px;
  54 + }
  55 + .employee-select .employeeGroup.active {
  56 + color: white;
  57 + background: #8DA29F;
  58 + border: 1px solid #8DA29F;
  59 + min-width: 100px;
  60 + max-width: 200px;
  61 + }
  62 + .employee-select .employeeGroup.start {
  63 + color: white;
  64 + background: #32C5D2;
  65 + border: 1px solid #32C5D2;
  66 + min-width: 100px;
  67 + max-width: 200px;
  68 + }
  69 +
  70 +
  71 + </style>
  72 +
  73 + <div class="col-md-12 employee-select">
  74 + <div class="col-md-12 employee-input">
  75 + <div class="col-md-9">
  76 + 人员列表,共{{$saEmployeegroupCtrl.$$data.length}}组
  77 +
  78 + </div>
  79 + <div class="checkbox col-md-3" style="min-height: 19px; color: black;">
  80 + <label>
  81 + <input type="checkbox" ng-model="$saEmployeegroupCtrl.$$isFB"/>
  82 + 是否分班
  83 + </label>
  84 + </div>
  85 +
  86 + </div>
  87 + <div class="col-md-12 employee-select-cont">
  88 + <div class="employee-select-body">
  89 + <div class="employee active"
  90 + ng-repeat="$d in $saEmployeegroupCtrl.$$data track by $index"
  91 + ng-click="$saEmployeegroupCtrl.$$internal_rylist_click($index)">
  92 + <span ng-if="$d.spy">
  93 + {{$d.jsy}}-{{$d.spy}}
  94 + <i class="fa fa-ticket" aria-hidden="true"></i>
  95 + </span>
  96 + <span ng-if="!$d.spy">
  97 + <i class="fa fa-bus" aria-hidden="true"></i>
  98 + {{$d.jsy}}
  99 + </span>
  100 + </div>
  101 + </div>
  102 + </div>
  103 +
  104 + <!-- 不分班 -->
  105 + <div class="col-md-12 employee-input" ng-if="!$saEmployeegroupCtrl.$$isFB">
  106 + <div class="col-md-12">
  107 + 已经选中的人员列表,共{{$saEmployeegroupCtrl.$$dataSelected.length}}组,
  108 + 初始人员,{{$saEmployeegroupCtrl.$$dataSelectedStart == undefined ? "未选择" : "第" + ($saEmployeegroupCtrl.$$dataSelectedStart + 1) + "组"}}
  109 + </div>
  110 + </div>
  111 + <div class="col-md-12 employee-select-cont" ng-if="!$saEmployeegroupCtrl.$$isFB">
  112 + <div class="employee-select-body">
  113 + <div ng-class="{employee: true, active: true, start: $d.isstart}"
  114 + ng-repeat="$d in $saEmployeegroupCtrl.$$dataSelected track by $index"
  115 + ng-click="$saEmployeegroupCtrl.$$internal_selrylist_click($index)"
  116 + ng-dblclick="$saEmployeegroupCtrl.$$internal_selrylist_dbclick($index)">
  117 + <span ng-if="$d.spy">
  118 + {{$d.jsy}}-{{$d.spy}}
  119 + <i class="fa fa-ticket" aria-hidden="true"></i>
  120 + </span>
  121 + <span ng-if="!$d.spy">
  122 + <i class="fa fa-bus" aria-hidden="true"></i>
  123 + {{$d.jsy}}
  124 + </span>
  125 +
  126 + </div>
  127 + </div>
  128 + </div>
  129 +
  130 + <!-- 分班 -->
  131 + <div class="col-md-12 employee-input" ng-if="$saEmployeegroupCtrl.$$isFB">
  132 + <div class="col-md-12">
  133 + 已经选中的分班人员列表,共{{$saEmployeegroupCtrl.$$dataFBSelected.length}}组,
  134 + 初始分班人员,{{$saEmployeegroupCtrl.$$dataFBSelectedStart == undefined ? "未选择" : "第" + ($saEmployeegroupCtrl.$$dataFBSelectedStart + 1) + "组"}}
  135 + </div>
  136 + </div>
  137 + <div class="col-md-12 employee-select-cont" ng-if="$saEmployeegroupCtrl.$$isFB">
  138 + <div class="employee-select-body">
  139 + <div ng-class="{employeeGroup: true, active: true, start: $d.isstart}"
  140 + ng-repeat="$d in $saEmployeegroupCtrl.$$dataFBSelected track by $index"
  141 + ng-click="$saEmployeegroupCtrl.$$internal_selrygrouplist_click($index)"
  142 + ng-dblclick="$saEmployeegroupCtrl.$$internal_selrygrouplist_dbclick($index)">
  143 +
  144 + <div>
  145 + <i class="fa fa-sun-o" aria-hidden="true"></i>
  146 + <div ng-class="{employee: true, active: true, start: $d.group[0].isselected}"
  147 + ng-click="$saEmployeegroupCtrl.$$internal_selrygroup_click($index, 0, $event)"
  148 + ng-if="$d.group[0].spy">
  149 + <i class="fa fa-bus" aria-hidden="true"></i>
  150 + {{$d.group[0].jsy}}
  151 + -
  152 + <i class="fa fa-ticket" aria-hidden="true"></i>
  153 + {{$d.group[0].spy}}
  154 + </div>
  155 + <div ng-class="{employee: true, active: true, start: $d.group[0].isselected}"
  156 + ng-click="$saEmployeegroupCtrl.$$internal_selrygroup_click($index, 0, $event)"
  157 + ng-if="!$d.group[0].spy">
  158 + <i class="fa fa-bus" aria-hidden="true"></i>
  159 + {{$d.group[0].jsy}}
  160 + </div>
  161 + </div>
  162 +
  163 + <div>
  164 + <i class="fa fa-moon-o" aria-hidden="true"></i>
  165 + <div ng-class="{employee: true, active: true, start: $d.group[1].isselected}"
  166 + ng-click="$saEmployeegroupCtrl.$$internal_selrygroup_click($index, 1, $event)"
  167 + ng-if="$d.group[1].spy">
  168 + <i class="fa fa-bus" aria-hidden="true"></i>
  169 + {{$d.group[1].jsy}}
  170 + -
  171 + <i class="fa fa-ticket" aria-hidden="true"></i>
  172 + {{$d.group[1].spy}}
  173 + </div>
  174 + <div ng-class="{employee: true, active: true, start: $d.group[1].isselected}"
  175 + ng-click="$saEmployeegroupCtrl.$$internal_selrygroup_click($index, 1, $event)"
  176 + ng-if="!$d.group[1].spy">
  177 + <i class="fa fa-bus" aria-hidden="true"></i>
  178 + {{$d.group[1].jsy}}
  179 + </div>
  180 + </div>
  181 +
  182 +
  183 + </div>
  184 +
  185 + </div>
  186 + </div>
  187 +
  188 +
  189 +
  190 + </div>
  191 +
82 192 </div>
83 193 \ No newline at end of file
... ...
src/main/resources/static/pages/scheduleApp/module/common/dt/MyGuideboardGroupWrapTemplate.html
1   -<div name="{{$saGuideboardgroupCtrl.$name_attr}}"
2   - ng-model="$saGuideboardgroupCtrl.$$internalmodel">
3   -
4   - <style>
5   - .guideboard-select {
6   - min-height: 180px;
7   - border: 1px solid #ddd;
8   - }
9   - .guideboard-select .guideboard-input {
10   - margin: 2px 5px 5px 5px;
11   - padding-left: 0;
12   - }
13   - .guideboard-select .guideboard-select-cont {
14   - text-align: left;
15   - min-height: 60px;
16   - padding-right: 0px;
17   - }
18   - .guideboard-select .guideboard-select-body {
19   - margin-top: 10px;
20   - overflow: auto;
21   - width: auto;
22   - min-height: 5px;
23   - }
24   - .guideboard-select .guideboard {
25   - display: inline-block;
26   - padding: 8px;
27   - min-width: 50px;
28   - text-align: center;
29   - border: 1px solid #C1C1C1;
30   - color: #666;
31   - border-radius: 5px !important;
32   - margin: 5px;
33   - }
34   - .guideboard-select .guideboard.active {
35   - color: white;
36   - background: #4095E8;
37   - border: 1px solid #4095E8;
38   - }
39   - .guideboard-select .guideboard.start {
40   - color: white;
41   - background: #32C5D2;
42   - border: 1px solid #32C5D2;
43   - }
44   -
45   - </style>
46   -
47   - <div class="col-md-12 guideboard-select">
48   - <div class="col-md-12 guideboard-input">
49   - <div class="col-md-9">
50   - 路牌列表
51   - <span ng-bind="$saGuideboardgroupCtrl.$$dataDesc"></span>
52   - </div>
53   - </div>
54   - <div class="col-md-12 guideboard-select-cont">
55   - <div class="guideboard-select-body">
56   - <div class="guideboard active"
57   - ng-repeat="$d in $saGuideboardgroupCtrl.$$data track by $index"
58   - ng-click="$saGuideboardgroupCtrl.$$internal_lplist_click($index)">
59   - {{$d.lpname}}
60   - </div>
61   - </div>
62   - </div>
63   - <div class="col-md-12 guideboard-input">
64   - <div class="col-md-9">
65   - 已经选中的路牌列表
66   - <span ng-bind="$saGuideboardgroupCtrl.$$dataSelectDesc"></span>
67   - </div>
68   - </div>
69   - <div class="col-md-12 guideboard-select-cont">
70   - <div class="guideboard-select-body">
71   - <div ng-class="{guideboard: true, active: true, start: $d.isstart}"
72   - ng-repeat="$d in $saGuideboardgroupCtrl.$$dataSelected track by $index"
73   - ng-click="$saGuideboardgroupCtrl.$$internal_sellplist_click($index)"
74   - ng-dblclick="$saGuideboardgroupCtrl.$$internal_sellplist_dbclick($index)">
75   - {{$d.lpname}}
76   - </div>
77   - </div>
78   - </div>
79   - </div>
80   -
  1 +<div name="{{$saGuideboardgroupCtrl.$name_attr}}"
  2 + ng-model="$saGuideboardgroupCtrl.$$internalmodel">
  3 +
  4 + <style>
  5 + .guideboard-select {
  6 + min-height: 180px;
  7 + border: 1px solid #ddd;
  8 + }
  9 + .guideboard-select .guideboard-input {
  10 + margin: 5px 5px 0px 5px;
  11 + padding-left: 0;
  12 + }
  13 + .guideboard-select .guideboard-select-cont {
  14 + text-align: left;
  15 + min-height: 60px;
  16 + padding-right: 0px;
  17 + }
  18 + .guideboard-select .guideboard-select-body {
  19 + margin-top: 5px;
  20 + overflow: auto;
  21 + width: auto;
  22 + min-height: 5px;
  23 + }
  24 + .guideboard-select .guideboard {
  25 + display: inline-block;
  26 + padding: 8px;
  27 + min-width: 50px;
  28 + text-align: center;
  29 + border: 1px solid #C1C1C1;
  30 + color: #666;
  31 + border-radius: 5px !important;
  32 + margin: 5px;
  33 + }
  34 + .guideboard-select .guideboard.active {
  35 + color: white;
  36 + background: #4095E8;
  37 + border: 1px solid #4095E8;
  38 + }
  39 + .guideboard-select .guideboard.start {
  40 + color: white;
  41 + background: #32C5D2;
  42 + border: 1px solid #32C5D2;
  43 + }
  44 +
  45 + </style>
  46 +
  47 + <div class="col-md-12 guideboard-select">
  48 + <div class="col-md-12 guideboard-input">
  49 + <div class="col-md-9">
  50 + 路牌列表,共{{$saGuideboardgroupCtrl.$$data.length}}个
  51 + </div>
  52 + </div>
  53 + <div class="col-md-12 guideboard-select-cont">
  54 + <div class="guideboard-select-body">
  55 + <div class="guideboard active"
  56 + ng-repeat="$d in $saGuideboardgroupCtrl.$$data track by $index"
  57 + ng-click="$saGuideboardgroupCtrl.$$internal_lplist_click($index)">
  58 + <i class="fa fa-map-signs" aria-hidden="true"></i>
  59 + {{$d.lpname}}
  60 + </div>
  61 + </div>
  62 + </div>
  63 + <div class="col-md-12 guideboard-input">
  64 + <div class="col-md-12">
  65 + 已经选中的路牌列表,共{{$saGuideboardgroupCtrl.$$dataSelected.length}}个,
  66 + 初始路牌,{{$saGuideboardgroupCtrl.$$dataSelectedStart == undefined ? "未选择" : "第" + ($saGuideboardgroupCtrl.$$dataSelectedStart + 1) + "个"}}
  67 + </div>
  68 + </div>
  69 + <div class="col-md-12 guideboard-select-cont">
  70 + <div class="guideboard-select-body">
  71 + <div ng-class="{guideboard: true, active: true, start: $d.isstart}"
  72 + ng-repeat="$d in $saGuideboardgroupCtrl.$$dataSelected track by $index"
  73 + ng-click="$saGuideboardgroupCtrl.$$internal_sellplist_click($index)"
  74 + ng-dblclick="$saGuideboardgroupCtrl.$$internal_sellplist_dbclick($index)">
  75 + <i class="fa fa-map-signs" aria-hidden="true"></i>
  76 + {{$d.lpname}}
  77 + </div>
  78 + </div>
  79 + </div>
  80 + </div>
  81 +
81 82 </div>
82 83 \ No newline at end of file
... ...
src/main/resources/static/pages/scheduleApp/module/common/prj-common-directive.js
... ... @@ -1479,9 +1479,6 @@ angular.module(&#39;ScheduleApp&#39;).directive(&#39;saGuideboardgroup&#39;, [
1479 1479 self.$$data_lpid_first_init = false; // 路牌id是否初始化
1480 1480 self.$$data_lpstart_first_init = false; // 起始路牌是否初始化
1481 1481  
1482   - self.$$dataDesc = ""; // 路牌列表描述
1483   - self.$$dataSelectDesc = ""; // 选中路牌描述
1484   -
1485 1482 },
1486 1483  
1487 1484 /**
... ... @@ -1617,9 +1614,6 @@ angular.module(&#39;ScheduleApp&#39;).directive(&#39;saGuideboardgroup&#39;, [
1617 1614 eval("scope[ctrlAs].model" + "." + $lpstartname_attr + " = lpStart;");
1618 1615 }
1619 1616  
1620   - scope[ctrlAs].$$dataSelectDesc =
1621   - ",共" + data_temp.length + "个," + "初始路牌,第" + lpStart + "个";
1622   -
1623 1617 } else {
1624 1618 scope[ctrlAs].$$internalmodel = undefined;
1625 1619 }
... ... @@ -1724,12 +1718,8 @@ angular.module(&#39;ScheduleApp&#39;).directive(&#39;saGuideboardgroup&#39;, [
1724 1718 scope[ctrlAs].$$dataSelected = [];
1725 1719 scope[ctrlAs].$$dataSelectedStart = undefined;
1726 1720 scope[ctrlAs].$$internalmodel = undefined;
1727   - scope[ctrlAs].$$dataDesc = "";
1728   - scope[ctrlAs].$$dataSelectDesc = "";
1729 1721 }
1730 1722 scope[ctrlAs].$$data_xl_first_init = true;
1731   -
1732   - scope[ctrlAs].$$dataDesc = ",共" + result.content.length + "个";
1733 1723 },
1734 1724 function(result) {
1735 1725  
... ... @@ -1837,14 +1827,35 @@ angular.module(&#39;ScheduleApp&#39;).directive(&#39;saEmployeegroup&#39;, [
1837 1827  
1838 1828 // 测试数据
1839 1829 //self.$$data = [
  1830 + // {id: 1, dbbm: "1", jsy: '忍1', spy: '守1'},
  1831 + // {id: 2, dbbm: "2", jsy: '忍2', spy: '守2'},
  1832 + // {id: 3, dbbm: "3", jsy: '忍3', spy: '守3'}
  1833 + //];
  1834 +
  1835 + self.$$dataSelected = []; // 选中的人员配置列表
  1836 + self.$$dataSelectedStart = undefined; // 起始人员配置
  1837 +
  1838 + //self.$$dataSelected = [
1840 1839 // {id: 1, dbbm: "1", jsy: '忍1', spy: '守1', isstart: false},
1841 1840 // {id: 2, dbbm: "2", jsy: '忍2', spy: '守2', isstart: true},
1842 1841 // {id: 3, dbbm: "3", jsy: '忍3', spy: '守3', isstart: false}
1843 1842 //];
1844 1843  
1845   -
1846   - self.$$dataSelected = []; // 选中的人员配置列表
1847   - self.$$dataSelectedStart = undefined; // 起始人员配置
  1844 + self.$$isFB = false; // 是否分班
  1845 + self.$$dataFBSelected = []; // 选中的分班人员组配置列表
  1846 + self.$$dataFBInternalSelected = undefined; // 分班组内人员选中标识
  1847 + self.$$dataFBSelectedStart = undefined; // 选中的起始分班人员组合
  1848 +
  1849 + //self.$$dataFBSelected = [
  1850 + // {isstart: true, group: [
  1851 + // {id: 1, dbbm: "1", jsy: '忍1', spy: '守1', isselected: false},
  1852 + // {id: 2, dbbm: "2", jsy: '忍2', spy: '守2', isstart: true}
  1853 + // ]},
  1854 + // {isstart: false, group: [
  1855 + // {id: 1, dbbm: "1", jsy: '忍1', spy: '守1', isselected: false},
  1856 + // {id: 2, dbbm: "2", jsy: '忍2', spy: '守2', isstart: true}
  1857 + // ]}
  1858 + //];
1848 1859  
1849 1860 // saGuideboardgroup组件的ng-model,用于外部绑定等操作
1850 1861 self.$$internalmodel = undefined;
... ... @@ -1852,11 +1863,11 @@ angular.module(&#39;ScheduleApp&#39;).directive(&#39;saEmployeegroup&#39;, [
1852 1863 self.$$data_init = false; // *数据源初始化标志
1853 1864 self.$$data_xl_first_init = false; // 线路是否初始化
1854 1865 self.$$data_ry_first_init = false; // 人员配置是否初始化
  1866 + self.$$data_ry_first_data = undefined; // 人员配置初始化数据
1855 1867 self.$$data_rycid_first_init = false; // 人员配置id是否初始化
  1868 + self.$$data_rycid_first_data = undefined; // 人员配置id初始化数据
1856 1869 self.$$data_rystart_first_init = false; // 起始人员是否初始化
1857   -
1858   - self.$$dataDesc = ""; // 路牌列表描述
1859   - self.$$dataSelectDesc = ""; // 选中路牌描述
  1870 + self.$$data_rystart_first_data = undefined; // 起始人员初始化数据
1860 1871  
1861 1872 },
1862 1873  
... ... @@ -1901,9 +1912,6 @@ angular.module(&#39;ScheduleApp&#39;).directive(&#39;saEmployeegroup&#39;, [
1901 1912 scope[ctrlAs]["$name_attr"] = $name_attr;
1902 1913 }
1903 1914  
1904   - // TODO:
1905   -
1906   -
1907 1915 /**
1908 1916 * 人员配置列表点击(人员配置列表中选中路牌)
1909 1917 * @param $index
... ... @@ -1911,21 +1919,61 @@ angular.module(&#39;ScheduleApp&#39;).directive(&#39;saEmployeegroup&#39;, [
1911 1919 scope[ctrlAs].$$internal_rylist_click = function($index) {
1912 1920 var data_temp = scope[ctrlAs].$$data;
1913 1921 if (data_temp && data_temp.length > $index) {
1914   - scope[ctrlAs].$$dataSelected.push({
1915   - id : data_temp[$index].id,
1916   - dbbm: data_temp[$index].dbbm,
1917   - jsy: data_temp[$index].jsy,
1918   - spy: data_temp[$index].spy,
1919   - isstart: data_temp[$index].isstart
1920   - });
  1922 + if (!scope[ctrlAs].$$isFB) { // 不分班
  1923 + scope[ctrlAs].$$dataSelected.push({
  1924 + id : data_temp[$index].id,
  1925 + dbbm: data_temp[$index].dbbm,
  1926 + jsy: data_temp[$index].jsy,
  1927 + spy: data_temp[$index].spy,
  1928 + isstart: false
  1929 + });
  1930 +
  1931 + // 如果没有指定过初始人员,默认选择此人员作为起始人员
  1932 + if (scope[ctrlAs].$$dataSelectedStart == undefined) {
  1933 + scope[ctrlAs].$$internal_selrylist_click(
  1934 + scope[ctrlAs].$$dataSelected.length - 1);
  1935 + }
  1936 + } else { // 分班
  1937 + if (scope[ctrlAs].$$dataFBInternalSelected) { // 替换组内人员
  1938 + scope[ctrlAs].$$dataFBSelected
  1939 + [scope[ctrlAs].$$dataFBInternalSelected.gindex].group
  1940 + [scope[ctrlAs].$$dataFBInternalSelected.index] = {
  1941 + id : data_temp[$index].id,
  1942 + dbbm: data_temp[$index].dbbm,
  1943 + jsy: data_temp[$index].jsy,
  1944 + spy: data_temp[$index].spy,
  1945 + isselected: true
  1946 + };
1921 1947  
1922   - // 如果没有指定过初始人员,默认选择此人员作为起始人员
1923   - if (scope[ctrlAs].$$dataSelectedStart == undefined) {
1924   - scope[ctrlAs].$$internal_selrylist_click(
1925   - scope[ctrlAs].$$dataSelected.length - 1);
  1948 + } else {
  1949 + scope[ctrlAs].$$dataFBSelected.push({
  1950 + isstart: false,
  1951 + group: [].concat(
  1952 + {
  1953 + id : data_temp[$index].id,
  1954 + dbbm: data_temp[$index].dbbm,
  1955 + jsy: data_temp[$index].jsy,
  1956 + spy: data_temp[$index].spy,
  1957 + isselected: false
  1958 + }, {
  1959 + id : data_temp[$index].id,
  1960 + dbbm: data_temp[$index].dbbm,
  1961 + jsy: data_temp[$index].jsy,
  1962 + spy: data_temp[$index].spy,
  1963 + isselected: false
  1964 + }
  1965 + )
  1966 + });
  1967 + if (scope[ctrlAs].$$dataFBSelectedStart == undefined) {
  1968 + scope[ctrlAs].$$internal_selrygrouplist_click(
  1969 + scope[ctrlAs].$$dataFBSelected.length - 1);
  1970 + }
  1971 + }
1926 1972 }
  1973 +
1927 1974 }
1928 1975 };
  1976 +
1929 1977 /**
1930 1978 * 选中的人员单击(初始人员选择)
1931 1979 * @param $index
... ... @@ -1954,6 +2002,69 @@ angular.module(&#39;ScheduleApp&#39;).directive(&#39;saEmployeegroup&#39;, [
1954 2002 }
1955 2003 };
1956 2004  
  2005 + /**
  2006 + * 选中的分班组人员单击(初始人员选择)
  2007 + * @param $index
  2008 + */
  2009 + scope[ctrlAs].$$internal_selrygrouplist_click = function($index) {
  2010 + var data_temp = scope[ctrlAs].$$dataFBSelected;
  2011 + if (data_temp && data_temp.length > $index) {
  2012 + for (var i = 0; i < data_temp.length; i++) {
  2013 + data_temp[i].isstart = false;
  2014 + for (var j = 0; j < data_temp[i].group.length; j++) {
  2015 + data_temp[i].group[j].isselected = false;
  2016 + }
  2017 + }
  2018 + data_temp[$index].isstart = true;
  2019 + scope[ctrlAs].$$dataFBSelectedStart = $index;
  2020 + scope[ctrlAs].$$dataFBInternalSelected = undefined;
  2021 + }
  2022 + };
  2023 + /**
  2024 + * 分组内部单击(选中分班中的某组人员)
  2025 + * @param $groupindex 组index
  2026 + * @param $index 组内部某个index
  2027 + * @param $event 事件防止冒泡
  2028 + */
  2029 + scope[ctrlAs].$$internal_selrygroup_click = function($groupindex, $index, $event) {
  2030 + var data_temp = scope[ctrlAs].$$dataFBSelected;
  2031 + if (data_temp && data_temp.length > $groupindex) {
  2032 + if (data_temp[$groupindex].group && data_temp[$groupindex].group.length > $index) {
  2033 + // $$dataFBInternalSelected的格式如下:
  2034 + //{gindex: 1, index: 0}
  2035 + for (var i = 0; i < data_temp.length; i++) {
  2036 + data_temp[i].isstart = false;
  2037 + for (var j = 0; j < data_temp[i].group.length; j++) {
  2038 + data_temp[i].group[j].isselected = false;
  2039 + }
  2040 + }
  2041 + data_temp[$groupindex].group[$index].isselected = true;
  2042 + scope[ctrlAs].$$dataFBInternalSelected = {
  2043 + gindex: $groupindex, index: $index
  2044 + };
  2045 + scope[ctrlAs].$$dataFBSelectedStart = undefined;
  2046 + $event.stopPropagation();
  2047 + }
  2048 + }
  2049 +
  2050 + };
  2051 + /**
  2052 + * 选中的分班人员双击(删除选中的人员)
  2053 + * @param $index
  2054 + */
  2055 + scope[ctrlAs].$$internal_selrygrouplist_dbclick = function($index) {
  2056 + var data_temp = scope[ctrlAs].$$dataFBSelected;
  2057 + if (data_temp && data_temp.length > $index) {
  2058 + if (scope[ctrlAs].$$dataFBSelectedStart == $index) {
  2059 + scope[ctrlAs].$$dataFBSelectedStart = undefined;
  2060 + }
  2061 + if (scope[ctrlAs].$$dataFBInternalSelected &&
  2062 + scope[ctrlAs].$$dataFBInternalSelected.gindex == $index) {
  2063 + scope[ctrlAs].$$dataFBInternalSelected = undefined;
  2064 + }
  2065 + data_temp.splice($index, 1);
  2066 + }
  2067 + };
1957 2068  
1958 2069 /**
1959 2070 * 验证内部数据,更新外部model
... ... @@ -1961,51 +2072,97 @@ angular.module(&#39;ScheduleApp&#39;).directive(&#39;saEmployeegroup&#39;, [
1961 2072 scope[ctrlAs].$$internal_validate_model = function() {
1962 2073 var data_temp = scope[ctrlAs].$$dataSelected;
1963 2074 var data_temp2 = scope[ctrlAs].$$dataSelectedStart;
  2075 + var data_temp3 = scope[ctrlAs].$$dataFBSelected;
  2076 + var data_temp4 = scope[ctrlAs].$$dataFBSelectedStart;
1964 2077 var ryDbbms = [];
  2078 + var ryDbbm_group = [];
1965 2079 var ryCids = [];
  2080 + var ryCid_group = [];
1966 2081 var ryStart = 0;
1967 2082 var i = 0;
  2083 + var j = 0;
1968 2084  
1969   - if (data_temp &&
1970   - data_temp.length > 0 &&
1971   - data_temp2 != undefined) {
  2085 + var isFB = scope[ctrlAs].$$isFB;
1972 2086  
1973   - for (i = 0; i < data_temp.length; i++) {
1974   - ryDbbms.push(data_temp[i].dbbm);
1975   - ryCids.push(data_temp[i].id);
1976   - }
1977   - data_temp[data_temp2].isstart = true;
1978   - ryStart = data_temp2 + 1;
  2087 + if (isFB) {
  2088 + if (data_temp3 &&
  2089 + data_temp3.length > 0 &&
  2090 + data_temp4 != undefined) {
1979 2091  
1980   - // 更新内部model,用于外部验证
1981   - // 内部model的值暂时随意,以后再改
1982   - scope[ctrlAs].$$internalmodel = {desc: "ok"};
  2092 + for (i = 0; i < data_temp3.length; i++) {
  2093 + for (j = 0; j < data_temp3[i].group.length; j++) {
  2094 + ryDbbm_group.push(data_temp3[i].group[j].dbbm);
  2095 + ryCid_group.push(data_temp3[i].group[j].id);
  2096 + }
  2097 + ryDbbms.push(ryDbbm_group.join("-"));
  2098 + ryCids.push(ryCid_group.join("-"));
  2099 + ryDbbm_group = [];
  2100 + ryCid_group = [];
  2101 + }
1983 2102  
1984   - // 更新外部model字段
1985   - if ($dbbmrangename_attr) {
1986   - console.log("dbbmrangename=" + ryDbbms.join(','));
1987   - eval("scope[ctrlAs].model" + "." + $dbbmrangename_attr + " = ryDbbms.join(',');");
1988   - }
1989   - if (rycidrangename_attr) {
1990   - console.log("rycidrangename=" + ryCids.join(','));
1991   - eval("scope[ctrlAs].model" + "." + rycidrangename_attr + " = ryCids.join(',');");
1992   - }
1993   - if ($rystartname_attr) {
1994   - console.log("rystartname=" + ryStart);
1995   - eval("scope[ctrlAs].model" + "." + $rystartname_attr + " = ryStart;");
1996   - }
  2103 + data_temp3[data_temp4].isstart = true;
  2104 + ryStart = data_temp4 + 1;
  2105 +
  2106 + // 更新内部model,用于外部验证
  2107 + // 内部model的值暂时随意,以后再改
  2108 + scope[ctrlAs].$$internalmodel = {desc: "ok"};
  2109 +
  2110 + // 更新外部model字段
  2111 + if ($dbbmrangename_attr) {
  2112 + console.log("dbbmrangename=" + ryDbbms.join(','));
  2113 + eval("scope[ctrlAs].model" + "." + $dbbmrangename_attr + " = ryDbbms.join(',');");
  2114 + }
  2115 + if (rycidrangename_attr) {
  2116 + console.log("rycidrangename=" + ryCids.join(','));
  2117 + eval("scope[ctrlAs].model" + "." + rycidrangename_attr + " = ryCids.join(',');");
  2118 + }
  2119 + if ($rystartname_attr) {
  2120 + console.log("rystartname=" + ryStart);
  2121 + eval("scope[ctrlAs].model" + "." + $rystartname_attr + " = ryStart;");
  2122 + }
1997 2123  
1998   - scope[ctrlAs].$$dataSelectDesc =
1999   - ",共" + data_temp.length + "组," + "初始人员,第" + ryStart + "组";
  2124 + } else {
  2125 + scope[ctrlAs].$$internalmodel = undefined;
  2126 + }
2000 2127  
2001 2128 } else {
2002   - scope[ctrlAs].$$internalmodel = undefined;
2003   - }
  2129 + if (data_temp &&
  2130 + data_temp.length > 0 &&
  2131 + data_temp2 != undefined) {
  2132 +
  2133 + for (i = 0; i < data_temp.length; i++) {
  2134 + ryDbbms.push(data_temp[i].dbbm);
  2135 + ryCids.push(data_temp[i].id);
  2136 + }
  2137 + data_temp[data_temp2].isstart = true;
  2138 + ryStart = data_temp2 + 1;
2004 2139  
  2140 + // 更新内部model,用于外部验证
  2141 + // 内部model的值暂时随意,以后再改
  2142 + scope[ctrlAs].$$internalmodel = {desc: "ok"};
  2143 +
  2144 + // 更新外部model字段
  2145 + if ($dbbmrangename_attr) {
  2146 + console.log("dbbmrangename=" + ryDbbms.join(','));
  2147 + eval("scope[ctrlAs].model" + "." + $dbbmrangename_attr + " = ryDbbms.join(',');");
  2148 + }
  2149 + if (rycidrangename_attr) {
  2150 + console.log("rycidrangename=" + ryCids.join(','));
  2151 + eval("scope[ctrlAs].model" + "." + rycidrangename_attr + " = ryCids.join(',');");
  2152 + }
  2153 + if ($rystartname_attr) {
  2154 + console.log("rystartname=" + ryStart);
  2155 + eval("scope[ctrlAs].model" + "." + $rystartname_attr + " = ryStart;");
  2156 + }
  2157 +
  2158 + } else {
  2159 + scope[ctrlAs].$$internalmodel = undefined;
  2160 + }
  2161 + }
2005 2162  
2006 2163 };
2007 2164  
2008   - // 监控内部数据,$$data_selected 变化
  2165 + // 监控内部数据,$$dataSelected 变化
2009 2166 scope.$watch(
2010 2167 function() {
2011 2168 return scope[ctrlAs].$$dataSelected;
... ... @@ -2016,7 +2173,7 @@ angular.module(&#39;ScheduleApp&#39;).directive(&#39;saEmployeegroup&#39;, [
2016 2173 true
2017 2174 );
2018 2175  
2019   - // 监控内部数据,$$data_selected_start 变化
  2176 + // 监控内部数据,$$dataSelectedStart 变化
2020 2177 scope.$watch(
2021 2178 function() {
2022 2179 return scope[ctrlAs].$$dataSelectedStart;
... ... @@ -2027,6 +2184,51 @@ angular.module(&#39;ScheduleApp&#39;).directive(&#39;saEmployeegroup&#39;, [
2027 2184 true
2028 2185 );
2029 2186  
  2187 +
  2188 + // 监控内部数据,$$dataFBSelected 变化
  2189 + scope.$watch(
  2190 + function() {
  2191 + return scope[ctrlAs].$$dataFBSelected;
  2192 + },
  2193 + function(newValue, oldValue) {
  2194 + scope[ctrlAs].$$internal_validate_model();
  2195 + },
  2196 + true
  2197 + );
  2198 +
  2199 + // 监控内部数据,$$dataFBSelectedStart 变化
  2200 + scope.$watch(
  2201 + function() {
  2202 + return scope[ctrlAs].$$dataFBSelectedStart;
  2203 + },
  2204 + function(newValue, oldValue) {
  2205 + scope[ctrlAs].$$internal_validate_model();
  2206 + },
  2207 + true
  2208 + );
  2209 +
  2210 + // 监控内部数据,$$dataFBInternalSelected 变化
  2211 + scope.$watch(
  2212 + function() {
  2213 + return scope[ctrlAs].$$dataFBInternalSelected;
  2214 + },
  2215 + function(newValue, oldValue) {
  2216 + scope[ctrlAs].$$internal_validate_model();
  2217 + },
  2218 + true
  2219 + );
  2220 +
  2221 + // 监控内部数据,$$isFB 变化
  2222 + scope.$watch(
  2223 + function() {
  2224 + return scope[ctrlAs].$$isFB;
  2225 + },
  2226 + function(newValue, oldValue) {
  2227 + scope[ctrlAs].$$internal_validate_model();
  2228 + },
  2229 + true
  2230 + );
  2231 +
2030 2232 /**
2031 2233 * 验证数据是否初始化完成,
2032 2234 * 所谓的初始化就是内部所有的数据被有效设定过一次。
... ... @@ -2035,26 +2237,86 @@ angular.module(&#39;ScheduleApp&#39;).directive(&#39;saEmployeegroup&#39;, [
2035 2237 var self = scope[ctrlAs];
2036 2238 var data_temp = self.$$data;
2037 2239 var dataSelect_temp = self.$$dataSelected;
  2240 + var dataFBSelect_temp = self.$$dataFBSelected;
  2241 + var dbbmnames = null;
  2242 + var dbbmnamegroup = null;
  2243 + var rycids = null;
  2244 + var rycidgroup = null;
  2245 +
2038 2246 var i = 0;
2039 2247 var j = 0;
  2248 + var k = 0;
2040 2249  
2041 2250 if (self.$$data_xl_first_init &&
2042 2251 self.$$data_ry_first_init &&
2043 2252 self.$$data_rycid_first_init &&
2044 2253 self.$$data_rystart_first_init) {
2045   - console.log("数据初始化完毕!");
2046   - self.$$data_init = true;
  2254 + console.log("开始初始化数据");
2047 2255  
2048   - // 修正选择dataSelect
2049   - for (i = 0; i < dataSelect_temp.length; i++) {
2050   - for (j = 0; j < data_temp.length; j++) {
2051   - if (dataSelect_temp[i].dbbm == data_temp[j].dbbm) {
2052   - dataSelect_temp[i].jsy = data_temp[j].jsy;
2053   - dataSelect_temp[i].spy = data_temp[j].spy;
2054   - break;
  2256 + // 判定是否分班,字符串中包含-就是了
  2257 + if (self.$$data_ry_first_data.indexOf("-") != -1) { // 分班
  2258 + self.$$isFB = true;
  2259 +
  2260 + // 搭班编码、人员配置id
  2261 + dbbmnames = self.$$data_ry_first_data.split(",");
  2262 + rycids = self.$$data_rycid_first_data.split(",");
  2263 + for (i = 0; i < dbbmnames.length; i++) {
  2264 + dataFBSelect_temp.push({
  2265 + group: [],
  2266 + isstart: false
  2267 + });
  2268 + dbbmnamegroup = dbbmnames[i].split("-");
  2269 + rycidgroup = rycids[i].split("-");
  2270 +
  2271 + for (k = 0; k < dbbmnamegroup.length; k++) {
  2272 + dataFBSelect_temp[i].group.push({
  2273 + id: rycidgroup[k],
  2274 + dbbm: dbbmnamegroup[k],
  2275 + isselected: false
  2276 + });
  2277 +
  2278 + for (j = 0; j < data_temp.length; j++) {
  2279 + if (dataFBSelect_temp[i].group[k].dbbm == data_temp[j].dbbm) {
  2280 + dataFBSelect_temp[i].group[k].jsy = data_temp[j].jsy;
  2281 + dataFBSelect_temp[i].group[k].spy = data_temp[j].spy;
  2282 + break;
  2283 + }
  2284 + }
2055 2285 }
  2286 +
2056 2287 }
  2288 +
  2289 + // 初始人员
  2290 + scope[ctrlAs].$$dataFBSelectedStart = self.$$data_rystart_first_data - 1;
  2291 +
  2292 +
  2293 + } else {
  2294 + self.$$isFB = false;
  2295 +
  2296 + // 搭班编码、人员配置id
  2297 + dbbmnames = self.$$data_ry_first_data.split(",");
  2298 + rycids = self.$$data_rycid_first_data.split(",");
  2299 + for (i = 0; i < dbbmnames.length; i++) {
  2300 + dataSelect_temp.push({
  2301 + id: rycids[i],
  2302 + dbbm: dbbmnames[i],
  2303 + isstart: false
  2304 + });
  2305 + for (j = 0; j < data_temp.length; j++) {
  2306 + if (dataSelect_temp[i].dbbm == data_temp[j].dbbm) {
  2307 + dataSelect_temp[i].jsy = data_temp[j].jsy;
  2308 + dataSelect_temp[i].spy = data_temp[j].spy;
  2309 + break;
  2310 + }
  2311 + }
  2312 + }
  2313 + // 初始人员
  2314 + scope[ctrlAs].$$dataSelectedStart = self.$$data_rystart_first_data - 1;
  2315 +
2057 2316 }
  2317 +
  2318 + console.log("数据初始化完毕!");
  2319 + self.$$data_init = true;
2058 2320 }
2059 2321  
2060 2322 };
... ... @@ -2111,20 +2373,20 @@ angular.module(&#39;ScheduleApp&#39;).directive(&#39;saEmployeegroup&#39;, [
2111 2373 id: result.content[i].id,
2112 2374 dbbm: result.content[i].dbbm,
2113 2375 jsy: result.content[i].jsy.personnelName,
2114   - spy: result.content[i].spy == null ? "" : result.content[i].spy.personnelName,
2115   - isstart: false
  2376 + spy: result.content[i].spy == null ? "" : result.content[i].spy.personnelName
2116 2377 });
2117 2378 }
2118 2379 if (scope[ctrlAs].$$data_init) {
2119 2380 scope[ctrlAs].$$dataSelected = [];
2120 2381 scope[ctrlAs].$$dataSelectedStart = undefined;
  2382 +
  2383 + scope[ctrlAs].$$dataFBSelected = [];
  2384 + scope[ctrlAs].$$dataFBInternalSelected = undefined;
  2385 + scope[ctrlAs].$$dataFBSelectedStart = undefined;
  2386 +
2121 2387 scope[ctrlAs].$$internalmodel = undefined;
2122   - scope[ctrlAs].$$dataDesc = "";
2123   - scope[ctrlAs].$$dataSelectDesc = "";
2124 2388 }
2125 2389 scope[ctrlAs].$$data_xl_first_init = true;
2126   -
2127   - scope[ctrlAs].$$dataDesc = ",共" + result.content.length + "组";
2128 2390 },
2129 2391 function(result) {
2130 2392  
... ... @@ -2137,59 +2399,30 @@ angular.module(&#39;ScheduleApp&#39;).directive(&#39;saEmployeegroup&#39;, [
2137 2399 // 监控搭班编码范围值的变化
2138 2400 attr.$observe("dbbmrangevalue", function(value) {
2139 2401 if (value && value != "") {
2140   - var data_temp = scope[ctrlAs].$$dataSelected;
2141   - var dbbmnames = value.split(",");
2142   - var i = 0;
2143   - if (data_temp && data_temp.length == 0) { // 初始创建
2144   - console.log("dbbmrangevalue变换了");
2145   - for (i = 0; i < dbbmnames.length; i++) {
2146   - scope[ctrlAs].$$dataSelected.push({
2147   - dbbm: dbbmnames[i],
2148   - isstart: false
2149   - });
2150   - }
2151   - } else {
2152   - for (i = 0; i < dbbmnames.length; i++) {
2153   - data_temp[i].dbbm = dbbmnames[i];
2154   - }
2155   - }
  2402 + console.log("dbbmrangevalue变换了");
2156 2403 scope[ctrlAs].$$data_ry_first_init = true;
  2404 + scope[ctrlAs].$$data_ry_first_data = value;
2157 2405 }
2158 2406 });
2159 2407  
2160 2408 // 监控人员配置id范围值的变化
2161 2409 attr.$observe("rycidrangevalue", function(value) {
2162 2410 if (value && value != "") {
2163   - var data_temp = scope[ctrlAs].$$dataSelected;
2164   - var rycids = value.split(",");
2165   - var i = 0;
2166   - if (data_temp && data_temp.length == 0) { // 初始创建
2167   - console.log("rycidrangevalue变换了");
2168   - for (i = 0; i < rycids.length; i++) {
2169   - scope[ctrlAs].$$dataSelected.push({
2170   - id: rycids[i],
2171   - isstart: false
2172   - });
2173   - }
2174   - } else {
2175   - for (i = 0; i < rycids.length; i++) {
2176   - data_temp[i].id = rycids[i];
2177   - }
2178   - }
  2411 + console.log("rycidrangevalue变换了");
2179 2412 scope[ctrlAs].$$data_rycid_first_init = true;
  2413 + scope[ctrlAs].$$data_rycid_first_data = value;
2180 2414 }
2181 2415 });
2182 2416  
2183 2417 // 监控起始人员的变化
2184 2418 attr.$observe("rystartvalue", function(value) {
2185 2419 if (value && value != "") {
2186   - scope[ctrlAs].$$dataSelectedStart = value - 1;
  2420 + console.log("rystartvalue变换了");
2187 2421 scope[ctrlAs].$$data_rystart_first_init = true;
  2422 + scope[ctrlAs].$$data_rystart_first_data = value;
2188 2423 }
2189 2424 });
2190 2425  
2191   -
2192   -
2193 2426 }
2194 2427 }
2195 2428  
... ...
src/main/resources/static/pages/scheduleApp/module/core/schedulePlanManage/schedulePlanReportManage.js
... ... @@ -3,130 +3,130 @@
3 3 angular.module('ScheduleApp').factory('SchedulePlanReportManageService', [
4 4 'SchedulePlanInfoManageService_g', 'SchedulePlanManageService_g', '$q',
5 5 function(service, service2, $q) {
6   - /** 当前的查询条件信息 */
7   - var currentSearchCondition = {};
  6 + /** 当前的查询条件信息 */
  7 + var currentSearchCondition = {};
8 8  
9   - return {
10   - /**
11   - * 获取查询条件信息,
12   - * 用于给controller用来和页面数据绑定。
13   - */
14   - getSearchCondition: function() {
15   - return currentSearchCondition;
16   - },
17   - /**
18   - * 重置查询条件信息。
19   - */
20   - resetSearchCondition: function() {
21   - var key;
22   - for (key in currentSearchCondition) {
23   - currentSearchCondition[key] = undefined;
24   - }
25   - },
26   - /**
27   - * 组装查询参数,返回一个promise查询结果。
28   - * @param params 查询参数
29   - * @return 返回一个 promise
30   - */
31   - getPage: function() {
32   - var params = currentSearchCondition; // 查询条件
  9 + return {
  10 + /**
  11 + * 获取查询条件信息,
  12 + * 用于给controller用来和页面数据绑定。
  13 + */
  14 + getSearchCondition: function() {
  15 + return currentSearchCondition;
  16 + },
  17 + /**
  18 + * 重置查询条件信息。
  19 + */
  20 + resetSearchCondition: function() {
  21 + var key;
  22 + for (key in currentSearchCondition) {
  23 + currentSearchCondition[key] = undefined;
  24 + }
  25 + },
  26 + /**
  27 + * 组装查询参数,返回一个promise查询结果。
  28 + * @param params 查询参数
  29 + * @return 返回一个 promise
  30 + */
  31 + getPage: function() {
  32 + var params = currentSearchCondition; // 查询条件
  33 +
  34 + // promise
  35 + var deferred = $q.defer();
33 36  
34   - // promise
35   - var deferred = $q.defer();
  37 + // 如果线路id和日期都没有,从后台获取一组参数,如果还没有,就设定死一组参数
  38 + if (!params.xlid && !params.sdate) {
  39 + service2.tommorw.list().$promise.then(
  40 + function(result) {
  41 + if (result) {
  42 + // 线路id
  43 + params.xlid = result.xl.id;
  44 + // 时间
  45 + var dd = new Date();
  46 + dd.setHours(0);
  47 + dd.setMinutes(0);
  48 + dd.setSeconds(0);
  49 + dd.setMilliseconds(0);
  50 + dd.setTime(dd.getTime() + 24 * 3600 * 1000);
  51 + params.sdate = dd;
  52 + } else {
  53 + // 如果没有选中线路、日期,默认选中一个
  54 + params.xlid = 2;
  55 + params.sdate = new Date();
  56 + params.sdate.setTime(1472140800000);
  57 + }
36 58  
37   - // 如果线路id和日期都没有,从后台获取一组参数,如果还没有,就设定死一组参数
38   - if (!params.xlid && !params.sdate) {
39   - service2.tommorw.list().$promise.then(
40   - function(result) {
41   - if (result) {
42   - // 线路id
43   - params.xlid = result.xl.id;
44   - // 时间
45   - var dd = new Date();
46   - dd.setHours(0);
47   - dd.setMinutes(0);
48   - dd.setSeconds(0);
49   - dd.setMilliseconds(0);
50   - dd.setTime(dd.getTime() + 24 * 3600 * 1000);
51   - params.sdate = dd;
52   - } else {
  59 + // 调用方法
  60 + service.groupinfo.list(params).$promise.then(
  61 + function(result_internal) {
  62 + deferred.resolve(result_internal);
  63 + },
  64 + function(result_internal_error) {
  65 + deferred.reject(result_internal_error);
  66 + }
  67 + );
  68 +
  69 + },
  70 + function(result_error) {
53 71 // 如果没有选中线路、日期,默认选中一个
54 72 params.xlid = 2;
55 73 params.sdate = new Date();
56 74 params.sdate.setTime(1472140800000);
57   - }
58 75  
59   - // 调用方法
60   - service.groupinfo.list(params).$promise.then(
61   - function(result_internal) {
62   - deferred.resolve(result_internal);
63   - },
64   - function(result_internal_error) {
65   - deferred.reject(result_internal_error);
66   - }
67   - );
  76 + // 调用方法
  77 + service.groupinfo.list(params).$promise.then(
  78 + function(result_internal) {
  79 + deferred.resolve(result_internal);
  80 + },
  81 + function(result_internal_error) {
  82 + deferred.reject(result_internal_error);
  83 + }
  84 + );
  85 + }
  86 + );
  87 + } else {
  88 + // 调用方法
  89 + service.groupinfo.list(params).$promise.then(
  90 + function(result_internal) {
  91 + deferred.resolve(result_internal);
  92 + },
  93 + function(result_internal_error) {
  94 + deferred.reject(result_internal_error);
  95 + }
  96 + );
  97 + }
68 98  
69   - },
70   - function(result_error) {
71   - // 如果没有选中线路、日期,默认选中一个
72   - params.xlid = 2;
73   - params.sdate = new Date();
74   - params.sdate.setTime(1472140800000);
  99 + return deferred.promise;
75 100  
76   - // 调用方法
77   - service.groupinfo.list(params).$promise.then(
78   - function(result_internal) {
79   - deferred.resolve(result_internal);
80   - },
81   - function(result_internal_error) {
82   - deferred.reject(result_internal_error);
83   - }
84   - );
85   - }
86   - );
87   - } else {
88   - // 调用方法
89   - service.groupinfo.list(params).$promise.then(
90   - function(result_internal) {
91   - deferred.resolve(result_internal);
92   - },
93   - function(result_internal_error) {
94   - deferred.reject(result_internal_error);
95   - }
96   - );
  101 + },
  102 + /**
  103 + * 获取明细信息。
  104 + * @param id 车辆id
  105 + * @return 返回一个 promise
  106 + */
  107 + getDetail: function(id) {
  108 + var params = {id: id};
  109 + return service.get(params).$promise;
  110 + },
  111 + /**
  112 + * 保存信息。
  113 + * @param obj 车辆详细信息
  114 + * @return 返回一个 promise
  115 + */
  116 + saveDetail: function(obj) {
  117 + return service.save(obj).$promise;
  118 + },
  119 + /**
  120 + * 更新分组信息。
  121 + * @param obj
  122 + * @returns {*|Function|promise|n}
  123 + */
  124 + updateDetail: function(obj) {
  125 + return service.updateGroupInfo.update(obj).$promise;
97 126 }
  127 + };
98 128  
99   - return deferred.promise;
100   -
101   - },
102   - /**
103   - * 获取明细信息。
104   - * @param id 车辆id
105   - * @return 返回一个 promise
106   - */
107   - getDetail: function(id) {
108   - var params = {id: id};
109   - return service.get(params).$promise;
110   - },
111   - /**
112   - * 保存信息。
113   - * @param obj 车辆详细信息
114   - * @return 返回一个 promise
115   - */
116   - saveDetail: function(obj) {
117   - return service.save(obj).$promise;
118   - },
119   - /**
120   - * 更新分组信息。
121   - * @param obj
122   - * @returns {*|Function|promise|n}
123   - */
124   - updateDetail: function(obj) {
125   - return service.updateGroupInfo.update(obj).$promise;
126   - }
127   - };
128   -
129   -}]);
  129 + }]);
130 130  
131 131 angular.module('ScheduleApp').controller('SchedulePlanReportManageCtrl', [
132 132 'SchedulePlanReportManageService', '$state',
... ...