| New file |
| | |
| | | # éç¨ä»»å¡ç®¡çåè½ä½¿ç¨è¯´æ |
| | | |
| | | ## åè½æ¦è¿° |
| | | |
| | | éç¨ä»»å¡ç®¡çåè½æ¯åºäºè¥ä¾æ¡æ¶å¼åç宿´ä»»å¡ç®¡çç³»ç»ï¼æ¯æç»´ä¿®ä¿å
»ãå æ²¹ä»»å¡ãå
¶ä»ä»»å¡ç±»åçå
¨çå½å¨æç®¡çã |
| | | |
| | | ## 主è¦åè½ |
| | | |
| | | ### 1. ä»»å¡ç®¡ç |
| | | - **ä»»å¡å建**ï¼æ¯æå建维修ä¿å
»ãå æ²¹ä»»å¡ãå
¶ä»ç±»åä»»å¡ |
| | | - **任塿¥è¯¢**ï¼æ¯ææä»»å¡ç¼å·ãç±»åãç¶æãæ¶é´èå´çæ¡ä»¶æ¥è¯¢ |
| | | - **ä»»å¡ç¼è¾**ï¼æ¯æä¿®æ¹ä»»å¡æè¿°ãå°åãæ¶é´ãæ§è¡äººçä¿¡æ¯ |
| | | - **ä»»å¡å é¤**ï¼æ¯æåä¸ªææ¹éå é¤ä»»å¡ |
| | | - **ä»»å¡åé
**ï¼æ¯æå°ä»»å¡åé
ç»æå®æ§è¡äºº |
| | | - **ç¶æç®¡ç**ï¼æ¯æä»»å¡ç¶ææµè½¬ï¼å¾
å¼å§âä»»å¡ä¸â已宿ï¼ä»»ä½ç¶æå¯åæ¶ï¼ |
| | | |
| | | ### 2. 车è¾ç®¡ç |
| | | - **车è¾åé
**ï¼æ¯æå°è½¦è¾åé
ç»ä»»å¡ |
| | | - **æ¹éåé
**ï¼æ¯æä¸æ¬¡æ§åé
å¤è¾è½¦ç»ä»»å¡ |
| | | - **åæ¶åé
**ï¼æ¯æåæ¶è½¦è¾ä¸ä»»å¡çå
³è |
| | | - **è½¦è¾æ¥è¯¢**ï¼æ¯ææ¥è¯¢å¯ç¨è½¦è¾å表 |
| | | |
| | | ### 3. é件管ç |
| | | - **æä»¶ä¸ä¼ **ï¼æ¯æä¸ä¼ ä»»å¡ç¸å
³éä»¶ï¼PDFãDOCãå¾ççï¼ |
| | | - **æä»¶ä¸è½½**ï¼æ¯æä¸è½½å·²ä¸ä¼ çéä»¶ |
| | | - **æä»¶å é¤**ï¼æ¯æå é¤ä¸éè¦çéä»¶ |
| | | |
| | | ### 4. æä½æ¥å¿ |
| | | - **æ¥å¿è®°å½**ï¼èªå¨è®°å½ææä»»å¡æä½æ¥å¿ |
| | | - **æ¥å¿æ¥è¯¢**ï¼æ¯ææ¥çä»»å¡çæä½åå² |
| | | - **æä½è¿½è¸ª**ï¼è®°å½æä½äººãæä½æ¶é´ãæä½å
容ç详ç»ä¿¡æ¯ |
| | | |
| | | ### 5. ç»è®¡åè½ |
| | | - **ä»»å¡ç»è®¡**ï¼æä¾ä»»å¡æ»æ°ãåç¶æä»»å¡æ°éãè¶
æ¶ä»»å¡çç»è®¡ä¿¡æ¯ |
| | | - **æçä»»å¡**ï¼æ¯ææ¥çå½åç¨æ·å建æåé
çä»»å¡ |
| | | - **è¶
æ¶æé**ï¼èªå¨è¯å«åæéè¶
æ¶ä»»å¡ |
| | | |
| | | ## æ°æ®åºè¡¨ç»æ |
| | | |
| | | ### æ ¸å¿è¡¨ |
| | | 1. **sys_task** - ä»»å¡ä¸»è¡¨ |
| | | 2. **sys_task_vehicle** - ä»»å¡è½¦è¾å
³è表 |
| | | 3. **sys_task_attachment** - ä»»å¡é件表 |
| | | 4. **sys_task_log** - 任塿使¥å¿è¡¨ |
| | | |
| | | ### æ°æ®åå
¸ |
| | | - **sys_task_type** - ä»»å¡ç±»ååå
¸ |
| | | - **sys_task_status** - ä»»å¡ç¶æåå
¸ |
| | | - **sys_vehicle_type** - 车è¾ç±»ååå
¸ |
| | | - **sys_vehicle_status** - 车è¾ç¶æåå
¸ |
| | | - **sys_task_vehicle_status** - ä»»å¡è½¦è¾å
³èç¶æåå
¸ |
| | | |
| | | ## é¨ç½²æ¥éª¤ |
| | | |
| | | ### 1. æ°æ®åºåå§å |
| | | ```sql |
| | | -- æ§è¡è¡¨ç»æåå»ºèæ¬ |
| | | source sql/task_tables.sql; |
| | | |
| | | -- æ§è¡æ°æ®åå
¸åå§åèæ¬ |
| | | source sql/task_dict_data.sql; |
| | | |
| | | -- æ§è¡èåæéåå§åèæ¬ |
| | | source sql/task_menu.sql; |
| | | ``` |
| | | |
| | | ### 2. å端é¨ç½² |
| | | 1. ç¡®ä¿ææJavaæä»¶å·²æ£ç¡®æ¾ç½®å°å¯¹åºç®å½ |
| | | 2. éæ°ç¼è¯é¡¹ç®ï¼`mvn clean compile` |
| | | 3. éå¯åºç¨æå¡ |
| | | |
| | | ### 3. å端é¨ç½² |
| | | 1. ç¡®ä¿ææVueæä»¶å·²æ£ç¡®æ¾ç½®å°å¯¹åºç®å½ |
| | | 2. éæ°æå»ºå端ï¼`npm run build:prod` |
| | | 3. é¨ç½²å°Webæå¡å¨ |
| | | |
| | | ### 4. æéé
ç½® |
| | | 1. ç»å½ç³»ç»ç®¡çåå° |
| | | 2. è¿å
¥"ç³»ç»ç®¡ç" â "èå管ç" |
| | | 3. 确认任å¡ç®¡çç¸å
³èåå·²æ£ç¡®å建 |
| | | 4. 为ç¸åºè§è²åé
ä»»å¡ç®¡çæé |
| | | |
| | | ## APIæ¥å£è¯´æ |
| | | |
| | | ### ä»»å¡ç®¡çæ¥å£ |
| | | - `GET /task/list` - æ¥è¯¢ä»»å¡å表 |
| | | - `GET /task/{taskId}` - è·åä»»å¡è¯¦æ
|
| | | - `POST /task` - åå»ºä»»å¡ |
| | | - `PUT /task` - æ´æ°ä»»å¡ |
| | | - `DELETE /task/{taskIds}` - å é¤ä»»å¡ |
| | | - `PUT /task/{taskId}/assign` - åé
ä»»å¡ |
| | | - `PUT /task/{taskId}/status` - æ´æ°ä»»å¡ç¶æ |
| | | |
| | | ### 车è¾ç®¡çæ¥å£ |
| | | - `GET /task/vehicle/list/{taskId}` - æ¥è¯¢ä»»å¡å
³èè½¦è¾ |
| | | - `GET /task/vehicle/available` - æ¥è¯¢å¯ç¨è½¦è¾ |
| | | - `POST /task/vehicle/assign/{taskId}` - åé
è½¦è¾ |
| | | - `POST /task/vehicle/assign-batch/{taskId}` - æ¹éåé
è½¦è¾ |
| | | - `DELETE /task/vehicle/{taskId}/{vehicleId}` - åæ¶è½¦è¾åé
|
| | | |
| | | ### éä»¶ç®¡çæ¥å£ |
| | | - `GET /task/attachment/list/{taskId}` - æ¥è¯¢ä»»å¡éä»¶ |
| | | - `POST /task/attachment/upload/{taskId}` - ä¸ä¼ éä»¶ |
| | | - `DELETE /task/attachment/{attachmentId}` - å é¤éä»¶ |
| | | |
| | | ### ç»è®¡æ¥å£ |
| | | - `GET /task/statistics` - è·åä»»å¡ç»è®¡ä¿¡æ¯ |
| | | - `GET /task/overdue` - è·åè¶
æ¶ä»»å¡å表 |
| | | - `GET /task/my` - è·åæçä»»å¡å表 |
| | | |
| | | ## 使ç¨è¯´æ |
| | | |
| | | ### 1. åå»ºä»»å¡ |
| | | 1. è¿å
¥"ä»»å¡ç®¡ç" â "éç¨ä»»å¡" |
| | | 2. ç¹å»"æ°å¢"æé® |
| | | 3. å¡«åä»»å¡ä¿¡æ¯ï¼ |
| | | - ä»»å¡ç±»åï¼éæ©ç»´ä¿®ä¿å
»ãå æ²¹ä»»å¡æå
¶ä» |
| | | - ä»»å¡æè¿°ï¼è¯¦ç»æè¿°ä»»å¡å
容 |
| | | - åºåå°åï¼ä»»å¡èµ·å§å°ç¹ |
| | | - ç®çå°åï¼ä»»å¡ç®æ å°ç¹ |
| | | - è®¡åæ¶é´ï¼è®¾ç½®è®¡åå¼å§åç»ææ¶é´ |
| | | - æ§è¡äººï¼éæ©ä»»å¡æ§è¡äºº |
| | | - 夿³¨ï¼å
¶ä»è¯´æä¿¡æ¯ |
| | | 4. ç¹å»"ç¡®å®"ä¿å |
| | | |
| | | ### 2. åé
è½¦è¾ |
| | | 1. å¨ä»»å¡å表ä¸ç¹å»"æ¥ç"è¿å
¥ä»»å¡è¯¦æ
|
| | | 2. å¨"å
³è车è¾"åºåç¹å»"åé
车è¾" |
| | | 3. éæ©è¦åé
ç车è¾ï¼å¯å¤éï¼ |
| | | 4. å¡«ååé
夿³¨ |
| | | 5. ç¹å»"ç¡®å®"宿åé
|
| | | |
| | | ### 3. ä¸ä¼ éä»¶ |
| | | 1. å¨ä»»å¡è¯¦æ
页é¢ç¹å»"ä¸ä¼ éä»¶" |
| | | 2. éæ©è¦ä¸ä¼ çæä»¶ï¼æ¯æPDFãDOCãå¾ççæ ¼å¼ï¼ |
| | | 3. æä»¶å¤§å°ä¸è¶
è¿10MB |
| | | 4. ä¸ä¼ 宿åå¯å¨éä»¶åè¡¨ä¸æ¥çåä¸è½½ |
| | | |
| | | ### 4. ç¶æç®¡ç |
| | | 1. å¨ä»»å¡å表æè¯¦æ
页é¢ç¹å»"ç¶æåæ´" |
| | | 2. éæ©æ°çä»»å¡ç¶æ |
| | | 3. å¡«åç¶æåæ´å¤æ³¨ |
| | | 4. ç³»ç»ä¼èªå¨è®°å½ç¶æåæ´æ¥å¿ |
| | | |
| | | ## æé说æ |
| | | |
| | | ### èåæé |
| | | - `task:general:view` - 任塿¥çæé |
| | | - `task:general:query` - 任塿¥è¯¢æé |
| | | - `task:general:add` - 任塿°å¢æé |
| | | - `task:general:edit` - ä»»å¡ä¿®æ¹æé |
| | | - `task:general:remove` - ä»»å¡å 餿é |
| | | - `task:general:assign` - ä»»å¡åé
æé |
| | | - `task:general:status` - ç¶æåæ´æé |
| | | - `task:general:export` - ä»»å¡å¯¼åºæé |
| | | |
| | | ### æ°æ®æé |
| | | ç³»ç»åºäºé¨é¨è¿è¡æ°æ®é离ï¼ç¨æ·åªè½æ¥çåæä½æ¬é¨é¨åä¸çº§é¨é¨çæ°æ®ã |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **ä»»å¡ç¼å·**ï¼ç³»ç»èªå¨çæï¼æ ¼å¼ä¸ºTASK+æ¥æ+åºå· |
| | | 2. **ç¶ææµè½¬**ï¼å¿
é¡»æç
§ä¸å¡è§åè¿è¡ç¶ææµè½¬ï¼ä¸å
许跳è·å¼åæ´ |
| | | 3. **æä»¶ä¸ä¼ **ï¼æ¯æçæä»¶ç±»åå大尿éå¶ï¼è¯·æè¦æ±ä¸ä¼ |
| | | 4. **æ°æ®å¤ä»½**ï¼å»ºè®®å®æå¤ä»½ä»»å¡ç¸å
³æ°æ® |
| | | 5. **æ§è½ä¼å**ï¼å¤§éæ°æ®æ¶å»ºè®®ä½¿ç¨å页æ¥è¯¢ |
| | | |
| | | ## æ
éæé¤ |
| | | |
| | | ### 常è§é®é¢ |
| | | 1. **èå䏿¾ç¤º**ï¼æ£æ¥èåæéé
ç½®åè§è²åé
|
| | | 2. **æ¥å£è°ç¨å¤±è´¥**ï¼æ£æ¥å端æå¡æ¯å¦æ£å¸¸å¯å¨ |
| | | 3. **æä»¶ä¸ä¼ 失败**ï¼æ£æ¥æä»¶å¤§å°åæ ¼å¼æ¯å¦ç¬¦åè¦æ± |
| | | 4. **ç¶æåæ´å¤±è´¥**ï¼æ£æ¥ç¶ææµè½¬è§åæ¯å¦å
许 |
| | | |
| | | ### æ¥å¿æ¥ç |
| | | - å端æ¥å¿ï¼æ¥çåºç¨æ¥å¿æä»¶ |
| | | - å端æ¥å¿ï¼æå¼æµè§å¨å¼åè
å·¥å
·æ¥çæ§å¶å° |
| | | - æ°æ®åºæ¥å¿ï¼æ¥çæ°æ®åºæä½æ¥å¿ |
| | | |
| | | ## ææ¯æ¯æ |
| | | |
| | | 妿é®é¢è¯·è系系ç»ç®¡çåæå¼åå¢éã |
| New file |
| | |
| | | # ä»»å¡è½¦è¾å
³èå
³ç³»è®¾è®¡ |
| | | |
| | | ## å
³ç³»æ¦è¿° |
| | | |
| | | æ ¹æ®ä¸å¡éæ±ï¼ä»»å¡ç®¡çç³»ç»éè¦å»ºç«ä»¥ä¸å
³èå
³ç³»ï¼ |
| | | |
| | | 1. **ä»»å¡ â 车è¾**ï¼ä¸ä¸ªä»»å¡å¯ä»¥å
³èå¤è¾è½¦ï¼ä¸è¾è½¦å¯ä»¥æ§è¡å¤ä¸ªä»»å¡ |
| | | 2. **è½¦è¾ â æºæ**ï¼æ¯è¾è½¦å½å±äºä¸ä¸ªæºæ |
| | | 3. **ä»»å¡ â æ§è¡äºº**ï¼æ¯ä¸ªä»»å¡åé
ç»ä¸ä¸ªæ§è¡äºº |
| | | 4. **æ§è¡äºº â æºæ**ï¼æ¯ä¸ªæ§è¡äººå½å±äºä¸ä¸ªæºæ |
| | | |
| | | ## æ°æ®åºå
³ç³»è®¾è®¡ |
| | | |
| | | ### 1. æ ¸å¿å
³èå
³ç³» |
| | | |
| | | ```mermaid |
| | | erDiagram |
| | | sys_task ||--o{ sys_task_vehicle : "ä¸å¯¹å¤" |
| | | tb_vehicle_info ||--o{ sys_task_vehicle : "ä¸å¯¹å¤" |
| | | sys_dept ||--o{ tb_vehicle_info : "ä¸å¯¹å¤" |
| | | sys_dept ||--o{ sys_task : "ä¸å¯¹å¤" |
| | | sys_user ||--o{ sys_task : "ä¸å¯¹å¤" |
| | | sys_dept ||--o{ sys_user : "ä¸å¯¹å¤" |
| | | |
| | | sys_task { |
| | | bigint task_id PK |
| | | varchar task_code UK |
| | | varchar task_type |
| | | varchar task_status |
| | | bigint creator_id FK |
| | | bigint assignee_id FK |
| | | bigint dept_id FK |
| | | bigint vehicle_id FK |
| | | } |
| | | |
| | | tb_vehicle_info { |
| | | bigint vehicle_id PK |
| | | varchar platform_code |
| | | varchar vehicle_no UK |
| | | varchar vehicle_type |
| | | varchar vehicle_brand |
| | | varchar vehicle_model |
| | | varchar vehicle_color |
| | | char vehicle_status |
| | | varchar device_id |
| | | bigint dept_id FK |
| | | } |
| | | |
| | | sys_task_vehicle { |
| | | bigint id PK |
| | | bigint task_id FK |
| | | bigint vehicle_id FK |
| | | datetime assign_time |
| | | varchar assign_by |
| | | varchar status |
| | | varchar remark |
| | | } |
| | | |
| | | sys_dept { |
| | | bigint dept_id PK |
| | | varchar dept_name |
| | | bigint parent_id |
| | | } |
| | | |
| | | sys_user { |
| | | bigint user_id PK |
| | | varchar user_name |
| | | bigint dept_id FK |
| | | } |
| | | ``` |
| | | |
| | | ### 2. å
³èå
³ç³»è¯´æ |
| | | |
| | | #### 2.1 ä»»å¡ä¸è½¦è¾å
³è |
| | | - **å
³ç³»ç±»å**ï¼å¤å¯¹å¤ï¼éè¿ä¸é´è¡¨ `sys_task_vehicle`ï¼ |
| | | - **ä¸å¡è§å**ï¼ |
| | | - **ä¸ä¸ªä»»å¡å¯ä»¥åé
å¤è¾è½¦**ï¼å¦ï¼ä¸»è½¦+å¤ç¨è½¦ãå¤è½¦ååä½ä¸ï¼ |
| | | - **ä¸è¾è½¦å¯ä»¥æ§è¡å¤ä¸ªä»»å¡**ï¼ææ¶é´é¡ºåºï¼é¿å
å²çªï¼ |
| | | - **ä»»å¡è½¦è¾å
³èæç¬ç«ç¶æç®¡ç**ï¼å·²åé
ãæ§è¡ä¸ã已宿ãå·²åæ¶ï¼ |
| | | - **æ¯ææ¹éåé
ååæ¶åé
** |
| | | - **车è¾åé
æ¶éªè¯è½¦è¾ç¶æåå¯ç¨æ§** |
| | | |
| | | #### 2.2 车è¾ä¸æºæå
³è |
| | | - **å
³ç³»ç±»å**ï¼å¤å¯¹ä¸ |
| | | - **ä¸å¡è§å**ï¼ |
| | | - æ¯è¾è½¦å¿
é¡»å½å±äºä¸ä¸ªæºæ |
| | | - æºæå 餿¶ï¼è½¦è¾å½å±è®¾ç½®ä¸ºNULLï¼è½¯å é¤ï¼ |
| | | - æ¯æææºææ¥è¯¢è½¦è¾ |
| | | |
| | | #### 2.3 ä»»å¡ä¸æ§è¡äººå
³è |
| | | - **å
³ç³»ç±»å**ï¼å¤å¯¹ä¸ |
| | | - **ä¸å¡è§å**ï¼ |
| | | - æ¯ä¸ªä»»å¡åé
ç»ä¸ä¸ªæ§è¡äºº |
| | | - æ§è¡äººå¿
é¡»ä¸ä»»å¡å¨å䏿ºææä¸çº§æºæ |
| | | - æ¯æä»»å¡éæ°åé
|
| | | |
| | | #### 2.4 æ§è¡äººä¸æºæå
³è |
| | | - **å
³ç³»ç±»å**ï¼å¤å¯¹ä¸ |
| | | - **ä¸å¡è§å**ï¼ |
| | | - æ¯ä¸ªæ§è¡äººå½å±äºä¸ä¸ªæºæ |
| | | - æ¯ææºæå±çº§æéæ§å¶ |
| | | |
| | | ## æ°æ®æéæ§å¶ |
| | | |
| | | ### 1. æºææ°æ®é离 |
| | | ```sql |
| | | -- æ¥è¯¢ä»»å¡æ¶ææºæè¿æ»¤ |
| | | SELECT t.* FROM sys_task t |
| | | WHERE t.dept_id IN ( |
| | | SELECT dept_id FROM sys_dept |
| | | WHERE FIND_IN_SET(dept_id, @user_dept_ids) |
| | | ); |
| | | |
| | | -- æ¥è¯¢è½¦è¾æ¶ææºæè¿æ»¤ |
| | | SELECT v.* FROM tb_vehicle_info v |
| | | WHERE v.dept_id IN ( |
| | | SELECT dept_id FROM sys_dept |
| | | WHERE FIND_IN_SET(dept_id, @user_dept_ids) |
| | | ); |
| | | ``` |
| | | |
| | | ### 2. æééªè¯è§å |
| | | - **ä»»å¡å建**ï¼åªè½åå»ºæ¬æºæåä¸çº§æºæçä»»å¡ |
| | | - **车è¾åé
**ï¼åªè½åé
æ¬æºæåä¸çº§æºæçè½¦è¾ |
| | | - **æ§è¡äººåé
**ï¼åªè½åé
ç»æ¬æºæåä¸çº§æºæçç¨æ· |
| | | - **æ°æ®æ¥è¯¢**ï¼åªè½æ¥çæ¬æºæåä¸çº§æºæçæ°æ® |
| | | |
| | | ## ä¸å¡åºæ¯ç¤ºä¾ |
| | | |
| | | ### 1. å建维修任å¡å¹¶åé
å¤è¾è½¦ |
| | | ```sql |
| | | -- 1. åå»ºä»»å¡ |
| | | INSERT INTO sys_task (task_code, task_type, task_status, creator_id, dept_id, ...) |
| | | VALUES ('TASK202401150001', 'MAINTENANCE', 'PENDING', 100, 200, ...); |
| | | |
| | | -- 2. åé
å¤è¾è½¦ï¼ä¸»è½¦+å¤ç¨è½¦ï¼ |
| | | INSERT INTO sys_task_vehicle (task_id, vehicle_id, assign_by, status, remark) |
| | | VALUES |
| | | (1, 10, 'admin', 'ASSIGNED', 'åé
主维修车'), |
| | | (1, 11, 'admin', 'ASSIGNED', 'åé
å¤ç¨ç»´ä¿®è½¦'), |
| | | (1, 12, 'admin', 'ASSIGNED', 'åé
å·¥å
·è½¦'); |
| | | |
| | | -- 3. åé
æ§è¡äºº |
| | | UPDATE sys_task SET assignee_id = 150 WHERE task_id = 1; |
| | | ``` |
| | | |
| | | ### 2. æ¥è¯¢æºæä¸çææä»»å¡åè½¦è¾ |
| | | ```sql |
| | | -- æ¥è¯¢æºæä»»å¡ |
| | | SELECT t.task_code, t.task_type, t.task_status, |
| | | u.user_name as assignee_name, |
| | | d.dept_name |
| | | FROM sys_task t |
| | | LEFT JOIN sys_user u ON t.assignee_id = u.user_id |
| | | LEFT JOIN sys_dept d ON t.dept_id = d.dept_id |
| | | WHERE t.dept_id = 200; |
| | | |
| | | -- æ¥è¯¢æºæè½¦è¾ |
| | | SELECT v.vehicle_no, v.vehicle_type, v.vehicle_status, |
| | | d.dept_name |
| | | FROM tb_vehicle_info v |
| | | LEFT JOIN sys_dept d ON v.dept_id = d.dept_id |
| | | WHERE v.dept_id = 200; |
| | | ``` |
| | | |
| | | ### 3. æ¥è¯¢ä»»å¡ç车è¾åé
æ
åµ |
| | | ```sql |
| | | SELECT t.task_code, t.task_type, |
| | | v.vehicle_no, v.vehicle_type, |
| | | tv.assign_time, tv.status, tv.remark |
| | | FROM sys_task t |
| | | LEFT JOIN sys_task_vehicle tv ON t.task_id = tv.task_id |
| | | LEFT JOIN tb_vehicle_info v ON tv.vehicle_id = v.vehicle_id |
| | | WHERE t.task_id = 1; |
| | | ``` |
| | | |
| | | ## æ¥å£è®¾è®¡æ©å± |
| | | |
| | | ### 1. 车è¾ç®¡çæ¥å£ |
| | | ```javascript |
| | | // æ¥è¯¢æºæè½¦è¾å表 |
| | | export function listVehicleByDept(deptId, query) { |
| | | return request({ |
| | | url: '/api/vehicle/list-by-dept/' + deptId, |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢å¯ç¨è½¦è¾ï¼æªåé
ä»»å¡ç车è¾ï¼ |
| | | export function listAvailableVehicles(deptId, taskType) { |
| | | return request({ |
| | | url: '/api/vehicle/available', |
| | | method: 'get', |
| | | params: { deptId, taskType } |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | ### 2. ä»»å¡è½¦è¾åé
æ¥å£ |
| | | ```javascript |
| | | // æ¹éåé
è½¦è¾ |
| | | export function assignVehiclesToTask(taskId, vehicleIds, remark) { |
| | | return request({ |
| | | url: '/api/task/' + taskId + '/assign-vehicles', |
| | | method: 'post', |
| | | data: { vehicleIds, remark } |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢ä»»å¡è½¦è¾ä½¿ç¨æ
åµ |
| | | export function getTaskVehicleUsage(taskId) { |
| | | return request({ |
| | | url: '/api/task/' + taskId + '/vehicle-usage', |
| | | method: 'get' |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | ## æ°æ®ä¸è´æ§ä¿è¯ |
| | | |
| | | ### 1. å¤é®çº¦æ |
| | | - ä»»å¡è¡¨å¼ç¨è½¦è¾è¡¨ï¼`ON DELETE SET NULL` |
| | | - ä»»å¡è½¦è¾å
³è表ï¼`ON DELETE CASCADE` |
| | | - 车è¾è¡¨å¼ç¨æºæè¡¨ï¼`ON DELETE SET NULL` |
| | | |
| | | ### 2. ä¸å¡è§åéªè¯ |
| | | - 车è¾åé
æ¶éªè¯è½¦è¾ç¶æï¼å¿
须为æ£å¸¸ç¶æï¼ |
| | | - ä»»å¡åé
æ¶éªè¯æ§è¡äººæéï¼åæºææä¸çº§æºæï¼ |
| | | - æºæå 餿¶å¤çå
³èæ°æ®ï¼è½¯å é¤æè½¬ç§»ï¼ |
| | | |
| | | ### 3. äºå¡æ§å¶ |
| | | ```java |
| | | @Transactional |
| | | public void assignMultipleVehiclesToTask(Long taskId, List<Long> vehicleIds, String remark) { |
| | | // 1. éªè¯ä»»å¡ç¶æ |
| | | Task task = taskMapper.selectById(taskId); |
| | | if (task.getStatus() == TaskStatus.COMPLETED) { |
| | | throw new BusinessException("已宿çä»»å¡ä¸è½åé
车è¾"); |
| | | } |
| | | |
| | | List<TaskVehicle> assignedVehicles = new ArrayList<>(); |
| | | |
| | | for (Long vehicleId : vehicleIds) { |
| | | // 2. éªè¯è½¦è¾ç¶æåå¯ç¨æ§ |
| | | Vehicle vehicle = vehicleMapper.selectById(vehicleId); |
| | | if (vehicle.getStatus() != VehicleStatus.ACTIVE) { |
| | | throw new BusinessException("车è¾ID " + vehicleId + " ç¶æå¼å¸¸ï¼ä¸è½åé
"); |
| | | } |
| | | |
| | | // 3. æ£æ¥è½¦è¾æ¯å¦å·²è¢«å
¶ä»ä»»å¡å ç¨ |
| | | if (isVehicleAssignedToOtherTask(vehicleId, taskId)) { |
| | | throw new BusinessException("车è¾ID " + vehicleId + " 已被å
¶ä»ä»»å¡å ç¨"); |
| | | } |
| | | |
| | | // 4. å建å
³èè®°å½ |
| | | TaskVehicle taskVehicle = new TaskVehicle(); |
| | | taskVehicle.setTaskId(taskId); |
| | | taskVehicle.setVehicleId(vehicleId); |
| | | taskVehicle.setStatus(TaskVehicleStatus.ASSIGNED); |
| | | taskVehicle.setRemark(remark); |
| | | taskVehicleMapper.insert(taskVehicle); |
| | | assignedVehicles.add(taskVehicle); |
| | | } |
| | | |
| | | // 5. è®°å½æä½æ¥å¿ |
| | | logTaskOperation(taskId, "ASSIGN_MULTIPLE_VEHICLES", |
| | | "åé
äº " + vehicleIds.size() + " è¾è½¦: " + vehicleIds.toString()); |
| | | } |
| | | |
| | | @Transactional |
| | | public void unassignVehicleFromTask(Long taskId, Long vehicleId) { |
| | | // 1. éªè¯ä»»å¡è½¦è¾å
³èæ¯å¦åå¨ |
| | | TaskVehicle taskVehicle = taskVehicleMapper.selectByTaskAndVehicle(taskId, vehicleId); |
| | | if (taskVehicle == null) { |
| | | throw new BusinessException("ä»»å¡è½¦è¾å
³èä¸åå¨"); |
| | | } |
| | | |
| | | // 2. éªè¯æ¯å¦å¯ä»¥åæ¶åé
|
| | | if (taskVehicle.getStatus() == TaskVehicleStatus.COMPLETED) { |
| | | throw new BusinessException("已宿çä»»å¡è½¦è¾å
³èä¸è½åæ¶"); |
| | | } |
| | | |
| | | // 3. å é¤å
³èè®°å½ |
| | | taskVehicleMapper.deleteById(taskVehicle.getId()); |
| | | |
| | | // 4. è®°å½æä½æ¥å¿ |
| | | logTaskOperation(taskId, "UNASSIGN_VEHICLE", "åæ¶åé
车è¾ID: " + vehicleId); |
| | | } |
| | | ``` |
| | | |
| | | ## æ»ç» |
| | | |
| | | éè¿ä»¥ä¸è®¾è®¡ï¼å®ç°äºä»»å¡ã车è¾ãæºæåæ§è¡äººä¹é´ç宿´å
³èå
³ç³»ï¼ |
| | | |
| | | 1. **æ°æ®å®æ´æ§**ï¼éè¿å¤é®çº¦æä¿è¯æ°æ®ä¸è´æ§ |
| | | 2. **æéæ§å¶**ï¼åºäºæºæçæ°æ®é离åæééªè¯ |
| | | 3. **ä¸å¡çµæ´»æ§**ï¼æ¯æå¤è½¦è¾åé
åç¶æç®¡ç |
| | | 4. **æ©å±æ§**ï¼é¢çäºè®¾å¤IDçåæ®µï¼æ¯æGPSå®ä½çåè½æ©å± |
| | | |
| | | è¿ä¸ªè®¾è®¡æ¢æ»¡è¶³äºå½åçä¸å¡éæ±ï¼åä¸ºæªæ¥çåè½æ©å±çä¸äºç©ºé´ã |
| New file |
| | |
| | | # éç¨ä»»å¡ç®¡çåè½è¯´æ |
| | | |
| | | ## åè½æ¦è¿° |
| | | |
| | | æ ¹æ®éæ±ææ¡£ï¼å·²å®æéç¨ä»»å¡å转è¿ä»»å¡çåå°ç®¡çåè½å¼åï¼å
æ¬ï¼ |
| | | |
| | | 1. **éç¨ä»»å¡ç®¡ç** - æ¯æç»´ä¿®ä¿å
»ãå æ²¹ä»»å¡ãå
¶ä»ä»»å¡ç±»å |
| | | 2. **宿´çCRUDæä½** - åå»ºãæ¥è¯¢ãæ´æ°ãå é¤ãåé
ãç¶æç®¡ç |
| | | 3. **æéæ§å¶** - åºäºè§è²çæä½æéæ§å¶ |
| | | 4. **æ°æ®é离** - åºäºæºæçæ°æ®æéé离 |
| | | |
| | | ## ææ¯æ¶æ |
| | | ### åç«¯æ¶æ (ruoyi-task模å) |
| | | - éç¨DDDæ¶æè®¾è®¡ï¼åå±æç¡® |
| | | - **é¢åå±**: ä»»å¡èåæ ¹ãå¼å¯¹è±¡ãé¢åæå¡ |
| | | - **åºç¨å±**: CQRSå½ä»¤æ¥è¯¢å离ãåºç¨æå¡ |
| | | - **åºç¡è®¾æ½å±**: æä¹
åãæ¶æ¯æ¨é |
| | | - **æ¥å£å±**: REST APIæ§å¶å¨ |
| | | |
| | | ### åç«¯æ¶æ (ruoyi-ui模å) |
| | | - **页é¢ç»ä»¶**: ä»»å¡å表ãä»»å¡è¯¦æ
ãä»»å¡å建 |
| | | - **APIæå¡**: ç»ä¸çAPIæ¥å£è°ç¨ |
| | | - **è·¯ç±é
ç½®**: å¨æè·¯ç±åæéæ§å¶ |
| | | |
| | | ## æ ¸å¿åè½ |
| | | |
| | | ### 1. ä»»å¡ç±»å管ç |
| | | |
| | | #### éç¨ä»»å¡ç±»å |
| | | - **ç»´ä¿®ä¿å
»** (MAINTENANCE) - 车è¾ç»´ä¿®ä¿å
»ä»»å¡ |
| | | - **å æ²¹ä»»å¡** (FUEL) - 车è¾å æ²¹ä»»å¡ |
| | | - **å
¶ä»** (OTHER) - å
¶ä»ç±»åä»»å¡ |
| | | |
| | | |
| | | |
| | | ### 2. ä»»å¡ç¶æç®¡ç |
| | | |
| | | #### ä»»å¡ç¶æå®ä¹ |
| | | - **å¾
å¼å§** (PENDING) - ä»»å¡å·²å建ï¼çå¾
å¼å§ |
| | | - **ä»»å¡ä¸** (IN_PROGRESS) - ä»»å¡å·²ç»å¼å§ |
| | | - **已宿** (COMPLETED) - ä»»å¡å·²å®æ |
| | | - **已忶** (CANCELLED) - ä»»å¡å·²åæ¶ |
| | | |
| | | |
| | | #### ä»»å¡ç¶ææµè½¬è§å |
| | | ##### ä»»å¡ç¶ææµè½¬è§å |
| | | - **PENDING** â **IN_PROGRESS** â **COMPLETED** |
| | | - ä»»ä½ç¶æé½å¯ä»¥æµè½¬å° **CANCELLED**ï¼é¤äº **COMPLETED**ï¼ |
| | | |
| | | |
| | | |
| | | ##### ç¶ææµè½¬çº¦æ |
| | | 1. ä»»å¡ç¶ææµè½¬å¿
须符åä¸å¡é»è¾é¡ºåº |
| | | 2. æ¯æç¶æåéï¼å¦ä» IN_PROGRESS åå° PENDINGï¼ |
| | | 3. ä»»å¡åæ¶åä¸è½åæ¬¡æ¿æ´» |
| | | |
| | | ### 3. ä»»å¡å段设计 |
| | | |
| | | #### éç¨å段 |
| | | - ä»»å¡ç¼å·ãä»»å¡å建人ï¼ä»»å¡å½å±æºæ |
| | | - ä»»å¡ç±»åãä»»å¡ç¶æ |
| | | - ä»»å¡ç®çå°åãä»»å¡åºåå°å |
| | | - 计åå¼å§æ¶é´ã计åç»ææ¶é´ |
| | | - å®é
å¼å§æ¶é´ãå®é
ç»ææ¶é´ |
| | | - ä»»å¡å¤æ³¨ãéä»¶å表 |
| | | |
| | | ## æ°æ®åºè®¾è®¡ |
| | | |
| | | ### 1. æ ¸å¿è¡¨ç»æ |
| | | |
| | | #### 1.1 ä»»å¡ä¸»è¡¨ (sys_task) |
| | | ```sql |
| | | CREATE TABLE sys_task ( |
| | | task_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 'ä»»å¡ID', |
| | | task_code VARCHAR(50) NOT NULL UNIQUE COMMENT 'ä»»å¡ç¼å·', |
| | | task_type VARCHAR(20) NOT NULL COMMENT 'ä»»å¡ç±»åï¼MAINTENANCE-ç»´ä¿®ä¿å
»ï¼FUEL-å æ²¹ä»»å¡ï¼OTHER-å
¶ä»', |
| | | task_status VARCHAR(20) NOT NULL DEFAULT 'PENDING' COMMENT 'ä»»å¡ç¶æï¼PENDING-å¾
å¼å§ï¼IN_PROGRESS-ä»»å¡ä¸ï¼COMPLETED-已宿ï¼CANCELLED-已忶', |
| | | task_description varchar(1000) COMMENT 'ä»»å¡æè¿°', |
| | | |
| | | -- å°åä¿¡æ¯ |
| | | departure_address VARCHAR(500) COMMENT 'åºåå°å', |
| | | destination_address VARCHAR(500) COMMENT 'ç®çå°å', |
| | | |
| | | -- æ¶é´ä¿¡æ¯ |
| | | planned_start_time DATETIME COMMENT '计åå¼å§æ¶é´', |
| | | planned_end_time DATETIME COMMENT '计åç»ææ¶é´', |
| | | actual_start_time DATETIME COMMENT 'å®é
å¼å§æ¶é´', |
| | | actual_end_time DATETIME COMMENT 'å®é
ç»ææ¶é´', |
| | | |
| | | -- 人åä¿¡æ¯ |
| | | creator_id BIGINT NOT NULL COMMENT 'å建人ID', |
| | | assignee_id BIGINT COMMENT 'æ§è¡äººID', |
| | | dept_id BIGINT NOT NULL COMMENT 'å½å±é¨é¨ID', |
| | | |
| | | -- ç³»ç»å段 |
| | | create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | create_by VARCHAR(64) NOT NULL COMMENT 'å建è
', |
| | | update_by VARCHAR(64) COMMENT 'æ´æ°è
', |
| | | remark VARCHAR(500) COMMENT '夿³¨', |
| | | del_flag CHAR(1) DEFAULT '0' COMMENT 'å 餿 å¿ï¼0代表åå¨ 2代表å é¤ï¼', |
| | | |
| | | INDEX idx_task_code (task_code), |
| | | INDEX idx_task_type (task_type), |
| | | INDEX idx_task_status (task_status), |
| | | INDEX idx_creator_id (creator_id), |
| | | INDEX idx_assignee_id (assignee_id), |
| | | INDEX idx_dept_id (dept_id), |
| | | INDEX idx_planned_start_time (planned_start_time), |
| | | INDEX idx_create_time (create_time) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ä»»å¡ç®¡ç表'; |
| | | ``` |
| | | |
| | | #### 1.2 车è¾ä¿¡æ¯è¡¨ (tb_vehicle_info) |
| | | ```sql |
| | | -- åºäºç°æè½¦è¾è¡¨ç»æï¼æ·»å æºæå
³èåæ®µ |
| | | CREATE TABLE tb_vehicle_info ( |
| | | vehicle_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '车è¾ID', |
| | | platform_code VARCHAR(50) NOT NULL COMMENT '平尿 è¯ï¼A/Bï¼', |
| | | vehicle_no VARCHAR(50) NOT NULL COMMENT '车çå·', |
| | | vehicle_type VARCHAR(50) NOT NULL COMMENT '车è¾ç±»åï¼AMBULANCE-ææ¤è½¦ï¼TRANSFER-转è¿è½¦ï¼MAINTENANCE-维修车', |
| | | vehicle_brand VARCHAR(50) COMMENT '车è¾åç', |
| | | vehicle_model VARCHAR(50) COMMENT '车è¾åå·', |
| | | vehicle_color VARCHAR(20) COMMENT '车è¾é¢è²', |
| | | vehicle_status CHAR(1) DEFAULT '0' COMMENT '车è¾ç¶æï¼0æ£å¸¸ 1åç¨ï¼', |
| | | device_id VARCHAR(50) DEFAULT NULL COMMENT '设å¤ID', |
| | | |
| | | -- æºæå
³èï¼æ°å¢åæ®µï¼ |
| | | dept_id BIGINT(20) DEFAULT NULL COMMENT 'å½å±æºæID', |
| | | |
| | | -- ç³»ç»å段 |
| | | create_by VARCHAR(64) DEFAULT '' COMMENT 'å建è
', |
| | | create_time DATETIME COMMENT 'å建æ¶é´', |
| | | update_by VARCHAR(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | update_time DATETIME COMMENT 'æ´æ°æ¶é´', |
| | | remark VARCHAR(500) DEFAULT NULL COMMENT '夿³¨', |
| | | |
| | | PRIMARY KEY (vehicle_id), |
| | | INDEX idx_vehicle_no (vehicle_no), |
| | | INDEX idx_vehicle_type (vehicle_type), |
| | | INDEX idx_vehicle_status (vehicle_status), |
| | | INDEX idx_dept_id (dept_id), |
| | | INDEX idx_platform_code (platform_code), |
| | | |
| | | FOREIGN KEY (dept_id) REFERENCES sys_dept(dept_id) ON DELETE SET NULL |
| | | ) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8mb4 COMMENT='车è¾ä¿¡æ¯è¡¨'; |
| | | ``` |
| | | |
| | | #### 1.3 ä»»å¡è½¦è¾å
³è表 (sys_task_vehicle) |
| | | ```sql |
| | | CREATE TABLE sys_task_vehicle ( |
| | | id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 'å
³èID', |
| | | task_id BIGINT NOT NULL COMMENT 'ä»»å¡ID', |
| | | vehicle_id BIGINT NOT NULL COMMENT '车è¾ID', |
| | | assign_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'åé
æ¶é´', |
| | | assign_by VARCHAR(64) NOT NULL COMMENT 'åé
人', |
| | | status VARCHAR(20) DEFAULT 'ASSIGNED' COMMENT 'å
³èç¶æï¼ASSIGNED-å·²åé
ï¼ACTIVE-æ§è¡ä¸ï¼COMPLETED-已宿ï¼CANCELLED-已忶', |
| | | remark VARCHAR(500) COMMENT '夿³¨', |
| | | |
| | | INDEX idx_task_id (task_id), |
| | | INDEX idx_vehicle_id (vehicle_id), |
| | | INDEX idx_status (status), |
| | | INDEX idx_assign_time (assign_time), |
| | | |
| | | UNIQUE KEY uk_task_vehicle (task_id, vehicle_id), |
| | | FOREIGN KEY (task_id) REFERENCES sys_task(task_id) ON DELETE CASCADE, |
| | | FOREIGN KEY (vehicle_id) REFERENCES tb_vehicle_info(vehicle_id) ON DELETE CASCADE |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ä»»å¡è½¦è¾å
³è表'; |
| | | ``` |
| | | |
| | | #### 1.4 ä»»å¡é件表 (sys_task_attachment) |
| | | ```sql |
| | | CREATE TABLE sys_task_attachment ( |
| | | attachment_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 'éä»¶ID', |
| | | task_id BIGINT NOT NULL COMMENT 'ä»»å¡ID', |
| | | file_name VARCHAR(255) NOT NULL COMMENT 'æä»¶å', |
| | | file_path VARCHAR(500) NOT NULL COMMENT 'æä»¶è·¯å¾', |
| | | file_size BIGINT COMMENT 'æä»¶å¤§å°ï¼åèï¼', |
| | | file_type VARCHAR(50) COMMENT 'æä»¶ç±»å', |
| | | upload_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'ä¸ä¼ æ¶é´', |
| | | upload_by VARCHAR(64) NOT NULL COMMENT 'ä¸ä¼ è
', |
| | | |
| | | INDEX idx_task_id (task_id), |
| | | FOREIGN KEY (task_id) REFERENCES sys_task(task_id) ON DELETE CASCADE |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ä»»å¡é件表'; |
| | | ``` |
| | | |
| | | #### 1.3 任塿使¥å¿è¡¨ (sys_task_log) |
| | | ```sql |
| | | CREATE TABLE sys_task_log ( |
| | | log_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 'æ¥å¿ID', |
| | | task_id BIGINT NOT NULL COMMENT 'ä»»å¡ID', |
| | | operation_type VARCHAR(20) NOT NULL COMMENT 'æä½ç±»åï¼CREATE-å建ï¼UPDATE-æ´æ°ï¼ASSIGN-åé
ï¼STATUS_CHANGE-ç¶æåæ´ï¼DELETE-å é¤', |
| | | operation_desc VARCHAR(500) COMMENT 'æä½æè¿°', |
| | | old_value TEXT COMMENT 'æä½åå¼', |
| | | new_value TEXT COMMENT 'æä½åå¼', |
| | | operator_id BIGINT NOT NULL COMMENT 'æä½äººID', |
| | | operator_name VARCHAR(64) NOT NULL COMMENT 'æä½äººå§å', |
| | | operation_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'æä½æ¶é´', |
| | | ip_address VARCHAR(128) COMMENT 'IPå°å', |
| | | |
| | | INDEX idx_task_id (task_id), |
| | | INDEX idx_operation_type (operation_type), |
| | | INDEX idx_operator_id (operator_id), |
| | | INDEX idx_operation_time (operation_time), |
| | | FOREIGN KEY (task_id) REFERENCES sys_task(task_id) ON DELETE CASCADE |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任塿使¥å¿è¡¨'; |
| | | ``` |
| | | |
| | | ### 2. æ°æ®åå
¸è®¾è®¡ |
| | | |
| | | #### 2.1 ä»»å¡ç±»ååå
¸ |
| | | ```sql |
| | | INSERT INTO sys_dict_type VALUES ('sys_task_type', 'ä»»å¡ç±»å', '0', 'admin', sysdate(), '', null, 'ä»»å¡ç±»åå表'); |
| | | INSERT INTO sys_dict_data VALUES (1, 1, 'ç»´ä¿®ä¿å
»', 'MAINTENANCE', 'sys_task_type', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, 'ç»´ä¿®ä¿å
»ä»»å¡'); |
| | | INSERT INTO sys_dict_data VALUES (2, 2, 'å æ²¹ä»»å¡', 'FUEL', 'sys_task_type', '', 'success', 'N', '0', 'admin', sysdate(), '', null, 'å æ²¹ä»»å¡'); |
| | | INSERT INTO sys_dict_data VALUES (3, 3, 'å
¶ä»', 'OTHER', 'sys_task_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, 'å
¶ä»ç±»åä»»å¡'); |
| | | ``` |
| | | |
| | | #### 2.2 ä»»å¡ç¶æåå
¸ |
| | | ```sql |
| | | INSERT INTO sys_dict_type VALUES ('sys_task_status', 'ä»»å¡ç¶æ', '0', 'admin', sysdate(), '', null, 'ä»»å¡ç¶æå表'); |
| | | INSERT INTO sys_dict_data VALUES (4, 1, 'å¾
å¼å§', 'PENDING', 'sys_task_status', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, 'ä»»å¡å·²å建ï¼çå¾
å¼å§'); |
| | | INSERT INTO sys_dict_data VALUES (5, 2, 'ä»»å¡ä¸', 'IN_PROGRESS', 'sys_task_status', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, 'ä»»å¡å·²ç»å¼å§'); |
| | | INSERT INTO sys_dict_data VALUES (6, 3, '已宿', 'COMPLETED', 'sys_task_status', '', 'success', 'N', '0', 'admin', sysdate(), '', null, 'ä»»å¡å·²å®æ'); |
| | | INSERT INTO sys_dict_data VALUES (7, 4, '已忶', 'CANCELLED', 'sys_task_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, 'ä»»å¡å·²åæ¶'); |
| | | ``` |
| | | |
| | | #### 2.3 车è¾ç±»ååå
¸ |
| | | ```sql |
| | | INSERT INTO sys_dict_type VALUES ('sys_vehicle_type', '车è¾ç±»å', '0', 'admin', sysdate(), '', null, '车è¾ç±»åå表'); |
| | | INSERT INTO sys_dict_data VALUES (8, 1, 'ææ¤è½¦', 'AMBULANCE', 'sys_vehicle_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, 'ææ¤è½¦'); |
| | | INSERT INTO sys_dict_data VALUES (9, 2, '转è¿è½¦', 'TRANSFER', 'sys_vehicle_type', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '转è¿è½¦'); |
| | | INSERT INTO sys_dict_data VALUES (10, 3, '维修车', 'MAINTENANCE', 'sys_vehicle_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '维修车'); |
| | | ``` |
| | | |
| | | #### 2.4 车è¾ç¶æåå
¸ |
| | | ```sql |
| | | INSERT INTO sys_dict_type VALUES ('sys_vehicle_status', '车è¾ç¶æ', '0', 'admin', sysdate(), '', null, '车è¾ç¶æå表'); |
| | | INSERT INTO sys_dict_data VALUES (11, 1, 'æ£å¸¸', '0', 'sys_vehicle_status', '', 'success', 'N', '0', 'admin', sysdate(), '', null, 'è½¦è¾æ£å¸¸ä½¿ç¨'); |
| | | INSERT INTO sys_dict_data VALUES (12, 2, 'åç¨', '1', 'sys_vehicle_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '车è¾åç¨'); |
| | | ``` |
| | | |
| | | #### 2.5 ä»»å¡è½¦è¾å
³èç¶æåå
¸ |
| | | ```sql |
| | | INSERT INTO sys_dict_type VALUES ('sys_task_vehicle_status', 'ä»»å¡è½¦è¾å
³èç¶æ', '0', 'admin', sysdate(), '', null, 'ä»»å¡è½¦è¾å
³èç¶æå表'); |
| | | INSERT INTO sys_dict_data VALUES (15, 1, 'å·²åé
', 'ASSIGNED', 'sys_task_vehicle_status', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '车è¾å·²åé
ç»ä»»å¡'); |
| | | INSERT INTO sys_dict_data VALUES (16, 2, 'æ§è¡ä¸', 'ACTIVE', 'sys_task_vehicle_status', '', 'success', 'N', '0', 'admin', sysdate(), '', null, 'è½¦è¾æ£å¨æ§è¡ä»»å¡'); |
| | | INSERT INTO sys_dict_data VALUES (17, 3, '已宿', 'COMPLETED', 'sys_task_vehicle_status', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '车è¾ä»»å¡å·²å®æ'); |
| | | INSERT INTO sys_dict_data VALUES (18, 4, '已忶', 'CANCELLED', 'sys_task_vehicle_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '车è¾ä»»å¡å·²åæ¶'); |
| | | ``` |
| | | |
| | | ## æ¥å£è®¾è®¡ |
| | | |
| | | ### 1. REST API è§è |
| | | |
| | | #### 1.1 ä»»å¡ç®¡çæ¥å£ |
| | | |
| | | ##### 1.1.1 åå»ºä»»å¡ |
| | | ``` |
| | | POST /api/task |
| | | Content-Type: application/json |
| | | |
| | | Request Body: |
| | | { |
| | | "taskType": "MAINTENANCE", |
| | | "taskTitle": "车è¾ç»´ä¿®ä¿å
»", |
| | | "taskDescription": "宿ä¿å
»æ£æ¥", |
| | | "departureAddress": "åäº¬å¸æé³åº", |
| | | "destinationAddress": "åäº¬å¸æµ·æ·åºç»´ä¿®å", |
| | | "plannedStartTime": "2024-01-15 09:00:00", |
| | | "plannedEndTime": "2024-01-15 17:00:00", |
| | | "assigneeId": 100, |
| | | "remark": "ç´§æ¥ç»´ä¿®" |
| | | } |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "taskId": 1, |
| | | "taskCode": "TASK202401150001" |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ##### 1.1.2 æ¥è¯¢ä»»å¡å表 |
| | | ``` |
| | | GET /api/task/list?pageNum=1&pageSize=10&taskType=MAINTENANCE&taskStatus=PENDING |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "æ¥è¯¢æå", |
| | | "rows": [ |
| | | { |
| | | "taskId": 1, |
| | | "taskCode": "TASK202401150001", |
| | | "taskType": "MAINTENANCE", |
| | | "taskStatus": "PENDING", |
| | | "taskTitle": "车è¾ç»´ä¿®ä¿å
»", |
| | | "departureAddress": "åäº¬å¸æé³åº", |
| | | "destinationAddress": "åäº¬å¸æµ·æ·åºç»´ä¿®å", |
| | | "plannedStartTime": "2024-01-15 09:00:00", |
| | | "plannedEndTime": "2024-01-15 17:00:00", |
| | | "creatorName": "å¼ ä¸", |
| | | "assigneeName": "æå", |
| | | "createTime": "2024-01-15 08:30:00" |
| | | } |
| | | ], |
| | | "total": 1 |
| | | } |
| | | ``` |
| | | |
| | | ##### 1.1.3 è·åä»»å¡è¯¦æ
|
| | | ``` |
| | | GET /api/task/{taskId} |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "taskId": 1, |
| | | "taskCode": "TASK202401150001", |
| | | "taskType": "MAINTENANCE", |
| | | "taskStatus": "PENDING", |
| | | "taskTitle": "车è¾ç»´ä¿®ä¿å
»", |
| | | "taskDescription": "宿ä¿å
»æ£æ¥", |
| | | "departureAddress": "åäº¬å¸æé³åº", |
| | | "destinationAddress": "åäº¬å¸æµ·æ·åºç»´ä¿®å", |
| | | "plannedStartTime": "2024-01-15 09:00:00", |
| | | "plannedEndTime": "2024-01-15 17:00:00", |
| | | "actualStartTime": null, |
| | | "actualEndTime": null, |
| | | "creatorName": "å¼ ä¸", |
| | | "assigneeName": "æå", |
| | | "remark": "ç´§æ¥ç»´ä¿®", |
| | | "attachments": [], |
| | | "operationLogs": [], |
| | | "assignedVehicles": [ |
| | | { |
| | | "id": 1, |
| | | "vehicleId": 1, |
| | | "vehicleNo": "京A12345", |
| | | "vehicleType": "AMBULANCE", |
| | | "assignTime": "2024-01-15 09:00:00", |
| | | "assignBy": "å¼ ä¸", |
| | | "status": "ASSIGNED", |
| | | "remark": "åé
ææ¤è½¦æ§è¡ä»»å¡" |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ##### 1.1.4 æ´æ°ä»»å¡ |
| | | ``` |
| | | PUT /api/task/{taskId} |
| | | Content-Type: application/json |
| | | |
| | | Request Body: |
| | | { |
| | | "taskTitle": "车è¾ç»´ä¿®ä¿å
»ï¼æ´æ°ï¼", |
| | | "taskDescription": "宿ä¿å
»æ£æ¥ï¼å¢å å®å
¨æ£æ¥", |
| | | "plannedStartTime": "2024-01-15 10:00:00", |
| | | "assigneeId": 101, |
| | | "remark": "æ´æ°åç夿³¨" |
| | | } |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | ##### 1.1.5 æ´æ°ä»»å¡ç¶æ |
| | | ``` |
| | | PUT /api/task/{taskId}/status |
| | | Content-Type: application/json |
| | | |
| | | Request Body: |
| | | { |
| | | "taskStatus": "IN_PROGRESS", |
| | | "actualStartTime": "2024-01-15 10:15:00", |
| | | "remark": "ä»»å¡å¼å§æ§è¡" |
| | | } |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | ##### 1.1.6 åé
ä»»å¡ |
| | | ``` |
| | | PUT /api/task/{taskId}/assign |
| | | Content-Type: application/json |
| | | |
| | | Request Body: |
| | | { |
| | | "assigneeId": 102, |
| | | "remark": "éæ°åé
ç»çäº" |
| | | } |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | ##### 1.1.7 å é¤ä»»å¡ |
| | | ``` |
| | | DELETE /api/task/{taskIds} |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | #### 1.2 ä»»å¡éä»¶æ¥å£ |
| | | |
| | | ##### 1.2.1 ä¸ä¼ éä»¶ |
| | | ``` |
| | | POST /api/task/{taskId}/attachment |
| | | Content-Type: multipart/form-data |
| | | |
| | | Request Body: |
| | | - file: æä»¶å
容 |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "ä¸ä¼ æå", |
| | | "data": { |
| | | "attachmentId": 1, |
| | | "fileName": "ç»´ä¿®æ¥å.pdf", |
| | | "filePath": "/uploads/task/2024/01/15/xxx.pdf" |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ##### 1.2.2 å é¤éä»¶ |
| | | ``` |
| | | DELETE /api/task/attachment/{attachmentId} |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | #### 1.3 车è¾ç®¡çæ¥å£ |
| | | |
| | | ##### 1.3.1 æ¥è¯¢è½¦è¾å表 |
| | | ``` |
| | | GET /api/vehicle/list?pageNum=1&pageSize=10&vehicleType=AMBULANCE&vehicleStatus=ACTIVE&deptId=100 |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "æ¥è¯¢æå", |
| | | "rows": [ |
| | | { |
| | | "vehicleId": 1, |
| | | "platformCode": "A", |
| | | "vehicleNo": "京A12345", |
| | | "vehicleType": "AMBULANCE", |
| | | "vehicleBrand": "å¥é©°", |
| | | "vehicleModel": "Sprinter", |
| | | "vehicleStatus": "0", |
| | | "deviceId": "DEV001", |
| | | "deptId": 100, |
| | | "deptName": "åäº¬æ¥æä¸å¿", |
| | | "createTime": "2024-01-15 08:30:00" |
| | | } |
| | | ], |
| | | "total": 1 |
| | | } |
| | | ``` |
| | | |
| | | ##### 1.3.2 è·å车è¾è¯¦æ
|
| | | ``` |
| | | GET /api/vehicle/{vehicleId} |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "vehicleId": 1, |
| | | "platformCode": "A", |
| | | "vehicleNo": "京A12345", |
| | | "vehicleType": "AMBULANCE", |
| | | "vehicleBrand": "å¥é©°", |
| | | "vehicleModel": "Sprinter", |
| | | "vehicleColor": "ç½è²", |
| | | "vehicleStatus": "0", |
| | | "deviceId": "DEV001", |
| | | "deptId": 100, |
| | | "deptName": "åäº¬æ¥æä¸å¿", |
| | | "createBy": "admin", |
| | | "createTime": "2024-01-15 08:30:00", |
| | | "updateBy": "admin", |
| | | "updateTime": "2024-01-15 10:30:00", |
| | | "remark": "车è¾ç¶æè¯å¥½" |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ##### 1.3.3 åé
车è¾ç»ä»»å¡ |
| | | ``` |
| | | POST /api/task/{taskId}/assign-vehicle |
| | | Content-Type: application/json |
| | | |
| | | Request Body: |
| | | { |
| | | "vehicleId": 1, |
| | | "remark": "åé
ææ¤è½¦æ§è¡ä»»å¡" |
| | | } |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | ##### 1.3.4 æ¹éåé
车è¾ç»ä»»å¡ |
| | | ``` |
| | | POST /api/task/{taskId}/assign-vehicles |
| | | Content-Type: application/json |
| | | |
| | | Request Body: |
| | | { |
| | | "vehicleIds": [1, 2, 3], |
| | | "remark": "åé
å¤è¾è½¦æ§è¡ä»»å¡" |
| | | } |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "successCount": 3, |
| | | "failedCount": 0, |
| | | "details": [ |
| | | { |
| | | "vehicleId": 1, |
| | | "vehicleNo": "京A12345", |
| | | "status": "success", |
| | | "message": "åé
æå" |
| | | }, |
| | | { |
| | | "vehicleId": 2, |
| | | "vehicleNo": "京A12346", |
| | | "status": "success", |
| | | "message": "åé
æå" |
| | | }, |
| | | { |
| | | "vehicleId": 3, |
| | | "vehicleNo": "京A12347", |
| | | "status": "success", |
| | | "message": "åé
æå" |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ##### 1.3.5 åæ¶ä»»å¡è½¦è¾åé
|
| | | ``` |
| | | DELETE /api/task/{taskId}/vehicle/{vehicleId} |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | ##### 1.3.6 æ¥è¯¢ä»»å¡å
³èçè½¦è¾ |
| | | ``` |
| | | GET /api/task/{taskId}/vehicles |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "æ¥è¯¢æå", |
| | | "data": [ |
| | | { |
| | | "id": 1, |
| | | "taskId": 1, |
| | | "vehicleId": 1, |
| | | "vehicleNo": "京A12345", |
| | | "vehicleType": "AMBULANCE", |
| | | "assignTime": "2024-01-15 09:00:00", |
| | | "assignBy": "å¼ ä¸", |
| | | "status": "ASSIGNED", |
| | | "remark": "åé
ææ¤è½¦æ§è¡ä»»å¡" |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | ##### 1.3.7 æ¥è¯¢å¯ç¨è½¦è¾ |
| | | ``` |
| | | GET /api/vehicle/available?deptId=100&taskType=MAINTENANCE |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "æ¥è¯¢æå", |
| | | "data": [ |
| | | { |
| | | "vehicleId": 1, |
| | | "vehicleNo": "京A12345", |
| | | "vehicleType": "AMBULANCE", |
| | | "vehicleBrand": "å¥é©°", |
| | | "vehicleModel": "Sprinter", |
| | | "vehicleStatus": "0", |
| | | "deptName": "åäº¬æ¥æä¸å¿", |
| | | "currentLocation": "åäº¬å¸æé³åº" |
| | | }, |
| | | { |
| | | "vehicleId": 2, |
| | | "vehicleNo": "京A12346", |
| | | "vehicleType": "AMBULANCE", |
| | | "vehicleBrand": "å¥é©°", |
| | | "vehicleModel": "Sprinter", |
| | | "vehicleStatus": "0", |
| | | "deptName": "åäº¬æ¥æä¸å¿", |
| | | "currentLocation": "åäº¬å¸æµ·æ·åº" |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | #### 1.4 ä»»å¡ç»è®¡æ¥å£ |
| | | |
| | | ##### 1.4.1 ä»»å¡ç»è®¡æ¦è§ |
| | | ``` |
| | | GET /api/task/statistics |
| | | |
| | | Response: |
| | | { |
| | | "code": 200, |
| | | "msg": "æ¥è¯¢æå", |
| | | "data": { |
| | | "totalTasks": 100, |
| | | "pendingTasks": 20, |
| | | "inProgressTasks": 30, |
| | | "completedTasks": 45, |
| | | "cancelledTasks": 5, |
| | | "todayTasks": 8, |
| | | "overdueTasks": 3, |
| | | "vehicleUtilization": 85.5 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## ç¨åºè®¾è®¡ |
| | | |
| | | ### 1. åç«¯æ¶æè®¾è®¡ |
| | | |
| | | #### 1.1 模åç»æ |
| | | ``` |
| | | ruoyi-task/ |
| | | âââ src/main/java/com/ruoyi/task/ |
| | | â âââ controller/ # æ§å¶å¨å± |
| | | â â âââ TaskController.java |
| | | â â âââ TaskAttachmentController.java |
| | | â â âââ VehicleController.java |
| | | â â âââ TaskVehicleController.java |
| | | â âââ service/ # æå¡å± |
| | | â â âââ ITaskService.java |
| | | â â âââ impl/TaskServiceImpl.java |
| | | â â âââ ITaskAttachmentService.java |
| | | â â âââ impl/TaskAttachmentServiceImpl.java |
| | | â â âââ IVehicleService.java |
| | | â â âââ impl/VehicleServiceImpl.java |
| | | â â âââ ITaskVehicleService.java |
| | | â â âââ impl/TaskVehicleServiceImpl.java |
| | | â âââ domain/ # é¢åå± |
| | | â â âââ Task.java |
| | | â â âââ TaskAttachment.java |
| | | â â âââ TaskLog.java |
| | | â â âââ Vehicle.java |
| | | â â âââ TaskVehicle.java |
| | | â â âââ enums/ |
| | | â â â âââ TaskType.java |
| | | â â â âââ TaskStatus.java |
| | | â â â âââ VehicleType.java |
| | | â â â âââ VehicleStatus.java |
| | | â â â âââ TaskVehicleStatus.java |
| | | â â âââ vo/ |
| | | â â âââ TaskQueryVO.java |
| | | â â âââ TaskCreateVO.java |
| | | â â âââ TaskUpdateVO.java |
| | | â â âââ VehicleQueryVO.java |
| | | â â âââ VehicleCreateVO.java |
| | | â â âââ TaskVehicleAssignVO.java |
| | | â âââ mapper/ # æ°æ®è®¿é®å± |
| | | â â âââ TaskMapper.java |
| | | â â âââ TaskAttachmentMapper.java |
| | | â â âââ TaskLogMapper.java |
| | | â â âââ VehicleMapper.java |
| | | â â âââ TaskVehicleMapper.java |
| | | â âââ config/ # é
置类 |
| | | â â âââ TaskConfig.java |
| | | â âââ utils/ # å·¥å
·ç±» |
| | | â âââ TaskCodeGenerator.java |
| | | â âââ TaskStatusValidator.java |
| | | â âââ VehicleCodeGenerator.java |
| | | âââ src/main/resources/ |
| | | âââ mapper/ |
| | | âââ TaskMapper.xml |
| | | âââ TaskAttachmentMapper.xml |
| | | âââ TaskLogMapper.xml |
| | | âââ VehicleMapper.xml |
| | | âââ TaskVehicleMapper.xml |
| | | ``` |
| | | |
| | | #### 1.2 æ ¸å¿ç±»è®¾è®¡ |
| | | |
| | | ##### 1.2.1 ä»»å¡å®ä½ç±» (Task.java) |
| | | ```java |
| | | /** |
| | | * ä»»å¡å®ä½ç±» |
| | | * å
å«ä»»å¡çææå±æ§åä¸å¡æ¹æ³ |
| | | */ |
| | | public class Task extends BaseEntity { |
| | | private Long taskId; |
| | | private String taskCode; |
| | | private TaskType taskType; |
| | | private TaskStatus taskStatus; |
| | | private String taskTitle; |
| | | private String taskDescription; |
| | | private String departureAddress; |
| | | private String destinationAddress; |
| | | private Date plannedStartTime; |
| | | private Date plannedEndTime; |
| | | private Date actualStartTime; |
| | | private Date actualEndTime; |
| | | private Long creatorId; |
| | | private Long assigneeId; |
| | | private Long deptId; |
| | | |
| | | // å
³è车è¾å表ï¼éè¿ä¸é´è¡¨æ¥è¯¢ï¼ |
| | | private List<TaskVehicle> assignedVehicles; |
| | | |
| | | // ä¸å¡æ¹æ³ |
| | | public boolean canChangeStatus(TaskStatus newStatus); |
| | | public boolean isOverdue(); |
| | | public long getDuration(); |
| | | public void start(); |
| | | public void complete(); |
| | | public void cancel(); |
| | | public List<Vehicle> getAssignedVehicles(); |
| | | public boolean hasVehicle(Long vehicleId); |
| | | } |
| | | ``` |
| | | |
| | | ##### 1.2.2 任塿塿¥å£ (ITaskService.java) |
| | | ```java |
| | | /** |
| | | * 任塿塿¥å£ |
| | | * å®ä¹ä»»å¡ç¸å
³çä¸å¡æä½ |
| | | */ |
| | | public interface ITaskService { |
| | | // åºç¡CRUDæä½ |
| | | List<Task> selectTaskList(TaskQueryVO queryVO); |
| | | Task selectTaskById(Long taskId); |
| | | int insertTask(TaskCreateVO createVO); |
| | | int updateTask(TaskUpdateVO updateVO); |
| | | int deleteTaskByIds(Long[] taskIds); |
| | | |
| | | // ä¸å¡æä½ |
| | | int assignTask(Long taskId, Long assigneeId, String remark); |
| | | int changeTaskStatus(Long taskId, TaskStatus newStatus, String remark); |
| | | int uploadAttachment(Long taskId, MultipartFile file); |
| | | int deleteAttachment(Long attachmentId); |
| | | |
| | | // 车è¾ç®¡çæä½ |
| | | int assignVehicleToTask(Long taskId, Long vehicleId, String remark); |
| | | int unassignVehicleFromTask(Long taskId, Long vehicleId); |
| | | int assignMultipleVehiclesToTask(Long taskId, List<Long> vehicleIds, String remark); |
| | | List<TaskVehicle> getTaskVehicles(Long taskId); |
| | | List<Vehicle> getAvailableVehicles(Long deptId, String taskType); |
| | | |
| | | // ç»è®¡æ¥è¯¢ |
| | | TaskStatisticsVO getTaskStatistics(); |
| | | List<Task> selectOverdueTasks(); |
| | | List<Task> selectMyTasks(Long userId); |
| | | } |
| | | ``` |
| | | |
| | | #### 1.3 ä¸å¡è§å设计 |
| | | |
| | | ##### 1.3.1 ä»»å¡ç¶ææµè½¬è§å |
| | | ```java |
| | | /** |
| | | * ä»»å¡ç¶ææµè½¬éªè¯å¨ |
| | | */ |
| | | @Component |
| | | public class TaskStatusValidator { |
| | | |
| | | private static final Map<TaskStatus, Set<TaskStatus>> ALLOWED_TRANSITIONS = new HashMap<>(); |
| | | |
| | | static { |
| | | // PENDING -> IN_PROGRESS, CANCELLED |
| | | ALLOWED_TRANSITIONS.put(PENDING, Set.of(IN_PROGRESS, CANCELLED)); |
| | | // IN_PROGRESS -> COMPLETED, CANCELLED, PENDING |
| | | ALLOWED_TRANSITIONS.put(IN_PROGRESS, Set.of(COMPLETED, CANCELLED, PENDING)); |
| | | // COMPLETED -> ä¸å
许任ä½ç¶æåæ´ |
| | | ALLOWED_TRANSITIONS.put(COMPLETED, Set.of()); |
| | | // CANCELLED -> ä¸å
许任ä½ç¶æåæ´ |
| | | ALLOWED_TRANSITIONS.put(CANCELLED, Set.of()); |
| | | } |
| | | |
| | | public boolean canTransition(TaskStatus from, TaskStatus to) { |
| | | return ALLOWED_TRANSITIONS.get(from).contains(to); |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ##### 1.3.2 ä»»å¡ç¼å·çæè§å |
| | | ```java |
| | | /** |
| | | * ä»»å¡ç¼å·çæå¨ |
| | | * æ ¼å¼ï¼TASK + YYYYMMDD + 4ä½åºå· |
| | | */ |
| | | @Component |
| | | public class TaskCodeGenerator { |
| | | |
| | | public String generateTaskCode() { |
| | | String dateStr = DateUtils.formatDate(new Date(), "yyyyMMdd"); |
| | | String sequence = getNextSequence(dateStr); |
| | | return "TASK" + dateStr + sequence; |
| | | } |
| | | |
| | | private String getNextSequence(String dateStr) { |
| | | // æ¥è¯¢å½æ¥æå¤§åºå·å¹¶éå¢ |
| | | // å®ç°é»è¾... |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 2. åç«¯æ¶æè®¾è®¡ |
| | | |
| | | #### 2.1 页é¢ç»ä»¶ç»æ |
| | | ``` |
| | | src/views/task/ |
| | | âââ index.vue # ä»»å¡åè¡¨é¡µé¢ |
| | | âââ detail.vue # ä»»å¡è¯¦æ
é¡µé¢ |
| | | âââ create.vue # å建任å¡é¡µé¢ |
| | | âââ edit.vue # ç¼è¾ä»»å¡é¡µé¢ |
| | | âââ components/ |
| | | âââ TaskList.vue # ä»»å¡å表ç»ä»¶ |
| | | âââ TaskForm.vue # ä»»å¡è¡¨åç»ä»¶ |
| | | âââ TaskStatus.vue # ä»»å¡ç¶æç»ä»¶ |
| | | âââ TaskAttachment.vue # ä»»å¡éä»¶ç»ä»¶ |
| | | âââ TaskLog.vue # 任塿¥å¿ç»ä»¶ |
| | | ``` |
| | | |
| | | #### 2.2 APIæå¡è®¾è®¡ |
| | | ```javascript |
| | | // src/api/task.js |
| | | import request from '@/utils/request' |
| | | |
| | | // ä»»å¡ç®¡çAPI |
| | | export function listTask(query) { |
| | | return request({ |
| | | url: '/api/task/list', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | export function getTask(taskId) { |
| | | return request({ |
| | | url: '/api/task/' + taskId, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | export function addTask(data) { |
| | | return request({ |
| | | url: '/api/task', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function updateTask(data) { |
| | | return request({ |
| | | url: '/api/task/' + data.taskId, |
| | | method: 'put', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function deleteTask(taskIds) { |
| | | return request({ |
| | | url: '/api/task/' + taskIds, |
| | | method: 'delete' |
| | | }) |
| | | } |
| | | |
| | | export function assignTask(taskId, data) { |
| | | return request({ |
| | | url: '/api/task/' + taskId + '/assign', |
| | | method: 'put', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function changeTaskStatus(taskId, data) { |
| | | return request({ |
| | | url: '/api/task/' + taskId + '/status', |
| | | method: 'put', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // é件管çAPI |
| | | export function uploadAttachment(taskId, file) { |
| | | const formData = new FormData() |
| | | formData.append('file', file) |
| | | return request({ |
| | | url: '/api/task/' + taskId + '/attachment', |
| | | method: 'post', |
| | | data: formData, |
| | | headers: { |
| | | 'Content-Type': 'multipart/form-data' |
| | | } |
| | | }) |
| | | } |
| | | |
| | | export function deleteAttachment(attachmentId) { |
| | | return request({ |
| | | url: '/api/task/attachment/' + attachmentId, |
| | | method: 'delete' |
| | | }) |
| | | } |
| | | |
| | | // ç»è®¡API |
| | | export function getTaskStatistics() { |
| | | return request({ |
| | | url: '/api/task/statistics', |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // 车è¾ç®¡çAPI |
| | | export function listVehicleByDept(deptId, query) { |
| | | return request({ |
| | | url: '/api/vehicle/list-by-dept/' + deptId, |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | export function listAvailableVehicles(deptId, taskType) { |
| | | return request({ |
| | | url: '/api/vehicle/available', |
| | | method: 'get', |
| | | params: { deptId, taskType } |
| | | }) |
| | | } |
| | | |
| | | export function assignVehiclesToTask(taskId, vehicleIds, remark) { |
| | | return request({ |
| | | url: '/api/task/' + taskId + '/assign-vehicles', |
| | | method: 'post', |
| | | data: { vehicleIds, remark } |
| | | }) |
| | | } |
| | | |
| | | export function getTaskVehicleUsage(taskId) { |
| | | return request({ |
| | | url: '/api/task/' + taskId + '/vehicle-usage', |
| | | method: 'get' |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | ### 3. æéæ§å¶è®¾è®¡ |
| | | |
| | | #### 3.1 èåæéé
ç½® |
| | | ```sql |
| | | -- ä»»å¡ç®¡çèå |
| | | INSERT INTO sys_menu VALUES (2000, 'ä»»å¡ç®¡ç', 0, 5, 'task', null, '', 1, 0, 'M', '0', '0', '', 'task', 'admin', sysdate(), '', null, 'ä»»å¡ç®¡çç®å½'); |
| | | |
| | | -- éç¨ä»»å¡èå |
| | | INSERT INTO sys_menu VALUES (2001, 'éç¨ä»»å¡', 2000, 1, 'general', 'task/general/index', '', 1, 0, 'C', '0', '0', 'task:general:view', 'list', 'admin', sysdate(), '', null, 'éç¨ä»»å¡èå'); |
| | | |
| | | -- ä»»å¡ç®¡çæé®æé |
| | | INSERT INTO sys_menu VALUES (2002, '任塿¥è¯¢', 2001, 1, '', '', '', 1, 0, 'F', '0', '0', 'task:general:query', '#', 'admin', sysdate(), '', null, ''); |
| | | INSERT INTO sys_menu VALUES (2003, '任塿°å¢', 2001, 2, '', '', '', 1, 0, 'F', '0', '0', 'task:general:add', '#', 'admin', sysdate(), '', null, ''); |
| | | INSERT INTO sys_menu VALUES (2004, 'ä»»å¡ä¿®æ¹', 2001, 3, '', '', '', 1, 0, 'F', '0', '0', 'task:general:edit', '#', 'admin', sysdate(), '', null, ''); |
| | | INSERT INTO sys_menu VALUES (2005, 'ä»»å¡å é¤', 2001, 4, '', '', '', 1, 0, 'F', '0', '0', 'task:general:remove', '#', 'admin', sysdate(), '', null, ''); |
| | | INSERT INTO sys_menu VALUES (2006, 'ä»»å¡åé
', 2001, 5, '', '', '', 1, 0, 'F', '0', '0', 'task:general:assign', '#', 'admin', sysdate(), '', null, ''); |
| | | INSERT INTO sys_menu VALUES (2007, 'ç¶æåæ´', 2001, 6, '', '', '', 1, 0, 'F', '0', '0', 'task:general:status', '#', 'admin', sysdate(), '', null, ''); |
| | | ``` |
| | | |
| | | #### 3.2 æ°æ®æéæ§å¶ |
| | | ```java |
| | | /** |
| | | * 任塿°æ®æéæ§å¶ |
| | | * åºäºé¨é¨è¿è¡æ°æ®é离 |
| | | */ |
| | | @Aspect |
| | | @Component |
| | | public class TaskDataScopeAspect { |
| | | |
| | | @Before("@annotation(dataScope)") |
| | | public void doBefore(JoinPoint point, DataScope dataScope) { |
| | | // è·åå½åç¨æ·é¨é¨æé |
| | | // æ·»å æ°æ®æéè¿æ»¤æ¡ä»¶ |
| | | // å®ç°é»è¾... |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 4. å¼å¸¸å¤ç设计 |
| | | |
| | | #### 4.1 ä¸å¡å¼å¸¸å®ä¹ |
| | | ```java |
| | | /** |
| | | * ä»»å¡ç¸å
³ä¸å¡å¼å¸¸ |
| | | */ |
| | | public class TaskException extends RuntimeException { |
| | | private String code; |
| | | private String message; |
| | | |
| | | public TaskException(String code, String message) { |
| | | super(message); |
| | | this.code = code; |
| | | this.message = message; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * ä»»å¡å¼å¸¸å¸¸é |
| | | */ |
| | | public class TaskErrorCode { |
| | | public static final String TASK_NOT_FOUND = "TASK_001"; |
| | | public static final String TASK_STATUS_INVALID = "TASK_002"; |
| | | public static final String TASK_ASSIGNEE_INVALID = "TASK_003"; |
| | | public static final String TASK_PERMISSION_DENIED = "TASK_004"; |
| | | } |
| | | ``` |
| | | |
| | | #### 4.2 å
¨å±å¼å¸¸å¤ç |
| | | ```java |
| | | /** |
| | | * å
¨å±å¼å¸¸å¤çå¨ |
| | | */ |
| | | @RestControllerAdvice |
| | | public class GlobalExceptionHandler { |
| | | |
| | | @ExceptionHandler(TaskException.class) |
| | | public AjaxResult handleTaskException(TaskException e) { |
| | | return AjaxResult.error(e.getCode(), e.getMessage()); |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## é¨ç½²åé
ç½® |
| | | |
| | | ### 1. ç¯å¢è¦æ± |
| | | - JDK 1.8+ |
| | | - MySQL 5.7+ |
| | | - Redis 3.0+ |
| | | - Maven 3.6+ |
| | | |
| | | ### 2. é
ç½®æä»¶ |
| | | ```yaml |
| | | # application.yml |
| | | spring: |
| | | datasource: |
| | | url: jdbc:mysql://localhost:3306/ry-task?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 |
| | | username: root |
| | | password: password |
| | | |
| | | redis: |
| | | host: localhost |
| | | port: 6379 |
| | | password: |
| | | database: 0 |
| | | |
| | | # ä»»å¡ç¸å
³é
ç½® |
| | | task: |
| | | # ä»»å¡ç¼å·åç¼ |
| | | code-prefix: TASK |
| | | # éä»¶ä¸ä¼ è·¯å¾ |
| | | upload-path: /uploads/task/ |
| | | # æå¤§é件大å°ï¼MBï¼ |
| | | max-file-size: 10 |
| | | # å
许çæä»¶ç±»å |
| | | allowed-file-types: pdf,doc,docx,jpg,jpeg,png |
| | | ``` |
| | | |
| | | ### 3. æ°æ®åºåå§å |
| | | ```sql |
| | | -- æ§è¡æ°æ®åºè¡¨åå»ºèæ¬ |
| | | source sql/task_tables.sql; |
| | | |
| | | -- æ§è¡æ°æ®åå
¸åå§åèæ¬ |
| | | source sql/task_dict_data.sql; |
| | | |
| | | -- æ§è¡èåæéåå§åèæ¬ |
| | | source sql/task_menu.sql; |
| | | ``` |
| | | |
| | | ## æµè¯çç¥ |
| | | |
| | | ### 1. åå
æµè¯ |
| | | - æå¡å±ä¸å¡é»è¾æµè¯ |
| | | - æ°æ®è®¿é®å±æµè¯ |
| | | - å·¥å
·ç±»æµè¯ |
| | | |
| | | ### 2. éææµè¯ |
| | | - APIæ¥å£æµè¯ |
| | | - æ°æ®åºæä½æµè¯ |
| | | - æéæ§å¶æµè¯ |
| | | |
| | | ### 3. æ§è½æµè¯ |
| | | - å¹¶ååå»ºä»»å¡æµè¯ |
| | | - å¤§æ°æ®éæ¥è¯¢æµè¯ |
| | | - æä»¶ä¸ä¼ æ§è½æµè¯ |
| | | |
| | | ## çæ§åæ¥å¿ |
| | | |
| | | ### 1. ä¸å¡çæ§ |
| | | - ä»»å¡å建æ°éç»è®¡ |
| | | - ä»»å¡å®æçç»è®¡ |
| | | - ä»»å¡è¶
æ¶çç»è®¡ |
| | | |
| | | ### 2. ç³»ç»çæ§ |
| | | - APIååºæ¶é´çæ§ |
| | | - æ°æ®åºè¿æ¥æ± çæ§ |
| | | - æä»¶åå¨ç©ºé´çæ§ |
| | | |
| | | ### 3. æ¥å¿è®°å½ |
| | | - æä½æ¥å¿è®°å½ |
| | | - å¼å¸¸æ¥å¿è®°å½ |
| | | - æ§è½æ¥å¿è®°å½ |
| New file |
| | |
| | | package com.ruoyi.web.controller.task; |
| | | |
| | | import java.util.List; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | |
| | | import com.ruoyi.system.domain.SysTask; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.DeleteMapping; |
| | | import org.springframework.web.bind.annotation.PathVariable; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | import com.ruoyi.common.annotation.Log; |
| | | import com.ruoyi.common.core.controller.BaseController; |
| | | import com.ruoyi.common.core.domain.AjaxResult; |
| | | import com.ruoyi.common.enums.BusinessType; |
| | | import com.ruoyi.system.domain.SysTaskAttachment; |
| | | import com.ruoyi.system.service.ISysTaskService; |
| | | |
| | | /** |
| | | * ä»»å¡éä»¶Controller |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/task/attachment") |
| | | public class SysTaskAttachmentController extends BaseController { |
| | | |
| | | @Autowired |
| | | private ISysTaskService sysTaskService; |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡éä»¶å表 |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:query')") |
| | | @GetMapping("/list/{taskId}") |
| | | public AjaxResult list(@PathVariable("taskId") Long taskId) { |
| | | SysTask task = sysTaskService.getTaskDetail(taskId); |
| | | return success(task.getAttachments()); |
| | | } |
| | | |
| | | /** |
| | | * ä¸ä¼ ä»»å¡éä»¶ |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:edit')") |
| | | @Log(title = "ä»»å¡éä»¶", businessType = BusinessType.INSERT) |
| | | @PostMapping("/upload/{taskId}") |
| | | public AjaxResult upload(@PathVariable("taskId") Long taskId, @RequestParam("file") MultipartFile file) { |
| | | try { |
| | | int result = sysTaskService.uploadAttachment(taskId, file); |
| | | if (result > 0) { |
| | | return success("ä¸ä¼ æå"); |
| | | } else { |
| | | return error("ä¸ä¼ 失败"); |
| | | } |
| | | } catch (Exception e) { |
| | | return error("ä¸ä¼ 失败ï¼" + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å é¤ä»»å¡éä»¶ |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:edit')") |
| | | @Log(title = "ä»»å¡éä»¶", businessType = BusinessType.DELETE) |
| | | @DeleteMapping("/{attachmentId}") |
| | | public AjaxResult remove(@PathVariable("attachmentId") Long attachmentId) { |
| | | try { |
| | | int result = sysTaskService.deleteAttachment(attachmentId); |
| | | if (result > 0) { |
| | | return success("å 餿å"); |
| | | } else { |
| | | return error("å é¤å¤±è´¥"); |
| | | } |
| | | } catch (Exception e) { |
| | | return error("å é¤å¤±è´¥ï¼" + e.getMessage()); |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.web.controller.task; |
| | | |
| | | import java.util.List; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.PutMapping; |
| | | import org.springframework.web.bind.annotation.DeleteMapping; |
| | | import org.springframework.web.bind.annotation.PathVariable; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | import com.ruoyi.common.annotation.Log; |
| | | import com.ruoyi.common.core.controller.BaseController; |
| | | import com.ruoyi.common.core.domain.AjaxResult; |
| | | import com.ruoyi.common.enums.BusinessType; |
| | | import com.ruoyi.system.domain.SysTask; |
| | | import com.ruoyi.system.domain.vo.TaskQueryVO; |
| | | import com.ruoyi.system.domain.vo.TaskCreateVO; |
| | | import com.ruoyi.system.domain.vo.TaskUpdateVO; |
| | | import com.ruoyi.system.domain.vo.TaskStatisticsVO; |
| | | import com.ruoyi.system.domain.enums.TaskStatus; |
| | | import com.ruoyi.system.service.ISysTaskService; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.common.core.page.TableDataInfo; |
| | | |
| | | /** |
| | | * ä»»å¡ç®¡çController |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/task") |
| | | public class SysTaskController extends BaseController { |
| | | |
| | | @Autowired |
| | | private ISysTaskService sysTaskService; |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡ç®¡çå表 |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:query')") |
| | | @GetMapping("/list") |
| | | public TableDataInfo list(TaskQueryVO queryVO) { |
| | | startPage(); |
| | | List<SysTask> list = sysTaskService.selectSysTaskList(queryVO); |
| | | return getDataTable(list); |
| | | } |
| | | |
| | | /** |
| | | * 导åºä»»å¡ç®¡çå表 |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:export')") |
| | | @Log(title = "ä»»å¡ç®¡ç", businessType = BusinessType.EXPORT) |
| | | @PostMapping("/export") |
| | | public void export(HttpServletResponse response, TaskQueryVO queryVO) { |
| | | List<SysTask> list = sysTaskService.selectSysTaskList(queryVO); |
| | | ExcelUtil<SysTask> util = new ExcelUtil<SysTask>(SysTask.class); |
| | | util.exportExcel(response, list, "ä»»å¡ç®¡çæ°æ®"); |
| | | } |
| | | |
| | | /** |
| | | * è·åä»»å¡ç®¡ç详ç»ä¿¡æ¯ |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:query')") |
| | | @GetMapping(value = "/{taskId}") |
| | | public AjaxResult getInfo(@PathVariable("taskId") Long taskId) { |
| | | return success(sysTaskService.getTaskDetail(taskId)); |
| | | } |
| | | |
| | | /** |
| | | * æ°å¢ä»»å¡ç®¡ç |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:add')") |
| | | @Log(title = "ä»»å¡ç®¡ç", businessType = BusinessType.INSERT) |
| | | @PostMapping |
| | | public AjaxResult add(@RequestBody TaskCreateVO createVO) { |
| | | return toAjax(sysTaskService.insertSysTask(createVO)); |
| | | } |
| | | |
| | | /** |
| | | * ä¿®æ¹ä»»å¡ç®¡ç |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:edit')") |
| | | @Log(title = "ä»»å¡ç®¡ç", businessType = BusinessType.UPDATE) |
| | | @PutMapping |
| | | public AjaxResult edit(@RequestBody TaskUpdateVO updateVO) { |
| | | return toAjax(sysTaskService.updateSysTask(updateVO)); |
| | | } |
| | | |
| | | /** |
| | | * å é¤ä»»å¡ç®¡ç |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:remove')") |
| | | @Log(title = "ä»»å¡ç®¡ç", businessType = BusinessType.DELETE) |
| | | @DeleteMapping("/{taskIds}") |
| | | public AjaxResult remove(@PathVariable Long[] taskIds) { |
| | | return toAjax(sysTaskService.deleteSysTaskByTaskIds(taskIds)); |
| | | } |
| | | |
| | | /** |
| | | * åé
ä»»å¡ |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:assign')") |
| | | @Log(title = "ä»»å¡åé
", businessType = BusinessType.UPDATE) |
| | | @PutMapping("/{taskId}/assign") |
| | | public AjaxResult assignTask(@PathVariable Long taskId, @RequestBody AssignTaskRequest request) { |
| | | return toAjax(sysTaskService.assignTask(taskId, request.getAssigneeId(), request.getRemark())); |
| | | } |
| | | |
| | | /** |
| | | * æ´æ°ä»»å¡ç¶æ |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:status')") |
| | | @Log(title = "ä»»å¡ç¶æåæ´", businessType = BusinessType.UPDATE) |
| | | @PutMapping("/{taskId}/status") |
| | | public AjaxResult changeTaskStatus(@PathVariable Long taskId, @RequestBody ChangeStatusRequest request) { |
| | | TaskStatus newStatus = TaskStatus.getByCode(request.getTaskStatus()); |
| | | if (newStatus == null) { |
| | | return error("æ æçä»»å¡ç¶æ"); |
| | | } |
| | | return toAjax(sysTaskService.changeTaskStatus(taskId, newStatus, request.getRemark())); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡ç»è®¡ä¿¡æ¯ |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:query')") |
| | | @GetMapping("/statistics") |
| | | public AjaxResult getStatistics() { |
| | | TaskStatisticsVO statistics = sysTaskService.getTaskStatistics(); |
| | | return success(statistics); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢è¶
æ¶ä»»å¡å表 |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:query')") |
| | | @GetMapping("/overdue") |
| | | public AjaxResult getOverdueTasks() { |
| | | List<SysTask> list = sysTaskService.selectOverdueTasks(); |
| | | return success(list); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢æçä»»å¡å表 |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:query')") |
| | | @GetMapping("/my") |
| | | public AjaxResult getMyTasks() { |
| | | List<SysTask> list = sysTaskService.selectMyTasks(getUserId()); |
| | | return success(list); |
| | | } |
| | | |
| | | /** |
| | | * åé
ä»»å¡è¯·æ±å¯¹è±¡ |
| | | */ |
| | | public static class AssignTaskRequest { |
| | | private Long assigneeId; |
| | | private String remark; |
| | | |
| | | public Long getAssigneeId() { |
| | | return assigneeId; |
| | | } |
| | | |
| | | public void setAssigneeId(Long assigneeId) { |
| | | this.assigneeId = assigneeId; |
| | | } |
| | | |
| | | public String getRemark() { |
| | | return remark; |
| | | } |
| | | |
| | | public void setRemark(String remark) { |
| | | this.remark = remark; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åæ´ç¶æè¯·æ±å¯¹è±¡ |
| | | */ |
| | | public static class ChangeStatusRequest { |
| | | private String taskStatus; |
| | | private String remark; |
| | | |
| | | public String getTaskStatus() { |
| | | return taskStatus; |
| | | } |
| | | |
| | | public void setTaskStatus(String taskStatus) { |
| | | this.taskStatus = taskStatus; |
| | | } |
| | | |
| | | public String getRemark() { |
| | | return remark; |
| | | } |
| | | |
| | | public void setRemark(String remark) { |
| | | this.remark = remark; |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.web.controller.task; |
| | | |
| | | import java.util.List; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.DeleteMapping; |
| | | import org.springframework.web.bind.annotation.PathVariable; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | import com.ruoyi.common.annotation.Log; |
| | | import com.ruoyi.common.core.controller.BaseController; |
| | | import com.ruoyi.common.core.domain.AjaxResult; |
| | | import com.ruoyi.common.enums.BusinessType; |
| | | import com.ruoyi.system.domain.SysTaskVehicle; |
| | | import com.ruoyi.system.service.ISysTaskService; |
| | | |
| | | /** |
| | | * ä»»å¡è½¦è¾å
³èController |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/task/vehicle") |
| | | public class SysTaskVehicleController extends BaseController { |
| | | |
| | | @Autowired |
| | | private ISysTaskService sysTaskService; |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡å
³èç车è¾å表 |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:query')") |
| | | @GetMapping("/list/{taskId}") |
| | | public AjaxResult list(@PathVariable("taskId") Long taskId) { |
| | | List<SysTaskVehicle> list = sysTaskService.getTaskVehicles(taskId); |
| | | return success(list); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢å¯ç¨è½¦è¾å表 |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:query')") |
| | | @GetMapping("/available") |
| | | public AjaxResult getAvailableVehicles(@RequestParam Long deptId, @RequestParam(required = false) String taskType) { |
| | | List<SysTaskVehicle> list = sysTaskService.getAvailableVehicles(deptId, taskType); |
| | | return success(list); |
| | | } |
| | | |
| | | /** |
| | | * åé
车è¾ç»ä»»å¡ |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:assign')") |
| | | @Log(title = "ä»»å¡è½¦è¾åé
", businessType = BusinessType.INSERT) |
| | | @PostMapping("/assign/{taskId}") |
| | | public AjaxResult assignVehicle(@PathVariable("taskId") Long taskId, @RequestBody AssignVehicleRequest request) { |
| | | try { |
| | | int result = sysTaskService.assignVehicleToTask(taskId, request.getVehicleId(), request.getRemark()); |
| | | if (result > 0) { |
| | | return success("åé
æå"); |
| | | } else { |
| | | return error("åé
失败"); |
| | | } |
| | | } catch (Exception e) { |
| | | return error("åé
失败ï¼" + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ¹éåé
车è¾ç»ä»»å¡ |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:assign')") |
| | | @Log(title = "ä»»å¡è½¦è¾æ¹éåé
", businessType = BusinessType.INSERT) |
| | | @PostMapping("/assign-batch/{taskId}") |
| | | public AjaxResult assignVehicles(@PathVariable("taskId") Long taskId, @RequestBody BatchAssignVehicleRequest request) { |
| | | try { |
| | | int result = sysTaskService.assignMultipleVehiclesToTask(taskId, request.getVehicleIds(), request.getRemark()); |
| | | if (result > 0) { |
| | | return success("æ¹éåé
æåï¼å
±åé
" + result + " è¾è½¦"); |
| | | } else { |
| | | return error("æ¹éåé
失败"); |
| | | } |
| | | } catch (Exception e) { |
| | | return error("æ¹éåé
失败ï¼" + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åæ¶ä»»å¡è½¦è¾åé
|
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:assign')") |
| | | @Log(title = "åæ¶ä»»å¡è½¦è¾åé
", businessType = BusinessType.DELETE) |
| | | @DeleteMapping("/{taskId}/{vehicleId}") |
| | | public AjaxResult unassignVehicle(@PathVariable("taskId") Long taskId, @PathVariable("vehicleId") Long vehicleId) { |
| | | try { |
| | | int result = sysTaskService.unassignVehicleFromTask(taskId, vehicleId); |
| | | if (result > 0) { |
| | | return success("åæ¶åé
æå"); |
| | | } else { |
| | | return error("åæ¶åé
失败"); |
| | | } |
| | | } catch (Exception e) { |
| | | return error("åæ¶åé
失败ï¼" + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åé
车è¾è¯·æ±å¯¹è±¡ |
| | | */ |
| | | public static class AssignVehicleRequest { |
| | | private Long vehicleId; |
| | | private String remark; |
| | | |
| | | public Long getVehicleId() { |
| | | return vehicleId; |
| | | } |
| | | |
| | | public void setVehicleId(Long vehicleId) { |
| | | this.vehicleId = vehicleId; |
| | | } |
| | | |
| | | public String getRemark() { |
| | | return remark; |
| | | } |
| | | |
| | | public void setRemark(String remark) { |
| | | this.remark = remark; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ¹éåé
车è¾è¯·æ±å¯¹è±¡ |
| | | */ |
| | | public static class BatchAssignVehicleRequest { |
| | | private List<Long> vehicleIds; |
| | | private String remark; |
| | | |
| | | public List<Long> getVehicleIds() { |
| | | return vehicleIds; |
| | | } |
| | | |
| | | public void setVehicleIds(List<Long> vehicleIds) { |
| | | this.vehicleIds = vehicleIds; |
| | | } |
| | | |
| | | public String getRemark() { |
| | | return remark; |
| | | } |
| | | |
| | | public void setRemark(String remark) { |
| | | this.remark = remark; |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.domain; |
| | | |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.common.annotation.Excel; |
| | | import com.ruoyi.common.core.domain.BaseEntity; |
| | | import com.ruoyi.system.domain.enums.TaskStatus; |
| | | import com.ruoyi.system.domain.enums.TaskType; |
| | | |
| | | /** |
| | | * ä»»å¡ç®¡ç对象 sys_task |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | public class SysTask extends BaseEntity { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** ä»»å¡ID */ |
| | | private Long taskId; |
| | | |
| | | /** ä»»å¡ç¼å· */ |
| | | @Excel(name = "ä»»å¡ç¼å·") |
| | | private String taskCode; |
| | | |
| | | /** ä»»å¡ç±»å */ |
| | | @Excel(name = "ä»»å¡ç±»å", readConverterExp = "MAINTENANCE=ç»´ä¿®ä¿å
»,FUEL=å æ²¹ä»»å¡,OTHER=å
¶ä»") |
| | | private String taskType; |
| | | |
| | | /** ä»»å¡ç¶æ */ |
| | | @Excel(name = "ä»»å¡ç¶æ", readConverterExp = "PENDING=å¾
å¼å§,IN_PROGRESS=ä»»å¡ä¸,COMPLETED=已宿,CANCELLED=已忶") |
| | | private String taskStatus; |
| | | |
| | | /** ä»»å¡æè¿° */ |
| | | @Excel(name = "ä»»å¡æè¿°") |
| | | private String taskDescription; |
| | | |
| | | /** åºåå°å */ |
| | | @Excel(name = "åºåå°å") |
| | | private String departureAddress; |
| | | |
| | | /** ç®çå°å */ |
| | | @Excel(name = "ç®çå°å") |
| | | private String destinationAddress; |
| | | |
| | | /** 计åå¼å§æ¶é´ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @Excel(name = "计åå¼å§æ¶é´", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") |
| | | private Date plannedStartTime; |
| | | |
| | | /** 计åç»ææ¶é´ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @Excel(name = "计åç»ææ¶é´", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") |
| | | private Date plannedEndTime; |
| | | |
| | | /** å®é
å¼å§æ¶é´ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @Excel(name = "å®é
å¼å§æ¶é´", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") |
| | | private Date actualStartTime; |
| | | |
| | | /** å®é
ç»ææ¶é´ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @Excel(name = "å®é
ç»ææ¶é´", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") |
| | | private Date actualEndTime; |
| | | |
| | | /** å建人ID */ |
| | | @Excel(name = "å建人ID") |
| | | private Long creatorId; |
| | | |
| | | /** æ§è¡äººID */ |
| | | @Excel(name = "æ§è¡äººID") |
| | | private Long assigneeId; |
| | | |
| | | /** å½å±é¨é¨ID */ |
| | | @Excel(name = "å½å±é¨é¨ID") |
| | | private Long deptId; |
| | | |
| | | /** å建人å§å */ |
| | | @Excel(name = "å建人") |
| | | private String creatorName; |
| | | |
| | | /** æ§è¡äººå§å */ |
| | | @Excel(name = "æ§è¡äºº") |
| | | private String assigneeName; |
| | | |
| | | /** é¨é¨åç§° */ |
| | | @Excel(name = "é¨é¨åç§°") |
| | | private String deptName; |
| | | |
| | | /** å 餿 å¿ï¼0代表åå¨ 2代表å é¤ï¼ */ |
| | | private String delFlag; |
| | | |
| | | /** å
³è车è¾å表 */ |
| | | private List<SysTaskVehicle> assignedVehicles; |
| | | |
| | | /** éä»¶å表 */ |
| | | private List<SysTaskAttachment> attachments; |
| | | |
| | | /** æä½æ¥å¿å表 */ |
| | | private List<SysTaskLog> operationLogs; |
| | | |
| | | public void setTaskId(Long taskId) { |
| | | this.taskId = taskId; |
| | | } |
| | | |
| | | public Long getTaskId() { |
| | | return taskId; |
| | | } |
| | | |
| | | public void setTaskCode(String taskCode) { |
| | | this.taskCode = taskCode; |
| | | } |
| | | |
| | | public String getTaskCode() { |
| | | return taskCode; |
| | | } |
| | | |
| | | public void setTaskType(String taskType) { |
| | | this.taskType = taskType; |
| | | } |
| | | |
| | | public String getTaskType() { |
| | | return taskType; |
| | | } |
| | | |
| | | public void setTaskStatus(String taskStatus) { |
| | | this.taskStatus = taskStatus; |
| | | } |
| | | |
| | | public String getTaskStatus() { |
| | | return taskStatus; |
| | | } |
| | | |
| | | public void setTaskDescription(String taskDescription) { |
| | | this.taskDescription = taskDescription; |
| | | } |
| | | |
| | | public String getTaskDescription() { |
| | | return taskDescription; |
| | | } |
| | | |
| | | public void setDepartureAddress(String departureAddress) { |
| | | this.departureAddress = departureAddress; |
| | | } |
| | | |
| | | public String getDepartureAddress() { |
| | | return departureAddress; |
| | | } |
| | | |
| | | public void setDestinationAddress(String destinationAddress) { |
| | | this.destinationAddress = destinationAddress; |
| | | } |
| | | |
| | | public String getDestinationAddress() { |
| | | return destinationAddress; |
| | | } |
| | | |
| | | public void setPlannedStartTime(Date plannedStartTime) { |
| | | this.plannedStartTime = plannedStartTime; |
| | | } |
| | | |
| | | public Date getPlannedStartTime() { |
| | | return plannedStartTime; |
| | | } |
| | | |
| | | public void setPlannedEndTime(Date plannedEndTime) { |
| | | this.plannedEndTime = plannedEndTime; |
| | | } |
| | | |
| | | public Date getPlannedEndTime() { |
| | | return plannedEndTime; |
| | | } |
| | | |
| | | public void setActualStartTime(Date actualStartTime) { |
| | | this.actualStartTime = actualStartTime; |
| | | } |
| | | |
| | | public Date getActualStartTime() { |
| | | return actualStartTime; |
| | | } |
| | | |
| | | public void setActualEndTime(Date actualEndTime) { |
| | | this.actualEndTime = actualEndTime; |
| | | } |
| | | |
| | | public Date getActualEndTime() { |
| | | return actualEndTime; |
| | | } |
| | | |
| | | public void setCreatorId(Long creatorId) { |
| | | this.creatorId = creatorId; |
| | | } |
| | | |
| | | public Long getCreatorId() { |
| | | return creatorId; |
| | | } |
| | | |
| | | public void setAssigneeId(Long assigneeId) { |
| | | this.assigneeId = assigneeId; |
| | | } |
| | | |
| | | public Long getAssigneeId() { |
| | | return assigneeId; |
| | | } |
| | | |
| | | public void setDeptId(Long deptId) { |
| | | this.deptId = deptId; |
| | | } |
| | | |
| | | public Long getDeptId() { |
| | | return deptId; |
| | | } |
| | | |
| | | public void setCreatorName(String creatorName) { |
| | | this.creatorName = creatorName; |
| | | } |
| | | |
| | | public String getCreatorName() { |
| | | return creatorName; |
| | | } |
| | | |
| | | public void setAssigneeName(String assigneeName) { |
| | | this.assigneeName = assigneeName; |
| | | } |
| | | |
| | | public String getAssigneeName() { |
| | | return assigneeName; |
| | | } |
| | | |
| | | public void setDeptName(String deptName) { |
| | | this.deptName = deptName; |
| | | } |
| | | |
| | | public String getDeptName() { |
| | | return deptName; |
| | | } |
| | | |
| | | public void setDelFlag(String delFlag) { |
| | | this.delFlag = delFlag; |
| | | } |
| | | |
| | | public String getDelFlag() { |
| | | return delFlag; |
| | | } |
| | | |
| | | public void setAssignedVehicles(List<SysTaskVehicle> assignedVehicles) { |
| | | this.assignedVehicles = assignedVehicles; |
| | | } |
| | | |
| | | public List<SysTaskVehicle> getAssignedVehicles() { |
| | | return assignedVehicles; |
| | | } |
| | | |
| | | public void setAttachments(List<SysTaskAttachment> attachments) { |
| | | this.attachments = attachments; |
| | | } |
| | | |
| | | public List<SysTaskAttachment> getAttachments() { |
| | | return attachments; |
| | | } |
| | | |
| | | public void setOperationLogs(List<SysTaskLog> operationLogs) { |
| | | this.operationLogs = operationLogs; |
| | | } |
| | | |
| | | public List<SysTaskLog> getOperationLogs() { |
| | | return operationLogs; |
| | | } |
| | | |
| | | /** |
| | | * 夿æ¯å¦å¯ä»¥åæ´ç¶æ |
| | | */ |
| | | public boolean canChangeStatus(TaskStatus newStatus) { |
| | | TaskStatus currentStatus = TaskStatus.getByCode(this.taskStatus); |
| | | if (currentStatus == null || newStatus == null) { |
| | | return false; |
| | | } |
| | | |
| | | // ç¶ææµè½¬è§å |
| | | switch (currentStatus) { |
| | | case PENDING: |
| | | return newStatus == TaskStatus.IN_PROGRESS || newStatus == TaskStatus.CANCELLED; |
| | | case IN_PROGRESS: |
| | | return newStatus == TaskStatus.COMPLETED || newStatus == TaskStatus.CANCELLED || newStatus == TaskStatus.PENDING; |
| | | case COMPLETED: |
| | | case CANCELLED: |
| | | return false; |
| | | default: |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 夿æ¯å¦è¶
æ¶ |
| | | */ |
| | | public boolean isOverdue() { |
| | | if (plannedEndTime == null) { |
| | | return false; |
| | | } |
| | | return new Date().after(plannedEndTime) && !TaskStatus.COMPLETED.getCode().equals(taskStatus); |
| | | } |
| | | |
| | | /** |
| | | * è·åä»»å¡æç»æ¶é´ï¼åéï¼ |
| | | */ |
| | | public long getDuration() { |
| | | if (actualStartTime != null && actualEndTime != null) { |
| | | return (actualEndTime.getTime() - actualStartTime.getTime()) / (1000 * 60); |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | /** |
| | | * å¼å§ä»»å¡ |
| | | */ |
| | | public void start() { |
| | | this.taskStatus = TaskStatus.IN_PROGRESS.getCode(); |
| | | this.actualStartTime = new Date(); |
| | | } |
| | | |
| | | /** |
| | | * å®æä»»å¡ |
| | | */ |
| | | public void complete() { |
| | | this.taskStatus = TaskStatus.COMPLETED.getCode(); |
| | | this.actualEndTime = new Date(); |
| | | } |
| | | |
| | | /** |
| | | * åæ¶ä»»å¡ |
| | | */ |
| | | public void cancel() { |
| | | this.taskStatus = TaskStatus.CANCELLED.getCode(); |
| | | } |
| | | |
| | | /** |
| | | * æ£æ¥æ¯å¦åé
äºæå®è½¦è¾ |
| | | */ |
| | | public boolean hasVehicle(Long vehicleId) { |
| | | if (assignedVehicles == null || vehicleId == null) { |
| | | return false; |
| | | } |
| | | return assignedVehicles.stream().anyMatch(v -> vehicleId.equals(v.getVehicleId())); |
| | | } |
| | | |
| | | @Override |
| | | public String toString() { |
| | | return "SysTask{" + |
| | | "taskId=" + taskId + |
| | | ", taskCode='" + taskCode + '\'' + |
| | | ", taskType='" + taskType + '\'' + |
| | | ", taskStatus='" + taskStatus + '\'' + |
| | | ", taskDescription='" + taskDescription + '\'' + |
| | | ", departureAddress='" + departureAddress + '\'' + |
| | | ", destinationAddress='" + destinationAddress + '\'' + |
| | | ", plannedStartTime=" + plannedStartTime + |
| | | ", plannedEndTime=" + plannedEndTime + |
| | | ", actualStartTime=" + actualStartTime + |
| | | ", actualEndTime=" + actualEndTime + |
| | | ", creatorId=" + creatorId + |
| | | ", assigneeId=" + assigneeId + |
| | | ", deptId=" + deptId + |
| | | ", creatorName='" + creatorName + '\'' + |
| | | ", assigneeName='" + assigneeName + '\'' + |
| | | ", deptName='" + deptName + '\'' + |
| | | '}'; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.domain; |
| | | |
| | | import java.util.Date; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.common.annotation.Excel; |
| | | import com.ruoyi.common.core.domain.BaseEntity; |
| | | |
| | | /** |
| | | * ä»»å¡é件对象 sys_task_attachment |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | public class SysTaskAttachment extends BaseEntity { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** éä»¶ID */ |
| | | private Long attachmentId; |
| | | |
| | | /** ä»»å¡ID */ |
| | | @Excel(name = "ä»»å¡ID") |
| | | private Long taskId; |
| | | |
| | | /** æä»¶å */ |
| | | @Excel(name = "æä»¶å") |
| | | private String fileName; |
| | | |
| | | /** æä»¶è·¯å¾ */ |
| | | @Excel(name = "æä»¶è·¯å¾") |
| | | private String filePath; |
| | | |
| | | /** æä»¶å¤§å°ï¼åèï¼ */ |
| | | @Excel(name = "æä»¶å¤§å°") |
| | | private Long fileSize; |
| | | |
| | | /** æä»¶ç±»å */ |
| | | @Excel(name = "æä»¶ç±»å") |
| | | private String fileType; |
| | | |
| | | /** ä¸ä¼ æ¶é´ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @Excel(name = "ä¸ä¼ æ¶é´", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") |
| | | private Date uploadTime; |
| | | |
| | | /** ä¸ä¼ è
*/ |
| | | @Excel(name = "ä¸ä¼ è
") |
| | | private String uploadBy; |
| | | |
| | | public void setAttachmentId(Long attachmentId) { |
| | | this.attachmentId = attachmentId; |
| | | } |
| | | |
| | | public Long getAttachmentId() { |
| | | return attachmentId; |
| | | } |
| | | |
| | | public void setTaskId(Long taskId) { |
| | | this.taskId = taskId; |
| | | } |
| | | |
| | | public Long getTaskId() { |
| | | return taskId; |
| | | } |
| | | |
| | | public void setFileName(String fileName) { |
| | | this.fileName = fileName; |
| | | } |
| | | |
| | | public String getFileName() { |
| | | return fileName; |
| | | } |
| | | |
| | | public void setFilePath(String filePath) { |
| | | this.filePath = filePath; |
| | | } |
| | | |
| | | public String getFilePath() { |
| | | return filePath; |
| | | } |
| | | |
| | | public void setFileSize(Long fileSize) { |
| | | this.fileSize = fileSize; |
| | | } |
| | | |
| | | public Long getFileSize() { |
| | | return fileSize; |
| | | } |
| | | |
| | | public void setFileType(String fileType) { |
| | | this.fileType = fileType; |
| | | } |
| | | |
| | | public String getFileType() { |
| | | return fileType; |
| | | } |
| | | |
| | | public void setUploadTime(Date uploadTime) { |
| | | this.uploadTime = uploadTime; |
| | | } |
| | | |
| | | public Date getUploadTime() { |
| | | return uploadTime; |
| | | } |
| | | |
| | | public void setUploadBy(String uploadBy) { |
| | | this.uploadBy = uploadBy; |
| | | } |
| | | |
| | | public String getUploadBy() { |
| | | return uploadBy; |
| | | } |
| | | |
| | | @Override |
| | | public String toString() { |
| | | return "SysTaskAttachment{" + |
| | | "attachmentId=" + attachmentId + |
| | | ", taskId=" + taskId + |
| | | ", fileName='" + fileName + '\'' + |
| | | ", filePath='" + filePath + '\'' + |
| | | ", fileSize=" + fileSize + |
| | | ", fileType='" + fileType + '\'' + |
| | | ", uploadTime=" + uploadTime + |
| | | ", uploadBy='" + uploadBy + '\'' + |
| | | '}'; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.domain; |
| | | |
| | | import java.util.Date; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.common.annotation.Excel; |
| | | import com.ruoyi.common.core.domain.BaseEntity; |
| | | |
| | | /** |
| | | * 任塿使¥å¿å¯¹è±¡ sys_task_log |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | public class SysTaskLog extends BaseEntity { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** æ¥å¿ID */ |
| | | private Long logId; |
| | | |
| | | /** ä»»å¡ID */ |
| | | @Excel(name = "ä»»å¡ID") |
| | | private Long taskId; |
| | | |
| | | /** æä½ç±»å */ |
| | | @Excel(name = "æä½ç±»å", readConverterExp = "CREATE=å建,UPDATE=æ´æ°,ASSIGN=åé
,STATUS_CHANGE=ç¶æåæ´,DELETE=å é¤") |
| | | private String operationType; |
| | | |
| | | /** æä½æè¿° */ |
| | | @Excel(name = "æä½æè¿°") |
| | | private String operationDesc; |
| | | |
| | | /** æä½åå¼ */ |
| | | @Excel(name = "æä½åå¼") |
| | | private String oldValue; |
| | | |
| | | /** æä½åå¼ */ |
| | | @Excel(name = "æä½åå¼") |
| | | private String newValue; |
| | | |
| | | /** æä½äººID */ |
| | | @Excel(name = "æä½äººID") |
| | | private Long operatorId; |
| | | |
| | | /** æä½äººå§å */ |
| | | @Excel(name = "æä½äººå§å") |
| | | private String operatorName; |
| | | |
| | | /** æä½æ¶é´ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @Excel(name = "æä½æ¶é´", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") |
| | | private Date operationTime; |
| | | |
| | | /** IPå°å */ |
| | | @Excel(name = "IPå°å") |
| | | private String ipAddress; |
| | | |
| | | public void setLogId(Long logId) { |
| | | this.logId = logId; |
| | | } |
| | | |
| | | public Long getLogId() { |
| | | return logId; |
| | | } |
| | | |
| | | public void setTaskId(Long taskId) { |
| | | this.taskId = taskId; |
| | | } |
| | | |
| | | public Long getTaskId() { |
| | | return taskId; |
| | | } |
| | | |
| | | public void setOperationType(String operationType) { |
| | | this.operationType = operationType; |
| | | } |
| | | |
| | | public String getOperationType() { |
| | | return operationType; |
| | | } |
| | | |
| | | public void setOperationDesc(String operationDesc) { |
| | | this.operationDesc = operationDesc; |
| | | } |
| | | |
| | | public String getOperationDesc() { |
| | | return operationDesc; |
| | | } |
| | | |
| | | public void setOldValue(String oldValue) { |
| | | this.oldValue = oldValue; |
| | | } |
| | | |
| | | public String getOldValue() { |
| | | return oldValue; |
| | | } |
| | | |
| | | public void setNewValue(String newValue) { |
| | | this.newValue = newValue; |
| | | } |
| | | |
| | | public String getNewValue() { |
| | | return newValue; |
| | | } |
| | | |
| | | public void setOperatorId(Long operatorId) { |
| | | this.operatorId = operatorId; |
| | | } |
| | | |
| | | public Long getOperatorId() { |
| | | return operatorId; |
| | | } |
| | | |
| | | public void setOperatorName(String operatorName) { |
| | | this.operatorName = operatorName; |
| | | } |
| | | |
| | | public String getOperatorName() { |
| | | return operatorName; |
| | | } |
| | | |
| | | public void setOperationTime(Date operationTime) { |
| | | this.operationTime = operationTime; |
| | | } |
| | | |
| | | public Date getOperationTime() { |
| | | return operationTime; |
| | | } |
| | | |
| | | public void setIpAddress(String ipAddress) { |
| | | this.ipAddress = ipAddress; |
| | | } |
| | | |
| | | public String getIpAddress() { |
| | | return ipAddress; |
| | | } |
| | | |
| | | @Override |
| | | public String toString() { |
| | | return "SysTaskLog{" + |
| | | "logId=" + logId + |
| | | ", taskId=" + taskId + |
| | | ", operationType='" + operationType + '\'' + |
| | | ", operationDesc='" + operationDesc + '\'' + |
| | | ", oldValue='" + oldValue + '\'' + |
| | | ", newValue='" + newValue + '\'' + |
| | | ", operatorId=" + operatorId + |
| | | ", operatorName='" + operatorName + '\'' + |
| | | ", operationTime=" + operationTime + |
| | | ", ipAddress='" + ipAddress + '\'' + |
| | | '}'; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.domain; |
| | | |
| | | import java.util.Date; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.common.annotation.Excel; |
| | | import com.ruoyi.common.core.domain.BaseEntity; |
| | | |
| | | /** |
| | | * ä»»å¡è½¦è¾å
³è对象 sys_task_vehicle |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | public class SysTaskVehicle extends BaseEntity { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** å
³èID */ |
| | | private Long id; |
| | | |
| | | /** ä»»å¡ID */ |
| | | @Excel(name = "ä»»å¡ID") |
| | | private Long taskId; |
| | | |
| | | /** 车è¾ID */ |
| | | @Excel(name = "车è¾ID") |
| | | private Long vehicleId; |
| | | |
| | | /** åé
æ¶é´ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @Excel(name = "åé
æ¶é´", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") |
| | | private Date assignTime; |
| | | |
| | | /** åé
人 */ |
| | | @Excel(name = "åé
人") |
| | | private String assignBy; |
| | | |
| | | /** å
³èç¶æ */ |
| | | @Excel(name = "å
³èç¶æ", readConverterExp = "ASSIGNED=å·²åé
,ACTIVE=æ§è¡ä¸,COMPLETED=已宿,CANCELLED=已忶") |
| | | private String status; |
| | | |
| | | /** 车çå· */ |
| | | @Excel(name = "车çå·") |
| | | private String vehicleNo; |
| | | |
| | | /** 车è¾ç±»å */ |
| | | @Excel(name = "车è¾ç±»å", readConverterExp = "AMBULANCE=ææ¤è½¦,TRANSFER=转è¿è½¦,MAINTENANCE=维修车") |
| | | private String vehicleType; |
| | | |
| | | /** 车è¾åç */ |
| | | @Excel(name = "车è¾åç") |
| | | private String vehicleBrand; |
| | | |
| | | /** 车è¾åå· */ |
| | | @Excel(name = "车è¾åå·") |
| | | private String vehicleModel; |
| | | |
| | | public void setId(Long id) { |
| | | this.id = id; |
| | | } |
| | | |
| | | public Long getId() { |
| | | return id; |
| | | } |
| | | |
| | | public void setTaskId(Long taskId) { |
| | | this.taskId = taskId; |
| | | } |
| | | |
| | | public Long getTaskId() { |
| | | return taskId; |
| | | } |
| | | |
| | | public void setVehicleId(Long vehicleId) { |
| | | this.vehicleId = vehicleId; |
| | | } |
| | | |
| | | public Long getVehicleId() { |
| | | return vehicleId; |
| | | } |
| | | |
| | | public void setAssignTime(Date assignTime) { |
| | | this.assignTime = assignTime; |
| | | } |
| | | |
| | | public Date getAssignTime() { |
| | | return assignTime; |
| | | } |
| | | |
| | | public void setAssignBy(String assignBy) { |
| | | this.assignBy = assignBy; |
| | | } |
| | | |
| | | public String getAssignBy() { |
| | | return assignBy; |
| | | } |
| | | |
| | | public void setStatus(String status) { |
| | | this.status = status; |
| | | } |
| | | |
| | | public String getStatus() { |
| | | return status; |
| | | } |
| | | |
| | | public void setVehicleNo(String vehicleNo) { |
| | | this.vehicleNo = vehicleNo; |
| | | } |
| | | |
| | | public String getVehicleNo() { |
| | | return vehicleNo; |
| | | } |
| | | |
| | | public void setVehicleType(String vehicleType) { |
| | | this.vehicleType = vehicleType; |
| | | } |
| | | |
| | | public String getVehicleType() { |
| | | return vehicleType; |
| | | } |
| | | |
| | | public void setVehicleBrand(String vehicleBrand) { |
| | | this.vehicleBrand = vehicleBrand; |
| | | } |
| | | |
| | | public String getVehicleBrand() { |
| | | return vehicleBrand; |
| | | } |
| | | |
| | | public void setVehicleModel(String vehicleModel) { |
| | | this.vehicleModel = vehicleModel; |
| | | } |
| | | |
| | | public String getVehicleModel() { |
| | | return vehicleModel; |
| | | } |
| | | |
| | | @Override |
| | | public String toString() { |
| | | return "SysTaskVehicle{" + |
| | | "id=" + id + |
| | | ", taskId=" + taskId + |
| | | ", vehicleId=" + vehicleId + |
| | | ", assignTime=" + assignTime + |
| | | ", assignBy='" + assignBy + '\'' + |
| | | ", status='" + status + '\'' + |
| | | ", vehicleNo='" + vehicleNo + '\'' + |
| | | ", vehicleType='" + vehicleType + '\'' + |
| | | ", vehicleBrand='" + vehicleBrand + '\'' + |
| | | ", vehicleModel='" + vehicleModel + '\'' + |
| | | '}'; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.domain.enums; |
| | | |
| | | /** |
| | | * ä»»å¡ç¶ææä¸¾ |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public enum TaskStatus { |
| | | |
| | | /** å¾
å¼å§ */ |
| | | PENDING("PENDING", "å¾
å¼å§"), |
| | | |
| | | /** ä»»å¡ä¸ */ |
| | | IN_PROGRESS("IN_PROGRESS", "ä»»å¡ä¸"), |
| | | |
| | | /** 已宿 */ |
| | | COMPLETED("COMPLETED", "已宿"), |
| | | |
| | | /** 已忶 */ |
| | | CANCELLED("CANCELLED", "已忶"); |
| | | |
| | | private final String code; |
| | | private final String info; |
| | | |
| | | TaskStatus(String code, String info) { |
| | | this.code = code; |
| | | this.info = info; |
| | | } |
| | | |
| | | public String getCode() { |
| | | return code; |
| | | } |
| | | |
| | | public String getInfo() { |
| | | return info; |
| | | } |
| | | |
| | | public static TaskStatus getByCode(String code) { |
| | | for (TaskStatus status : values()) { |
| | | if (status.getCode().equals(code)) { |
| | | return status; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.domain.enums; |
| | | |
| | | /** |
| | | * ä»»å¡ç±»åæä¸¾ |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public enum TaskType { |
| | | |
| | | /** ç»´ä¿®ä¿å
» */ |
| | | MAINTENANCE("MAINTENANCE", "ç»´ä¿®ä¿å
»"), |
| | | |
| | | /** å æ²¹ä»»å¡ */ |
| | | FUEL("FUEL", "å æ²¹ä»»å¡"), |
| | | |
| | | /** å
¶ä» */ |
| | | OTHER("OTHER", "å
¶ä»"); |
| | | |
| | | private final String code; |
| | | private final String info; |
| | | |
| | | TaskType(String code, String info) { |
| | | this.code = code; |
| | | this.info = info; |
| | | } |
| | | |
| | | public String getCode() { |
| | | return code; |
| | | } |
| | | |
| | | public String getInfo() { |
| | | return info; |
| | | } |
| | | |
| | | public static TaskType getByCode(String code) { |
| | | for (TaskType type : values()) { |
| | | if (type.getCode().equals(code)) { |
| | | return type; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.domain.enums; |
| | | |
| | | /** |
| | | * ä»»å¡è½¦è¾å
³èç¶ææä¸¾ |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public enum TaskVehicleStatus { |
| | | |
| | | /** å·²åé
*/ |
| | | ASSIGNED("ASSIGNED", "å·²åé
"), |
| | | |
| | | /** æ§è¡ä¸ */ |
| | | ACTIVE("ACTIVE", "æ§è¡ä¸"), |
| | | |
| | | /** 已宿 */ |
| | | COMPLETED("COMPLETED", "已宿"), |
| | | |
| | | /** 已忶 */ |
| | | CANCELLED("CANCELLED", "已忶"); |
| | | |
| | | private final String code; |
| | | private final String info; |
| | | |
| | | TaskVehicleStatus(String code, String info) { |
| | | this.code = code; |
| | | this.info = info; |
| | | } |
| | | |
| | | public String getCode() { |
| | | return code; |
| | | } |
| | | |
| | | public String getInfo() { |
| | | return info; |
| | | } |
| | | |
| | | public static TaskVehicleStatus getByCode(String code) { |
| | | for (TaskVehicleStatus status : values()) { |
| | | if (status.getCode().equals(code)) { |
| | | return status; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.domain.enums; |
| | | |
| | | /** |
| | | * 车è¾ç±»åæä¸¾ |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public enum VehicleType { |
| | | |
| | | /** ææ¤è½¦ */ |
| | | AMBULANCE("AMBULANCE", "ææ¤è½¦"), |
| | | |
| | | /** 转è¿è½¦ */ |
| | | TRANSFER("TRANSFER", "转è¿è½¦"), |
| | | |
| | | /** 维修车 */ |
| | | MAINTENANCE("MAINTENANCE", "维修车"); |
| | | |
| | | private final String code; |
| | | private final String info; |
| | | |
| | | VehicleType(String code, String info) { |
| | | this.code = code; |
| | | this.info = info; |
| | | } |
| | | |
| | | public String getCode() { |
| | | return code; |
| | | } |
| | | |
| | | public String getInfo() { |
| | | return info; |
| | | } |
| | | |
| | | public static VehicleType getByCode(String code) { |
| | | for (VehicleType type : values()) { |
| | | if (type.getCode().equals(code)) { |
| | | return type; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.domain.vo; |
| | | |
| | | import java.util.Date; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | |
| | | /** |
| | | * ä»»å¡å建对象 |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | public class TaskCreateVO { |
| | | |
| | | /** ä»»å¡ç±»å */ |
| | | private String taskType; |
| | | |
| | | /** ä»»å¡æè¿° */ |
| | | private String taskDescription; |
| | | |
| | | /** åºåå°å */ |
| | | private String departureAddress; |
| | | |
| | | /** ç®çå°å */ |
| | | private String destinationAddress; |
| | | |
| | | /** 计åå¼å§æ¶é´ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date plannedStartTime; |
| | | |
| | | /** 计åç»ææ¶é´ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date plannedEndTime; |
| | | |
| | | /** æ§è¡äººID */ |
| | | private Long assigneeId; |
| | | |
| | | /** 夿³¨ */ |
| | | private String remark; |
| | | |
| | | public String getTaskType() { |
| | | return taskType; |
| | | } |
| | | |
| | | public void setTaskType(String taskType) { |
| | | this.taskType = taskType; |
| | | } |
| | | |
| | | public String getTaskDescription() { |
| | | return taskDescription; |
| | | } |
| | | |
| | | public void setTaskDescription(String taskDescription) { |
| | | this.taskDescription = taskDescription; |
| | | } |
| | | |
| | | public String getDepartureAddress() { |
| | | return departureAddress; |
| | | } |
| | | |
| | | public void setDepartureAddress(String departureAddress) { |
| | | this.departureAddress = departureAddress; |
| | | } |
| | | |
| | | public String getDestinationAddress() { |
| | | return destinationAddress; |
| | | } |
| | | |
| | | public void setDestinationAddress(String destinationAddress) { |
| | | this.destinationAddress = destinationAddress; |
| | | } |
| | | |
| | | public Date getPlannedStartTime() { |
| | | return plannedStartTime; |
| | | } |
| | | |
| | | public void setPlannedStartTime(Date plannedStartTime) { |
| | | this.plannedStartTime = plannedStartTime; |
| | | } |
| | | |
| | | public Date getPlannedEndTime() { |
| | | return plannedEndTime; |
| | | } |
| | | |
| | | public void setPlannedEndTime(Date plannedEndTime) { |
| | | this.plannedEndTime = plannedEndTime; |
| | | } |
| | | |
| | | public Long getAssigneeId() { |
| | | return assigneeId; |
| | | } |
| | | |
| | | public void setAssigneeId(Long assigneeId) { |
| | | this.assigneeId = assigneeId; |
| | | } |
| | | |
| | | public String getRemark() { |
| | | return remark; |
| | | } |
| | | |
| | | public void setRemark(String remark) { |
| | | this.remark = remark; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.domain.vo; |
| | | |
| | | import java.util.Date; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.common.core.domain.BaseEntity; |
| | | |
| | | /** |
| | | * 任塿¥è¯¢å¯¹è±¡ sys_task |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | public class TaskQueryVO extends BaseEntity { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** ä»»å¡ç¼å· */ |
| | | private String taskCode; |
| | | |
| | | /** ä»»å¡ç±»å */ |
| | | private String taskType; |
| | | |
| | | /** ä»»å¡ç¶æ */ |
| | | private String taskStatus; |
| | | |
| | | /** å建人ID */ |
| | | private Long creatorId; |
| | | |
| | | /** æ§è¡äººID */ |
| | | private Long assigneeId; |
| | | |
| | | /** å½å±é¨é¨ID */ |
| | | private Long deptId; |
| | | |
| | | /** 计åå¼å§æ¶é´-å¼å§ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date plannedStartTimeBegin; |
| | | |
| | | /** 计åå¼å§æ¶é´-ç»æ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date plannedStartTimeEnd; |
| | | |
| | | /** 计åç»ææ¶é´-å¼å§ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date plannedEndTimeBegin; |
| | | |
| | | /** 计åç»ææ¶é´-ç»æ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date plannedEndTimeEnd; |
| | | |
| | | /** æ¯å¦è¶
æ¶ */ |
| | | private Boolean overdue; |
| | | |
| | | public String getTaskCode() { |
| | | return taskCode; |
| | | } |
| | | |
| | | public void setTaskCode(String taskCode) { |
| | | this.taskCode = taskCode; |
| | | } |
| | | |
| | | public String getTaskType() { |
| | | return taskType; |
| | | } |
| | | |
| | | public void setTaskType(String taskType) { |
| | | this.taskType = taskType; |
| | | } |
| | | |
| | | public String getTaskStatus() { |
| | | return taskStatus; |
| | | } |
| | | |
| | | public void setTaskStatus(String taskStatus) { |
| | | this.taskStatus = taskStatus; |
| | | } |
| | | |
| | | public Long getCreatorId() { |
| | | return creatorId; |
| | | } |
| | | |
| | | public void setCreatorId(Long creatorId) { |
| | | this.creatorId = creatorId; |
| | | } |
| | | |
| | | public Long getAssigneeId() { |
| | | return assigneeId; |
| | | } |
| | | |
| | | public void setAssigneeId(Long assigneeId) { |
| | | this.assigneeId = assigneeId; |
| | | } |
| | | |
| | | public Long getDeptId() { |
| | | return deptId; |
| | | } |
| | | |
| | | public void setDeptId(Long deptId) { |
| | | this.deptId = deptId; |
| | | } |
| | | |
| | | public Date getPlannedStartTimeBegin() { |
| | | return plannedStartTimeBegin; |
| | | } |
| | | |
| | | public void setPlannedStartTimeBegin(Date plannedStartTimeBegin) { |
| | | this.plannedStartTimeBegin = plannedStartTimeBegin; |
| | | } |
| | | |
| | | public Date getPlannedStartTimeEnd() { |
| | | return plannedStartTimeEnd; |
| | | } |
| | | |
| | | public void setPlannedStartTimeEnd(Date plannedStartTimeEnd) { |
| | | this.plannedStartTimeEnd = plannedStartTimeEnd; |
| | | } |
| | | |
| | | public Date getPlannedEndTimeBegin() { |
| | | return plannedEndTimeBegin; |
| | | } |
| | | |
| | | public void setPlannedEndTimeBegin(Date plannedEndTimeBegin) { |
| | | this.plannedEndTimeBegin = plannedEndTimeBegin; |
| | | } |
| | | |
| | | public Date getPlannedEndTimeEnd() { |
| | | return plannedEndTimeEnd; |
| | | } |
| | | |
| | | public void setPlannedEndTimeEnd(Date plannedEndTimeEnd) { |
| | | this.plannedEndTimeEnd = plannedEndTimeEnd; |
| | | } |
| | | |
| | | public Boolean getOverdue() { |
| | | return overdue; |
| | | } |
| | | |
| | | public void setOverdue(Boolean overdue) { |
| | | this.overdue = overdue; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.domain.vo; |
| | | |
| | | /** |
| | | * ä»»å¡ç»è®¡å¯¹è±¡ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | public class TaskStatisticsVO { |
| | | |
| | | /** æ»ä»»å¡æ° */ |
| | | private Long totalTasks; |
| | | |
| | | /** å¾
å¼å§ä»»å¡æ° */ |
| | | private Long pendingTasks; |
| | | |
| | | /** ä»»å¡ä¸æ°é */ |
| | | private Long inProgressTasks; |
| | | |
| | | /** 已宿任塿° */ |
| | | private Long completedTasks; |
| | | |
| | | /** 已忶任塿° */ |
| | | private Long cancelledTasks; |
| | | |
| | | /** 仿¥ä»»å¡æ° */ |
| | | private Long todayTasks; |
| | | |
| | | /** è¶
æ¶ä»»å¡æ° */ |
| | | private Long overdueTasks; |
| | | |
| | | /** 车è¾å©ç¨ç */ |
| | | private Double vehicleUtilization; |
| | | |
| | | public Long getTotalTasks() { |
| | | return totalTasks; |
| | | } |
| | | |
| | | public void setTotalTasks(Long totalTasks) { |
| | | this.totalTasks = totalTasks; |
| | | } |
| | | |
| | | public Long getPendingTasks() { |
| | | return pendingTasks; |
| | | } |
| | | |
| | | public void setPendingTasks(Long pendingTasks) { |
| | | this.pendingTasks = pendingTasks; |
| | | } |
| | | |
| | | public Long getInProgressTasks() { |
| | | return inProgressTasks; |
| | | } |
| | | |
| | | public void setInProgressTasks(Long inProgressTasks) { |
| | | this.inProgressTasks = inProgressTasks; |
| | | } |
| | | |
| | | public Long getCompletedTasks() { |
| | | return completedTasks; |
| | | } |
| | | |
| | | public void setCompletedTasks(Long completedTasks) { |
| | | this.completedTasks = completedTasks; |
| | | } |
| | | |
| | | public Long getCancelledTasks() { |
| | | return cancelledTasks; |
| | | } |
| | | |
| | | public void setCancelledTasks(Long cancelledTasks) { |
| | | this.cancelledTasks = cancelledTasks; |
| | | } |
| | | |
| | | public Long getTodayTasks() { |
| | | return todayTasks; |
| | | } |
| | | |
| | | public void setTodayTasks(Long todayTasks) { |
| | | this.todayTasks = todayTasks; |
| | | } |
| | | |
| | | public Long getOverdueTasks() { |
| | | return overdueTasks; |
| | | } |
| | | |
| | | public void setOverdueTasks(Long overdueTasks) { |
| | | this.overdueTasks = overdueTasks; |
| | | } |
| | | |
| | | public Double getVehicleUtilization() { |
| | | return vehicleUtilization; |
| | | } |
| | | |
| | | public void setVehicleUtilization(Double vehicleUtilization) { |
| | | this.vehicleUtilization = vehicleUtilization; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.domain.vo; |
| | | |
| | | import java.util.Date; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | |
| | | /** |
| | | * 任塿´æ°å¯¹è±¡ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | public class TaskUpdateVO { |
| | | |
| | | /** ä»»å¡ID */ |
| | | private Long taskId; |
| | | |
| | | /** ä»»å¡æè¿° */ |
| | | private String taskDescription; |
| | | |
| | | /** åºåå°å */ |
| | | private String departureAddress; |
| | | |
| | | /** ç®çå°å */ |
| | | private String destinationAddress; |
| | | |
| | | /** 计åå¼å§æ¶é´ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date plannedStartTime; |
| | | |
| | | /** 计åç»ææ¶é´ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date plannedEndTime; |
| | | |
| | | /** æ§è¡äººID */ |
| | | private Long assigneeId; |
| | | |
| | | /** 夿³¨ */ |
| | | private String remark; |
| | | |
| | | public Long getTaskId() { |
| | | return taskId; |
| | | } |
| | | |
| | | public void setTaskId(Long taskId) { |
| | | this.taskId = taskId; |
| | | } |
| | | |
| | | public String getTaskDescription() { |
| | | return taskDescription; |
| | | } |
| | | |
| | | public void setTaskDescription(String taskDescription) { |
| | | this.taskDescription = taskDescription; |
| | | } |
| | | |
| | | public String getDepartureAddress() { |
| | | return departureAddress; |
| | | } |
| | | |
| | | public void setDepartureAddress(String departureAddress) { |
| | | this.departureAddress = departureAddress; |
| | | } |
| | | |
| | | public String getDestinationAddress() { |
| | | return destinationAddress; |
| | | } |
| | | |
| | | public void setDestinationAddress(String destinationAddress) { |
| | | this.destinationAddress = destinationAddress; |
| | | } |
| | | |
| | | public Date getPlannedStartTime() { |
| | | return plannedStartTime; |
| | | } |
| | | |
| | | public void setPlannedStartTime(Date plannedStartTime) { |
| | | this.plannedStartTime = plannedStartTime; |
| | | } |
| | | |
| | | public Date getPlannedEndTime() { |
| | | return plannedEndTime; |
| | | } |
| | | |
| | | public void setPlannedEndTime(Date plannedEndTime) { |
| | | this.plannedEndTime = plannedEndTime; |
| | | } |
| | | |
| | | public Long getAssigneeId() { |
| | | return assigneeId; |
| | | } |
| | | |
| | | public void setAssigneeId(Long assigneeId) { |
| | | this.assigneeId = assigneeId; |
| | | } |
| | | |
| | | public String getRemark() { |
| | | return remark; |
| | | } |
| | | |
| | | public void setRemark(String remark) { |
| | | this.remark = remark; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.mapper; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysTaskAttachment; |
| | | |
| | | /** |
| | | * ä»»å¡éä»¶Mapperæ¥å£ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | public interface SysTaskAttachmentMapper { |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡éä»¶ |
| | | * |
| | | * @param attachmentId ä»»å¡éä»¶ä¸»é® |
| | | * @return ä»»å¡éä»¶ |
| | | */ |
| | | public SysTaskAttachment selectSysTaskAttachmentByAttachmentId(Long attachmentId); |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡éä»¶å表 |
| | | * |
| | | * @param sysTaskAttachment ä»»å¡éä»¶ |
| | | * @return ä»»å¡éä»¶éå |
| | | */ |
| | | public List<SysTaskAttachment> selectSysTaskAttachmentList(SysTaskAttachment sysTaskAttachment); |
| | | |
| | | /** |
| | | * æ ¹æ®ä»»å¡IDæ¥è¯¢éä»¶å表 |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @return ä»»å¡éä»¶éå |
| | | */ |
| | | public List<SysTaskAttachment> selectSysTaskAttachmentByTaskId(Long taskId); |
| | | |
| | | /** |
| | | * æ°å¢ä»»å¡éä»¶ |
| | | * |
| | | * @param sysTaskAttachment ä»»å¡éä»¶ |
| | | * @return ç»æ |
| | | */ |
| | | public int insertSysTaskAttachment(SysTaskAttachment sysTaskAttachment); |
| | | |
| | | /** |
| | | * ä¿®æ¹ä»»å¡éä»¶ |
| | | * |
| | | * @param sysTaskAttachment ä»»å¡éä»¶ |
| | | * @return ç»æ |
| | | */ |
| | | public int updateSysTaskAttachment(SysTaskAttachment sysTaskAttachment); |
| | | |
| | | /** |
| | | * å é¤ä»»å¡éä»¶ |
| | | * |
| | | * @param attachmentId ä»»å¡éä»¶ä¸»é® |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysTaskAttachmentByAttachmentId(Long attachmentId); |
| | | |
| | | /** |
| | | * æ¹éå é¤ä»»å¡éä»¶ |
| | | * |
| | | * @param attachmentIds éè¦å é¤çæ°æ®ä¸»é®éå |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysTaskAttachmentByAttachmentIds(Long[] attachmentIds); |
| | | |
| | | /** |
| | | * æ ¹æ®ä»»å¡IDå é¤éä»¶ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysTaskAttachmentByTaskId(Long taskId); |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.mapper; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysTaskLog; |
| | | |
| | | /** |
| | | * 任塿使¥å¿Mapperæ¥å£ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | public interface SysTaskLogMapper { |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡æä½æ¥å¿ |
| | | * |
| | | * @param logId 任塿使¥å¿ä¸»é® |
| | | * @return 任塿使¥å¿ |
| | | */ |
| | | public SysTaskLog selectSysTaskLogByLogId(Long logId); |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡æä½æ¥å¿å表 |
| | | * |
| | | * @param sysTaskLog 任塿使¥å¿ |
| | | * @return 任塿使¥å¿éå |
| | | */ |
| | | public List<SysTaskLog> selectSysTaskLogList(SysTaskLog sysTaskLog); |
| | | |
| | | /** |
| | | * æ ¹æ®ä»»å¡IDæ¥è¯¢æä½æ¥å¿å表 |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @return 任塿使¥å¿éå |
| | | */ |
| | | public List<SysTaskLog> selectSysTaskLogByTaskId(Long taskId); |
| | | |
| | | /** |
| | | * æ°å¢ä»»å¡æä½æ¥å¿ |
| | | * |
| | | * @param sysTaskLog 任塿使¥å¿ |
| | | * @return ç»æ |
| | | */ |
| | | public int insertSysTaskLog(SysTaskLog sysTaskLog); |
| | | |
| | | /** |
| | | * ä¿®æ¹ä»»å¡æä½æ¥å¿ |
| | | * |
| | | * @param sysTaskLog 任塿使¥å¿ |
| | | * @return ç»æ |
| | | */ |
| | | public int updateSysTaskLog(SysTaskLog sysTaskLog); |
| | | |
| | | /** |
| | | * å é¤ä»»å¡æä½æ¥å¿ |
| | | * |
| | | * @param logId 任塿使¥å¿ä¸»é® |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysTaskLogByLogId(Long logId); |
| | | |
| | | /** |
| | | * æ¹éå é¤ä»»å¡æä½æ¥å¿ |
| | | * |
| | | * @param logIds éè¦å é¤çæ°æ®ä¸»é®éå |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysTaskLogByLogIds(Long[] logIds); |
| | | |
| | | /** |
| | | * æ ¹æ®ä»»å¡IDå 餿使¥å¿ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysTaskLogByTaskId(Long taskId); |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.mapper; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysTask; |
| | | import com.ruoyi.system.domain.vo.TaskQueryVO; |
| | | import com.ruoyi.system.domain.vo.TaskStatisticsVO; |
| | | |
| | | /** |
| | | * ä»»å¡ç®¡çMapperæ¥å£ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | public interface SysTaskMapper { |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡ç®¡ç |
| | | * |
| | | * @param taskId ä»»å¡ç®¡çä¸»é® |
| | | * @return ä»»å¡ç®¡ç |
| | | */ |
| | | public SysTask selectSysTaskByTaskId(Long taskId); |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡ç®¡çå表 |
| | | * |
| | | * @param sysTask ä»»å¡ç®¡ç |
| | | * @return ä»»å¡ç®¡çéå |
| | | */ |
| | | public List<SysTask> selectSysTaskList(TaskQueryVO queryVO); |
| | | |
| | | /** |
| | | * æ°å¢ä»»å¡ç®¡ç |
| | | * |
| | | * @param sysTask ä»»å¡ç®¡ç |
| | | * @return ç»æ |
| | | */ |
| | | public int insertSysTask(SysTask sysTask); |
| | | |
| | | /** |
| | | * ä¿®æ¹ä»»å¡ç®¡ç |
| | | * |
| | | * @param sysTask ä»»å¡ç®¡ç |
| | | * @return ç»æ |
| | | */ |
| | | public int updateSysTask(SysTask sysTask); |
| | | |
| | | /** |
| | | * å é¤ä»»å¡ç®¡ç |
| | | * |
| | | * @param taskId ä»»å¡ç®¡çä¸»é® |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysTaskByTaskId(Long taskId); |
| | | |
| | | /** |
| | | * æ¹éå é¤ä»»å¡ç®¡ç |
| | | * |
| | | * @param taskIds éè¦å é¤çæ°æ®ä¸»é®éå |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysTaskByTaskIds(Long[] taskIds); |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡ç»è®¡ä¿¡æ¯ |
| | | * |
| | | * @return ä»»å¡ç»è®¡ä¿¡æ¯ |
| | | */ |
| | | public TaskStatisticsVO selectTaskStatistics(); |
| | | |
| | | /** |
| | | * æ¥è¯¢è¶
æ¶ä»»å¡å表 |
| | | * |
| | | * @return è¶
æ¶ä»»å¡éå |
| | | */ |
| | | public List<SysTask> selectOverdueTasks(); |
| | | |
| | | /** |
| | | * æ¥è¯¢æçä»»å¡å表 |
| | | * |
| | | * @param userId ç¨æ·ID |
| | | * @return æçä»»å¡éå |
| | | */ |
| | | public List<SysTask> selectMyTasks(Long userId); |
| | | |
| | | /** |
| | | * æ ¹æ®ä»»å¡ç¼å·æ¥è¯¢ä»»å¡ |
| | | * |
| | | * @param taskCode ä»»å¡ç¼å· |
| | | * @return ä»»å¡ä¿¡æ¯ |
| | | */ |
| | | public SysTask selectSysTaskByTaskCode(String taskCode); |
| | | |
| | | /** |
| | | * æ´æ°ä»»å¡ç¶æ |
| | | * |
| | | * @param sysTask ä»»å¡ä¿¡æ¯ |
| | | * @return ç»æ |
| | | */ |
| | | public int updateTaskStatus(SysTask sysTask); |
| | | |
| | | /** |
| | | * åé
ä»»å¡ |
| | | * |
| | | * @param sysTask ä»»å¡ä¿¡æ¯ |
| | | * @return ç»æ |
| | | */ |
| | | public int assignTask(SysTask sysTask); |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.mapper; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysTaskVehicle; |
| | | |
| | | /** |
| | | * ä»»å¡è½¦è¾å
³èMapperæ¥å£ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | public interface SysTaskVehicleMapper { |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡è½¦è¾å
³è |
| | | * |
| | | * @param id ä»»å¡è½¦è¾å
³èä¸»é® |
| | | * @return ä»»å¡è½¦è¾å
³è |
| | | */ |
| | | public SysTaskVehicle selectSysTaskVehicleById(Long id); |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡è½¦è¾å
³èå表 |
| | | * |
| | | * @param sysTaskVehicle ä»»å¡è½¦è¾å
³è |
| | | * @return ä»»å¡è½¦è¾å
³èéå |
| | | */ |
| | | public List<SysTaskVehicle> selectSysTaskVehicleList(SysTaskVehicle sysTaskVehicle); |
| | | |
| | | /** |
| | | * æ ¹æ®ä»»å¡IDæ¥è¯¢å
³è车è¾å表 |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @return ä»»å¡è½¦è¾å
³èéå |
| | | */ |
| | | public List<SysTaskVehicle> selectSysTaskVehicleByTaskId(Long taskId); |
| | | |
| | | /** |
| | | * æ°å¢ä»»å¡è½¦è¾å
³è |
| | | * |
| | | * @param sysTaskVehicle ä»»å¡è½¦è¾å
³è |
| | | * @return ç»æ |
| | | */ |
| | | public int insertSysTaskVehicle(SysTaskVehicle sysTaskVehicle); |
| | | |
| | | /** |
| | | * ä¿®æ¹ä»»å¡è½¦è¾å
³è |
| | | * |
| | | * @param sysTaskVehicle ä»»å¡è½¦è¾å
³è |
| | | * @return ç»æ |
| | | */ |
| | | public int updateSysTaskVehicle(SysTaskVehicle sysTaskVehicle); |
| | | |
| | | /** |
| | | * å é¤ä»»å¡è½¦è¾å
³è |
| | | * |
| | | * @param id ä»»å¡è½¦è¾å
³èä¸»é® |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysTaskVehicleById(Long id); |
| | | |
| | | /** |
| | | * æ¹éå é¤ä»»å¡è½¦è¾å
³è |
| | | * |
| | | * @param ids éè¦å é¤çæ°æ®ä¸»é®éå |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysTaskVehicleByIds(Long[] ids); |
| | | |
| | | /** |
| | | * æ ¹æ®ä»»å¡IDå é¤è½¦è¾å
³è |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysTaskVehicleByTaskId(Long taskId); |
| | | |
| | | /** |
| | | * æ ¹æ®ä»»å¡IDå车è¾IDå é¤å
³è |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param vehicleId 车è¾ID |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysTaskVehicleByTaskIdAndVehicleId(Long taskId, Long vehicleId); |
| | | |
| | | /** |
| | | * æ£æ¥ä»»å¡è½¦è¾å
³èæ¯å¦åå¨ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param vehicleId 车è¾ID |
| | | * @return ç»æ |
| | | */ |
| | | public int checkTaskVehicleExists(Long taskId, Long vehicleId); |
| | | |
| | | /** |
| | | * æ¹éæ°å¢ä»»å¡è½¦è¾å
³è |
| | | * |
| | | * @param sysTaskVehicleList ä»»å¡è½¦è¾å
³èå表 |
| | | * @return ç»æ |
| | | */ |
| | | public int batchInsertSysTaskVehicle(List<SysTaskVehicle> sysTaskVehicleList); |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.service; |
| | | |
| | | import java.util.List; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | import com.ruoyi.system.domain.SysTask; |
| | | import com.ruoyi.system.domain.SysTaskVehicle; |
| | | import com.ruoyi.system.domain.SysTaskAttachment; |
| | | import com.ruoyi.system.domain.vo.TaskQueryVO; |
| | | import com.ruoyi.system.domain.vo.TaskCreateVO; |
| | | import com.ruoyi.system.domain.vo.TaskUpdateVO; |
| | | import com.ruoyi.system.domain.vo.TaskStatisticsVO; |
| | | import com.ruoyi.system.domain.enums.TaskStatus; |
| | | |
| | | /** |
| | | * ä»»å¡ç®¡çServiceæ¥å£ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | public interface ISysTaskService { |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡ç®¡ç |
| | | * |
| | | * @param taskId ä»»å¡ç®¡çä¸»é® |
| | | * @return ä»»å¡ç®¡ç |
| | | */ |
| | | public SysTask selectSysTaskByTaskId(Long taskId); |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡ç®¡çå表 |
| | | * |
| | | * @param queryVO 任塿¥è¯¢å¯¹è±¡ |
| | | * @return ä»»å¡ç®¡çéå |
| | | */ |
| | | public List<SysTask> selectSysTaskList(TaskQueryVO queryVO); |
| | | |
| | | /** |
| | | * æ°å¢ä»»å¡ç®¡ç |
| | | * |
| | | * @param createVO ä»»å¡å建对象 |
| | | * @return ç»æ |
| | | */ |
| | | public int insertSysTask(TaskCreateVO createVO); |
| | | |
| | | /** |
| | | * ä¿®æ¹ä»»å¡ç®¡ç |
| | | * |
| | | * @param updateVO 任塿´æ°å¯¹è±¡ |
| | | * @return ç»æ |
| | | */ |
| | | public int updateSysTask(TaskUpdateVO updateVO); |
| | | |
| | | /** |
| | | * æ¹éå é¤ä»»å¡ç®¡ç |
| | | * |
| | | * @param taskIds éè¦å é¤çä»»å¡ç®¡ç主é®éå |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysTaskByTaskIds(Long[] taskIds); |
| | | |
| | | /** |
| | | * åé
ä»»å¡ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param assigneeId æ§è¡äººID |
| | | * @param remark 夿³¨ |
| | | * @return ç»æ |
| | | */ |
| | | public int assignTask(Long taskId, Long assigneeId, String remark); |
| | | |
| | | /** |
| | | * åæ´ä»»å¡ç¶æ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param newStatus æ°ç¶æ |
| | | * @param remark 夿³¨ |
| | | * @return ç»æ |
| | | */ |
| | | public int changeTaskStatus(Long taskId, TaskStatus newStatus, String remark); |
| | | |
| | | /** |
| | | * ä¸ä¼ ä»»å¡éä»¶ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param file æä»¶ |
| | | * @return ç»æ |
| | | */ |
| | | public int uploadAttachment(Long taskId, MultipartFile file); |
| | | |
| | | /** |
| | | * å é¤ä»»å¡éä»¶ |
| | | * |
| | | * @param attachmentId éä»¶ID |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteAttachment(Long attachmentId); |
| | | |
| | | /** |
| | | * åé
车è¾ç»ä»»å¡ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param vehicleId 车è¾ID |
| | | * @param remark 夿³¨ |
| | | * @return ç»æ |
| | | */ |
| | | public int assignVehicleToTask(Long taskId, Long vehicleId, String remark); |
| | | |
| | | /** |
| | | * åæ¶ä»»å¡è½¦è¾åé
|
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param vehicleId 车è¾ID |
| | | * @return ç»æ |
| | | */ |
| | | public int unassignVehicleFromTask(Long taskId, Long vehicleId); |
| | | |
| | | /** |
| | | * æ¹éåé
车è¾ç»ä»»å¡ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param vehicleIds 车è¾IDå表 |
| | | * @param remark 夿³¨ |
| | | * @return ç»æ |
| | | */ |
| | | public int assignMultipleVehiclesToTask(Long taskId, List<Long> vehicleIds, String remark); |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡å
³èçè½¦è¾ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @return ä»»å¡è½¦è¾å
³èå表 |
| | | */ |
| | | public List<SysTaskVehicle> getTaskVehicles(Long taskId); |
| | | |
| | | /** |
| | | * æ¥è¯¢å¯ç¨è½¦è¾ |
| | | * |
| | | * @param deptId é¨é¨ID |
| | | * @param taskType ä»»å¡ç±»å |
| | | * @return å¯ç¨è½¦è¾å表 |
| | | */ |
| | | public List<SysTaskVehicle> getAvailableVehicles(Long deptId, String taskType); |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡ç»è®¡ä¿¡æ¯ |
| | | * |
| | | * @return ä»»å¡ç»è®¡ä¿¡æ¯ |
| | | */ |
| | | public TaskStatisticsVO getTaskStatistics(); |
| | | |
| | | /** |
| | | * æ¥è¯¢è¶
æ¶ä»»å¡å表 |
| | | * |
| | | * @return è¶
æ¶ä»»å¡å表 |
| | | */ |
| | | public List<SysTask> selectOverdueTasks(); |
| | | |
| | | /** |
| | | * æ¥è¯¢æçä»»å¡å表 |
| | | * |
| | | * @param userId ç¨æ·ID |
| | | * @return æçä»»å¡å表 |
| | | */ |
| | | public List<SysTask> selectMyTasks(Long userId); |
| | | |
| | | /** |
| | | * è·åä»»å¡è¯¦æ
ï¼å
å«å
³èæ°æ®ï¼ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @return ä»»å¡è¯¦æ
|
| | | */ |
| | | public SysTask getTaskDetail(Long taskId); |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.ArrayList; |
| | | import java.io.File; |
| | | import java.io.IOException; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | import com.ruoyi.common.utils.DateUtils; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.file.FileUploadUtils; |
| | | import com.ruoyi.common.utils.file.FileUtils; |
| | | import com.ruoyi.system.domain.SysTask; |
| | | import com.ruoyi.system.domain.SysTaskVehicle; |
| | | import com.ruoyi.system.domain.SysTaskAttachment; |
| | | import com.ruoyi.system.domain.SysTaskLog; |
| | | import com.ruoyi.system.domain.vo.TaskQueryVO; |
| | | import com.ruoyi.system.domain.vo.TaskCreateVO; |
| | | import com.ruoyi.system.domain.vo.TaskUpdateVO; |
| | | import com.ruoyi.system.domain.vo.TaskStatisticsVO; |
| | | import com.ruoyi.system.domain.enums.TaskStatus; |
| | | import com.ruoyi.system.mapper.SysTaskMapper; |
| | | import com.ruoyi.system.mapper.SysTaskVehicleMapper; |
| | | import com.ruoyi.system.mapper.SysTaskAttachmentMapper; |
| | | import com.ruoyi.system.mapper.SysTaskLogMapper; |
| | | import com.ruoyi.system.service.ISysTaskService; |
| | | |
| | | /** |
| | | * ä»»å¡ç®¡çServiceä¸å¡å±å¤ç |
| | | * |
| | | * @author ruoyi |
| | | * @date 2024-01-15 |
| | | */ |
| | | @Service |
| | | public class SysTaskServiceImpl implements ISysTaskService { |
| | | |
| | | @Autowired |
| | | private SysTaskMapper sysTaskMapper; |
| | | |
| | | @Autowired |
| | | private SysTaskVehicleMapper sysTaskVehicleMapper; |
| | | |
| | | @Autowired |
| | | private SysTaskAttachmentMapper sysTaskAttachmentMapper; |
| | | |
| | | @Autowired |
| | | private SysTaskLogMapper sysTaskLogMapper; |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡ç®¡ç |
| | | * |
| | | * @param taskId ä»»å¡ç®¡çä¸»é® |
| | | * @return ä»»å¡ç®¡ç |
| | | */ |
| | | @Override |
| | | public SysTask selectSysTaskByTaskId(Long taskId) { |
| | | return sysTaskMapper.selectSysTaskByTaskId(taskId); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡ç®¡çå表 |
| | | * |
| | | * @param queryVO 任塿¥è¯¢å¯¹è±¡ |
| | | * @return ä»»å¡ç®¡ç |
| | | */ |
| | | @Override |
| | | public List<SysTask> selectSysTaskList(TaskQueryVO queryVO) { |
| | | return sysTaskMapper.selectSysTaskList(queryVO); |
| | | } |
| | | |
| | | /** |
| | | * æ°å¢ä»»å¡ç®¡ç |
| | | * |
| | | * @param createVO ä»»å¡å建对象 |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public int insertSysTask(TaskCreateVO createVO) { |
| | | SysTask task = new SysTask(); |
| | | task.setTaskCode(generateTaskCode()); |
| | | task.setTaskType(createVO.getTaskType()); |
| | | task.setTaskStatus(TaskStatus.PENDING.getCode()); |
| | | task.setTaskDescription(createVO.getTaskDescription()); |
| | | task.setDepartureAddress(createVO.getDepartureAddress()); |
| | | task.setDestinationAddress(createVO.getDestinationAddress()); |
| | | task.setPlannedStartTime(createVO.getPlannedStartTime()); |
| | | task.setPlannedEndTime(createVO.getPlannedEndTime()); |
| | | task.setAssigneeId(createVO.getAssigneeId()); |
| | | task.setCreatorId(SecurityUtils.getUserId()); |
| | | task.setDeptId(SecurityUtils.getDeptId()); |
| | | task.setCreateBy(SecurityUtils.getUsername()); |
| | | task.setCreateTime(DateUtils.getNowDate()); |
| | | task.setRemark(createVO.getRemark()); |
| | | task.setDelFlag("0"); |
| | | |
| | | int result = sysTaskMapper.insertSysTask(task); |
| | | |
| | | // è®°å½æä½æ¥å¿ |
| | | if (result > 0) { |
| | | recordTaskLog(task.getTaskId(), "CREATE", "å建任å¡", null, |
| | | "ä»»å¡ç±»åï¼" + createVO.getTaskType(), SecurityUtils.getUserId(), SecurityUtils.getUsername()); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * ä¿®æ¹ä»»å¡ç®¡ç |
| | | * |
| | | * @param updateVO 任塿´æ°å¯¹è±¡ |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public int updateSysTask(TaskUpdateVO updateVO) { |
| | | SysTask oldTask = sysTaskMapper.selectSysTaskByTaskId(updateVO.getTaskId()); |
| | | if (oldTask == null) { |
| | | throw new RuntimeException("ä»»å¡ä¸åå¨"); |
| | | } |
| | | |
| | | SysTask task = new SysTask(); |
| | | task.setTaskId(updateVO.getTaskId()); |
| | | task.setTaskDescription(updateVO.getTaskDescription()); |
| | | task.setDepartureAddress(updateVO.getDepartureAddress()); |
| | | task.setDestinationAddress(updateVO.getDestinationAddress()); |
| | | task.setPlannedStartTime(updateVO.getPlannedStartTime()); |
| | | task.setPlannedEndTime(updateVO.getPlannedEndTime()); |
| | | task.setAssigneeId(updateVO.getAssigneeId()); |
| | | task.setUpdateBy(SecurityUtils.getUsername()); |
| | | task.setUpdateTime(DateUtils.getNowDate()); |
| | | task.setRemark(updateVO.getRemark()); |
| | | |
| | | int result = sysTaskMapper.updateSysTask(task); |
| | | |
| | | // è®°å½æä½æ¥å¿ |
| | | if (result > 0) { |
| | | recordTaskLog(updateVO.getTaskId(), "UPDATE", "æ´æ°ä»»å¡", |
| | | buildTaskDescription(oldTask), buildTaskDescription(task), |
| | | SecurityUtils.getUserId(), SecurityUtils.getUsername()); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * æ¹éå é¤ä»»å¡ç®¡ç |
| | | * |
| | | * @param taskIds éè¦å é¤çä»»å¡ç®¡çä¸»é® |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public int deleteSysTaskByTaskIds(Long[] taskIds) { |
| | | int result = 0; |
| | | for (Long taskId : taskIds) { |
| | | // è®°å½å 餿¥å¿ |
| | | recordTaskLog(taskId, "DELETE", "å é¤ä»»å¡", null, null, |
| | | SecurityUtils.getUserId(), SecurityUtils.getUsername()); |
| | | result += sysTaskMapper.deleteSysTaskByTaskId(taskId); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * åé
ä»»å¡ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param assigneeId æ§è¡äººID |
| | | * @param remark 夿³¨ |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public int assignTask(Long taskId, Long assigneeId, String remark) { |
| | | SysTask task = new SysTask(); |
| | | task.setTaskId(taskId); |
| | | task.setAssigneeId(assigneeId); |
| | | task.setUpdateBy(SecurityUtils.getUsername()); |
| | | |
| | | int result = sysTaskMapper.assignTask(task); |
| | | |
| | | // è®°å½æä½æ¥å¿ |
| | | if (result > 0) { |
| | | recordTaskLog(taskId, "ASSIGN", "åé
ä»»å¡", null, |
| | | "åé
ç»ç¨æ·IDï¼" + assigneeId + "ï¼å¤æ³¨ï¼" + remark, |
| | | SecurityUtils.getUserId(), SecurityUtils.getUsername()); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * åæ´ä»»å¡ç¶æ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param newStatus æ°ç¶æ |
| | | * @param remark 夿³¨ |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public int changeTaskStatus(Long taskId, TaskStatus newStatus, String remark) { |
| | | SysTask oldTask = sysTaskMapper.selectSysTaskByTaskId(taskId); |
| | | if (oldTask == null) { |
| | | throw new RuntimeException("ä»»å¡ä¸åå¨"); |
| | | } |
| | | |
| | | // éªè¯ç¶ææµè½¬æ¯å¦åæ³ |
| | | TaskStatus oldTaskStatus = TaskStatus.getByCode(oldTask.getTaskStatus()); |
| | | if (!oldTask.canChangeStatus(newStatus)) { |
| | | throw new RuntimeException("ç¶ææµè½¬ä¸åæ³ï¼ä» " + oldTaskStatus.getInfo() + " å° " + newStatus.getInfo()); |
| | | } |
| | | |
| | | SysTask task = new SysTask(); |
| | | task.setTaskId(taskId); |
| | | task.setTaskStatus(newStatus.getCode()); |
| | | task.setUpdateBy(SecurityUtils.getUsername()); |
| | | |
| | | // æ ¹æ®ç¶æè®¾ç½®ç¸åºçæ¶é´ |
| | | if (newStatus == TaskStatus.IN_PROGRESS && oldTask.getActualStartTime() == null) { |
| | | task.setActualStartTime(DateUtils.getNowDate()); |
| | | } else if (newStatus == TaskStatus.COMPLETED) { |
| | | task.setActualEndTime(DateUtils.getNowDate()); |
| | | } |
| | | |
| | | int result = sysTaskMapper.updateTaskStatus(task); |
| | | |
| | | // è®°å½æä½æ¥å¿ |
| | | if (result > 0) { |
| | | recordTaskLog(taskId, "STATUS_CHANGE", "ç¶æåæ´", |
| | | "ç¶æï¼" + oldTaskStatus.getInfo(), |
| | | "ç¶æï¼" + newStatus.getInfo() + "ï¼å¤æ³¨ï¼" + remark, |
| | | SecurityUtils.getUserId(), SecurityUtils.getUsername()); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * ä¸ä¼ ä»»å¡éä»¶ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param file æä»¶ |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public int uploadAttachment(Long taskId, MultipartFile file) { |
| | | try { |
| | | // ä¸ä¼ æä»¶ |
| | | String fileName = FileUploadUtils.upload("/task", file); |
| | | String filePath = FileUploadUtils.getDefaultBaseDir() + fileName; |
| | | |
| | | SysTaskAttachment attachment = new SysTaskAttachment(); |
| | | attachment.setTaskId(taskId); |
| | | attachment.setFileName(file.getOriginalFilename()); |
| | | attachment.setFilePath(filePath); |
| | | attachment.setFileSize(file.getSize()); |
| | | attachment.setFileType(getFileType(file.getOriginalFilename())); |
| | | attachment.setUploadTime(DateUtils.getNowDate()); |
| | | attachment.setUploadBy(SecurityUtils.getUsername()); |
| | | |
| | | int result = sysTaskAttachmentMapper.insertSysTaskAttachment(attachment); |
| | | |
| | | // è®°å½æä½æ¥å¿ |
| | | if (result > 0) { |
| | | recordTaskLog(taskId, "UPDATE", "ä¸ä¼ éä»¶", null, |
| | | "ä¸ä¼ æä»¶ï¼" + file.getOriginalFilename(), |
| | | SecurityUtils.getUserId(), SecurityUtils.getUsername()); |
| | | } |
| | | |
| | | return result; |
| | | } catch (IOException e) { |
| | | throw new RuntimeException("æä»¶ä¸ä¼ 失败ï¼" + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å é¤ä»»å¡éä»¶ |
| | | * |
| | | * @param attachmentId éä»¶ID |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public int deleteAttachment(Long attachmentId) { |
| | | SysTaskAttachment attachment = sysTaskAttachmentMapper.selectSysTaskAttachmentByAttachmentId(attachmentId); |
| | | if (attachment == null) { |
| | | throw new RuntimeException("éä»¶ä¸åå¨"); |
| | | } |
| | | |
| | | // å é¤ç©çæä»¶ |
| | | try { |
| | | FileUtils.deleteFile(attachment.getFilePath()); |
| | | } catch (Exception e) { |
| | | // å¿½ç¥æä»¶å é¤å¤±è´¥ |
| | | } |
| | | |
| | | int result = sysTaskAttachmentMapper.deleteSysTaskAttachmentByAttachmentId(attachmentId); |
| | | |
| | | // è®°å½æä½æ¥å¿ |
| | | if (result > 0) { |
| | | recordTaskLog(attachment.getTaskId(), "UPDATE", "å é¤éä»¶", |
| | | "å 餿件ï¼" + attachment.getFileName(), null, |
| | | SecurityUtils.getUserId(), SecurityUtils.getUsername()); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * åé
车è¾ç»ä»»å¡ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param vehicleId 车è¾ID |
| | | * @param remark 夿³¨ |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public int assignVehicleToTask(Long taskId, Long vehicleId, String remark) { |
| | | // æ£æ¥æ¯å¦å·²ç»åé
|
| | | int exists = sysTaskVehicleMapper.checkTaskVehicleExists(taskId, vehicleId); |
| | | if (exists > 0) { |
| | | throw new RuntimeException("车è¾å·²ç»åé
ç»è¯¥ä»»å¡"); |
| | | } |
| | | |
| | | SysTaskVehicle taskVehicle = new SysTaskVehicle(); |
| | | taskVehicle.setTaskId(taskId); |
| | | taskVehicle.setVehicleId(vehicleId); |
| | | taskVehicle.setAssignTime(DateUtils.getNowDate()); |
| | | taskVehicle.setAssignBy(SecurityUtils.getUsername()); |
| | | taskVehicle.setStatus("ASSIGNED"); |
| | | taskVehicle.setRemark(remark); |
| | | |
| | | int result = sysTaskVehicleMapper.insertSysTaskVehicle(taskVehicle); |
| | | |
| | | // è®°å½æä½æ¥å¿ |
| | | if (result > 0) { |
| | | recordTaskLog(taskId, "ASSIGN", "åé
车è¾", null, |
| | | "åé
车è¾IDï¼" + vehicleId + "ï¼å¤æ³¨ï¼" + remark, |
| | | SecurityUtils.getUserId(), SecurityUtils.getUsername()); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * åæ¶ä»»å¡è½¦è¾åé
|
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param vehicleId 车è¾ID |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public int unassignVehicleFromTask(Long taskId, Long vehicleId) { |
| | | int result = sysTaskVehicleMapper.deleteSysTaskVehicleByTaskIdAndVehicleId(taskId, vehicleId); |
| | | |
| | | // è®°å½æä½æ¥å¿ |
| | | if (result > 0) { |
| | | recordTaskLog(taskId, "ASSIGN", "åæ¶è½¦è¾åé
", |
| | | "åæ¶è½¦è¾IDï¼" + vehicleId, null, |
| | | SecurityUtils.getUserId(), SecurityUtils.getUsername()); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * æ¹éåé
车è¾ç»ä»»å¡ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param vehicleIds 车è¾IDå表 |
| | | * @param remark 夿³¨ |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public int assignMultipleVehiclesToTask(Long taskId, List<Long> vehicleIds, String remark) { |
| | | List<SysTaskVehicle> taskVehicles = new ArrayList<>(); |
| | | Date now = DateUtils.getNowDate(); |
| | | String assignBy = SecurityUtils.getUsername(); |
| | | |
| | | for (Long vehicleId : vehicleIds) { |
| | | // æ£æ¥æ¯å¦å·²ç»åé
|
| | | int exists = sysTaskVehicleMapper.checkTaskVehicleExists(taskId, vehicleId); |
| | | if (exists == 0) { |
| | | SysTaskVehicle taskVehicle = new SysTaskVehicle(); |
| | | taskVehicle.setTaskId(taskId); |
| | | taskVehicle.setVehicleId(vehicleId); |
| | | taskVehicle.setAssignTime(now); |
| | | taskVehicle.setAssignBy(assignBy); |
| | | taskVehicle.setStatus("ASSIGNED"); |
| | | taskVehicle.setRemark(remark); |
| | | taskVehicles.add(taskVehicle); |
| | | } |
| | | } |
| | | |
| | | int result = 0; |
| | | if (!taskVehicles.isEmpty()) { |
| | | result = sysTaskVehicleMapper.batchInsertSysTaskVehicle(taskVehicles); |
| | | } |
| | | |
| | | // è®°å½æä½æ¥å¿ |
| | | if (result > 0) { |
| | | recordTaskLog(taskId, "ASSIGN", "æ¹éåé
车è¾", null, |
| | | "åé
è½¦è¾æ°éï¼" + result + "ï¼å¤æ³¨ï¼" + remark, |
| | | SecurityUtils.getUserId(), SecurityUtils.getUsername()); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡å
³èçè½¦è¾ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @return ä»»å¡è½¦è¾å
³èå表 |
| | | */ |
| | | @Override |
| | | public List<SysTaskVehicle> getTaskVehicles(Long taskId) { |
| | | return sysTaskVehicleMapper.selectSysTaskVehicleByTaskId(taskId); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢å¯ç¨è½¦è¾ |
| | | * |
| | | * @param deptId é¨é¨ID |
| | | * @param taskType ä»»å¡ç±»å |
| | | * @return å¯ç¨è½¦è¾å表 |
| | | */ |
| | | @Override |
| | | public List<SysTaskVehicle> getAvailableVehicles(Long deptId, String taskType) { |
| | | // è¿ééè¦æ ¹æ®ä¸å¡é»è¾æ¥è¯¢å¯ç¨è½¦è¾ |
| | | // ææ¶è¿å空å表ï¼å®é
å®ç°éè¦æ¥è¯¢è½¦è¾è¡¨ |
| | | return new ArrayList<>(); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡ç»è®¡ä¿¡æ¯ |
| | | * |
| | | * @return ä»»å¡ç»è®¡ä¿¡æ¯ |
| | | */ |
| | | @Override |
| | | public TaskStatisticsVO getTaskStatistics() { |
| | | return sysTaskMapper.selectTaskStatistics(); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢è¶
æ¶ä»»å¡å表 |
| | | * |
| | | * @return è¶
æ¶ä»»å¡å表 |
| | | */ |
| | | @Override |
| | | public List<SysTask> selectOverdueTasks() { |
| | | return sysTaskMapper.selectOverdueTasks(); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢æçä»»å¡å表 |
| | | * |
| | | * @param userId ç¨æ·ID |
| | | * @return æçä»»å¡å表 |
| | | */ |
| | | @Override |
| | | public List<SysTask> selectMyTasks(Long userId) { |
| | | return sysTaskMapper.selectMyTasks(userId); |
| | | } |
| | | |
| | | /** |
| | | * è·åä»»å¡è¯¦æ
ï¼å
å«å
³èæ°æ®ï¼ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @return ä»»å¡è¯¦æ
|
| | | */ |
| | | @Override |
| | | public SysTask getTaskDetail(Long taskId) { |
| | | SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId); |
| | | if (task != null) { |
| | | // æ¥è¯¢å
³èè½¦è¾ |
| | | task.setAssignedVehicles(sysTaskVehicleMapper.selectSysTaskVehicleByTaskId(taskId)); |
| | | // æ¥è¯¢éä»¶ |
| | | task.setAttachments(sysTaskAttachmentMapper.selectSysTaskAttachmentByTaskId(taskId)); |
| | | // æ¥è¯¢æä½æ¥å¿ |
| | | task.setOperationLogs(sysTaskLogMapper.selectSysTaskLogByTaskId(taskId)); |
| | | } |
| | | return task; |
| | | } |
| | | |
| | | /** |
| | | * çæä»»å¡ç¼å· |
| | | * |
| | | * @return ä»»å¡ç¼å· |
| | | */ |
| | | private String generateTaskCode() { |
| | | String dateStr = DateUtils.dateTimeNow("yyyyMMdd"); |
| | | return "TASK" + dateStr + "0001"; |
| | | } |
| | | |
| | | /** |
| | | * è®°å½ä»»å¡æä½æ¥å¿ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param operationType æä½ç±»å |
| | | * @param operationDesc æä½æè¿° |
| | | * @param oldValue æä½åå¼ |
| | | * @param newValue æä½åå¼ |
| | | * @param operatorId æä½äººID |
| | | * @param operatorName æä½äººå§å |
| | | */ |
| | | private void recordTaskLog(Long taskId, String operationType, String operationDesc, |
| | | String oldValue, String newValue, Long operatorId, String operatorName) { |
| | | SysTaskLog log = new SysTaskLog(); |
| | | log.setTaskId(taskId); |
| | | log.setOperationType(operationType); |
| | | log.setOperationDesc(operationDesc); |
| | | log.setOldValue(oldValue); |
| | | log.setNewValue(newValue); |
| | | log.setOperatorId(operatorId); |
| | | log.setOperatorName(operatorName); |
| | | log.setOperationTime(DateUtils.getNowDate()); |
| | | // è¿éå¯ä»¥è·åIPå°å |
| | | log.setIpAddress("127.0.0.1"); |
| | | |
| | | sysTaskLogMapper.insertSysTaskLog(log); |
| | | } |
| | | |
| | | /** |
| | | * æå»ºä»»å¡æè¿° |
| | | * |
| | | * @param task ä»»å¡å¯¹è±¡ |
| | | * @return ä»»å¡æè¿° |
| | | */ |
| | | private String buildTaskDescription(SysTask task) { |
| | | StringBuilder sb = new StringBuilder(); |
| | | sb.append("ä»»å¡ç¼å·ï¼").append(task.getTaskCode()).append("ï¼"); |
| | | sb.append("ä»»å¡ç±»åï¼").append(task.getTaskType()).append("ï¼"); |
| | | sb.append("ä»»å¡ç¶æï¼").append(task.getTaskStatus()).append("ï¼"); |
| | | if (StringUtils.isNotEmpty(task.getTaskDescription())) { |
| | | sb.append("ä»»å¡æè¿°ï¼").append(task.getTaskDescription()).append("ï¼"); |
| | | } |
| | | return sb.toString(); |
| | | } |
| | | |
| | | /** |
| | | * è·åæä»¶ç±»å |
| | | * |
| | | * @param fileName æä»¶å |
| | | * @return æä»¶ç±»å |
| | | */ |
| | | private String getFileType(String fileName) { |
| | | if (StringUtils.isEmpty(fileName)) { |
| | | return ""; |
| | | } |
| | | int lastDotIndex = fileName.lastIndexOf("."); |
| | | if (lastDotIndex > 0 && lastDotIndex < fileName.length() - 1) { |
| | | return fileName.substring(lastDotIndex + 1).toLowerCase(); |
| | | } |
| | | return ""; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.utils; |
| | | |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Date; |
| | | import org.springframework.stereotype.Component; |
| | | import com.ruoyi.common.utils.DateUtils; |
| | | |
| | | /** |
| | | * ä»»å¡ç¼å·çæå¨ |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Component |
| | | public class TaskCodeGenerator { |
| | | |
| | | /** |
| | | * çæä»»å¡ç¼å· |
| | | * æ ¼å¼ï¼TASK + YYYYMMDD + 4ä½åºå· |
| | | * |
| | | * @return ä»»å¡ç¼å· |
| | | */ |
| | | public String generateTaskCode() { |
| | | String dateStr = DateUtils.dateTimeNow("yyyyMMdd"); |
| | | return "TASK" + dateStr + "0001"; |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ¥æçæä»»å¡ç¼å· |
| | | * |
| | | * @param date æ¥æ |
| | | * @return ä»»å¡ç¼å· |
| | | */ |
| | | public String generateTaskCode(Date date) { |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); |
| | | String dateStr = sdf.format(date); |
| | | return "TASK" + dateStr + "0001"; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.utils; |
| | | |
| | | import java.util.HashMap; |
| | | import java.util.HashSet; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | import org.springframework.stereotype.Component; |
| | | import com.ruoyi.system.domain.enums.TaskStatus; |
| | | |
| | | /** |
| | | * ä»»å¡ç¶ææµè½¬éªè¯å¨ |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Component |
| | | public class TaskStatusValidator { |
| | | |
| | | private static final Map<TaskStatus, Set<TaskStatus>> ALLOWED_TRANSITIONS = new HashMap<>(); |
| | | |
| | | static { |
| | | // PENDING -> IN_PROGRESS, CANCELLED |
| | | Set<TaskStatus> pendingTransitions = new HashSet<>(); |
| | | pendingTransitions.add(TaskStatus.IN_PROGRESS); |
| | | pendingTransitions.add(TaskStatus.CANCELLED); |
| | | ALLOWED_TRANSITIONS.put(TaskStatus.PENDING, pendingTransitions); |
| | | |
| | | // IN_PROGRESS -> COMPLETED, CANCELLED, PENDING |
| | | Set<TaskStatus> inProgressTransitions = new HashSet<>(); |
| | | inProgressTransitions.add(TaskStatus.COMPLETED); |
| | | inProgressTransitions.add(TaskStatus.CANCELLED); |
| | | inProgressTransitions.add(TaskStatus.PENDING); |
| | | ALLOWED_TRANSITIONS.put(TaskStatus.IN_PROGRESS, inProgressTransitions); |
| | | |
| | | // COMPLETED -> ä¸å
许任ä½ç¶æåæ´ |
| | | ALLOWED_TRANSITIONS.put(TaskStatus.COMPLETED, new HashSet<>()); |
| | | // CANCELLED -> ä¸å
许任ä½ç¶æåæ´ |
| | | ALLOWED_TRANSITIONS.put(TaskStatus.CANCELLED, new HashSet<>()); |
| | | } |
| | | |
| | | /** |
| | | * éªè¯ç¶ææµè½¬æ¯å¦åæ³ |
| | | * |
| | | * @param from åç¶æ |
| | | * @param to ç®æ ç¶æ |
| | | * @return æ¯å¦å
许æµè½¬ |
| | | */ |
| | | public boolean canTransition(TaskStatus from, TaskStatus to) { |
| | | if (from == null || to == null) { |
| | | return false; |
| | | } |
| | | return ALLOWED_TRANSITIONS.get(from).contains(to); |
| | | } |
| | | |
| | | /** |
| | | * è·åå
许çç¶ææµè½¬å表 |
| | | * |
| | | * @param from åç¶æ |
| | | * @return å
许çç®æ ç¶æéå |
| | | */ |
| | | public Set<TaskStatus> getAllowedTransitions(TaskStatus from) { |
| | | if (from == null) { |
| | | return new HashSet<>(); |
| | | } |
| | | return ALLOWED_TRANSITIONS.get(from); |
| | | } |
| | | } |
| New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8" ?> |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysTaskAttachmentMapper"> |
| | | |
| | | <resultMap type="SysTaskAttachment" id="SysTaskAttachmentResult"> |
| | | <result property="attachmentId" column="attachment_id" /> |
| | | <result property="taskId" column="task_id" /> |
| | | <result property="fileName" column="file_name" /> |
| | | <result property="filePath" column="file_path" /> |
| | | <result property="fileSize" column="file_size" /> |
| | | <result property="fileType" column="file_type" /> |
| | | <result property="uploadTime" column="upload_time" /> |
| | | <result property="uploadBy" column="upload_by" /> |
| | | </resultMap> |
| | | |
| | | <sql id="selectSysTaskAttachmentVo"> |
| | | select attachment_id, task_id, file_name, file_path, file_size, file_type, upload_time, upload_by |
| | | from sys_task_attachment |
| | | </sql> |
| | | |
| | | <select id="selectSysTaskAttachmentList" parameterType="SysTaskAttachment" resultMap="SysTaskAttachmentResult"> |
| | | <include refid="selectSysTaskAttachmentVo"/> |
| | | <where> |
| | | <if test="taskId != null "> and task_id = #{taskId}</if> |
| | | <if test="fileName != null and fileName != ''"> and file_name like concat('%', #{fileName}, '%')</if> |
| | | <if test="fileType != null and fileType != ''"> and file_type = #{fileType}</if> |
| | | <if test="uploadBy != null and uploadBy != ''"> and upload_by like concat('%', #{uploadBy}, '%')</if> |
| | | </where> |
| | | order by upload_time desc |
| | | </select> |
| | | |
| | | <select id="selectSysTaskAttachmentByAttachmentId" parameterType="Long" resultMap="SysTaskAttachmentResult"> |
| | | <include refid="selectSysTaskAttachmentVo"/> |
| | | where attachment_id = #{attachmentId} |
| | | </select> |
| | | |
| | | <select id="selectSysTaskAttachmentByTaskId" parameterType="Long" resultMap="SysTaskAttachmentResult"> |
| | | <include refid="selectSysTaskAttachmentVo"/> |
| | | where task_id = #{taskId} |
| | | order by upload_time desc |
| | | </select> |
| | | |
| | | <insert id="insertSysTaskAttachment" parameterType="SysTaskAttachment" useGeneratedKeys="true" keyProperty="attachmentId"> |
| | | insert into sys_task_attachment |
| | | <trim prefix="(" suffix=")" suffixOverrides=","> |
| | | <if test="taskId != null">task_id,</if> |
| | | <if test="fileName != null and fileName != ''">file_name,</if> |
| | | <if test="filePath != null and filePath != ''">file_path,</if> |
| | | <if test="fileSize != null">file_size,</if> |
| | | <if test="fileType != null">file_type,</if> |
| | | <if test="uploadTime != null">upload_time,</if> |
| | | <if test="uploadBy != null and uploadBy != ''">upload_by,</if> |
| | | </trim> |
| | | <trim prefix="values (" suffix=")" suffixOverrides=","> |
| | | <if test="taskId != null">#{taskId},</if> |
| | | <if test="fileName != null and fileName != ''">#{fileName},</if> |
| | | <if test="filePath != null and filePath != ''">#{filePath},</if> |
| | | <if test="fileSize != null">#{fileSize},</if> |
| | | <if test="fileType != null">#{fileType},</if> |
| | | <if test="uploadTime != null">#{uploadTime},</if> |
| | | <if test="uploadBy != null and uploadBy != ''">#{uploadBy},</if> |
| | | </trim> |
| | | </insert> |
| | | |
| | | <update id="updateSysTaskAttachment" parameterType="SysTaskAttachment"> |
| | | update sys_task_attachment |
| | | <trim prefix="SET" suffixOverrides=","> |
| | | <if test="taskId != null">task_id = #{taskId},</if> |
| | | <if test="fileName != null and fileName != ''">file_name = #{fileName},</if> |
| | | <if test="filePath != null and filePath != ''">file_path = #{filePath},</if> |
| | | <if test="fileSize != null">file_size = #{fileSize},</if> |
| | | <if test="fileType != null">file_type = #{fileType},</if> |
| | | <if test="uploadTime != null">upload_time = #{uploadTime},</if> |
| | | <if test="uploadBy != null and uploadBy != ''">upload_by = #{uploadBy},</if> |
| | | </trim> |
| | | where attachment_id = #{attachmentId} |
| | | </update> |
| | | |
| | | <delete id="deleteSysTaskAttachmentByAttachmentId" parameterType="Long"> |
| | | delete from sys_task_attachment where attachment_id = #{attachmentId} |
| | | </delete> |
| | | |
| | | <delete id="deleteSysTaskAttachmentByAttachmentIds" parameterType="String"> |
| | | delete from sys_task_attachment where attachment_id in |
| | | <foreach item="attachmentId" collection="array" open="(" separator="," close=")"> |
| | | #{attachmentId} |
| | | </foreach> |
| | | </delete> |
| | | |
| | | <delete id="deleteSysTaskAttachmentByTaskId" parameterType="Long"> |
| | | delete from sys_task_attachment where task_id = #{taskId} |
| | | </delete> |
| | | </mapper> |
| New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8" ?> |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysTaskLogMapper"> |
| | | |
| | | <resultMap type="SysTaskLog" id="SysTaskLogResult"> |
| | | <result property="logId" column="log_id" /> |
| | | <result property="taskId" column="task_id" /> |
| | | <result property="operationType" column="operation_type" /> |
| | | <result property="operationDesc" column="operation_desc" /> |
| | | <result property="oldValue" column="old_value" /> |
| | | <result property="newValue" column="new_value" /> |
| | | <result property="operatorId" column="operator_id" /> |
| | | <result property="operatorName" column="operator_name" /> |
| | | <result property="operationTime" column="operation_time" /> |
| | | <result property="ipAddress" column="ip_address" /> |
| | | </resultMap> |
| | | |
| | | <sql id="selectSysTaskLogVo"> |
| | | select log_id, task_id, operation_type, operation_desc, old_value, new_value, |
| | | operator_id, operator_name, operation_time, ip_address |
| | | from sys_task_log |
| | | </sql> |
| | | |
| | | <select id="selectSysTaskLogList" parameterType="SysTaskLog" resultMap="SysTaskLogResult"> |
| | | <include refid="selectSysTaskLogVo"/> |
| | | <where> |
| | | <if test="taskId != null "> and task_id = #{taskId}</if> |
| | | <if test="operationType != null and operationType != ''"> and operation_type = #{operationType}</if> |
| | | <if test="operatorId != null "> and operator_id = #{operatorId}</if> |
| | | <if test="operatorName != null and operatorName != ''"> and operator_name like concat('%', #{operatorName}, '%')</if> |
| | | </where> |
| | | order by operation_time desc |
| | | </select> |
| | | |
| | | <select id="selectSysTaskLogByLogId" parameterType="Long" resultMap="SysTaskLogResult"> |
| | | <include refid="selectSysTaskLogVo"/> |
| | | where log_id = #{logId} |
| | | </select> |
| | | |
| | | <select id="selectSysTaskLogByTaskId" parameterType="Long" resultMap="SysTaskLogResult"> |
| | | <include refid="selectSysTaskLogVo"/> |
| | | where task_id = #{taskId} |
| | | order by operation_time desc |
| | | </select> |
| | | |
| | | <insert id="insertSysTaskLog" parameterType="SysTaskLog" useGeneratedKeys="true" keyProperty="logId"> |
| | | insert into sys_task_log |
| | | <trim prefix="(" suffix=")" suffixOverrides=","> |
| | | <if test="taskId != null">task_id,</if> |
| | | <if test="operationType != null and operationType != ''">operation_type,</if> |
| | | <if test="operationDesc != null">operation_desc,</if> |
| | | <if test="oldValue != null">old_value,</if> |
| | | <if test="newValue != null">new_value,</if> |
| | | <if test="operatorId != null">operator_id,</if> |
| | | <if test="operatorName != null and operatorName != ''">operator_name,</if> |
| | | <if test="operationTime != null">operation_time,</if> |
| | | <if test="ipAddress != null">ip_address,</if> |
| | | </trim> |
| | | <trim prefix="values (" suffix=")" suffixOverrides=","> |
| | | <if test="taskId != null">#{taskId},</if> |
| | | <if test="operationType != null and operationType != ''">#{operationType},</if> |
| | | <if test="operationDesc != null">#{operationDesc},</if> |
| | | <if test="oldValue != null">#{oldValue},</if> |
| | | <if test="newValue != null">#{newValue},</if> |
| | | <if test="operatorId != null">#{operatorId},</if> |
| | | <if test="operatorName != null and operatorName != ''">#{operatorName},</if> |
| | | <if test="operationTime != null">#{operationTime},</if> |
| | | <if test="ipAddress != null">#{ipAddress},</if> |
| | | </trim> |
| | | </insert> |
| | | |
| | | <update id="updateSysTaskLog" parameterType="SysTaskLog"> |
| | | update sys_task_log |
| | | <trim prefix="SET" suffixOverrides=","> |
| | | <if test="taskId != null">task_id = #{taskId},</if> |
| | | <if test="operationType != null and operationType != ''">operation_type = #{operationType},</if> |
| | | <if test="operationDesc != null">operation_desc = #{operationDesc},</if> |
| | | <if test="oldValue != null">old_value = #{oldValue},</if> |
| | | <if test="newValue != null">new_value = #{newValue},</if> |
| | | <if test="operatorId != null">operator_id = #{operatorId},</if> |
| | | <if test="operatorName != null and operatorName != ''">operator_name = #{operatorName},</if> |
| | | <if test="operationTime != null">operation_time = #{operationTime},</if> |
| | | <if test="ipAddress != null">ip_address = #{ipAddress},</if> |
| | | </trim> |
| | | where log_id = #{logId} |
| | | </update> |
| | | |
| | | <delete id="deleteSysTaskLogByLogId" parameterType="Long"> |
| | | delete from sys_task_log where log_id = #{logId} |
| | | </delete> |
| | | |
| | | <delete id="deleteSysTaskLogByLogIds" parameterType="String"> |
| | | delete from sys_task_log where log_id in |
| | | <foreach item="logId" collection="array" open="(" separator="," close=")"> |
| | | #{logId} |
| | | </foreach> |
| | | </delete> |
| | | |
| | | <delete id="deleteSysTaskLogByTaskId" parameterType="Long"> |
| | | delete from sys_task_log where task_id = #{taskId} |
| | | </delete> |
| | | </mapper> |
| New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8" ?> |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysTaskMapper"> |
| | | |
| | | <resultMap type="SysTask" id="SysTaskResult"> |
| | | <result property="taskId" column="task_id" /> |
| | | <result property="taskCode" column="task_code" /> |
| | | <result property="taskType" column="task_type" /> |
| | | <result property="taskStatus" column="task_status" /> |
| | | <result property="taskDescription" column="task_description" /> |
| | | <result property="departureAddress" column="departure_address" /> |
| | | <result property="destinationAddress" column="destination_address" /> |
| | | <result property="plannedStartTime" column="planned_start_time" /> |
| | | <result property="plannedEndTime" column="planned_end_time" /> |
| | | <result property="actualStartTime" column="actual_start_time" /> |
| | | <result property="actualEndTime" column="actual_end_time" /> |
| | | <result property="creatorId" column="creator_id" /> |
| | | <result property="assigneeId" column="assignee_id" /> |
| | | <result property="deptId" column="dept_id" /> |
| | | <result property="createTime" column="create_time" /> |
| | | <result property="updateTime" column="update_time" /> |
| | | <result property="createBy" column="create_by" /> |
| | | <result property="updateBy" column="update_by" /> |
| | | <result property="remark" column="remark" /> |
| | | <result property="delFlag" column="del_flag" /> |
| | | <result property="creatorName" column="creator_name" /> |
| | | <result property="assigneeName" column="assignee_name" /> |
| | | <result property="deptName" column="dept_name" /> |
| | | </resultMap> |
| | | |
| | | <sql id="selectSysTaskVo"> |
| | | select t.task_id, t.task_code, t.task_type, t.task_status, t.task_description, |
| | | t.departure_address, t.destination_address, t.planned_start_time, t.planned_end_time, |
| | | t.actual_start_time, t.actual_end_time, t.creator_id, t.assignee_id, t.dept_id, |
| | | t.create_time, t.update_time, t.create_by, t.update_by, t.remark, t.del_flag, |
| | | u1.nick_name as creator_name, u2.nick_name as assignee_name, d.dept_name |
| | | from sys_task t |
| | | left join sys_user u1 on t.creator_id = u1.user_id |
| | | left join sys_user u2 on t.assignee_id = u2.user_id |
| | | left join sys_dept d on t.dept_id = d.dept_id |
| | | </sql> |
| | | |
| | | <select id="selectSysTaskList" parameterType="TaskQueryVO" resultMap="SysTaskResult"> |
| | | <include refid="selectSysTaskVo"/> |
| | | <where> |
| | | t.del_flag = '0' |
| | | <if test="taskCode != null and taskCode != ''"> and t.task_code like concat('%', #{taskCode}, '%')</if> |
| | | <if test="taskType != null and taskType != ''"> and t.task_type = #{taskType}</if> |
| | | <if test="taskStatus != null and taskStatus != ''"> and t.task_status = #{taskStatus}</if> |
| | | <if test="creatorId != null "> and t.creator_id = #{creatorId}</if> |
| | | <if test="assigneeId != null "> and t.assignee_id = #{assigneeId}</if> |
| | | <if test="deptId != null "> and t.dept_id = #{deptId}</if> |
| | | <if test="plannedStartTimeBegin != null "> and t.planned_start_time >= #{plannedStartTimeBegin}</if> |
| | | <if test="plannedStartTimeEnd != null "> and t.planned_start_time <= #{plannedStartTimeEnd}</if> |
| | | <if test="plannedEndTimeBegin != null "> and t.planned_end_time >= #{plannedEndTimeBegin}</if> |
| | | <if test="plannedEndTimeEnd != null "> and t.planned_end_time <= #{plannedEndTimeEnd}</if> |
| | | <if test="overdue != null and overdue == true"> and t.planned_end_time < now() and t.task_status != 'COMPLETED'</if> |
| | | </where> |
| | | order by t.create_time desc |
| | | </select> |
| | | |
| | | <select id="selectSysTaskByTaskId" parameterType="Long" resultMap="SysTaskResult"> |
| | | <include refid="selectSysTaskVo"/> |
| | | where t.task_id = #{taskId} and t.del_flag = '0' |
| | | </select> |
| | | |
| | | <select id="selectSysTaskByTaskCode" parameterType="String" resultMap="SysTaskResult"> |
| | | <include refid="selectSysTaskVo"/> |
| | | where t.task_code = #{taskCode} and t.del_flag = '0' |
| | | </select> |
| | | |
| | | <select id="selectOverdueTasks" resultMap="SysTaskResult"> |
| | | <include refid="selectSysTaskVo"/> |
| | | where t.del_flag = '0' and t.planned_end_time < now() and t.task_status != 'COMPLETED' |
| | | order by t.planned_end_time asc |
| | | </select> |
| | | |
| | | <select id="selectMyTasks" parameterType="Long" resultMap="SysTaskResult"> |
| | | <include refid="selectSysTaskVo"/> |
| | | where t.del_flag = '0' and (t.creator_id = #{userId} or t.assignee_id = #{userId}) |
| | | order by t.create_time desc |
| | | </select> |
| | | |
| | | <select id="selectTaskStatistics" resultType="TaskStatisticsVO"> |
| | | select |
| | | count(*) as totalTasks, |
| | | sum(case when task_status = 'PENDING' then 1 else 0 end) as pendingTasks, |
| | | sum(case when task_status = 'IN_PROGRESS' then 1 else 0 end) as inProgressTasks, |
| | | sum(case when task_status = 'COMPLETED' then 1 else 0 end) as completedTasks, |
| | | sum(case when task_status = 'CANCELLED' then 1 else 0 end) as cancelledTasks, |
| | | sum(case when date(create_time) = curdate() then 1 else 0 end) as todayTasks, |
| | | sum(case when planned_end_time < now() and task_status != 'COMPLETED' then 1 else 0 end) as overdueTasks, |
| | | round(sum(case when task_status = 'IN_PROGRESS' then 1 else 0 end) * 100.0 / count(*), 2) as vehicleUtilization |
| | | from sys_task |
| | | where del_flag = '0' |
| | | </select> |
| | | |
| | | <insert id="insertSysTask" parameterType="SysTask" useGeneratedKeys="true" keyProperty="taskId"> |
| | | insert into sys_task |
| | | <trim prefix="(" suffix=")" suffixOverrides=","> |
| | | <if test="taskCode != null and taskCode != ''">task_code,</if> |
| | | <if test="taskType != null and taskType != ''">task_type,</if> |
| | | <if test="taskStatus != null and taskStatus != ''">task_status,</if> |
| | | <if test="taskDescription != null">task_description,</if> |
| | | <if test="departureAddress != null">departure_address,</if> |
| | | <if test="destinationAddress != null">destination_address,</if> |
| | | <if test="plannedStartTime != null">planned_start_time,</if> |
| | | <if test="plannedEndTime != null">planned_end_time,</if> |
| | | <if test="actualStartTime != null">actual_start_time,</if> |
| | | <if test="actualEndTime != null">actual_end_time,</if> |
| | | <if test="creatorId != null">creator_id,</if> |
| | | <if test="assigneeId != null">assignee_id,</if> |
| | | <if test="deptId != null">dept_id,</if> |
| | | <if test="createTime != null">create_time,</if> |
| | | <if test="updateTime != null">update_time,</if> |
| | | <if test="createBy != null">create_by,</if> |
| | | <if test="updateBy != null">update_by,</if> |
| | | <if test="remark != null">remark,</if> |
| | | <if test="delFlag != null">del_flag,</if> |
| | | </trim> |
| | | <trim prefix="values (" suffix=")" suffixOverrides=","> |
| | | <if test="taskCode != null and taskCode != ''">#{taskCode},</if> |
| | | <if test="taskType != null and taskType != ''">#{taskType},</if> |
| | | <if test="taskStatus != null and taskStatus != ''">#{taskStatus},</if> |
| | | <if test="taskDescription != null">#{taskDescription},</if> |
| | | <if test="departureAddress != null">#{departureAddress},</if> |
| | | <if test="destinationAddress != null">#{destinationAddress},</if> |
| | | <if test="plannedStartTime != null">#{plannedStartTime},</if> |
| | | <if test="plannedEndTime != null">#{plannedEndTime},</if> |
| | | <if test="actualStartTime != null">#{actualStartTime},</if> |
| | | <if test="actualEndTime != null">#{actualEndTime},</if> |
| | | <if test="creatorId != null">#{creatorId},</if> |
| | | <if test="assigneeId != null">#{assigneeId},</if> |
| | | <if test="deptId != null">#{deptId},</if> |
| | | <if test="createTime != null">#{createTime},</if> |
| | | <if test="updateTime != null">#{updateTime},</if> |
| | | <if test="createBy != null">#{createBy},</if> |
| | | <if test="updateBy != null">#{updateBy},</if> |
| | | <if test="remark != null">#{remark},</if> |
| | | <if test="delFlag != null">#{delFlag},</if> |
| | | </trim> |
| | | </insert> |
| | | |
| | | <update id="updateSysTask" parameterType="SysTask"> |
| | | update sys_task |
| | | <trim prefix="SET" suffixOverrides=","> |
| | | <if test="taskCode != null and taskCode != ''">task_code = #{taskCode},</if> |
| | | <if test="taskType != null and taskType != ''">task_type = #{taskType},</if> |
| | | <if test="taskStatus != null and taskStatus != ''">task_status = #{taskStatus},</if> |
| | | <if test="taskDescription != null">task_description = #{taskDescription},</if> |
| | | <if test="departureAddress != null">departure_address = #{departureAddress},</if> |
| | | <if test="destinationAddress != null">destination_address = #{destinationAddress},</if> |
| | | <if test="plannedStartTime != null">planned_start_time = #{plannedStartTime},</if> |
| | | <if test="plannedEndTime != null">planned_end_time = #{plannedEndTime},</if> |
| | | <if test="actualStartTime != null">actual_start_time = #{actualStartTime},</if> |
| | | <if test="actualEndTime != null">actual_end_time = #{actualEndTime},</if> |
| | | <if test="creatorId != null">creator_id = #{creatorId},</if> |
| | | <if test="assigneeId != null">assignee_id = #{assigneeId},</if> |
| | | <if test="deptId != null">dept_id = #{deptId},</if> |
| | | <if test="updateTime != null">update_time = #{updateTime},</if> |
| | | <if test="updateBy != null">update_by = #{updateBy},</if> |
| | | <if test="remark != null">remark = #{remark},</if> |
| | | <if test="delFlag != null">del_flag = #{delFlag},</if> |
| | | </trim> |
| | | where task_id = #{taskId} |
| | | </update> |
| | | |
| | | <update id="updateTaskStatus" parameterType="SysTask"> |
| | | update sys_task set |
| | | task_status = #{taskStatus}, |
| | | <if test="actualStartTime != null">actual_start_time = #{actualStartTime},</if> |
| | | <if test="actualEndTime != null">actual_end_time = #{actualEndTime},</if> |
| | | update_time = now(), |
| | | update_by = #{updateBy} |
| | | where task_id = #{taskId} |
| | | </update> |
| | | |
| | | <update id="assignTask" parameterType="SysTask"> |
| | | update sys_task set |
| | | assignee_id = #{assigneeId}, |
| | | update_time = now(), |
| | | update_by = #{updateBy} |
| | | where task_id = #{taskId} |
| | | </update> |
| | | |
| | | <delete id="deleteSysTaskByTaskId" parameterType="Long"> |
| | | update sys_task set del_flag = '2' where task_id = #{taskId} |
| | | </delete> |
| | | |
| | | <delete id="deleteSysTaskByTaskIds" parameterType="String"> |
| | | update sys_task set del_flag = '2' where task_id in |
| | | <foreach item="taskId" collection="array" open="(" separator="," close=")"> |
| | | #{taskId} |
| | | </foreach> |
| | | </delete> |
| | | </mapper> |
| New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8" ?> |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysTaskVehicleMapper"> |
| | | |
| | | <resultMap type="SysTaskVehicle" id="SysTaskVehicleResult"> |
| | | <result property="id" column="id" /> |
| | | <result property="taskId" column="task_id" /> |
| | | <result property="vehicleId" column="vehicle_id" /> |
| | | <result property="assignTime" column="assign_time" /> |
| | | <result property="assignBy" column="assign_by" /> |
| | | <result property="status" column="status" /> |
| | | <result property="remark" column="remark" /> |
| | | <result property="vehicleNo" column="vehicle_no" /> |
| | | <result property="vehicleType" column="vehicle_type" /> |
| | | <result property="vehicleBrand" column="vehicle_brand" /> |
| | | <result property="vehicleModel" column="vehicle_model" /> |
| | | </resultMap> |
| | | |
| | | <sql id="selectSysTaskVehicleVo"> |
| | | select tv.id, tv.task_id, tv.vehicle_id, tv.assign_time, tv.assign_by, tv.status, tv.remark, |
| | | v.vehicle_no, v.vehicle_type, v.vehicle_brand, v.vehicle_model |
| | | from sys_task_vehicle tv |
| | | left join tb_vehicle_info v on tv.vehicle_id = v.vehicle_id |
| | | </sql> |
| | | |
| | | <select id="selectSysTaskVehicleList" parameterType="SysTaskVehicle" resultMap="SysTaskVehicleResult"> |
| | | <include refid="selectSysTaskVehicleVo"/> |
| | | <where> |
| | | <if test="taskId != null "> and tv.task_id = #{taskId}</if> |
| | | <if test="vehicleId != null "> and tv.vehicle_id = #{vehicleId}</if> |
| | | <if test="status != null and status != ''"> and tv.status = #{status}</if> |
| | | <if test="assignBy != null and assignBy != ''"> and tv.assign_by like concat('%', #{assignBy}, '%')</if> |
| | | </where> |
| | | order by tv.assign_time desc |
| | | </select> |
| | | |
| | | <select id="selectSysTaskVehicleById" parameterType="Long" resultMap="SysTaskVehicleResult"> |
| | | <include refid="selectSysTaskVehicleVo"/> |
| | | where tv.id = #{id} |
| | | </select> |
| | | |
| | | <select id="selectSysTaskVehicleByTaskId" parameterType="Long" resultMap="SysTaskVehicleResult"> |
| | | <include refid="selectSysTaskVehicleVo"/> |
| | | where tv.task_id = #{taskId} |
| | | order by tv.assign_time desc |
| | | </select> |
| | | |
| | | <select id="checkTaskVehicleExists" resultType="int"> |
| | | select count(1) from sys_task_vehicle |
| | | where task_id = #{taskId} and vehicle_id = #{vehicleId} |
| | | </select> |
| | | |
| | | <insert id="insertSysTaskVehicle" parameterType="SysTaskVehicle" useGeneratedKeys="true" keyProperty="id"> |
| | | insert into sys_task_vehicle |
| | | <trim prefix="(" suffix=")" suffixOverrides=","> |
| | | <if test="taskId != null">task_id,</if> |
| | | <if test="vehicleId != null">vehicle_id,</if> |
| | | <if test="assignTime != null">assign_time,</if> |
| | | <if test="assignBy != null and assignBy != ''">assign_by,</if> |
| | | <if test="status != null and status != ''">status,</if> |
| | | <if test="remark != null">remark,</if> |
| | | </trim> |
| | | <trim prefix="values (" suffix=")" suffixOverrides=","> |
| | | <if test="taskId != null">#{taskId},</if> |
| | | <if test="vehicleId != null">#{vehicleId},</if> |
| | | <if test="assignTime != null">#{assignTime},</if> |
| | | <if test="assignBy != null and assignBy != ''">#{assignBy},</if> |
| | | <if test="status != null and status != ''">#{status},</if> |
| | | <if test="remark != null">#{remark},</if> |
| | | </trim> |
| | | </insert> |
| | | |
| | | <insert id="batchInsertSysTaskVehicle" parameterType="java.util.List"> |
| | | insert into sys_task_vehicle (task_id, vehicle_id, assign_time, assign_by, status, remark) |
| | | values |
| | | <foreach collection="list" item="item" separator=","> |
| | | (#{item.taskId}, #{item.vehicleId}, #{item.assignTime}, #{item.assignBy}, #{item.status}, #{item.remark}) |
| | | </foreach> |
| | | </insert> |
| | | |
| | | <update id="updateSysTaskVehicle" parameterType="SysTaskVehicle"> |
| | | update sys_task_vehicle |
| | | <trim prefix="SET" suffixOverrides=","> |
| | | <if test="taskId != null">task_id = #{taskId},</if> |
| | | <if test="vehicleId != null">vehicle_id = #{vehicleId},</if> |
| | | <if test="assignTime != null">assign_time = #{assignTime},</if> |
| | | <if test="assignBy != null and assignBy != ''">assign_by = #{assignBy},</if> |
| | | <if test="status != null and status != ''">status = #{status},</if> |
| | | <if test="remark != null">remark = #{remark},</if> |
| | | </trim> |
| | | where id = #{id} |
| | | </update> |
| | | |
| | | <delete id="deleteSysTaskVehicleById" parameterType="Long"> |
| | | delete from sys_task_vehicle where id = #{id} |
| | | </delete> |
| | | |
| | | <delete id="deleteSysTaskVehicleByIds" parameterType="String"> |
| | | delete from sys_task_vehicle where id in |
| | | <foreach item="id" collection="array" open="(" separator="," close=")"> |
| | | #{id} |
| | | </foreach> |
| | | </delete> |
| | | |
| | | <delete id="deleteSysTaskVehicleByTaskId" parameterType="Long"> |
| | | delete from sys_task_vehicle where task_id = #{taskId} |
| | | </delete> |
| | | |
| | | <delete id="deleteSysTaskVehicleByTaskIdAndVehicleId"> |
| | | delete from sys_task_vehicle where task_id = #{taskId} and vehicle_id = #{vehicleId} |
| | | </delete> |
| | | </mapper> |
| New file |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | // æ¥è¯¢ä»»å¡ç®¡çå表 |
| | | export function listTask(query) { |
| | | return request({ |
| | | url: '/task/list', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢ä»»å¡ç®¡çè¯¦ç» |
| | | export function getTask(taskId) { |
| | | return request({ |
| | | url: '/task/' + taskId, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // æ°å¢ä»»å¡ç®¡ç |
| | | export function addTask(data) { |
| | | return request({ |
| | | url: '/task', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // ä¿®æ¹ä»»å¡ç®¡ç |
| | | export function updateTask(data) { |
| | | return request({ |
| | | url: '/task', |
| | | method: 'put', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // å é¤ä»»å¡ç®¡ç |
| | | export function delTask(taskIds) { |
| | | return request({ |
| | | url: '/task/' + taskIds, |
| | | method: 'delete' |
| | | }) |
| | | } |
| | | |
| | | // åé
ä»»å¡ |
| | | export function assignTask(taskId, data) { |
| | | return request({ |
| | | url: '/task/' + taskId + '/assign', |
| | | method: 'put', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // æ´æ°ä»»å¡ç¶æ |
| | | export function changeTaskStatus(taskId, data) { |
| | | return request({ |
| | | url: '/task/' + taskId + '/status', |
| | | method: 'put', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢ä»»å¡ç»è®¡ä¿¡æ¯ |
| | | export function getTaskStatistics() { |
| | | return request({ |
| | | url: '/task/statistics', |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢è¶
æ¶ä»»å¡å表 |
| | | export function getOverdueTasks() { |
| | | return request({ |
| | | url: '/task/overdue', |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢æçä»»å¡å表 |
| | | export function getMyTasks() { |
| | | return request({ |
| | | url: '/task/my', |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // ä¸ä¼ ä»»å¡éä»¶ |
| | | export function uploadAttachment(taskId, file) { |
| | | const formData = new FormData() |
| | | formData.append('file', file) |
| | | return request({ |
| | | url: '/task/attachment/upload/' + taskId, |
| | | method: 'post', |
| | | data: formData, |
| | | headers: { |
| | | 'Content-Type': 'multipart/form-data' |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // å é¤ä»»å¡éä»¶ |
| | | export function deleteAttachment(attachmentId) { |
| | | return request({ |
| | | url: '/task/attachment/' + attachmentId, |
| | | method: 'delete' |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢ä»»å¡éä»¶å表 |
| | | export function getTaskAttachments(taskId) { |
| | | return request({ |
| | | url: '/task/attachment/list/' + taskId, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢ä»»å¡å
³èç车è¾å表 |
| | | export function getTaskVehicles(taskId) { |
| | | return request({ |
| | | url: '/task/vehicle/list/' + taskId, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢å¯ç¨è½¦è¾å表 |
| | | export function getAvailableVehicles(deptId, taskType) { |
| | | return request({ |
| | | url: '/task/vehicle/available', |
| | | method: 'get', |
| | | params: { deptId, taskType } |
| | | }) |
| | | } |
| | | |
| | | // åé
车è¾ç»ä»»å¡ |
| | | export function assignVehicleToTask(taskId, data) { |
| | | return request({ |
| | | url: '/task/vehicle/assign/' + taskId, |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // æ¹éåé
车è¾ç»ä»»å¡ |
| | | export function assignVehiclesToTask(taskId, data) { |
| | | return request({ |
| | | url: '/task/vehicle/assign-batch/' + taskId, |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // åæ¶ä»»å¡è½¦è¾åé
|
| | | export function unassignVehicleFromTask(taskId, vehicleId) { |
| | | return request({ |
| | | url: '/task/vehicle/' + taskId + '/' + vehicleId, |
| | | method: 'delete' |
| | | }) |
| | | } |
| | |
| | | meta: { title: 'ä¿®æ¹çæé
ç½®', activeMenu: '/tool/gen' } |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | path: '/task/general-detail', |
| | | component: Layout, |
| | | hidden: true, |
| | | permissions: ['task:general:query'], |
| | | children: [ |
| | | { |
| | | path: 'index/:taskId(\\d+)', |
| | | component: () => import('@/views/task/general/detail'), |
| | | name: 'TaskDetail', |
| | | meta: { title: 'ä»»å¡è¯¦æ
', activeMenu: '/task/general' } |
| | | } |
| | | ] |
| | | } |
| | | ] |
| | | |
| New file |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-card class="box-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span>ä»»å¡è¯¦æ
</span> |
| | | <el-button style="float: right; padding: 3px 0" type="text" @click="goBack">è¿å</el-button> |
| | | </div> |
| | | |
| | | <!-- åºæ¬ä¿¡æ¯ --> |
| | | <el-descriptions title="åºæ¬ä¿¡æ¯" :column="2" border> |
| | | <el-descriptions-item label="ä»»å¡ç¼å·">{{ taskDetail.taskCode }}</el-descriptions-item> |
| | | <el-descriptions-item label="ä»»å¡ç±»å"> |
| | | <dict-tag :options="dict.type.sys_task_type" :value="taskDetail.taskType"/> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="ä»»å¡ç¶æ"> |
| | | <dict-tag :options="dict.type.sys_task_status" :value="taskDetail.taskStatus"/> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="å建人">{{ taskDetail.creatorName }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ§è¡äºº">{{ taskDetail.assigneeName }}</el-descriptions-item> |
| | | <el-descriptions-item label="é¨é¨">{{ taskDetail.deptName }}</el-descriptions-item> |
| | | <el-descriptions-item label="ä»»å¡æè¿°" :span="2">{{ taskDetail.taskDescription }}</el-descriptions-item> |
| | | <el-descriptions-item label="åºåå°å" :span="2">{{ taskDetail.departureAddress }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç®çå°å" :span="2">{{ taskDetail.destinationAddress }}</el-descriptions-item> |
| | | <el-descriptions-item label="计åå¼å§æ¶é´">{{ parseTime(taskDetail.plannedStartTime) }}</el-descriptions-item> |
| | | <el-descriptions-item label="计åç»ææ¶é´">{{ parseTime(taskDetail.plannedEndTime) }}</el-descriptions-item> |
| | | <el-descriptions-item label="å®é
å¼å§æ¶é´">{{ parseTime(taskDetail.actualStartTime) }}</el-descriptions-item> |
| | | <el-descriptions-item label="å®é
ç»ææ¶é´">{{ parseTime(taskDetail.actualEndTime) }}</el-descriptions-item> |
| | | <el-descriptions-item label="å建æ¶é´">{{ parseTime(taskDetail.createTime) }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ´æ°æ¶é´">{{ parseTime(taskDetail.updateTime) }}</el-descriptions-item> |
| | | <el-descriptions-item label="夿³¨" :span="2">{{ taskDetail.remark }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | | <!-- æä½æé® --> |
| | | <div style="margin-top: 20px; text-align: center;"> |
| | | <el-button type="primary" @click="handleEdit" v-hasPermi="['task:general:edit']">ç¼è¾ä»»å¡</el-button> |
| | | <el-button type="success" @click="handleAssign" v-hasPermi="['task:general:assign']">åé
ä»»å¡</el-button> |
| | | <el-button type="warning" @click="handleStatusChange" v-hasPermi="['task:general:status']">ç¶æåæ´</el-button> |
| | | <el-button type="info" @click="handleVehicleAssign" v-hasPermi="['task:general:assign']">åé
车è¾</el-button> |
| | | </div> |
| | | </el-card> |
| | | |
| | | <!-- å
³èè½¦è¾ --> |
| | | <el-card class="box-card" style="margin-top: 20px;"> |
| | | <div slot="header" class="clearfix"> |
| | | <span>å
³è车è¾</span> |
| | | <el-button style="float: right; padding: 3px 0" type="text" @click="handleVehicleAssign" v-hasPermi="['task:general:assign']">åé
车è¾</el-button> |
| | | </div> |
| | | |
| | | <el-table :data="taskDetail.assignedVehicles" v-loading="vehicleLoading"> |
| | | <el-table-column label="车çå·" align="center" prop="vehicleNo" /> |
| | | <el-table-column label="车è¾ç±»å" align="center" prop="vehicleType"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag :options="dict.type.sys_vehicle_type" :value="scope.row.vehicleType"/> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="车è¾åç" align="center" prop="vehicleBrand" /> |
| | | <el-table-column label="车è¾åå·" align="center" prop="vehicleModel" /> |
| | | <el-table-column label="åé
æ¶é´" align="center" prop="assignTime" width="180"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.assignTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åé
人" align="center" prop="assignBy" /> |
| | | <el-table-column label="ç¶æ" align="center" prop="status"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag :options="dict.type.sys_task_vehicle_status" :value="scope.row.status"/> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-delete" |
| | | @click="handleUnassignVehicle(scope.row)" |
| | | v-hasPermi="['task:general:assign']" |
| | | >åæ¶åé
</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | |
| | | <!-- ä»»å¡éä»¶ --> |
| | | <el-card class="box-card" style="margin-top: 20px;"> |
| | | <div slot="header" class="clearfix"> |
| | | <span>ä»»å¡éä»¶</span> |
| | | <el-button style="float: right; padding: 3px 0" type="text" @click="handleUpload" v-hasPermi="['task:general:edit']">ä¸ä¼ éä»¶</el-button> |
| | | </div> |
| | | |
| | | <el-table :data="taskDetail.attachments" v-loading="attachmentLoading"> |
| | | <el-table-column label="æä»¶å" align="center" prop="fileName" /> |
| | | <el-table-column label="æä»¶ç±»å" align="center" prop="fileType" /> |
| | | <el-table-column label="æä»¶å¤§å°" align="center" prop="fileSize"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatFileSize(scope.row.fileSize) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ä¸ä¼ æ¶é´" align="center" prop="uploadTime" width="180"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.uploadTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ä¸ä¼ è
" align="center" prop="uploadBy" /> |
| | | <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-download" |
| | | @click="handleDownload(scope.row)" |
| | | >ä¸è½½</el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-delete" |
| | | @click="handleDeleteAttachment(scope.row)" |
| | | v-hasPermi="['task:general:edit']" |
| | | >å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | |
| | | <!-- æä½æ¥å¿ --> |
| | | <el-card class="box-card" style="margin-top: 20px;"> |
| | | <div slot="header" class="clearfix"> |
| | | <span>æä½æ¥å¿</span> |
| | | </div> |
| | | |
| | | <el-timeline> |
| | | <el-timeline-item |
| | | v-for="log in taskDetail.operationLogs" |
| | | :key="log.logId" |
| | | :timestamp="parseTime(log.operationTime)" |
| | | placement="top" |
| | | > |
| | | <el-card> |
| | | <h4>{{ log.operationDesc }}</h4> |
| | | <p>æä½äººï¼{{ log.operatorName }}</p> |
| | | <p v-if="log.oldValue">æä½åï¼{{ log.oldValue }}</p> |
| | | <p v-if="log.newValue">æä½åï¼{{ log.newValue }}</p> |
| | | </el-card> |
| | | </el-timeline-item> |
| | | </el-timeline> |
| | | </el-card> |
| | | |
| | | <!-- ç¼è¾ä»»å¡å¯¹è¯æ¡ --> |
| | | <el-dialog :title="'ç¼è¾ä»»å¡'" :visible.sync="editOpen" width="600px" append-to-body> |
| | | <el-form ref="editForm" :model="editForm" :rules="editRules" label-width="80px"> |
| | | <el-form-item label="ä»»å¡æè¿°" prop="taskDescription"> |
| | | <el-input v-model="editForm.taskDescription" type="textarea" placeholder="请è¾å
¥ä»»å¡æè¿°" /> |
| | | </el-form-item> |
| | | <el-form-item label="åºåå°å" prop="departureAddress"> |
| | | <el-input v-model="editForm.departureAddress" placeholder="请è¾å
¥åºåå°å" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç®çå°å" prop="destinationAddress"> |
| | | <el-input v-model="editForm.destinationAddress" placeholder="请è¾å
¥ç®çå°å" /> |
| | | </el-form-item> |
| | | <el-form-item label="计åå¼å§æ¶é´" prop="plannedStartTime"> |
| | | <el-date-picker clearable |
| | | v-model="editForm.plannedStartTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="è¯·éæ©è®¡åå¼å§æ¶é´"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="计åç»ææ¶é´" prop="plannedEndTime"> |
| | | <el-date-picker clearable |
| | | v-model="editForm.plannedEndTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="è¯·éæ©è®¡åç»ææ¶é´"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="æ§è¡äºº" prop="assigneeId"> |
| | | <el-select v-model="editForm.assigneeId" placeholder="è¯·éæ©æ§è¡äºº" clearable> |
| | | <el-option |
| | | v-for="user in userList" |
| | | :key="user.userId" |
| | | :label="user.nickName" |
| | | :value="user.userId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="editForm.remark" type="textarea" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="submitEdit">ç¡® å®</el-button> |
| | | <el-button @click="cancelEdit">å æ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | |
| | | <!-- åé
ä»»å¡å¯¹è¯æ¡ --> |
| | | <el-dialog title="åé
ä»»å¡" :visible.sync="assignOpen" width="500px" append-to-body> |
| | | <el-form ref="assignForm" :model="assignForm" :rules="assignRules" label-width="80px"> |
| | | <el-form-item label="æ§è¡äºº" prop="assigneeId"> |
| | | <el-select v-model="assignForm.assigneeId" placeholder="è¯·éæ©æ§è¡äºº" clearable> |
| | | <el-option |
| | | v-for="user in userList" |
| | | :key="user.userId" |
| | | :label="user.nickName" |
| | | :value="user.userId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="assignForm.remark" type="textarea" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="submitAssign">ç¡® å®</el-button> |
| | | <el-button @click="cancelAssign">å æ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | |
| | | <!-- ç¶æåæ´å¯¹è¯æ¡ --> |
| | | <el-dialog title="ç¶æåæ´" :visible.sync="statusOpen" width="500px" append-to-body> |
| | | <el-form ref="statusForm" :model="statusForm" :rules="statusRules" label-width="80px"> |
| | | <el-form-item label="ä»»å¡ç¶æ" prop="taskStatus"> |
| | | <el-select v-model="statusForm.taskStatus" placeholder="è¯·éæ©ä»»å¡ç¶æ"> |
| | | <el-option |
| | | v-for="dict in dict.type.sys_task_status" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="statusForm.remark" type="textarea" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="submitStatusChange">ç¡® å®</el-button> |
| | | <el-button @click="cancelStatusChange">å æ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | |
| | | <!-- åé
车è¾å¯¹è¯æ¡ --> |
| | | <el-dialog title="åé
车è¾" :visible.sync="vehicleAssignOpen" width="600px" append-to-body> |
| | | <el-form ref="vehicleAssignForm" :model="vehicleAssignForm" :rules="vehicleAssignRules" label-width="80px"> |
| | | <el-form-item label="车è¾" prop="vehicleIds"> |
| | | <el-select v-model="vehicleAssignForm.vehicleIds" placeholder="è¯·éæ©è½¦è¾" multiple clearable> |
| | | <el-option |
| | | v-for="vehicle in availableVehicles" |
| | | :key="vehicle.vehicleId" |
| | | :label="vehicle.vehicleNo + ' (' + vehicle.vehicleType + ')'" |
| | | :value="vehicle.vehicleId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="vehicleAssignForm.remark" type="textarea" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="submitVehicleAssign">ç¡® å®</el-button> |
| | | <el-button @click="cancelVehicleAssign">å æ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | |
| | | <!-- ä¸ä¼ éä»¶å¯¹è¯æ¡ --> |
| | | <el-dialog title="ä¸ä¼ éä»¶" :visible.sync="uploadOpen" width="500px" append-to-body> |
| | | <el-upload |
| | | class="upload-demo" |
| | | drag |
| | | :action="uploadUrl" |
| | | :headers="uploadHeaders" |
| | | :data="uploadData" |
| | | :on-success="handleUploadSuccess" |
| | | :on-error="handleUploadError" |
| | | :before-upload="beforeUpload" |
| | | multiple> |
| | | <i class="el-icon-upload"></i> |
| | | <div class="el-upload__text">å°æä»¶æå°æ¤å¤ï¼æ<em>ç¹å»ä¸ä¼ </em></div> |
| | | <div class="el-upload__tip" slot="tip">åªè½ä¸ä¼ jpg/png/pdf/doc/docxæä»¶ï¼ä¸ä¸è¶
è¿10MB</div> |
| | | </el-upload> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getTask, updateTask, assignTask, changeTaskStatus, uploadAttachment, deleteAttachment, getTaskVehicles, getAvailableVehicles, assignVehiclesToTask, unassignVehicleFromTask } from "@/api/task"; |
| | | import { listUser } from "@/api/system/user"; |
| | | import { getToken } from "@/utils/auth"; |
| | | |
| | | export default { |
| | | name: "TaskDetail", |
| | | dicts: ['sys_task_type', 'sys_task_status', 'sys_vehicle_type', 'sys_task_vehicle_status'], |
| | | data() { |
| | | return { |
| | | // ä»»å¡è¯¦æ
|
| | | taskDetail: { |
| | | assignedVehicles: [], |
| | | attachments: [], |
| | | operationLogs: [] |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºç¼è¾å¯¹è¯æ¡ |
| | | editOpen: false, |
| | | // æ¯å¦æ¾ç¤ºåé
å¯¹è¯æ¡ |
| | | assignOpen: false, |
| | | // æ¯å¦æ¾ç¤ºç¶æåæ´å¯¹è¯æ¡ |
| | | statusOpen: false, |
| | | // æ¯å¦æ¾ç¤ºè½¦è¾åé
å¯¹è¯æ¡ |
| | | vehicleAssignOpen: false, |
| | | // æ¯å¦æ¾ç¤ºä¸ä¼ å¯¹è¯æ¡ |
| | | uploadOpen: false, |
| | | // ç¼è¾è¡¨å |
| | | editForm: {}, |
| | | // åé
表å |
| | | assignForm: {}, |
| | | // ç¶æåæ´è¡¨å |
| | | statusForm: {}, |
| | | // 车è¾åé
表å |
| | | vehicleAssignForm: {}, |
| | | // ç¨æ·å表 |
| | | userList: [], |
| | | // å¯ç¨è½¦è¾å表 |
| | | availableVehicles: [], |
| | | // å è½½ç¶æ |
| | | vehicleLoading: false, |
| | | attachmentLoading: false, |
| | | // ä¸ä¼ ç¸å
³ |
| | | uploadUrl: process.env.VUE_APP_BASE_API + "/task/attachment/upload/" + this.$route.params.taskId, |
| | | uploadHeaders: { |
| | | Authorization: "Bearer " + getToken() |
| | | }, |
| | | uploadData: {}, |
| | | // è¡¨åæ ¡éª |
| | | editRules: { |
| | | taskDescription: [ |
| | | { required: true, message: "ä»»å¡æè¿°ä¸è½ä¸ºç©º", trigger: "blur" } |
| | | ], |
| | | plannedStartTime: [ |
| | | { required: true, message: "计åå¼å§æ¶é´ä¸è½ä¸ºç©º", trigger: "blur" } |
| | | ], |
| | | plannedEndTime: [ |
| | | { required: true, message: "计åç»ææ¶é´ä¸è½ä¸ºç©º", trigger: "blur" } |
| | | ] |
| | | }, |
| | | assignRules: { |
| | | assigneeId: [ |
| | | { required: true, message: "æ§è¡äººä¸è½ä¸ºç©º", trigger: "change" } |
| | | ] |
| | | }, |
| | | statusRules: { |
| | | taskStatus: [ |
| | | { required: true, message: "ä»»å¡ç¶æä¸è½ä¸ºç©º", trigger: "change" } |
| | | ] |
| | | }, |
| | | vehicleAssignRules: { |
| | | vehicleIds: [ |
| | | { required: true, message: "车è¾ä¸è½ä¸ºç©º", trigger: "change" } |
| | | ] |
| | | } |
| | | }; |
| | | }, |
| | | created() { |
| | | this.getTaskDetail(); |
| | | this.getUserList(); |
| | | }, |
| | | methods: { |
| | | /** è·åä»»å¡è¯¦æ
*/ |
| | | getTaskDetail() { |
| | | getTask(this.$route.params.taskId).then(response => { |
| | | this.taskDetail = response.data; |
| | | }); |
| | | }, |
| | | /** è·åç¨æ·å表 */ |
| | | getUserList() { |
| | | listUser().then(response => { |
| | | this.userList = response.rows; |
| | | }); |
| | | }, |
| | | /** è·åå¯ç¨è½¦è¾å表 */ |
| | | getAvailableVehicleList() { |
| | | getAvailableVehicles(this.taskDetail.deptId, this.taskDetail.taskType).then(response => { |
| | | this.availableVehicles = response.data; |
| | | }); |
| | | }, |
| | | /** è¿å */ |
| | | goBack() { |
| | | this.$router.go(-1); |
| | | }, |
| | | /** ç¼è¾ä»»å¡ */ |
| | | handleEdit() { |
| | | this.editForm = { |
| | | taskId: this.taskDetail.taskId, |
| | | taskDescription: this.taskDetail.taskDescription, |
| | | departureAddress: this.taskDetail.departureAddress, |
| | | destinationAddress: this.taskDetail.destinationAddress, |
| | | plannedStartTime: this.taskDetail.plannedStartTime, |
| | | plannedEndTime: this.taskDetail.plannedEndTime, |
| | | assigneeId: this.taskDetail.assigneeId, |
| | | remark: this.taskDetail.remark |
| | | }; |
| | | this.editOpen = true; |
| | | }, |
| | | /** åé
ä»»å¡ */ |
| | | handleAssign() { |
| | | this.assignForm = { |
| | | taskId: this.taskDetail.taskId, |
| | | assigneeId: this.taskDetail.assigneeId, |
| | | remark: null |
| | | }; |
| | | this.assignOpen = true; |
| | | }, |
| | | /** ç¶æåæ´ */ |
| | | handleStatusChange() { |
| | | this.statusForm = { |
| | | taskId: this.taskDetail.taskId, |
| | | taskStatus: this.taskDetail.taskStatus, |
| | | remark: null |
| | | }; |
| | | this.statusOpen = true; |
| | | }, |
| | | /** åé
è½¦è¾ */ |
| | | handleVehicleAssign() { |
| | | this.getAvailableVehicleList(); |
| | | this.vehicleAssignForm = { |
| | | taskId: this.taskDetail.taskId, |
| | | vehicleIds: [], |
| | | remark: null |
| | | }; |
| | | this.vehicleAssignOpen = true; |
| | | }, |
| | | /** ä¸ä¼ éä»¶ */ |
| | | handleUpload() { |
| | | this.uploadOpen = true; |
| | | }, |
| | | /** åæ¶è½¦è¾åé
*/ |
| | | handleUnassignVehicle(row) { |
| | | this.$modal.confirm('æ¯å¦ç¡®è®¤åæ¶è½¦è¾"' + row.vehicleNo + '"çåé
ï¼').then(() => { |
| | | return unassignVehicleFromTask(this.taskDetail.taskId, row.vehicleId); |
| | | }).then(() => { |
| | | this.$modal.msgSuccess("åæ¶åé
æå"); |
| | | this.getTaskDetail(); |
| | | }).catch(() => {}); |
| | | }, |
| | | /** ä¸è½½éä»¶ */ |
| | | handleDownload(row) { |
| | | window.open(row.filePath); |
| | | }, |
| | | /** å é¤éä»¶ */ |
| | | handleDeleteAttachment(row) { |
| | | this.$modal.confirm('æ¯å¦ç¡®è®¤å é¤éä»¶"' + row.fileName + '"ï¼').then(() => { |
| | | return deleteAttachment(row.attachmentId); |
| | | }).then(() => { |
| | | this.$modal.msgSuccess("å 餿å"); |
| | | this.getTaskDetail(); |
| | | }).catch(() => {}); |
| | | }, |
| | | /** æäº¤ç¼è¾ */ |
| | | submitEdit() { |
| | | this.$refs["editForm"].validate(valid => { |
| | | if (valid) { |
| | | updateTask(this.editForm).then(response => { |
| | | this.$modal.msgSuccess("ä¿®æ¹æå"); |
| | | this.editOpen = false; |
| | | this.getTaskDetail(); |
| | | }); |
| | | } |
| | | }); |
| | | }, |
| | | /** æäº¤åé
*/ |
| | | submitAssign() { |
| | | this.$refs["assignForm"].validate(valid => { |
| | | if (valid) { |
| | | assignTask(this.assignForm.taskId, this.assignForm).then(response => { |
| | | this.$modal.msgSuccess("åé
æå"); |
| | | this.assignOpen = false; |
| | | this.getTaskDetail(); |
| | | }); |
| | | } |
| | | }); |
| | | }, |
| | | /** æäº¤ç¶æåæ´ */ |
| | | submitStatusChange() { |
| | | this.$refs["statusForm"].validate(valid => { |
| | | if (valid) { |
| | | changeTaskStatus(this.statusForm.taskId, this.statusForm).then(response => { |
| | | this.$modal.msgSuccess("ç¶æåæ´æå"); |
| | | this.statusOpen = false; |
| | | this.getTaskDetail(); |
| | | }); |
| | | } |
| | | }); |
| | | }, |
| | | /** æäº¤è½¦è¾åé
*/ |
| | | submitVehicleAssign() { |
| | | this.$refs["vehicleAssignForm"].validate(valid => { |
| | | if (valid) { |
| | | assignVehiclesToTask(this.vehicleAssignForm.taskId, this.vehicleAssignForm).then(response => { |
| | | this.$modal.msgSuccess("åé
æå"); |
| | | this.vehicleAssignOpen = false; |
| | | this.getTaskDetail(); |
| | | }); |
| | | } |
| | | }); |
| | | }, |
| | | /** åæ¶ç¼è¾ */ |
| | | cancelEdit() { |
| | | this.editOpen = false; |
| | | this.editForm = {}; |
| | | }, |
| | | /** åæ¶åé
*/ |
| | | cancelAssign() { |
| | | this.assignOpen = false; |
| | | this.assignForm = {}; |
| | | }, |
| | | /** åæ¶ç¶æåæ´ */ |
| | | cancelStatusChange() { |
| | | this.statusOpen = false; |
| | | this.statusForm = {}; |
| | | }, |
| | | /** åæ¶è½¦è¾åé
*/ |
| | | cancelVehicleAssign() { |
| | | this.vehicleAssignOpen = false; |
| | | this.vehicleAssignForm = {}; |
| | | }, |
| | | /** ä¸ä¼ åæ£æ¥ */ |
| | | beforeUpload(file) { |
| | | const isValidType = ['image/jpeg', 'image/png', 'application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'].includes(file.type); |
| | | const isLt10M = file.size / 1024 / 1024 < 10; |
| | | |
| | | if (!isValidType) { |
| | | this.$message.error('åªè½ä¸ä¼ JPG/PNG/PDF/DOC/DOCX æ ¼å¼çæä»¶!'); |
| | | } |
| | | if (!isLt10M) { |
| | | this.$message.error('ä¸ä¼ æä»¶å¤§å°ä¸è½è¶
è¿ 10MB!'); |
| | | } |
| | | return isValidType && isLt10M; |
| | | }, |
| | | /** ä¸ä¼ æå */ |
| | | handleUploadSuccess(response, file, fileList) { |
| | | this.$modal.msgSuccess("ä¸ä¼ æå"); |
| | | this.uploadOpen = false; |
| | | this.getTaskDetail(); |
| | | }, |
| | | /** ä¸ä¼ 失败 */ |
| | | handleUploadError(err, file, fileList) { |
| | | this.$modal.msgError("ä¸ä¼ 失败"); |
| | | }, |
| | | /** æ ¼å¼åæä»¶å¤§å° */ |
| | | formatFileSize(size) { |
| | | if (size < 1024) { |
| | | return size + ' B'; |
| | | } else if (size < 1024 * 1024) { |
| | | return (size / 1024).toFixed(2) + ' KB'; |
| | | } else { |
| | | return (size / 1024 / 1024).toFixed(2) + ' MB'; |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .box-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | </style> |
| New file |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="ä»»å¡ç¼å·" prop="taskCode"> |
| | | <el-input |
| | | v-model="queryParams.taskCode" |
| | | placeholder="请è¾å
¥ä»»å¡ç¼å·" |
| | | clearable |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ä»»å¡ç±»å" prop="taskType"> |
| | | <el-select v-model="queryParams.taskType" placeholder="è¯·éæ©ä»»å¡ç±»å" clearable> |
| | | <el-option |
| | | v-for="dict in dict.type.sys_task_type" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="ä»»å¡ç¶æ" prop="taskStatus"> |
| | | <el-select v-model="queryParams.taskStatus" placeholder="è¯·éæ©ä»»å¡ç¶æ" clearable> |
| | | <el-option |
| | | v-for="dict in dict.type.sys_task_status" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="计åå¼å§æ¶é´"> |
| | | <el-date-picker |
| | | v-model="dateRange" |
| | | style="width: 240px" |
| | | value-format="yyyy-MM-dd" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | icon="el-icon-plus" |
| | | size="mini" |
| | | @click="handleAdd" |
| | | v-hasPermi="['task:general:add']" |
| | | >æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="success" |
| | | plain |
| | | icon="el-icon-edit" |
| | | size="mini" |
| | | :disabled="single" |
| | | @click="handleUpdate" |
| | | v-hasPermi="['task:general:edit']" |
| | | >ä¿®æ¹</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="danger" |
| | | plain |
| | | icon="el-icon-delete" |
| | | size="mini" |
| | | :disabled="multiple" |
| | | @click="handleDelete" |
| | | v-hasPermi="['task:general:remove']" |
| | | >å é¤</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="warning" |
| | | plain |
| | | icon="el-icon-download" |
| | | size="mini" |
| | | @click="handleExport" |
| | | v-hasPermi="['task:general:export']" |
| | | >导åº</el-button> |
| | | </el-col> |
| | | <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | |
| | | <el-table v-loading="loading" :data="taskList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="ä»»å¡ç¼å·" align="center" prop="taskCode" /> |
| | | <el-table-column label="ä»»å¡ç±»å" align="center" prop="taskType"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag :options="dict.type.sys_task_type" :value="scope.row.taskType"/> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ä»»å¡ç¶æ" align="center" prop="taskStatus"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag :options="dict.type.sys_task_status" :value="scope.row.taskStatus"/> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ä»»å¡æè¿°" align="center" prop="taskDescription" show-overflow-tooltip /> |
| | | <el-table-column label="åºåå°å" align="center" prop="departureAddress" show-overflow-tooltip /> |
| | | <el-table-column label="ç®çå°å" align="center" prop="destinationAddress" show-overflow-tooltip /> |
| | | <el-table-column label="计åå¼å§æ¶é´" align="center" prop="plannedStartTime" width="180"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.plannedStartTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="计åç»ææ¶é´" align="center" prop="plannedEndTime" width="180"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.plannedEndTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建人" align="center" prop="creatorName" /> |
| | | <el-table-column label="æ§è¡äºº" align="center" prop="assigneeName" /> |
| | | <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-view" |
| | | @click="handleView(scope.row)" |
| | | v-hasPermi="['task:general:query']" |
| | | >æ¥ç</el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-edit" |
| | | @click="handleUpdate(scope.row)" |
| | | v-hasPermi="['task:general:edit']" |
| | | >ä¿®æ¹</el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-user" |
| | | @click="handleAssign(scope.row)" |
| | | v-hasPermi="['task:general:assign']" |
| | | >åé
</el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-refresh" |
| | | @click="handleStatusChange(scope.row)" |
| | | v-hasPermi="['task:general:status']" |
| | | >ç¶æ</el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-delete" |
| | | @click="handleDelete(scope.row)" |
| | | v-hasPermi="['task:general:remove']" |
| | | >å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | v-show="total>0" |
| | | :total="total" |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getList" |
| | | /> |
| | | |
| | | <!-- æ·»å æä¿®æ¹ä»»å¡ç®¡çå¯¹è¯æ¡ --> |
| | | <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body> |
| | | <el-form ref="form" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="ä»»å¡ç±»å" prop="taskType"> |
| | | <el-select v-model="form.taskType" placeholder="è¯·éæ©ä»»å¡ç±»å"> |
| | | <el-option |
| | | v-for="dict in dict.type.sys_task_type" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="ä»»å¡æè¿°" prop="taskDescription"> |
| | | <el-input v-model="form.taskDescription" type="textarea" placeholder="请è¾å
¥ä»»å¡æè¿°" /> |
| | | </el-form-item> |
| | | <el-form-item label="åºåå°å" prop="departureAddress"> |
| | | <el-input v-model="form.departureAddress" placeholder="请è¾å
¥åºåå°å" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç®çå°å" prop="destinationAddress"> |
| | | <el-input v-model="form.destinationAddress" placeholder="请è¾å
¥ç®çå°å" /> |
| | | </el-form-item> |
| | | <el-form-item label="计åå¼å§æ¶é´" prop="plannedStartTime"> |
| | | <el-date-picker clearable |
| | | v-model="form.plannedStartTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="è¯·éæ©è®¡åå¼å§æ¶é´"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="计åç»ææ¶é´" prop="plannedEndTime"> |
| | | <el-date-picker clearable |
| | | v-model="form.plannedEndTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="è¯·éæ©è®¡åç»ææ¶é´"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="æ§è¡äºº" prop="assigneeId"> |
| | | <el-select v-model="form.assigneeId" placeholder="è¯·éæ©æ§è¡äºº" clearable> |
| | | <el-option |
| | | v-for="user in userList" |
| | | :key="user.userId" |
| | | :label="user.nickName" |
| | | :value="user.userId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | |
| | | |
| | | <!-- ä»»å¡åé
å¯¹è¯æ¡ --> |
| | | <el-dialog title="ä»»å¡åé
" :visible.sync="assignOpen" width="500px" append-to-body> |
| | | <el-form ref="assignForm" :model="assignForm" :rules="assignRules" label-width="80px"> |
| | | <el-form-item label="æ§è¡äºº" prop="assigneeId"> |
| | | <el-select v-model="assignForm.assigneeId" placeholder="è¯·éæ©æ§è¡äºº" clearable> |
| | | <el-option |
| | | v-for="user in userList" |
| | | :key="user.userId" |
| | | :label="user.nickName" |
| | | :value="user.userId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="assignForm.remark" type="textarea" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="submitAssign">ç¡® å®</el-button> |
| | | <el-button @click="cancelAssign">å æ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | |
| | | <!-- ç¶æåæ´å¯¹è¯æ¡ --> |
| | | <el-dialog title="ç¶æåæ´" :visible.sync="statusOpen" width="500px" append-to-body> |
| | | <el-form ref="statusForm" :model="statusForm" :rules="statusRules" label-width="80px"> |
| | | <el-form-item label="ä»»å¡ç¶æ" prop="taskStatus"> |
| | | <el-select v-model="statusForm.taskStatus" placeholder="è¯·éæ©ä»»å¡ç¶æ"> |
| | | <el-option |
| | | v-for="dict in dict.type.sys_task_status" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="statusForm.remark" type="textarea" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="submitStatusChange">ç¡® å®</el-button> |
| | | <el-button @click="cancelStatusChange">å æ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { listTask, getTask, delTask, addTask, updateTask, assignTask, changeTaskStatus } from "@/api/task"; |
| | | import { listUser } from "@/api/system/user"; |
| | | |
| | | export default { |
| | | name: "Task", |
| | | dicts: ['sys_task_type', 'sys_task_status'], |
| | | data() { |
| | | return { |
| | | // é®ç½©å± |
| | | loading: true, |
| | | // é䏿°ç» |
| | | ids: [], |
| | | // éå个ç¦ç¨ |
| | | single: true, |
| | | // éå¤ä¸ªç¦ç¨ |
| | | multiple: true, |
| | | // æ¾ç¤ºæç´¢æ¡ä»¶ |
| | | showSearch: true, |
| | | // æ»æ¡æ° |
| | | total: 0, |
| | | // ä»»å¡ç®¡çè¡¨æ ¼æ°æ® |
| | | taskList: [], |
| | | // å¼¹åºå±æ é¢ |
| | | title: "", |
| | | // æ¯å¦æ¾ç¤ºå¼¹åºå± |
| | | open: false, |
| | | // æ¯å¦æ¾ç¤ºåé
å¼¹åºå± |
| | | assignOpen: false, |
| | | // æ¯å¦æ¾ç¤ºç¶æåæ´å¼¹åºå± |
| | | statusOpen: false, |
| | | // æ¥æèå´ |
| | | dateRange: [], |
| | | // æ¥è¯¢åæ° |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | taskCode: null, |
| | | taskType: null, |
| | | taskStatus: null, |
| | | plannedStartTimeBegin: null, |
| | | plannedStartTimeEnd: null, |
| | | }, |
| | | // 表ååæ° |
| | | form: {}, |
| | | // åé
表å |
| | | assignForm: {}, |
| | | // ç¶æåæ´è¡¨å |
| | | statusForm: {}, |
| | | // ç¨æ·å表 |
| | | userList: [], |
| | | // è¡¨åæ ¡éª |
| | | rules: { |
| | | taskType: [ |
| | | { required: true, message: "ä»»å¡ç±»åä¸è½ä¸ºç©º", trigger: "change" } |
| | | ], |
| | | taskDescription: [ |
| | | { required: true, message: "ä»»å¡æè¿°ä¸è½ä¸ºç©º", trigger: "blur" } |
| | | ], |
| | | plannedStartTime: [ |
| | | { required: true, message: "计åå¼å§æ¶é´ä¸è½ä¸ºç©º", trigger: "blur" } |
| | | ], |
| | | plannedEndTime: [ |
| | | { required: true, message: "计åç»ææ¶é´ä¸è½ä¸ºç©º", trigger: "blur" } |
| | | ] |
| | | }, |
| | | // åé
è¡¨åæ ¡éª |
| | | assignRules: { |
| | | assigneeId: [ |
| | | { required: true, message: "æ§è¡äººä¸è½ä¸ºç©º", trigger: "change" } |
| | | ] |
| | | }, |
| | | // ç¶æåæ´è¡¨åæ ¡éª |
| | | statusRules: { |
| | | taskStatus: [ |
| | | { required: true, message: "ä»»å¡ç¶æä¸è½ä¸ºç©º", trigger: "change" } |
| | | ] |
| | | } |
| | | }; |
| | | }, |
| | | created() { |
| | | this.getList(); |
| | | this.getUserList(); |
| | | }, |
| | | methods: { |
| | | /** æ¥è¯¢ä»»å¡ç®¡çå表 */ |
| | | getList() { |
| | | this.loading = true; |
| | | if (this.dateRange != null && this.dateRange.length === 2) { |
| | | this.queryParams.plannedStartTimeBegin = this.dateRange[0]; |
| | | this.queryParams.plannedStartTimeEnd = this.dateRange[1]; |
| | | } |
| | | listTask(this.queryParams).then(response => { |
| | | this.taskList = response.rows; |
| | | this.total = response.total; |
| | | this.loading = false; |
| | | }); |
| | | }, |
| | | /** æ¥è¯¢ç¨æ·å表 */ |
| | | getUserList() { |
| | | listUser().then(response => { |
| | | this.userList = response.rows; |
| | | }); |
| | | }, |
| | | // åæ¶æé® |
| | | cancel() { |
| | | this.open = false; |
| | | this.reset(); |
| | | }, |
| | | // 表åéç½® |
| | | reset() { |
| | | this.form = { |
| | | taskId: null, |
| | | taskType: null, |
| | | taskDescription: null, |
| | | departureAddress: null, |
| | | destinationAddress: null, |
| | | plannedStartTime: null, |
| | | plannedEndTime: null, |
| | | assigneeId: null, |
| | | remark: null |
| | | }; |
| | | this.resetForm("form"); |
| | | }, |
| | | /** æç´¢æé®æä½ */ |
| | | handleQuery() { |
| | | this.queryParams.pageNum = 1; |
| | | this.getList(); |
| | | }, |
| | | /** éç½®æé®æä½ */ |
| | | resetQuery() { |
| | | this.dateRange = []; |
| | | this.resetForm("queryForm"); |
| | | this.handleQuery(); |
| | | }, |
| | | // å¤éæ¡é䏿°æ® |
| | | handleSelectionChange(selection) { |
| | | this.ids = selection.map(item => item.taskId) |
| | | this.single = selection.length!==1 |
| | | this.multiple = !selection.length |
| | | }, |
| | | /** æ°å¢æé®æä½ */ |
| | | handleAdd() { |
| | | this.reset(); |
| | | this.open = true; |
| | | this.title = "æ·»å ä»»å¡ç®¡ç"; |
| | | }, |
| | | /** ä¿®æ¹æé®æä½ */ |
| | | handleUpdate(row) { |
| | | this.reset(); |
| | | const taskId = row.taskId || this.ids |
| | | getTask(taskId).then(response => { |
| | | this.form = response.data; |
| | | this.open = true; |
| | | this.title = "ä¿®æ¹ä»»å¡ç®¡ç"; |
| | | }); |
| | | }, |
| | | /** æ¥çæé®æä½ */ |
| | | handleView(row) { |
| | | this.$router.push('/task/general-detail/index/' + row.taskId); |
| | | }, |
| | | /** åé
æé®æä½ */ |
| | | handleAssign(row) { |
| | | this.assignForm = { |
| | | taskId: row.taskId, |
| | | assigneeId: row.assigneeId, |
| | | remark: null |
| | | }; |
| | | this.assignOpen = true; |
| | | }, |
| | | /** ç¶æåæ´æé®æä½ */ |
| | | handleStatusChange(row) { |
| | | this.statusForm = { |
| | | taskId: row.taskId, |
| | | taskStatus: row.taskStatus, |
| | | remark: null |
| | | }; |
| | | this.statusOpen = true; |
| | | }, |
| | | /** æäº¤æé® */ |
| | | submitForm() { |
| | | this.$refs["form"].validate(valid => { |
| | | if (valid) { |
| | | if (this.form.taskId != null) { |
| | | updateTask(this.form).then(response => { |
| | | this.$modal.msgSuccess("ä¿®æ¹æå"); |
| | | this.open = false; |
| | | this.getList(); |
| | | }); |
| | | } else { |
| | | addTask(this.form).then(response => { |
| | | this.$modal.msgSuccess("æ°å¢æå"); |
| | | this.open = false; |
| | | this.getList(); |
| | | }); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | /** æäº¤åé
*/ |
| | | submitAssign() { |
| | | this.$refs["assignForm"].validate(valid => { |
| | | if (valid) { |
| | | assignTask(this.assignForm.taskId, this.assignForm).then(response => { |
| | | this.$modal.msgSuccess("åé
æå"); |
| | | this.assignOpen = false; |
| | | this.getList(); |
| | | }); |
| | | } |
| | | }); |
| | | }, |
| | | /** æäº¤ç¶æåæ´ */ |
| | | submitStatusChange() { |
| | | this.$refs["statusForm"].validate(valid => { |
| | | if (valid) { |
| | | changeTaskStatus(this.statusForm.taskId, this.statusForm).then(response => { |
| | | this.$modal.msgSuccess("ç¶æåæ´æå"); |
| | | this.statusOpen = false; |
| | | this.getList(); |
| | | }); |
| | | } |
| | | }); |
| | | }, |
| | | /** å é¤æé®æä½ */ |
| | | handleDelete(row) { |
| | | const taskIds = row.taskId || this.ids; |
| | | this.$modal.confirm('æ¯å¦ç¡®è®¤å é¤ä»»å¡ç®¡çç¼å·ä¸º"' + taskIds + '"çæ°æ®é¡¹ï¼').then(function() { |
| | | return delTask(taskIds); |
| | | }).then(() => { |
| | | this.getList(); |
| | | this.$modal.msgSuccess("å 餿å"); |
| | | }).catch(() => {}); |
| | | }, |
| | | /** å¯¼åºæé®æä½ */ |
| | | handleExport() { |
| | | this.download('task/export', { |
| | | ...this.queryParams |
| | | }, `task_${new Date().getTime()}.xlsx`) |
| | | }, |
| | | /** åæ¶åé
*/ |
| | | cancelAssign() { |
| | | this.assignOpen = false; |
| | | this.assignForm = {}; |
| | | }, |
| | | /** åæ¶ç¶æåæ´ */ |
| | | cancelStatusChange() { |
| | | this.statusOpen = false; |
| | | this.statusForm = {}; |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| New file |
| | |
| | | -- ---------------------------- |
| | | -- éç¨ä»»å¡ç®¡çæ°æ®åå
¸ |
| | | -- ---------------------------- |
| | | |
| | | -- 1. ä»»å¡ç±»ååå
¸ |
| | | -- ---------------------------- |
| | | INSERT INTO sys_dict_type VALUES ('sys_task_type', 'ä»»å¡ç±»å', '0', 'admin', sysdate(), '', null, 'ä»»å¡ç±»åå表'); |
| | | INSERT INTO sys_dict_data VALUES (1, 1, 'ç»´ä¿®ä¿å
»', 'MAINTENANCE', 'sys_task_type', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, 'ç»´ä¿®ä¿å
»ä»»å¡'); |
| | | INSERT INTO sys_dict_data VALUES (2, 2, 'å æ²¹ä»»å¡', 'FUEL', 'sys_task_type', '', 'success', 'N', '0', 'admin', sysdate(), '', null, 'å æ²¹ä»»å¡'); |
| | | INSERT INTO sys_dict_data VALUES (3, 3, 'å
¶ä»', 'OTHER', 'sys_task_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, 'å
¶ä»ç±»åä»»å¡'); |
| | | |
| | | -- 2. ä»»å¡ç¶æåå
¸ |
| | | -- ---------------------------- |
| | | INSERT INTO sys_dict_type VALUES ('sys_task_status', 'ä»»å¡ç¶æ', '0', 'admin', sysdate(), '', null, 'ä»»å¡ç¶æå表'); |
| | | INSERT INTO sys_dict_data VALUES (4, 1, 'å¾
å¼å§', 'PENDING', 'sys_task_status', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, 'ä»»å¡å·²å建ï¼çå¾
å¼å§'); |
| | | INSERT INTO sys_dict_data VALUES (5, 2, 'ä»»å¡ä¸', 'IN_PROGRESS', 'sys_task_status', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, 'ä»»å¡å·²ç»å¼å§'); |
| | | INSERT INTO sys_dict_data VALUES (6, 3, '已宿', 'COMPLETED', 'sys_task_status', '', 'success', 'N', '0', 'admin', sysdate(), '', null, 'ä»»å¡å·²å®æ'); |
| | | INSERT INTO sys_dict_data VALUES (7, 4, '已忶', 'CANCELLED', 'sys_task_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, 'ä»»å¡å·²åæ¶'); |
| | | |
| | | -- 3. 车è¾ç±»ååå
¸ |
| | | -- ---------------------------- |
| | | INSERT INTO sys_dict_type VALUES ('sys_vehicle_type', '车è¾ç±»å', '0', 'admin', sysdate(), '', null, '车è¾ç±»åå表'); |
| | | INSERT INTO sys_dict_data VALUES (8, 1, 'ææ¤è½¦', 'AMBULANCE', 'sys_vehicle_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, 'ææ¤è½¦'); |
| | | INSERT INTO sys_dict_data VALUES (9, 2, '转è¿è½¦', 'TRANSFER', 'sys_vehicle_type', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '转è¿è½¦'); |
| | | INSERT INTO sys_dict_data VALUES (10, 3, '维修车', 'MAINTENANCE', 'sys_vehicle_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '维修车'); |
| | | |
| | | -- 4. 车è¾ç¶æåå
¸ |
| | | -- ---------------------------- |
| | | INSERT INTO sys_dict_type VALUES ('sys_vehicle_status', '车è¾ç¶æ', '0', 'admin', sysdate(), '', null, '车è¾ç¶æå表'); |
| | | INSERT INTO sys_dict_data VALUES (11, 1, 'æ£å¸¸', '0', 'sys_vehicle_status', '', 'success', 'N', '0', 'admin', sysdate(), '', null, 'è½¦è¾æ£å¸¸ä½¿ç¨'); |
| | | INSERT INTO sys_dict_data VALUES (12, 2, 'åç¨', '1', 'sys_vehicle_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '车è¾åç¨'); |
| | | |
| | | -- 5. ä»»å¡è½¦è¾å
³èç¶æåå
¸ |
| | | -- ---------------------------- |
| | | INSERT INTO sys_dict_type VALUES ('sys_task_vehicle_status', 'ä»»å¡è½¦è¾å
³èç¶æ', '0', 'admin', sysdate(), '', null, 'ä»»å¡è½¦è¾å
³èç¶æå表'); |
| | | INSERT INTO sys_dict_data VALUES (15, 1, 'å·²åé
', 'ASSIGNED', 'sys_task_vehicle_status', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '车è¾å·²åé
ç»ä»»å¡'); |
| | | INSERT INTO sys_dict_data VALUES (16, 2, 'æ§è¡ä¸', 'ACTIVE', 'sys_task_vehicle_status', '', 'success', 'N', '0', 'admin', sysdate(), '', null, 'è½¦è¾æ£å¨æ§è¡ä»»å¡'); |
| | | INSERT INTO sys_dict_data VALUES (17, 3, '已宿', 'COMPLETED', 'sys_task_vehicle_status', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '车è¾ä»»å¡å·²å®æ'); |
| | | INSERT INTO sys_dict_data VALUES (18, 4, '已忶', 'CANCELLED', 'sys_task_vehicle_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '车è¾ä»»å¡å·²åæ¶'); |
| New file |
| | |
| | | -- ---------------------------- |
| | | -- éç¨ä»»å¡ç®¡çèåæéé
ç½® |
| | | -- ---------------------------- |
| | | |
| | | -- ä»»å¡ç®¡çèå |
| | | INSERT INTO sys_menu VALUES (2000, 'ä»»å¡ç®¡ç', 0, 5, 'task', null, '', 1, 0, 'M', '0', '0', '', 'task', 'admin', sysdate(), '', null, 'ä»»å¡ç®¡çç®å½'); |
| | | |
| | | -- éç¨ä»»å¡èå |
| | | INSERT INTO sys_menu VALUES (2001, 'éç¨ä»»å¡', 2000, 1, 'general', 'task/general/index', '', 1, 0, 'C', '0', '0', 'task:general:view', 'list', 'admin', sysdate(), '', null, 'éç¨ä»»å¡èå'); |
| | | |
| | | -- ä»»å¡ç®¡çæé®æé |
| | | INSERT INTO sys_menu VALUES (2002, '任塿¥è¯¢', 2001, 1, '', '', '', 1, 0, 'F', '0', '0', 'task:general:query', '#', 'admin', sysdate(), '', null, ''); |
| | | INSERT INTO sys_menu VALUES (2003, '任塿°å¢', 2001, 2, '', '', '', 1, 0, 'F', '0', '0', 'task:general:add', '#', 'admin', sysdate(), '', null, ''); |
| | | INSERT INTO sys_menu VALUES (2004, 'ä»»å¡ä¿®æ¹', 2001, 3, '', '', '', 1, 0, 'F', '0', '0', 'task:general:edit', '#', 'admin', sysdate(), '', null, ''); |
| | | INSERT INTO sys_menu VALUES (2005, 'ä»»å¡å é¤', 2001, 4, '', '', '', 1, 0, 'F', '0', '0', 'task:general:remove', '#', 'admin', sysdate(), '', null, ''); |
| | | INSERT INTO sys_menu VALUES (2006, 'ä»»å¡åé
', 2001, 5, '', '', '', 1, 0, 'F', '0', '0', 'task:general:assign', '#', 'admin', sysdate(), '', null, ''); |
| | | INSERT INTO sys_menu VALUES (2007, 'ç¶æåæ´', 2001, 6, '', '', '', 1, 0, 'F', '0', '0', 'task:general:status', '#', 'admin', sysdate(), '', null, ''); |
| | | |
| | | -- 车è¾ç®¡çèå |
| | | INSERT INTO sys_menu VALUES (2008, '车è¾ç®¡ç', 2000, 2, 'vehicle', 'task/vehicle/index', '', 1, 0, 'C', '0', '0', 'task:vehicle:view', 'car', 'admin', sysdate(), '', null, '车è¾ç®¡çèå'); |
| | | |
| | | -- 车è¾ç®¡çæé®æé |
| | | INSERT INTO sys_menu VALUES (2009, 'è½¦è¾æ¥è¯¢', 2008, 1, '', '', '', 1, 0, 'F', '0', '0', 'task:vehicle:query', '#', 'admin', sysdate(), '', null, ''); |
| | | INSERT INTO sys_menu VALUES (2010, 'è½¦è¾æ°å¢', 2008, 2, '', '', '', 1, 0, 'F', '0', '0', 'task:vehicle:add', '#', 'admin', sysdate(), '', null, ''); |
| | | INSERT INTO sys_menu VALUES (2011, '车è¾ä¿®æ¹', 2008, 3, '', '', '', 1, 0, 'F', '0', '0', 'task:vehicle:edit', '#', 'admin', sysdate(), '', null, ''); |
| | | INSERT INTO sys_menu VALUES (2012, '车è¾å é¤', 2008, 4, '', '', '', 1, 0, 'F', '0', '0', 'task:vehicle:remove', '#', 'admin', sysdate(), '', null, ''); |
| | | INSERT INTO sys_menu VALUES (2013, '车è¾åé
', 2008, 5, '', '', '', 1, 0, 'F', '0', '0', 'task:vehicle:assign', '#', 'admin', sysdate(), '', null, ''); |
| New file |
| | |
| | | -- ---------------------------- |
| | | -- éç¨ä»»å¡ç®¡çç¸å
³è¡¨ç»æ |
| | | -- ---------------------------- |
| | | |
| | | -- 1. ä»»å¡ä¸»è¡¨ |
| | | -- ---------------------------- |
| | | DROP TABLE IF EXISTS sys_task; |
| | | CREATE TABLE sys_task ( |
| | | task_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 'ä»»å¡ID', |
| | | task_code VARCHAR(50) NOT NULL UNIQUE COMMENT 'ä»»å¡ç¼å·', |
| | | task_type VARCHAR(20) NOT NULL COMMENT 'ä»»å¡ç±»åï¼MAINTENANCE-ç»´ä¿®ä¿å
»ï¼FUEL-å æ²¹ä»»å¡ï¼OTHER-å
¶ä»', |
| | | task_status VARCHAR(20) NOT NULL DEFAULT 'PENDING' COMMENT 'ä»»å¡ç¶æï¼PENDING-å¾
å¼å§ï¼IN_PROGRESS-ä»»å¡ä¸ï¼COMPLETED-已宿ï¼CANCELLED-已忶', |
| | | task_description VARCHAR(1000) COMMENT 'ä»»å¡æè¿°', |
| | | |
| | | -- å°åä¿¡æ¯ |
| | | departure_address VARCHAR(500) COMMENT 'åºåå°å', |
| | | destination_address VARCHAR(500) COMMENT 'ç®çå°å', |
| | | |
| | | -- æ¶é´ä¿¡æ¯ |
| | | planned_start_time DATETIME COMMENT '计åå¼å§æ¶é´', |
| | | planned_end_time DATETIME COMMENT '计åç»ææ¶é´', |
| | | actual_start_time DATETIME COMMENT 'å®é
å¼å§æ¶é´', |
| | | actual_end_time DATETIME COMMENT 'å®é
ç»ææ¶é´', |
| | | |
| | | -- 人åä¿¡æ¯ |
| | | creator_id BIGINT NOT NULL COMMENT 'å建人ID', |
| | | assignee_id BIGINT COMMENT 'æ§è¡äººID', |
| | | dept_id BIGINT NOT NULL COMMENT 'å½å±é¨é¨ID', |
| | | |
| | | -- ç³»ç»å段 |
| | | create_time DATETIME NOT NULL COMMENT 'å建æ¶é´', |
| | | update_time DATETIME NOT NULL COMMENT 'æ´æ°æ¶é´', |
| | | create_by VARCHAR(64) NOT NULL COMMENT 'å建è
', |
| | | update_by VARCHAR(64) COMMENT 'æ´æ°è
', |
| | | remark VARCHAR(500) COMMENT '夿³¨', |
| | | del_flag CHAR(1) DEFAULT '0' COMMENT 'å 餿 å¿ï¼0代表åå¨ 2代表å é¤ï¼', |
| | | |
| | | INDEX idx_task_code (task_code), |
| | | INDEX idx_task_type (task_type), |
| | | INDEX idx_task_status (task_status), |
| | | INDEX idx_creator_id (creator_id), |
| | | INDEX idx_assignee_id (assignee_id), |
| | | INDEX idx_dept_id (dept_id), |
| | | INDEX idx_planned_start_time (planned_start_time), |
| | | INDEX idx_create_time (create_time) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ä»»å¡ç®¡ç表'; |
| | | |
| | | -- 2. ä»»å¡è½¦è¾å
³è表 |
| | | -- ---------------------------- |
| | | DROP TABLE IF EXISTS sys_task_vehicle; |
| | | CREATE TABLE sys_task_vehicle ( |
| | | id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 'å
³èID', |
| | | task_id BIGINT NOT NULL COMMENT 'ä»»å¡ID', |
| | | vehicle_id BIGINT NOT NULL COMMENT '车è¾ID', |
| | | assign_time DATETIME NOT NULL COMMENT 'åé
æ¶é´', |
| | | assign_by VARCHAR(64) NOT NULL COMMENT 'åé
人', |
| | | status VARCHAR(20) DEFAULT 'ASSIGNED' COMMENT 'å
³èç¶æï¼ASSIGNED-å·²åé
ï¼ACTIVE-æ§è¡ä¸ï¼COMPLETED-已宿ï¼CANCELLED-已忶', |
| | | remark VARCHAR(500) COMMENT '夿³¨', |
| | | |
| | | INDEX idx_task_id (task_id), |
| | | INDEX idx_vehicle_id (vehicle_id), |
| | | INDEX idx_status (status), |
| | | INDEX idx_assign_time (assign_time), |
| | | |
| | | UNIQUE KEY uk_task_vehicle (task_id, vehicle_id), |
| | | FOREIGN KEY (task_id) REFERENCES sys_task(task_id) ON DELETE CASCADE, |
| | | FOREIGN KEY (vehicle_id) REFERENCES tb_vehicle_info(vehicle_id) ON DELETE CASCADE |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ä»»å¡è½¦è¾å
³è表'; |
| | | |
| | | -- 3. ä»»å¡é件表 |
| | | -- ---------------------------- |
| | | DROP TABLE IF EXISTS sys_task_attachment; |
| | | CREATE TABLE sys_task_attachment ( |
| | | attachment_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 'éä»¶ID', |
| | | task_id BIGINT NOT NULL COMMENT 'ä»»å¡ID', |
| | | file_name VARCHAR(255) NOT NULL COMMENT 'æä»¶å', |
| | | file_path VARCHAR(500) NOT NULL COMMENT 'æä»¶è·¯å¾', |
| | | file_size BIGINT COMMENT 'æä»¶å¤§å°ï¼åèï¼', |
| | | file_type VARCHAR(50) COMMENT 'æä»¶ç±»å', |
| | | upload_time DATETIME NOT NULL COMMENT 'ä¸ä¼ æ¶é´', |
| | | upload_by VARCHAR(64) NOT NULL COMMENT 'ä¸ä¼ è
', |
| | | |
| | | INDEX idx_task_id (task_id), |
| | | FOREIGN KEY (task_id) REFERENCES sys_task(task_id) ON DELETE CASCADE |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ä»»å¡é件表'; |
| | | |
| | | -- 4. 任塿使¥å¿è¡¨ |
| | | -- ---------------------------- |
| | | DROP TABLE IF EXISTS sys_task_log; |
| | | CREATE TABLE sys_task_log ( |
| | | log_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 'æ¥å¿ID', |
| | | task_id BIGINT NOT NULL COMMENT 'ä»»å¡ID', |
| | | operation_type VARCHAR(20) NOT NULL COMMENT 'æä½ç±»åï¼CREATE-å建ï¼UPDATE-æ´æ°ï¼ASSIGN-åé
ï¼STATUS_CHANGE-ç¶æåæ´ï¼DELETE-å é¤', |
| | | operation_desc VARCHAR(500) COMMENT 'æä½æè¿°', |
| | | old_value TEXT COMMENT 'æä½åå¼', |
| | | new_value TEXT COMMENT 'æä½åå¼', |
| | | operator_id BIGINT NOT NULL COMMENT 'æä½äººID', |
| | | operator_name VARCHAR(64) NOT NULL COMMENT 'æä½äººå§å', |
| | | operation_time DATETIME NOT NULL COMMENT 'æä½æ¶é´', |
| | | ip_address VARCHAR(128) COMMENT 'IPå°å', |
| | | |
| | | INDEX idx_task_id (task_id), |
| | | INDEX idx_operation_type (operation_type), |
| | | INDEX idx_operator_id (operator_id), |
| | | INDEX idx_operation_time (operation_time), |
| | | FOREIGN KEY (task_id) REFERENCES sys_task(task_id) ON DELETE CASCADE |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任塿使¥å¿è¡¨'; |
| | | |
| | | -- 5. æ´æ°è½¦è¾ä¿¡æ¯è¡¨ï¼æ·»å æºæå
³èåæ®µ |
| | | -- ---------------------------- |
| | | ALTER TABLE tb_vehicle_info ADD COLUMN dept_id BIGINT(20) DEFAULT NULL COMMENT 'å½å±æºæID'; |
| | | ALTER TABLE tb_vehicle_info ADD INDEX idx_dept_id (dept_id); |
| | | ALTER TABLE tb_vehicle_info ADD FOREIGN KEY (dept_id) REFERENCES sys_dept(dept_id) ON DELETE SET NULL; |
| | |
| | | -- å¨tb_vehicle_infoè¡¨ä¸æ·»å device_idåæ®µ |
| | | ALTER TABLE tb_vehicle_info ADD COLUMN device_id VARCHAR(50) DEFAULT NULL COMMENT '设å¤ID'; |
| | | |
| | | -- å¨tb_vehicle_infoè¡¨ä¸æ·»å å½å±æºæå段 |
| | | ALTER TABLE tb_vehicle_info ADD COLUMN dept_id BIGINT(20) DEFAULT NULL COMMENT 'å½å±æºæID'; |
| | | ALTER TABLE tb_vehicle_info ADD INDEX idx_dept_id (dept_id); |
| | | ALTER TABLE tb_vehicle_info ADD CONSTRAINT fk_vehicle_dept FOREIGN KEY (dept_id) REFERENCES sys_dept(dept_id) ON DELETE SET NULL; |
| | | |
| | | -- å¨tb_vehicle_gpsè¡¨ä¸æ·»å device_idåæ®µ |
| | | ALTER TABLE tb_vehicle_gps ADD COLUMN device_id VARCHAR(50) DEFAULT NULL COMMENT '设å¤ID'; |