From a4b14a35a2209a30e53472e6333b13aa4a55b0eb Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期二, 30 十二月 2025 22:14:25 +0800
Subject: [PATCH] feat:增加创建任务

---
 app/pages/task/create.vue                                                           |   13 
 app/utils/request.js                                                                |   14 
 prd/用户创建任务权限前端控制功能说明.md                                                             |  404 ++++++++++++++++++++++++++++
 sql/add_can_create_task_to_sys_user.sql                                             |   16 +
 ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml                     |    6 
 app/utils/constant.js                                                               |    3 
 app/store/modules/user.js                                                           |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/UserSyncDTO.java                 |   14 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java   |    1 
 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java         |   16 +
 ruoyi-system/src/main/resources/mapper/system/UserSyncMapper.xml                    |    7 
 app/pagesTask/components/HospitalSelector.vue                                       |    9 
 prd/用户创建任务单权限功能说明.md                                                                |  301 +++++++++++++++++++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserSyncServiceImpl.java   |    8 
 15 files changed, 807 insertions(+), 17 deletions(-)

diff --git a/app/pages/task/create.vue b/app/pages/task/create.vue
index 748bc8e..097fe25 100644
--- a/app/pages/task/create.vue
+++ b/app/pages/task/create.vue
@@ -26,6 +26,8 @@
 </template>
 
 <script>
+import { mapState } from 'vuex'
+
 export default {
   data() {
     return {
@@ -70,8 +72,19 @@
       ]
     }
   },
+  computed: {
+    ...mapState({
+      canCreateTask: state => state.user.canCreateTask
+    })
+  },
   methods: {
     selectTaskCategory(category) {
+      // 妫�鏌ユ槸鍚︽湁鍒涘缓浠诲姟鐨勬潈闄�
+      if (this.canCreateTask !== '1') {
+        this.$modal.msgError('鎮ㄦ病鏈夋潈闄愬垱寤轰换鍔�')
+        return
+      }
+      
       // 璺宠浆鍒板搴旂殑浠诲姟鍒涘缓椤甸潰
       uni.navigateTo({
         url: `${category.page}?categoryName=${category.name}&categoryType=${category.type}&taskType=${category.taskType}`
diff --git a/app/pagesTask/components/HospitalSelector.vue b/app/pagesTask/components/HospitalSelector.vue
index 6d6443e..3b2dd62 100644
--- a/app/pagesTask/components/HospitalSelector.vue
+++ b/app/pagesTask/components/HospitalSelector.vue
@@ -185,8 +185,9 @@
         this.searchResults = response.data || []
         this.showResults = true
       }).catch(error => {
-        console.error('鎼滅储鍖婚櫌澶辫触:', error)
+        // console.error('鎼滅储鍖婚櫌澶辫触:', error)
         this.searchResults = []
+        // this.showResults = false
       })
     },
     
@@ -215,9 +216,9 @@
         this.searchResults = this.defaultHospitals
         this.showResults = true
         this.hasLoadedDefault = true
-        console.log('鍔犺浇榛樿鍖婚櫌鍒楄〃锛屾暟閲�:', this.defaultHospitals.length)
+        // console.log('鍔犺浇榛樿鍖婚櫌鍒楄〃锛屾暟閲�:', this.defaultHospitals.length)
       }).catch(error => {
-        console.error('鍔犺浇榛樿鍖婚櫌鍒楄〃澶辫触:', error)
+        // console.error('鍔犺浇榛樿鍖婚櫌鍒楄〃澶辫触:', error)
         this.defaultHospitals = []
       })
     },
@@ -303,7 +304,7 @@
           this.showAddressSuggestions = false
         }
       }).catch(error => {
-        console.error('鎼滅储鍦板潃澶辫触:', error)
+        // console.error('鎼滅储鍦板潃澶辫触:', error)
         this.addressSuggestions = []
         this.showAddressSuggestions = false
       })
diff --git a/app/store/modules/user.js b/app/store/modules/user.js
index 66b252d..45113d9 100644
--- a/app/store/modules/user.js
+++ b/app/store/modules/user.js
@@ -19,7 +19,8 @@
     deptId: storage.get(constant.deptId),
     branchCompanyId: storage.get(constant.branchCompanyId),
     branchCompanyName: storage.get(constant.branchCompanyName),
-    oaUserId: storage.get(constant.oaUserId)
+    oaUserId: storage.get(constant.oaUserId),
+    canCreateTask: storage.get(constant.canCreateTask)
   },
 
   mutations: {
@@ -65,6 +66,10 @@
     SET_OA_USER_ID: (state, oaUserId) => {
       state.oaUserId = oaUserId
       storage.set(constant.oaUserId, oaUserId)
+    },
+    SET_CAN_CREATE_TASK: (state, canCreateTask) => {
+      state.canCreateTask = canCreateTask
+      storage.set(constant.canCreateTask, canCreateTask)
     }
   },
 
@@ -124,6 +129,7 @@
           commit('SET_BRANCH_COMPANY_ID', res.branchCompanyId)
           commit('SET_BRANCH_COMPANY_NAME', res.branchCompanyName)
           commit('SET_OA_USER_ID', res.oaUserId)
+          commit('SET_CAN_CREATE_TASK', res.canCreateTask)
           resolve(res)
         }).catch(error => {
           reject(error)
diff --git a/app/utils/constant.js b/app/utils/constant.js
index b084c8c..4133a31 100644
--- a/app/utils/constant.js
+++ b/app/utils/constant.js
@@ -8,7 +8,8 @@
    deptId: 'vuex_deptId',
    branchCompanyId: 'vuex_branchCompanyId',
    branchCompanyName: 'vuex_branchCompanyName',
-   oaUserId: 'vuex_oaUserId'
+   oaUserId: 'vuex_oaUserId',
+   canCreateTask: 'vuex_canCreateTask'
  }
 
  export default constant
diff --git a/app/utils/request.js b/app/utils/request.js
index f2fad21..fd6c1d7 100644
--- a/app/utils/request.js
+++ b/app/utils/request.js
@@ -54,9 +54,9 @@
           reject('鏃犳晥鐨勪細璇濓紝鎴栬�呬細璇濆凡杩囨湡锛岃閲嶆柊鐧诲綍銆�')
         } else if (code === 500) {
           // checkDuplicate 鎺ュ彛涓嶆樉绀� toast锛岃涓氬姟浠g爜鑷繁澶勭悊
-          if (!isCheckDuplicateApi) {
-            toast(msg)
-          }
+          // if (!isCheckDuplicateApi) {
+          //   toast(msg)
+          // }
           // checkDuplicate 鎺ュ彛杩斿洖瀹屾暣鍝嶅簲锛屼笉 reject
           if (isCheckDuplicateApi) {
             resolve(res.data)
@@ -65,9 +65,9 @@
           reject('500')
         } else if (code !== 200) {
           // checkDuplicate 鎺ュ彛涓嶆樉绀� toast锛岃涓氬姟浠g爜鑷繁澶勭悊
-          if (!isCheckDuplicateApi) {
-            toast(msg)
-          }
+          // if (!isCheckDuplicateApi) {
+          //   toast(msg)
+          // }
           // checkDuplicate 鎺ュ彛杩斿洖瀹屾暣鍝嶅簲锛屼笉 reject
           if (isCheckDuplicateApi) {
             resolve(res.data)
@@ -86,7 +86,7 @@
         } else if (message.includes('Request failed with status code')) {
           message = '绯荤粺鎺ュ彛' + message.substr(message.length - 3) + '寮傚父'
         }
-        toast(message)
+        // toast(message)
         reject(error)
       })
   })
diff --git "a/prd/\347\224\250\346\210\267\345\210\233\345\273\272\344\273\273\345\212\241\345\215\225\346\235\203\351\231\220\345\212\237\350\203\275\350\257\264\346\230\216.md" "b/prd/\347\224\250\346\210\267\345\210\233\345\273\272\344\273\273\345\212\241\345\215\225\346\235\203\351\231\220\345\212\237\350\203\275\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..4bee57f
--- /dev/null
+++ "b/prd/\347\224\250\346\210\267\345\210\233\345\273\272\344\273\273\345\212\241\345\215\225\346\235\203\351\231\220\345\212\237\350\203\275\350\257\264\346\230\216.md"
@@ -0,0 +1,301 @@
+# 鐢ㄦ埛鍒涘缓浠诲姟鍗曟潈闄愬姛鑳借鏄�
+
+## 馃搵 鍔熻兘姒傝堪
+鍦� sys_user 琛ㄤ腑鏂板 `can_create_task` 瀛楁锛岀敤浜庢爣璇嗙敤鎴锋槸鍚﹀叿鏈夊垱寤轰换鍔″崟鐨勬潈闄愩�傝瀛楁浠� OA 绯荤粺鐨� `OA_User` 琛ㄤ腑鐨� `OA_Power` 瀛楁鍚屾鑰屾潵銆�
+
+## 馃幆 鍚屾瑙勫垯
+褰� `OA_Power` 瀛楁鍖呭惈 `,020101,` 鏃讹紝鐢ㄦ埛鍏锋湁鍒涘缓浠诲姟鍗曟潈闄愩��
+
+**SQL 鍒ゆ柇閫昏緫**锛�
+```sql
+CASE 
+    WHEN OA_Power LIKE '%,020101,%' THEN '1'
+    ELSE '0'
+END AS can_create_task
+```
+
+## 馃敤 瀹炵幇鍐呭
+
+### 1. 鏁版嵁搴撲慨鏀�
+
+#### 娣诲姞瀛楁
+**鏂囦欢**: `sql/add_can_create_task_to_sys_user.sql`
+
+```sql
+ALTER TABLE sys_user ADD COLUMN can_create_task CHAR(1) DEFAULT '0' COMMENT '鏄惁鍙垱寤轰换鍔″崟锛�0鍚� 1鏄級';
+CREATE INDEX idx_can_create_task ON sys_user(can_create_task);
+```
+
+**瀛楁璇存槑**锛�
+- **瀛楁鍚�**: `can_create_task`
+- **绫诲瀷**: `CHAR(1)`
+- **榛樿鍊�**: `'0'` (涓嶅彲鍒涘缓)
+- **鍙�夊��**: 
+  - `'0'`: 涓嶅彲鍒涘缓浠诲姟鍗�
+  - `'1'`: 鍙互鍒涘缓浠诲姟鍗�
+- **绱㈠紩**: 宸叉坊鍔犵储寮� `idx_can_create_task` 鏂逛究鏌ヨ
+
+### 2. 瀹炰綋绫讳慨鏀�
+
+#### SysUser 瀹炰綋
+**鏂囦欢**: `ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java`
+
+**鏂板瀛楁**锛�
+```java
+/** 鏄惁鍙垱寤轰换鍔″崟锛�0鍚� 1鏄級 */
+@Excel(name = "鍙垱寤轰换鍔″崟", readConverterExp = "0=鍚�,1=鏄�")
+private String canCreateTask;
+
+public String getCanCreateTask() {
+    return canCreateTask;
+}
+
+public void setCanCreateTask(String canCreateTask) {
+    this.canCreateTask = canCreateTask;
+}
+```
+
+### 3. DTO 灞備慨鏀�
+
+#### UserSyncDTO
+**鏂囦欢**: `ruoyi-system/src/main/java/com/ruoyi/system/domain/UserSyncDTO.java`
+
+**鏂板瀛楁**锛�
+```java
+/** 鏄惁鍙垱寤轰换鍔″崟锛�0鍚� 1鏄級 */
+private String canCreateTask;
+
+public String getCanCreateTask() {
+    return canCreateTask;
+}
+
+public void setCanCreateTask(String canCreateTask) {
+    this.canCreateTask = canCreateTask;
+}
+```
+
+### 4. Mapper 灞備慨鏀�
+
+#### UserSyncMapper.xml
+**鏂囦欢**: `ruoyi-system/src/main/resources/mapper/system/UserSyncMapper.xml`
+
+**淇敼鍐呭**锛�
+1. 鍦� resultMap 涓坊鍔犲瓧娈垫槧灏�
+2. 鍦� SQL 鏌ヨ涓坊鍔� CASE 鍒ゆ柇閫昏緫
+
+```xml
+<result property="canCreateTask" column="can_create_task" />
+
+<!-- SQL 鏌ヨ娣诲姞 -->
+CASE 
+    WHEN OA_Power LIKE '%,020101,%' THEN '1'
+    ELSE '0'
+END AS can_create_task
+```
+
+#### SysUserMapper.xml
+**鏂囦欢**: `ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml`
+
+**淇敼鍐呭**锛�
+1. resultMap 娣诲姞瀛楁鏄犲皠
+2. selectUserVo 鏌ヨ娣诲姞瀛楁
+3. insertUser 娣诲姞瀛楁鎻掑叆
+4. updateUser 娣诲姞瀛楁鏇存柊
+
+### 5. Service 灞備慨鏀�
+
+#### UserSyncServiceImpl
+**鏂囦欢**: `ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserSyncServiceImpl.java`
+
+**淇敼鍐呭**锛�
+
+**鏇存柊宸插瓨鍦ㄧ敤鎴�**锛�
+```java
+if (StringUtils.isNotEmpty(dto.getCanCreateTask())) {
+    existingUser.setCanCreateTask(dto.getCanCreateTask());
+}
+```
+
+**鍒涘缓鏂扮敤鎴�**锛�
+```java
+if (StringUtils.isNotEmpty(dto.getCanCreateTask())) {
+    newUser.setCanCreateTask(dto.getCanCreateTask());
+}
+```
+
+## 馃搳 鏁版嵁娴佽浆杩囩▼
+
+```
+OA_User (SQL Server)
+    鈫�
+OA_Power LIKE '%,020101,%'
+    鈫�
+SQL CASE 鍒ゆ柇
+    鈫�
+UserSyncDTO.canCreateTask
+    鈫�
+SysUser.canCreateTask
+    鈫�
+sys_user.can_create_task
+```
+
+## 馃殌 浣跨敤姝ラ
+
+### 1. 鎵ц鏁版嵁搴撹剼鏈�
+```bash
+mysql -u root -p ry-vue < sql/add_can_create_task_to_sys_user.sql
+```
+
+### 2. 鍚屾鐢ㄦ埛鏁版嵁
+閫氳繃鍚庡彴绠$悊鐣岄潰鎴� API 鎵ц鐢ㄦ埛鍚屾锛�
+```bash
+POST http://localhost:8080/system/dept/sync/user
+Headers:
+  Authorization: Bearer {浣犵殑token}
+```
+
+### 3. 楠岃瘉鍚屾缁撴灉
+```sql
+-- 鏌ョ湅鍏锋湁鍒涘缓浠诲姟鍗曟潈闄愮殑鐢ㄦ埛
+SELECT 
+    user_name, 
+    nick_name, 
+    can_create_task,
+    oa_user_id
+FROM sys_user
+WHERE can_create_task = '1'
+  AND del_flag = '0'
+ORDER BY create_time DESC;
+
+-- 缁熻鏉冮檺鍒嗗竷
+SELECT 
+    can_create_task,
+    CASE can_create_task
+        WHEN '1' THEN '鍙垱寤�'
+        ELSE '涓嶅彲鍒涘缓'
+    END AS permission_label,
+    COUNT(*) AS user_count
+FROM sys_user
+WHERE del_flag = '0'
+GROUP BY can_create_task;
+```
+
+## 馃挕 浣跨敤绀轰緥
+
+### 鍦烘櫙1锛氭煡璇㈡湁鏉冮檺鐨勭敤鎴�
+```java
+// 鍦� Service 灞傛坊鍔犳煡璇㈡柟娉�
+public List<SysUser> getUsersWithCreateTaskPermission() {
+    SysUser query = new SysUser();
+    query.setCanCreateTask("1");
+    return userMapper.selectUserList(query);
+}
+```
+
+### 鍦烘櫙2锛氬墠绔潈闄愭帶鍒�
+```javascript
+// 鏍规嵁鐢ㄦ埛鏉冮檺鏄剧ず/闅愯棌鍒涘缓浠诲姟鎸夐挳
+if (user.canCreateTask === '1') {
+    // 鏄剧ず鍒涘缓浠诲姟鎸夐挳
+    showCreateTaskButton();
+} else {
+    // 闅愯棌鍒涘缓浠诲姟鎸夐挳
+    hideCreateTaskButton();
+}
+```
+
+### 鍦烘櫙3锛氬悗绔帴鍙f潈闄愰獙璇�
+```java
+@PreAuthorize("@ss.hasPermi('task:create')")
+@PostMapping("/create")
+public AjaxResult createTask(@RequestBody Task task) {
+    SysUser user = SecurityUtils.getLoginUser().getUser();
+    if (!"1".equals(user.getCanCreateTask())) {
+        return AjaxResult.error("鎮ㄦ病鏈夊垱寤轰换鍔″崟鐨勬潈闄�");
+    }
+    // 鍒涘缓浠诲姟閫昏緫
+    return taskService.createTask(task);
+}
+```
+
+## 馃摑 娉ㄦ剰浜嬮」
+
+### 閲嶈鎻愮ず
+1. **鏉冮檺鍚屾**: 璇ュ瓧娈典粠 OA 绯荤粺鑷姩鍚屾锛岃鍕挎墜鍔ㄤ慨鏀�
+2. **榛樿鍊�**: 鏂板垱寤虹敤鎴烽粯璁や负 `'0'`锛堜笉鍙垱寤猴級
+3. **鍚屾鏇存柊**: 姣忔鐢ㄦ埛鍚屾鏃朵細鑷姩鏇存柊璇ュ瓧娈�
+4. **鏉冮檺绮掑害**: 璇ュ瓧娈典粎鎺у埗鏄惁鍙垱寤轰换鍔″崟锛屼笉褰卞搷鍏朵粬鏉冮檺
+
+### 涓庡叾浠栨潈闄愬瓧娈电殑鍏崇郴
+- `can_view_all_consult`: 鏄惁鍙煡鐪嬫墍鏈夊挩璇㈠崟锛圤A_Power LIKE '%,020112,%'锛�
+- `can_create_task`: 鏄惁鍙垱寤轰换鍔″崟锛圤A_Power LIKE '%,020101,%'锛�
+
+杩欎袱涓瓧娈典簰鐩哥嫭绔嬶紝鐢ㄦ埛鍙互鍚屾椂鎷ユ湁鎴栧垎鍒嫢鏈夎繖浜涙潈闄愩��
+
+## 馃攳 楠岃瘉鏂规硶
+
+### 鏌ョ湅鍚庡彴鐢ㄦ埛绠$悊鐣岄潰
+1. 鐧诲綍鍚庡彴绠$悊绯荤粺
+2. 杩涘叆 **绯荤粺绠$悊** 鈫� **鐢ㄦ埛绠$悊**
+3. 鍦ㄧ敤鎴峰垪琛ㄤ腑鏌ョ湅 "鍙垱寤轰换鍔″崟" 鍒�
+4. 缂栬緫鐢ㄦ埛鏃跺彲鐪嬪埌璇ュ瓧娈碉紙鍙锛岀敱鍚屾鎺у埗锛�
+
+### 鏁版嵁搴撻獙璇�
+```sql
+-- 妫�鏌ュ瓧娈垫槸鍚﹀瓨鍦�
+SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT 
+FROM INFORMATION_SCHEMA.COLUMNS 
+WHERE TABLE_NAME = 'sys_user' 
+  AND COLUMN_NAME = 'can_create_task';
+
+-- 鏌ョ湅鍏蜂綋鐢ㄦ埛鐨勬潈闄�
+SELECT 
+    u.user_name,
+    u.nick_name,
+    u.can_view_all_consult,
+    u.can_create_task,
+    u.oa_user_id
+FROM sys_user u
+WHERE u.oa_user_id IS NOT NULL
+ORDER BY u.user_id;
+```
+
+## 馃摎 鐩稿叧鏂囦欢娓呭崟
+
+### SQL 鑴氭湰
+- `sql/add_can_create_task_to_sys_user.sql` - 娣诲姞瀛楁鑴氭湰
+
+### Java 鏂囦欢
+- `SysUser.java`锛堜慨鏀癸級 - 娣诲姞瀛楁瀹氫箟
+- `UserSyncDTO.java`锛堜慨鏀癸級 - 娣诲姞 DTO 瀛楁
+- `UserSyncServiceImpl.java`锛堜慨鏀癸級 - 娣诲姞鍚屾閫昏緫
+
+### Mapper 鏂囦欢
+- `UserSyncMapper.xml`锛堜慨鏀癸級 - 娣诲姞 SQL 鏌ヨ閫昏緫
+- `SysUserMapper.xml`锛堜慨鏀癸級 - 娣诲姞瀛楁鏄犲皠鍜屾搷浣�
+
+### 鏂囨。
+- `prd/鐢ㄦ埛鍒涘缓浠诲姟鍗曟潈闄愬姛鑳借鏄�.md` - 鏈枃妗�
+
+## 馃幆 甯歌闂
+
+### Q1: 瀛楁鍊间负浠�涔堟槸瀛楃涓茶�屼笉鏄竷灏斿�硷紵
+**A**: 涓轰簡涓庤嫢渚濇鏋剁殑鏁版嵁瀛楀吀瑙勮寖淇濇寔涓�鑷达紝浣跨敤 `'0'` 鍜� `'1'` 瀛楃涓茶〃绀哄竷灏斿�笺��
+
+### Q2: 濡備綍鎵嬪姩璁剧疆鐢ㄦ埛鏉冮檺锛�
+**A**: 涓嶅缓璁墜鍔ㄤ慨鏀广�傝瀛楁搴旈�氳繃 OA 绯荤粺鐨� `OA_Power` 瀛楁鎺у埗锛岄�氳繃鐢ㄦ埛鍚屾鑷姩鏇存柊銆�
+
+### Q3: 鐢ㄦ埛鍚屾鍚庢潈闄愭病鏈夊彉鍖栵紵
+**A**: 璇锋鏌ワ細
+1. OA 绯荤粺涓敤鎴风殑 `OA_Power` 瀛楁鏄惁鍖呭惈 `,020101,`
+2. 鐢ㄦ埛鍚屾鏄惁鎵ц鎴愬姛
+3. 鏌ョ湅鍚屾鏃ュ織纭鏇存柊鎯呭喌
+
+### Q4: 濡備綍鎵归噺璁剧疆鐢ㄦ埛鏉冮檺锛�
+**A**: 鍦� OA 绯荤粺涓壒閲忎慨鏀圭敤鎴风殑 `OA_Power` 瀛楁锛岀劧鍚庢墽琛岀敤鎴峰悓姝ュ嵆鍙��
+
+---
+
+**鐗堟湰**: v1.0  
+**鏇存柊鏃堕棿**: 2025-12-29  
+**鐩稿叧鍔熻兘**: 鐢ㄦ埛鍚屾銆佹潈闄愮鐞�
diff --git "a/prd/\347\224\250\346\210\267\345\210\233\345\273\272\344\273\273\345\212\241\346\235\203\351\231\220\345\211\215\347\253\257\346\216\247\345\210\266\345\212\237\350\203\275\350\257\264\346\230\216.md" "b/prd/\347\224\250\346\210\267\345\210\233\345\273\272\344\273\273\345\212\241\346\235\203\351\231\220\345\211\215\347\253\257\346\216\247\345\210\266\345\212\237\350\203\275\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..93b58f7
--- /dev/null
+++ "b/prd/\347\224\250\346\210\267\345\210\233\345\273\272\344\273\273\345\212\241\346\235\203\351\231\220\345\211\215\347\253\257\346\216\247\345\210\266\345\212\237\350\203\275\350\257\264\346\230\216.md"
@@ -0,0 +1,404 @@
+# 鐢ㄦ埛鍒涘缓浠诲姟鏉冮檺鍓嶇鎺у埗鍔熻兘璇存槑
+
+## 鍔熻兘姒傝堪
+
+鍦ㄧ敤鎴风櫥褰曞悗锛岀郴缁熶細杩斿洖 `canCreateTask` 瀛楁鍒� `getInfo` 鎺ュ彛鍝嶅簲涓紝骞跺瓨鍌ㄥ埌 APP 鐨� Vuex store銆傚綋鐢ㄦ埛鍦ㄤ换鍔″垱寤洪〉闈㈢偣鍑讳换鍔$被鍨嬫椂锛屼細妫�鏌ヨ鏉冮檺瀛楁锛屽鏋滃�间负 `'0'`锛堟棤鏉冮檺锛夛紝鍒欏脊鍑烘彁绀�"鎮ㄦ病鏈夋潈闄愬垱寤轰换鍔�"锛岄樆姝㈢敤鎴疯繘鍏ヤ换鍔″垱寤鸿〃鍗曢〉闈€��
+
+## 瀹炵幇鍐呭
+
+### 1. 鍚庣鎺ュ彛淇敼
+
+#### 1.1 getInfo 鎺ュ彛杩斿洖 canCreateTask
+
+**鏂囦欢**锛歚ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java`
+
+**淇敼浣嶇疆**锛氱 236-245 琛�
+
+**淇敼鍐呭**锛�
+```java
+AjaxResult ajax = AjaxResult.success();
+ajax.put("user", user);
+ajax.put("roles", roles);
+ajax.put("permissions", permissions);
+ajax.put("branchCompanyId", branchCompanyId);
+ajax.put("branchCompanyName", branchCompanyName);
+ajax.put("branchCompanies", branchCompanies);
+ajax.put("oaUserId", user.getOaUserId());
+ajax.put("canCreateTask", user.getCanCreateTask());  // 鉁� 鏂板
+return ajax;
+```
+
+**璇存槑**锛氬湪 getInfo 鎺ュ彛杩斿洖鐨� JSON 涓坊鍔� `canCreateTask` 瀛楁锛屽叾鍊兼潵鑷� `SysUser.canCreateTask`銆�
+
+---
+
+### 2. APP 绔瓨鍌ㄥ眰淇敼
+
+#### 2.1 娣诲姞 constant 甯搁噺
+
+**鏂囦欢**锛歚app/utils/constant.js`
+
+**淇敼鍐呭**锛�
+```javascript
+const constant = {
+   userId: 'vuex_userId',
+   avatar: 'vuex_avatar',
+   name: 'vuex_name',
+   nickName: 'vuex_nickName',
+   roles: 'vuex_roles',
+   permissions: 'vuex_permissions',
+   deptId: 'vuex_deptId',
+   branchCompanyId: 'vuex_branchCompanyId',
+   branchCompanyName: 'vuex_branchCompanyName',
+   oaUserId: 'vuex_oaUserId',
+   canCreateTask: 'vuex_canCreateTask'  // 鉁� 鏂板
+}
+```
+
+**璇存槑**锛氭坊鍔� `canCreateTask` 鐨勫瓨鍌ㄩ敭鍚嶅父閲忥紝鐢ㄤ簬鍦ㄦ湰鍦板瓨鍌ㄤ腑淇濆瓨璇ュ瓧娈点��
+
+---
+
+#### 2.2 Vuex State 娣诲姞瀛楁
+
+**鏂囦欢**锛歚app/store/modules/user.js`
+
+**淇敼浣嶇疆 1**锛氱 11-23 琛�
+
+```javascript
+state: {
+  token: getToken(),
+  userId: storage.get(constant.userId),
+  name: storage.get(constant.name),
+  nickName: storage.get(constant.nickName),
+  avatar: storage.get(constant.avatar),
+  roles: storage.get(constant.roles),
+  permissions: storage.get(constant.permissions),
+  deptId: storage.get(constant.deptId),
+  branchCompanyId: storage.get(constant.branchCompanyId),
+  branchCompanyName: storage.get(constant.branchCompanyName),
+  oaUserId: storage.get(constant.oaUserId),
+  canCreateTask: storage.get(constant.canCreateTask)  // 鉁� 鏂板
+},
+```
+
+**璇存槑**锛氬湪 Vuex state 涓坊鍔� `canCreateTask` 瀛楁锛屼粠鏈湴瀛樺偍涓鍙栧垵濮嬪�笺��
+
+---
+
+**淇敼浣嶇疆 2**锛氱 65-72 琛岋紙mutations锛�
+
+```javascript
+SET_OA_USER_ID: (state, oaUserId) => {
+  state.oaUserId = oaUserId
+  storage.set(constant.oaUserId, oaUserId)
+},
+SET_CAN_CREATE_TASK: (state, canCreateTask) => {  // 鉁� 鏂板
+  state.canCreateTask = canCreateTask
+  storage.set(constant.canCreateTask, canCreateTask)
+}
+```
+
+**璇存槑**锛氭坊鍔� `SET_CAN_CREATE_TASK` mutation锛岀敤浜庢洿鏂� state 鍜屾湰鍦板瓨鍌ㄣ��
+
+---
+
+**淇敼浣嶇疆 3**锛氱 119-132 琛岋紙GetInfo Action锛�
+
+```javascript
+commit('SET_USER_ID', userId)
+commit('SET_NAME', username)
+commit('SET_NICK_NAME', nickname)
+commit('SET_AVATAR', avatar)
+commit('SET_DEPT_ID', deptId)
+commit('SET_BRANCH_COMPANY_ID', res.branchCompanyId)
+commit('SET_BRANCH_COMPANY_NAME', res.branchCompanyName)
+commit('SET_OA_USER_ID', res.oaUserId)
+commit('SET_CAN_CREATE_TASK', res.canCreateTask)  // 鉁� 鏂板
+resolve(res)
+```
+
+**璇存槑**锛氬湪 GetInfo action 涓彁浜� `SET_CAN_CREATE_TASK` mutation锛屽皢鎺ュ彛杩斿洖鐨� `canCreateTask` 瀛樺偍鍒� Vuex銆�
+
+---
+
+### 3. APP 绔潈闄愭帶鍒�
+
+#### 3.1 浠诲姟鍒涘缓椤甸潰鏉冮檺妫�鏌�
+
+**鏂囦欢**锛歚app/pages/task/create.vue`
+
+**淇敼浣嶇疆 1**锛氱 28-30 琛岋紙寮曞叆 mapState锛�
+
+```javascript
+<script>
+import { mapState } from 'vuex'  // 鉁� 鏂板
+
+export default {
+```
+
+**淇敼浣嶇疆 2**锛氱 72-78 琛岋紙娣诲姞 computed锛�
+
+```javascript
+computed: {
+  ...mapState({
+    canCreateTask: state => state.user.canCreateTask
+  })
+},
+```
+
+**璇存槑**锛氫娇鐢� Vuex 鐨� mapState 杈呭姪鍑芥暟锛屽皢 `canCreateTask` 鏄犲皠鍒扮粍浠剁殑璁$畻灞炴�с��
+
+---
+
+**淇敼浣嶇疆 3**锛氱 81-90 琛岋紙鏉冮檺妫�鏌ラ�昏緫锛�
+
+```javascript
+methods: {
+  selectTaskCategory(category) {
+    // 妫�鏌ユ槸鍚︽湁鍒涘缓浠诲姟鐨勬潈闄�
+    if (this.canCreateTask !== '1') {
+      this.$modal.msgError('鎮ㄦ病鏈夋潈闄愬垱寤轰换鍔�')
+      return
+    }
+    
+    // 璺宠浆鍒板搴旂殑浠诲姟鍒涘缓椤甸潰
+    uni.navigateTo({
+      url: `${category.page}?categoryName=${category.name}&categoryType=${category.type}&taskType=${category.taskType}`
+    })
+  }
+}
+```
+
+**鏍稿績閫昏緫**锛�
+1. 鍦ㄧ偣鍑讳换鍔$被鍨嬫椂锛岄鍏堟鏌� `this.canCreateTask` 鐨勫��
+2. 濡傛灉鍊间笉绛変簬 `'1'`锛屽垯寮瑰嚭閿欒鎻愮ず"鎮ㄦ病鏈夋潈闄愬垱寤轰换鍔�"锛屽苟 return 闃绘鍚庣画鎵ц
+3. 鍙湁褰� `canCreateTask === '1'` 鏃讹紝鎵嶅厑璁歌烦杞埌鍏蜂綋鐨勪换鍔″垱寤洪〉闈�
+
+---
+
+## 鏁版嵁娴佸悜
+
+```
+SQL Server (OA_User.OA_Power)
+      鈫�
+[鐢ㄦ埛鍚屾] CASE WHEN OA_Power LIKE '%,020101,%' THEN '1' ELSE '0' END
+      鈫�
+MySQL (sys_user.can_create_task)
+      鈫�
+[鐧诲綍鍚嶿 getInfo 鎺ュ彛
+      鈫�
+{
+  "user": {...},
+  "canCreateTask": "1" or "0"
+}
+      鈫�
+[APP] Vuex Store (state.user.canCreateTask)
+      鈫�
+[鏈湴瀛樺偍] vuex_canCreateTask
+      鈫�
+[椤甸潰鏉冮檺鎺у埗] create.vue 妫�鏌ユ潈闄�
+      鈫�
+鍏佽鍒涘缓 or 鎻愮ず"鎮ㄦ病鏈夋潈闄愬垱寤轰换鍔�"
+```
+
+---
+
+## 浣跨敤鍦烘櫙
+
+### 鍦烘櫙 1锛氭湁鏉冮檺鐨勭敤鎴�
+
+1. 鐢ㄦ埛鐧诲綍鍚庯紝`canCreateTask` 涓� `'1'`
+2. 鐐瑰嚮搴曢儴 TabBar "鍒涘缓浠诲姟" 杩涘叆浠诲姟绫诲瀷閫夋嫨椤甸潰
+3. 鐐瑰嚮浠讳綍涓�绉嶄换鍔$被鍨嬶紙杞繍浠诲姟銆佺淮淇繚鍏汇�佸姞娌圭瓑锛�
+4. **鉁� 姝e父璺宠浆**鍒板搴旂殑浠诲姟鍒涘缓琛ㄥ崟椤甸潰
+
+### 鍦烘櫙 2锛氭棤鏉冮檺鐨勭敤鎴�
+
+1. 鐢ㄦ埛鐧诲綍鍚庯紝`canCreateTask` 涓� `'0'` 鎴� `null`
+2. 鐐瑰嚮搴曢儴 TabBar "鍒涘缓浠诲姟" 杩涘叆浠诲姟绫诲瀷閫夋嫨椤甸潰
+3. 鐐瑰嚮浠讳綍涓�绉嶄换鍔$被鍨�
+4. **鉂� 寮瑰嚭鎻愮ず**锛�"鎮ㄦ病鏈夋潈闄愬垱寤轰换鍔�"
+5. **鉂� 闃绘璺宠浆**锛屽仠鐣欏湪浠诲姟绫诲瀷閫夋嫨椤甸潰
+
+---
+
+## 楠岃瘉鏂规硶
+
+### 1. 鍚庣楠岃瘉
+
+**鏌ヨ鐢ㄦ埛鏉冮檺**锛�
+```sql
+SELECT user_name, nick_name, can_create_task, oa_user_id
+FROM sys_user
+WHERE del_flag = '0'
+ORDER BY can_create_task DESC;
+```
+
+**娴嬭瘯 getInfo 鎺ュ彛**锛�
+```bash
+# 鐧诲綍鑾峰彇 token
+POST http://localhost:8080/login
+{
+  "username": "test_user",
+  "password": "password"
+}
+
+# 鑾峰彇鐢ㄦ埛淇℃伅
+GET http://localhost:8080/getInfo
+Authorization: Bearer {token}
+
+# 鍝嶅簲绀轰緥
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛",
+  "user": {...},
+  "canCreateTask": "1"  // 鉁� 纭鍖呭惈姝ゅ瓧娈�
+}
+```
+
+---
+
+### 2. APP 绔獙璇�
+
+**姝ラ 1**锛氱櫥褰� APP
+
+**姝ラ 2**锛氭墦寮�寮�鍙戣�呭伐鍏凤紝鏌ョ湅 Vuex State
+```javascript
+// 鍦ㄦ帶鍒跺彴杈撳叆
+console.log(this.$store.state.user.canCreateTask)
+// 杈撳嚭搴斾负 "1" 鎴� "0"
+```
+
+**姝ラ 3**锛氱偣鍑诲簳閮� TabBar "鍒涘缓浠诲姟"
+
+**姝ラ 4**锛氬湪浠诲姟绫诲瀷閫夋嫨椤甸潰锛岀偣鍑讳换鎰忎换鍔$被鍨�
+
+**棰勬湡缁撴灉**锛�
+- 鏈夋潈闄愮敤鎴凤紙`canCreateTask === '1'`锛夛細姝e父璺宠浆鍒板垱寤鸿〃鍗�
+- 鏃犳潈闄愮敤鎴凤紙`canCreateTask !== '1'`锛夛細寮瑰嚭鎻愮ず"鎮ㄦ病鏈夋潈闄愬垱寤轰换鍔�"
+
+---
+
+## 甯歌闂
+
+### Q1锛氭柊鐢ㄦ埛鐧诲綍鍚� canCreateTask 涓� null锛屽浣曞鐞嗭紵
+
+**A**锛氶渶瑕佸厛鎵ц鐢ㄦ埛鍚屾鎺ュ彛锛屼粠 OA 绯荤粺鍚屾鏉冮檺瀛楁锛�
+```bash
+POST http://localhost:8080/system/dept/sync/user
+```
+
+鍚屾鍚庯紝`can_create_task` 瀛楁浼氭牴鎹� OA_Power 鑷姩濉厖銆�
+
+---
+
+### Q2锛氬浣曠粰鐢ㄦ埛寮�閫氬垱寤轰换鍔℃潈闄愶紵
+
+**A**锛氭湁涓ょ鏂瑰紡锛�
+
+**鏂瑰紡 1锛堟帹鑽愶級**锛氬湪 OA 绯荤粺涓慨鏀圭敤鎴风殑 OA_Power 瀛楁
+- 纭繚 OA_Power 鍖呭惈 `,020101,`锛堟敞鎰忓墠鍚庨兘鏈夐�楀彿锛�
+- 鎵ц鐢ㄦ埛鍚屾鎺ュ彛
+
+**鏂瑰紡 2**锛氱洿鎺ヤ慨鏀规暟鎹簱
+```sql
+UPDATE sys_user
+SET can_create_task = '1'
+WHERE user_name = '鐢ㄦ埛鍚�';
+```
+
+**娉ㄦ剰**锛氭柟寮� 2 鐨勪慨鏀逛細鍦ㄤ笅娆$敤鎴峰悓姝ユ椂琚鐩栵紝寤鸿浣跨敤鏂瑰紡 1銆�
+
+---
+
+### Q3锛氱敤鎴锋潈闄愭洿鏂板悗锛岄渶瑕侀噸鏂扮櫥褰曞悧锛�
+
+**A**锛氭槸鐨勶紝鏈変袱绉嶆柟寮忕敓鏁堬細
+
+**鏂瑰紡 1**锛氱敤鎴烽��鍑虹櫥褰曪紝閲嶆柊鐧诲綍
+- 鐧诲綍鏃朵細璋冪敤 getInfo锛岃幏鍙栨渶鏂扮殑 `canCreateTask`
+
+**鏂瑰紡 2**锛氬墠绔富鍔ㄥ埛鏂扮敤鎴蜂俊鎭�
+```javascript
+this.$store.dispatch('GetInfo')
+```
+
+---
+
+### Q4锛氬浣曞湪鍓嶇鍏朵粬椤甸潰鍒ゆ柇鐢ㄦ埛鏄惁鏈夊垱寤烘潈闄愶紵
+
+**A**锛氬弬鑰� `create.vue` 鐨勫疄鐜版柟寮忥細
+
+```javascript
+import { mapState } from 'vuex'
+
+export default {
+  computed: {
+    ...mapState({
+      canCreateTask: state => state.user.canCreateTask
+    })
+  },
+  methods: {
+    checkPermission() {
+      if (this.canCreateTask !== '1') {
+        this.$modal.msgError('鎮ㄦ病鏈夋潈闄愬垱寤轰换鍔�')
+        return false
+      }
+      return true
+    }
+  }
+}
+```
+
+---
+
+## 娉ㄦ剰浜嬮」
+
+1. **瀛楁绫诲瀷**锛歚canCreateTask` 鏄瓧绗︿覆绫诲瀷 `CHAR(1)`锛屽�间负 `'0'` 鎴� `'1'`锛屾瘮杈冩椂蹇呴』浣跨敤瀛楃涓�
+   - 鉁� 姝g‘锛歚canCreateTask !== '1'`
+   - 鉂� 閿欒锛歚canCreateTask !== 1` 鎴� `!canCreateTask`
+
+2. **null 鍊煎鐞�**锛氭湭鍚屾鐨勭敤鎴� `canCreateTask` 鍙兘涓� `null`
+   - 鍦ㄦ潈闄愬垽鏂椂锛宍null !== '1'` 杩斿洖 `true`锛屼細闃绘鎿嶄綔锛岀鍚堝畨鍏ㄥ師鍒�
+
+3. **鏁版嵁鍚屾**锛氱‘淇濆畾鏈熸墽琛岀敤鎴峰悓姝ワ紝淇濇寔鏉冮檺瀛楁涓� OA 绯荤粺涓�鑷�
+
+4. **鍓嶇瀛樺偍**锛歚canCreateTask` 浼氬悓鏃跺瓨鍌ㄥ湪锛�
+   - Vuex State锛堝唴瀛橈級
+   - LocalStorage锛堟寔涔呭寲锛�
+   - 椤甸潰鍒锋柊鎴栭噸鍚� APP 鏃朵細浠� LocalStorage 鎭㈠
+
+5. **瀹夊叏鎬�**锛�
+   - 鍓嶇鏉冮檺妫�鏌ュ彧鏄敤鎴蜂綋楠屼紭鍖栵紝涓嶅奖鍝嶅悗绔畨鍏�
+   - 鍚庣浠嶉渶鍦ㄥ垱寤轰换鍔$殑鎺ュ彛涓繘琛屾潈闄愰獙璇�
+
+---
+
+## 鎶�鏈�荤粨
+
+鏈淇敼瀹炵幇浜嗗畬鏁寸殑**鍓嶇鏉冮檺鎺у埗娴佺▼**锛�
+
+1. 鉁� **鍚庣鎺ュ彛**锛歡etInfo 杩斿洖 canCreateTask
+2. 鉁� **鏁版嵁瀛樺偍**锛歏uex + LocalStorage 鍙岄噸瀛樺偍
+3. 鉁� **鏉冮檺妫�鏌�**锛氶〉闈㈢骇鏉冮檺鎷︽埅
+4. 鉁� **鐢ㄦ埛鎻愮ず**锛氬弸濂界殑閿欒鎻愮ず淇℃伅
+5. 鉁� **鏁版嵁鍚屾**锛氫笌 OA 绯荤粺鏉冮檺淇濇寔涓�鑷�
+
+**浼樼偣**锛�
+- 缁熶竴鐨勬潈闄愭暟鎹簮锛圤A_Power锛�
+- 鑷姩鍚屾鏈哄埗
+- 鍓嶇蹇�熷搷搴旓紝閬垮厤鏃犳晥璇锋眰
+- 鑹ソ鐨勭敤鎴蜂綋楠�
+
+**灞�闄愭��**锛�
+- 鍓嶇鏉冮檺鍙缁曡繃锛堝紑鍙戣�呭伐鍏蜂慨鏀癸級
+- 闇�瑕佷緷璧栧悗绔帴鍙g殑浜屾楠岃瘉
+
+---
+
+## 鐩稿叧鏂囨。
+
+- [鐢ㄦ埛鍒涘缓浠诲姟鍗曟潈闄愬姛鑳借鏄嶿(./鐢ㄦ埛鍒涘缓浠诲姟鍗曟潈闄愬姛鑳借鏄�.md)
+- [鐢ㄦ埛鍚屾鍔熻兘璇存槑](./鐢ㄦ埛鍚屾鍔熻兘璇存槑.md)
+- [Vuex 鐢ㄦ埛鐘舵�佸畬鏁存�т紭鍖朷(./Vuex鐢ㄦ埛鐘舵�佸畬鏁存�т紭鍖�.md)
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
index 4bef3fb..e3bb508 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -241,6 +241,7 @@
         ajax.put("branchCompanyName", branchCompanyName);
         ajax.put("branchCompanies", branchCompanies);
         ajax.put("oaUserId", user.getOaUserId());
+        ajax.put("canCreateTask", user.getCanCreateTask());
         return ajax;
     }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java
index 94222e5..a5a7621 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java
@@ -1349,7 +1349,9 @@
             }
 
             JSONArray results = jsonResponse.getJSONArray("pois");
-
+            if(results==null|| results.isEmpty()){
+                return AjaxResult.error("鏈壘鍒板尮閰嶇殑鍦板潃");
+            }
             
             // 鏋勫缓杩斿洖缁撴灉
             List<Map<String, Object>> suggestions = new ArrayList<>();
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
index 36ca34a..6e4586a 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
@@ -113,6 +113,10 @@
     /** 鏄惁鍙煡鐪嬫墍鏈夊挩璇㈠崟锛�0鍚� 1鏄級 */
     @Excel(name = "鍙煡鐪嬫墍鏈夊挩璇㈠崟", readConverterExp = "0=鍚�,1=鏄�")
     private String canViewAllConsult;
+    
+    /** 鏄惁鍙垱寤轰换鍔″崟锛�0鍚� 1鏄級 */
+    @Excel(name = "鍙垱寤轰换鍔″崟", readConverterExp = "0=鍚�,1=鏄�")
+    private String canCreateTask;
 
 
 
@@ -403,6 +407,16 @@
     {
         this.canViewAllConsult = canViewAllConsult;
     }
+    
+    public String getCanCreateTask()
+    {
+        return canCreateTask;
+    }
+    
+    public void setCanCreateTask(String canCreateTask)
+    {
+        this.canCreateTask = canCreateTask;
+    }
 
 
     @Override
@@ -435,7 +449,7 @@
             .append("qyWechatUserId", getQyWechatUserId())
             .append("qyWechatUpdateTime", getQyWechatUpdateTime())
             .append("canViewAllConsult", getCanViewAllConsult())
-
+            .append("canCreateTask", getCanCreateTask())
             .toString();
     }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserSyncDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserSyncDTO.java
index dd344e7..49b76f5 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserSyncDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserSyncDTO.java
@@ -28,6 +28,9 @@
     
     /** 鏄惁鍙煡鐪嬫墍鏈夊挩璇㈠崟锛�0鍚� 1鏄級 */
     private String canViewAllConsult;
+    
+    /** 鏄惁鍙垱寤轰换鍔″崟锛�0鍚� 1鏄級 */
+    private String canCreateTask;
 
     /** 鐢ㄦ埛鎬у埆锛�0=鐢�,1=濂�,2=鏈煡锛� */
     private String sex;
@@ -137,6 +140,16 @@
     {
         this.canViewAllConsult = canViewAllConsult;
     }
+    
+    public String getCanCreateTask()
+    {
+        return canCreateTask;
+    }
+    
+    public void setCanCreateTask(String canCreateTask)
+    {
+        this.canCreateTask = canCreateTask;
+    }
 
     @Override
     public String toString()
@@ -152,6 +165,7 @@
                 ", phonenumber='" + phonenumber + '\'' +
                 ", oaOrderClass='" + oaOrderClass + '\'' +
                 ", canViewAllConsult='" + canViewAllConsult + '\'' +
+                ", canCreateTask='" + canCreateTask + '\'' +
                 '}';
     }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserSyncServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserSyncServiceImpl.java
index 58689a0..83d93e8 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserSyncServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserSyncServiceImpl.java
@@ -227,6 +227,10 @@
         {
             existingUser.setCanViewAllConsult(dto.getCanViewAllConsult());
         }
+        if (StringUtils.isNotEmpty(dto.getCanCreateTask()))
+        {
+            existingUser.setCanCreateTask(dto.getCanCreateTask());
+        }
         // 鍚屾浼佷笟寰俊鐢ㄦ埛ID
         if (StringUtils.isNotEmpty(dto.getOaWeixinUserId()))
         {
@@ -253,6 +257,10 @@
         {
             newUser.setCanViewAllConsult(dto.getCanViewAllConsult());
         }
+        if (StringUtils.isNotEmpty(dto.getCanCreateTask()))
+        {
+            newUser.setCanCreateTask(dto.getCanCreateTask());
+        }
         
         // 璁剧疆浼佷笟寰俊鐢ㄦ埛ID
         if (StringUtils.isNotEmpty(dto.getOaWeixinUserId()))
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
index b62ed45..5b35c0f 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -31,6 +31,7 @@
         <result property="qyWechatUserId" column="qy_wechat_user_id" />
         <result property="qyWechatUpdateTime" column="qy_wechat_update_time" />
         <result property="canViewAllConsult" column="can_view_all_consult" />
+        <result property="canCreateTask" column="can_create_task" />
         <association property="dept"    javaType="SysDept"         resultMap="deptResult" />
         <collection  property="roles"   javaType="java.util.List"  resultMap="RoleResult" />
     </resultMap>
@@ -55,7 +56,7 @@
     </resultMap>
 	
 	<sql id="selectUserVo">
-        select u.user_id, u.dept_id, u.user_name,u.oa_user_id, u.oa_order_class, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.oa_user_id, u.create_by, u.create_time, u.remark,u.open_id,u.union_id,u.wechat_nickname,u.qy_wechat_user_id,u.qy_wechat_update_time,u.can_view_all_consult,
+        select u.user_id, u.dept_id, u.user_name,u.oa_user_id, u.oa_order_class, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.oa_user_id, u.create_by, u.create_time, u.remark,u.open_id,u.union_id,u.wechat_nickname,u.qy_wechat_user_id,u.qy_wechat_update_time,u.can_view_all_consult,u.can_create_task,
         d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
         r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
         from sys_user u
@@ -173,6 +174,7 @@
  			<if test="oaUserId != null">oa_user_id,</if>
  			<if test="oaOrderClass != null and oaOrderClass != ''">oa_order_class,</if>
 			<if test="canViewAllConsult != null and canViewAllConsult != ''">can_view_all_consult,</if>
+			<if test="canCreateTask != null and canCreateTask != ''">can_create_task,</if>
  			<if test="qyWechatUserId != null and qyWechatUserId != ''">qy_wechat_user_id,</if>
  			<if test="qyWechatUpdateTime != null">qy_wechat_update_time,</if>
  			<if test="createBy != null and createBy != ''">create_by,</if>
@@ -192,6 +194,7 @@
  			<if test="oaUserId != null">#{oaUserId},</if>
  			<if test="oaOrderClass != null and oaOrderClass != ''">#{oaOrderClass},</if>
  			<if test="canViewAllConsult != null and canViewAllConsult != ''">#{canViewAllConsult},</if>
+ 			<if test="canCreateTask != null and canCreateTask != ''">#{canCreateTask},</if>
  			<if test="qyWechatUserId != null and qyWechatUserId != ''">#{qyWechatUserId},</if>
  			<if test="qyWechatUpdateTime != null">#{qyWechatUpdateTime},</if>
  			<if test="createBy != null and createBy != ''">#{createBy},</if>
@@ -214,6 +217,7 @@
  			<if test="oaUserId != null">oa_user_id = #{oaUserId},</if>
  			<if test="oaOrderClass != null">oa_order_class = #{oaOrderClass},</if>
  			<if test="canViewAllConsult != null and canViewAllConsult != ''">can_view_all_consult = #{canViewAllConsult},</if>
+ 			<if test="canCreateTask != null and canCreateTask != ''">can_create_task = #{canCreateTask},</if>
  			<if test="qyWechatUserId != null and qyWechatUserId != ''">qy_wechat_user_id = #{qyWechatUserId},</if>
  			<if test="qyWechatUpdateTime != null">qy_wechat_update_time = #{qyWechatUpdateTime},</if>
  			<if test="openId != null and openId != ''">open_id = #{openId},</if>
diff --git a/ruoyi-system/src/main/resources/mapper/system/UserSyncMapper.xml b/ruoyi-system/src/main/resources/mapper/system/UserSyncMapper.xml
index a1dbfcd..8f025e3 100644
--- a/ruoyi-system/src/main/resources/mapper/system/UserSyncMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/UserSyncMapper.xml
@@ -15,6 +15,7 @@
         <result property="phonenumber" column="phonenumber" />
         <result property="oaOrderClass" column="OA_OrderClass" />
         <result property="canViewAllConsult" column="can_view_all_consult" />
+        <result property="canCreateTask" column="can_create_task" />
     </resultMap>
 
     <!-- 鏌ヨSQL Server涓殑OA鐢ㄦ埛鍒楄〃 -->
@@ -33,7 +34,11 @@
             CASE 
                 WHEN OA_Power LIKE '%,020112,%' THEN '1'
                 ELSE '0'
-            END AS can_view_all_consult
+            END AS can_view_all_consult,
+            CASE 
+                WHEN OA_Power LIKE '%,020101,%' THEN '1'
+                ELSE '0'
+            END AS can_create_task
         FROM OA_User
         WHERE OA_User IS NOT NULL 
           AND OA_Name IS NOT NULL
diff --git a/sql/add_can_create_task_to_sys_user.sql b/sql/add_can_create_task_to_sys_user.sql
new file mode 100644
index 0000000..eb14bf6
--- /dev/null
+++ b/sql/add_can_create_task_to_sys_user.sql
@@ -0,0 +1,16 @@
+-- 鍦╯ys_user琛ㄤ腑娣诲姞鏄惁鍙垱寤轰换鍔″崟瀛楁
+-- 浣滅敤: 鏍囪瘑鐢ㄦ埛鏄惁鏈夊垱寤轰换鍔″崟鐨勬潈闄愶紝浠嶰A绯荤粺鍚屾
+-- 鍚屾瑙勫垯: OA_Power LIKE '%,020101,%' 鐨勭敤鎴峰彲浠ュ垱寤轰换鍔″崟
+
+-- 娣诲姞瀛楁
+ALTER TABLE sys_user ADD COLUMN can_create_task CHAR(1) DEFAULT '0' COMMENT '鏄惁鍙垱寤轰换鍔″崟锛�0鍚� 1鏄級';
+
+-- 娣诲姞绱㈠紩锛堟柟渚挎煡璇㈡湁鏉冮檺鐨勭敤鎴凤級
+CREATE INDEX idx_can_create_task ON sys_user(can_create_task);
+
+-- 鏌ヨ楠岃瘉
+SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT 
+FROM INFORMATION_SCHEMA.COLUMNS 
+WHERE TABLE_SCHEMA = 'ry-vue' 
+  AND TABLE_NAME = 'sys_user' 
+  AND COLUMN_NAME = 'can_create_task';

--
Gitblit v1.9.1