Explorar el Código

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	doc/待更新脚本
liao-sea hace 11 meses
padre
commit
a2e10a960d
Se han modificado 67 ficheros con 2776 adiciones y 1379 borrados
  1. 745 537
      doc/就业驿站管理系统.pdb
  2. 477 437
      doc/就业驿站管理系统.pdm
  3. 5 1
      doc/待更新脚本
  4. 3 1
      h5app/public/appconfig.json
  5. 9 0
      h5app/src/App.vue
  6. 13 0
      h5app/src/api/siteUserInfo/index.ts
  7. 28 0
      h5app/src/api/wechat/index.ts
  8. 5 2
      h5app/src/api/workTask/index.ts
  9. BIN
      h5app/src/assets/icon/qrcode.png
  10. BIN
      h5app/src/assets/icon/wxQrcode.jpg
  11. 3 0
      h5app/src/enums/cacheEnum.ts
  12. 32 2
      h5app/src/router/index.ts
  13. 13 4
      h5app/src/store/modules/user.ts
  14. 3 1
      h5app/src/utils/config.ts
  15. 128 118
      h5app/src/utils/request.ts
  16. 10 3
      h5app/src/utils/urlUtils.ts
  17. 49 0
      h5app/src/utils/wechat.ts
  18. 37 0
      h5app/src/views/pages/jobUserInfo/companyEdit.vue
  19. 117 0
      h5app/src/views/pages/jobUserInfo/index.vue
  20. 37 0
      h5app/src/views/pages/jobUserInfo/userEdit.vue
  21. 125 0
      h5app/src/views/pages/userQrCode/index.vue
  22. 112 0
      h5app/src/views/pages/work/task/detail.vue
  23. 109 86
      h5app/src/views/pages/work/task/edit.vue
  24. 16 7
      h5app/src/views/pages/work/task/list.vue
  25. 1 1
      h5app/src/views/pages/work/task/myTask.vue
  26. 35 0
      h5app/src/views/sapp/about.vue
  27. 14 3
      h5app/src/views/sapp/tabMain.vue
  28. 1 1
      h5app/src/views/sapp/tabUser.vue
  29. 1 1
      pom.xml
  30. 4 0
      src/main/java/com/hz/employmentsite/AppConfig.java
  31. 1 0
      src/main/java/com/hz/employmentsite/config/WebConfiguration.java
  32. 37 0
      src/main/java/com/hz/employmentsite/config/WxMpConfig.java
  33. 11 17
      src/main/java/com/hz/employmentsite/controller/CommonController.java
  34. 12 3
      src/main/java/com/hz/employmentsite/controller/WxController.java
  35. 5 3
      src/main/java/com/hz/employmentsite/controller/baseSettings/SiteUserController.java
  36. 2 2
      src/main/java/com/hz/employmentsite/controller/taskAndLog/DoTaskController.java
  37. 4 1
      src/main/java/com/hz/employmentsite/mapper/PcSiteUserMapper.java
  38. 2 1
      src/main/java/com/hz/employmentsite/mapper/cquery/UserInfoCQuery.java
  39. 12 0
      src/main/java/com/hz/employmentsite/model/PcDotaskUser.java
  40. 20 0
      src/main/java/com/hz/employmentsite/model/PcSite.java
  41. 20 0
      src/main/java/com/hz/employmentsite/model/PcSiteUser.java
  42. 140 0
      src/main/java/com/hz/employmentsite/model/PcSiteUserExample.java
  43. 23 9
      src/main/java/com/hz/employmentsite/services/impl/WechatServiceImpl.java
  44. 6 2
      src/main/java/com/hz/employmentsite/services/impl/baseSettings/SiteInfoImpl.java
  45. 26 7
      src/main/java/com/hz/employmentsite/services/impl/baseSettings/SiteUserImpl.java
  46. 2 1
      src/main/java/com/hz/employmentsite/services/impl/taskAndLog/DoTaskImpl.java
  47. 6 0
      src/main/java/com/hz/employmentsite/services/service/WechatService.java
  48. 1 1
      src/main/java/com/hz/employmentsite/services/service/baseSettings/SiteUserService.java
  49. 3 1
      src/main/java/com/hz/employmentsite/services/service/taskAndLog/DoTaskService.java
  50. 61 0
      src/main/java/com/hz/employmentsite/util/QrCodeUtils.java
  51. 5 1
      src/main/java/com/hz/employmentsite/vo/baseSettings/SiteInfoVo.java
  52. 6 2
      src/main/java/com/hz/employmentsite/vo/baseSettings/SiteUserVo.java
  53. 2 0
      src/main/java/com/hz/employmentsite/vo/taskAndLog/DoTaskVo.java
  54. 3 0
      src/main/java/com/hz/employmentsite/vo/user/UserInfoModel.java
  55. 4 2
      src/main/resources/application.yml
  56. 3 1
      src/main/resources/mapping/PcDotaskUserMapper.xml
  57. 85 55
      src/main/resources/mapping/PcSiteMapper.xml
  58. 51 13
      src/main/resources/mapping/PcSiteUserMapper.xml
  59. 1 1
      src/main/resources/mapping/cquery/DoTaskCQuery.xml
  60. 3 0
      src/main/resources/mapping/cquery/SiteUserCQuery.xml
  61. 4 1
      src/main/resources/mapping/cquery/SysUserCQuery.xml
  62. 14 26
      vue/src/layout/header/index.vue
  63. 19 5
      vue/src/views/baseSettings/siteInfo/edit.vue
  64. 34 8
      vue/src/views/baseSettings/siteUser/edit.vue
  65. 13 9
      vue/src/views/baseSettings/siteUser/index.vue
  66. 2 2
      vue/src/views/companyService/post/edit.vue
  67. 1 0
      vue/src/views/system/users/updatePassword.vue

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 745 - 537
doc/就业驿站管理系统.pdb


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 477 - 437
doc/就业驿站管理系统.pdm


+ 5 - 1
doc/待更新脚本

@@ -102,4 +102,8 @@ insert sys_dictionary_item values(UUID(),'','NationType',52,'鄂伦春族',52,1,
 insert sys_dictionary_item values(UUID(),'','NationType',53,'赫哲族',53,1,1);
 insert sys_dictionary_item values(UUID(),'','NationType',54,'门巴族',54,1,1);
 insert sys_dictionary_item values(UUID(),'','NationType',55,'珞巴族',55,1,1);
-insert sys_dictionary_item values(UUID(),'','NationType',56,'基诺族',56,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',56,'基诺族',56,1,1);
+
+-- 2024.4.17
+alter table pc_site_user add UserNo varchar(50) comment '工号';
+alter table pc_site_user add IDCard varchar(100) comment '身份证号';

+ 3 - 1
h5app/public/appconfig.json

@@ -1,3 +1,5 @@
 {
-  "isDev": true
+  "isDev": true,
+  "webSiteUrl": "http://www.bowintek.com:8022/mobile/index.html/#",
+  "webApiServiceUrl": "/api/"
 }

+ 9 - 0
h5app/src/App.vue

@@ -8,6 +8,7 @@
 import {IonApp, IonRouterOutlet} from '@ionic/vue';
 import {getCurrentInstance, ref} from "vue";
 import {useUserStore} from "@/store/modules/user";
+import {wxAuth} from "@/utils/wechat";
 
 const {appContext: {config: {globalProperties}}} = getCurrentInstance();
 
@@ -18,6 +19,9 @@ const user = ref(userStore.getUserInfo);
 if (user.value != null) {
   globalProperties.$routeActive = true;
 }
+else{
+  wxAuth();
+}
 
 </script>
 
@@ -28,6 +32,7 @@ ion-content {
 
 /*顶部导航白色背景主题样式*/
 .header-theme2 {
+  border-bottom: 1px solid #f1f5f7;
   background: white;
   text-align: center;
 
@@ -49,6 +54,10 @@ ion-content {
   }
 }
 
+.header-theme2::after{
+  background-image: none !important;
+}
+
 .grid-content {
   margin: 10px 10px;
   background-color: #f0f2f5;

+ 13 - 0
h5app/src/api/siteUserInfo/index.ts

@@ -11,4 +11,17 @@ export function getSiteUserDataList(){
             isNew: true,
         },
     );
+}
+
+export function getUserByID(userId: string) {
+    return request(
+        {
+            url: 'user/getUserInfo',
+            method: 'get',
+            params: {userId:userId},
+        },
+        {
+            isNew: true,
+        }
+    );
 }

+ 28 - 0
h5app/src/api/wechat/index.ts

@@ -0,0 +1,28 @@
+import {request} from "@/utils/request";
+
+export function getOAuthUrl() {
+    return request<object>(
+        {
+            url: 'wx/getOAuthUrl',
+            method: 'get',
+            params: {},
+        },
+        {
+            isNew: true,
+        },
+    );
+}
+
+
+export function getWxOpenId(code:string) {
+    return request<object>(
+        {
+            url: 'wx/getOpenId',
+            method: 'get',
+            params: {code:code},
+        },
+        {
+            isNew: true,
+        },
+    );
+}

+ 5 - 2
h5app/src/api/workTask/index.ts

@@ -11,12 +11,15 @@ export function saveWorkTask(data: any) {
     );
 }
 
-export function taskFinish(doTaskID: any) {
+export function taskFinish(doTaskID: any, completeTime: any) {
     return request(
         {
             url: 'taskAndLog/doTask/taskFinish',
             method: 'post',
-            params: {doTaskID:doTaskID},
+            params: {
+                doTaskID,
+                completeTime
+            },
         },
         { isNew: true },
     );

BIN
h5app/src/assets/icon/qrcode.png


BIN
h5app/src/assets/icon/wxQrcode.jpg


+ 3 - 0
h5app/src/enums/cacheEnum.ts

@@ -16,3 +16,6 @@ export const ROLES_KEY = 'MOBILE_ROLES__KEY__';
 export const IS_LOCKSCREEN = 'MOBILE_IS_LOCKSCREEN';
 /** 标签页 */
 export const TABS_ROUTES = 'MOBILE_TABS_ROUTES';
+
+/** 用户token */
+export const ACCESS_OpenId_KEY = 'MOBILE_OpenId';

+ 32 - 2
h5app/src/router/index.ts

@@ -4,6 +4,10 @@ import StudentTabsPage from '../views/sapp/TabsPage.vue';
 import LoginPage from '../views/login.vue';
 import WrapperLayoutView from '../views/wrapper/index.vue';
 import TeacherTabsPage from '../views/tapp/tabsPage.vue';
+import DemoPage from '../views/pages/demo/edit.vue';
+import JobUserInfoIndex from '../views/pages/jobUserInfo/index.vue';
+import JobUserInfoUserEdit from '../views/pages/jobUserInfo/userEdit.vue';
+import JobUserInfoCompanyEdit from '../views/pages/jobUserInfo/companyEdit.vue';
 
 const routes: Array<RouteRecordRaw> = [
     {
@@ -108,6 +112,10 @@ const routes: Array<RouteRecordRaw> = [
                 path: 'tabMain/work/task/edit',
                 component: () => import('@/views/pages/work/task/edit.vue')
             },
+            {
+                path: 'tabMain/work/task/detail',
+                component: () => import('@/views/pages/work/task/detail.vue')
+            },
             {
                 path: 'tabMain/work/task/myTask',
                 component: () => import('@/views/pages/work/task/myTask.vue')
@@ -132,11 +140,18 @@ const routes: Array<RouteRecordRaw> = [
                 path: 'tabUser/updatePassword',
                 component: () => import('@/views/pages/user/updatePassword.vue')
             },
+            {
+                path: 'tabUser/about',
+                component: () => import('@/views/sapp/about.vue')
+            },
             {
                 path: 'tabMain/demo/edit',
                 component: () => import('@/views/pages/demo/edit.vue')
+            },
+            {
+                path: 'tabMain/userQrCode/index',
+                component: () => import('@/views/pages/userQrCode/index.vue')
             }
-
         ]
     },
     {
@@ -168,8 +183,23 @@ const routes: Array<RouteRecordRaw> = [
     {
         path: '/login',
         component: LoginPage
+    },
+    {
+        path: '/demo',
+        component: DemoPage
+    },
+    {
+        path: '/jobUserInfo/index',
+        component: JobUserInfoIndex
+    },
+    {
+        path: '/jobUserInfo/useredit',
+        component: JobUserInfoUserEdit
+    },
+    {
+        path: '/jobUserInfo/companyedit',
+        component: JobUserInfoCompanyEdit
     }
-
 ]
 
 const router = createRouter({

+ 13 - 4
h5app/src/store/modules/user.ts

@@ -2,7 +2,7 @@ import { defineStore } from 'pinia';
 //import { useWsStore } from './ws';
 import { store } from '@/store';
 import { login } from '@/api/login';
-import {ACCESS_TOKEN_KEY, USER_INFO_KEY} from '@/enums/cacheEnum';
+import {ACCESS_OpenId_KEY, ACCESS_TOKEN_KEY, USER_INFO_KEY} from '@/enums/cacheEnum';
 import { Storage } from '@/utils/Storage';
 import { logout, getInfo, permmenu } from '@/api/account';
 import {oauthLogin} from "@/api/oauth";
@@ -16,7 +16,8 @@ interface UserState {
   perms: string[];
   menus: API.Menu[];
   userInfo: Partial<API.AdminUserInfo>;
-  timer: any
+  timer: any,
+  openId: string
 }
 
 export const useUserStore = defineStore({
@@ -28,7 +29,8 @@ export const useUserStore = defineStore({
     perms: [],
     menus: [],
     userInfo: Storage.get(USER_INFO_KEY, null),
-    timer: null
+    timer: null,
+    openId:''
   }),
   getters: {
     getToken(): string {
@@ -43,7 +45,9 @@ export const useUserStore = defineStore({
     getUserInfo():Partial<API.AdminUserInfo>{
       return this.userInfo;
     },
-
+    getOpenId(): string {
+      return this.openId;
+    },
   },
   actions: {
     /** 清空token及用户信息 */
@@ -65,6 +69,11 @@ export const useUserStore = defineStore({
       const ex = 7 * 24 * 60 * 60 * 1000;
       Storage.set(USER_INFO_KEY, this.userInfo,ex);
     },
+    setOpenId(openId: string) {
+      this.openId = openId ?? '';
+      const ex = 7 * 24 * 60 * 60 * 1000;
+      Storage.set(ACCESS_OpenId_KEY, this.openId, ex);
+    },
     /** 登录 */
     async login(params: API.LoginParams) {
       try {

+ 3 - 1
h5app/src/utils/config.ts

@@ -5,12 +5,14 @@ const service = axios.create({
 
 export interface ConfigParams  {
     isDev: boolean;
+    webSiteUrl: string;
+    webApiServiceUrl: string
 }
 
 export const getConfig = async <ConfigParams>(
 ): Promise<ConfigParams> => {
     try {
-        const res = await service.request({url: 'mobile/appconfig.json'});
+        const res = await service.request({url: '../mobile/appconfig.json'});
 
         return res.data as ConfigParams;
     } catch (error: any) {

+ 128 - 118
h5app/src/utils/request.ts

@@ -5,108 +5,118 @@ import {ACCESS_TOKEN_KEY} from '@/enums/cacheEnum';
 import {Storage} from '@/utils/Storage';
 import {useUserStore} from '@/store/modules/user';
 import {alertController} from "@ionic/vue";
+import {getConfig} from "./config";
 
 // import {ExclamationCircleOutlined} from '@ant-design/icons'
 
 export interface RequestOptions {
-  /** 当前接口权限, 不需要鉴权的接口请忽略, 格式:sys:user:add */
-  permCode?: string;
-  /** 是否直接获取data,而忽略message等 */
-  isGetDataDirectly?: boolean;
-  /** 请求成功是提示信息 */
-  successMsg?: string;
-  /** 请求失败是提示信息 */
-  errorMsg?: string;
-  /** 是否mock数据请求 */
-  isMock?: boolean;
-  /** 是否开发后台数据 */
-  isNew?: boolean;
-  isShowSuccessMsg?:boolean;
-  isShowErrorMsg?:boolean;
+    /** 当前接口权限, 不需要鉴权的接口请忽略, 格式:sys:user:add */
+    permCode?: string;
+    /** 是否直接获取data,而忽略message等 */
+    isGetDataDirectly?: boolean;
+    /** 请求成功是提示信息 */
+    successMsg?: string;
+    /** 请求失败是提示信息 */
+    errorMsg?: string;
+    /** 是否mock数据请求 */
+    isMock?: boolean;
+    /** 是否开发后台数据 */
+    isNew?: boolean;
+    isShowSuccessMsg?: boolean;
+    isShowErrorMsg?: boolean;
 }
 
 export interface RequsetData {
-  item: any;
-  extdata?: any;
-  success?: boolean;
-  msg?: string;
+    item: any;
+    extdata?: any;
+    success?: boolean;
+    msg?: string;
 }
 
 const UNKNOWN_ERROR = '未知错误,请重试';
 // 是否生产环境
 // const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV);
 /** 真实请求的路径前缀 */
-const baseApiUrl = '/api/';
+let baseApiUrl = '/api/';
+try {
+    getConfig().then((data: any) => {
+        baseApiUrl = data.webApiServiceUrl || '/api/';
+    }, () => {
+        baseApiUrl = '/api/';
+    })
+} catch (e: any) {
+    baseApiUrl = '/api/';
+}
 /** mock请求路径前缀 */
 const baseMockUrl = '/';
 
 const service = axios.create({
-  // baseURL: baseApiUrl,
-  timeout: 120000,
+    // baseURL: baseApiUrl,
+    timeout: 120000,
 });
 
 service.interceptors.request.use(
-  (config) => {
-    const token = Storage.get(ACCESS_TOKEN_KEY);
-    if (token && config.headers) {
-      // 请求头token信息,请根据实际情况进行修改
-      config.headers['Authorization'] = token;
-    }
-    return config;
-  },
-  (error) => {
-    Promise.reject(error);
-  },
+    (config) => {
+        const token = Storage.get(ACCESS_TOKEN_KEY);
+        if (token && config.headers) {
+            // 请求头token信息,请根据实际情况进行修改
+            config.headers['Authorization'] = token;
+        }
+        return config;
+    },
+    (error) => {
+        Promise.reject(error);
+    },
 );
 
 service.interceptors.response.use(
-  (response) => {
-    const res = response.data;
-
-    // if the custom code is not 200, it is judged as an error.
-
-    if (res.code !== "200") {
-      //$message.error(res.message || UNKNOWN_ERROR);
-
-      // Illegal token
-      if (res.code === 11001 || res.code === 11002) {
-        window.localStorage.clear();
-        window.location.reload();
-        // to re-login
-        // Modal.confirm({
-        //   title: '警告',
-        //   content: res.message || '账号异常,您可以取消停留在该页上,或重新登录',
-        //   okText: '重新登录',
-        //   cancelText: '取消',
-        //   onOk: () => {
-        //     localStorage.clear();
-        //     window.location.reload();
-        //   }
-        // });
-      }
-
-      // throw other
-        const error = new Error(res.message || UNKNOWN_ERROR) as Error & { code: any,data:any };
-        error.code = res.code;
-        error.data=res.data;
+    (response) => {
+        const res = response.data;
+
+        // if the custom code is not 200, it is judged as an error.
+
+        if (res.code !== "200") {
+            //$message.error(res.message || UNKNOWN_ERROR);
+
+            // Illegal token
+            if (res.code === 11001 || res.code === 11002) {
+                window.localStorage.clear();
+                window.location.reload();
+                // to re-login
+                // Modal.confirm({
+                //   title: '警告',
+                //   content: res.message || '账号异常,您可以取消停留在该页上,或重新登录',
+                //   okText: '重新登录',
+                //   cancelText: '取消',
+                //   onOk: () => {
+                //     localStorage.clear();
+                //     window.location.reload();
+                //   }
+                // });
+            }
+
+            // throw other
+            const error = new Error(res.message || res.msg || UNKNOWN_ERROR) as Error & { code: any, data: any };
+            error.code = res.code;
+            error.data = res.data;
+            return Promise.reject(error);
+        } else {
+            return res;
+        }
+    },
+    (error) => {
+        // 处理 422 或者 500 的错误异常提示
+        const errMsg = error?.response?.data?.message ?? UNKNOWN_ERROR;
+        //$message.error(errMsg);
+        error.message = errMsg;
         return Promise.reject(error);
-    } else {
-      return res;
-    }
-  },
-  (error) => {
-    // 处理 422 或者 500 的错误异常提示
-    const errMsg = error?.response?.data?.message ?? UNKNOWN_ERROR;
-    //$message.error(errMsg);
-    error.message = errMsg;
-    return Promise.reject(error);
-  },
+    },
 );
 
 export type Response<T = any> = {
-  code: number;
-  message: string;
-  data: T;
+    code: number;
+    message: string;
+    data: T;
 };
 
 export type BaseResponse<T = any> = Promise<Response<T>>;
@@ -118,52 +128,52 @@ export type BaseResponse<T = any> = Promise<Response<T>>;
  * @param data - request data or params
  */
 export const request = async <T = any>(
-  config: AxiosRequestConfig,
-  options: RequestOptions = {},
+    config: AxiosRequestConfig,
+    options: RequestOptions = {},
 ): Promise<T> => {
-  try {
-    const {successMsg, errorMsg, permCode, isMock, isGetDataDirectly = true,isShowSuccessMsg = true} = options;
-    // 如果当前是需要鉴权的接口 并且没有权限的话 则终止请求发起 , isNew
-    if (permCode && !useUserStore().perms.includes(permCode)) {
-      //return $message.error('你没有访问该接口的权限,请联系管理员!');
-      return Promise.reject('你没有访问该接口的权限,请联系管理员!');
+    try {
+        const {successMsg, errorMsg, permCode, isMock, isGetDataDirectly = true, isShowSuccessMsg = true} = options;
+        // 如果当前是需要鉴权的接口 并且没有权限的话 则终止请求发起 , isNew
+        if (permCode && !useUserStore().perms.includes(permCode)) {
+            //return $message.error('你没有访问该接口的权限,请联系管理员!');
+            return Promise.reject('你没有访问该接口的权限,请联系管理员!');
+        }
+        let fullUrl = '';
+
+        fullUrl = `${(isMock ? baseMockUrl : baseApiUrl) + config.url}`;
+        /*
+            if (isNew) {
+              fullUrl = `/n-api/${config.url}`;
+            } else {
+              fullUrl = `${(isMock ? baseMockUrl : baseApiUrl) + config.url}`;
+            }*/
+
+        config.url = uniqueSlash(fullUrl);
+        // if (IS_PROD) {
+        //   // 保持api请求的协议与当前访问的站点协议一致
+        //   config.url.replace(/^https?:/g, location.protocol);
+        // }
+        const res = await service.request(config);
+        successMsg && isShowSuccessMsg && presentAlert("成功", successMsg);
+        //successMsg && $message.success(successMsg);
+        //errorMsg && $message.error(errorMsg);
+
+        return isGetDataDirectly ? res.data : res;
+    } catch (error: any) {
+        const {errorMsg, isShowErrorMsg = true} = options;
+        isShowErrorMsg && presentAlert("错误", (errorMsg || "") + error.message);
+        return Promise.reject(error);
     }
-    let fullUrl = '';
-
-    fullUrl = `${(isMock ? baseMockUrl : baseApiUrl) + config.url}`;
-/*
-    if (isNew) {
-      fullUrl = `/n-api/${config.url}`;
-    } else {
-      fullUrl = `${(isMock ? baseMockUrl : baseApiUrl) + config.url}`;
-    }*/
-
-    config.url = uniqueSlash(fullUrl);
-    // if (IS_PROD) {
-    //   // 保持api请求的协议与当前访问的站点协议一致
-    //   config.url.replace(/^https?:/g, location.protocol);
-    // }
-    const res = await service.request(config);
-    successMsg && isShowSuccessMsg && presentAlert("成功",successMsg);
-    //successMsg && $message.success(successMsg);
-    //errorMsg && $message.error(errorMsg);
-
-    return isGetDataDirectly ? res.data : res;
-  } catch (error: any) {
-    const {errorMsg,isShowErrorMsg=true} = options;
-    isShowErrorMsg && presentAlert("错误",(errorMsg|| "")+error.message);
-    return Promise.reject(error);
-  }
 };
 
-const presentAlert = async (title:string,message: string) => {
-  const alert = await alertController.create({
-    header: title,
-    message: message,
-    buttons: [
-      '确定'
-    ],
-  });
+const presentAlert = async (title: string, message: string) => {
+    const alert = await alertController.create({
+        header: title,
+        message: message,
+        buttons: [
+            '确定'
+        ],
+    });
 
-  await alert.present();
+    await alert.present();
 }

+ 10 - 3
h5app/src/utils/urlUtils.ts

@@ -32,20 +32,27 @@ export const uniqueSlash = (path: string) => path.replace(/(https?:\/)|(\/)+/g,
 // Safari 不支持以下正则(反向否定查找) shit!
 // export const uniqueSlash = (path: string) => path.replace(/(?<!:)\/{2,}/g, '/');
 
+
 export function getUrlParams(){
-  // 截取url中的ticket方法
   let url = location.href;
   const theRequest = new Object();
   if (url.indexOf("#/login") != -1) {
     url = url.split("#/login")[0];
   }
   if (url.indexOf("?") != -1) {
-    const paramsUrl = url.split('?')[1];
+    const index = url.indexOf("?");
+    const splits = [url.slice(0,index),url.slice(index+1)];
+    const paramsUrl = splits[1];
     const strs = paramsUrl.split("&");
     for (let i = 0; i < strs.length; i++) {
       // eslint-disable-next-line @typescript-eslint/ban-ts-comment
       // @ts-ignore
-      theRequest[strs[i].split("=")[0]] = strs[i].split("=")[1];
+      const paramsIndex = strs[i].indexOf("=");
+      const paramsSplits = [strs[i].slice(0,paramsIndex),strs[i].slice(paramsIndex+1)];
+
+      // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+      // @ts-ignore
+      theRequest[paramsSplits[0]] = paramsSplits[1];
     }
   }
   return theRequest;

+ 49 - 0
h5app/src/utils/wechat.ts

@@ -0,0 +1,49 @@
+import {getUrlParams} from "@/utils/urlUtils";
+import {getOAuthUrl, getWxOpenId} from "@/api/wechat";
+import {useUserStore} from "@/store/modules/user";
+import {alertController, loadingController} from '@ionic/vue';
+
+export function isWechat() {
+    return String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger";
+    /*return true;*/
+}
+
+export async function wxAuth() {
+    const userStore = useUserStore();
+    if (isWechat() && !userStore.getOpenId) {
+        const urlParams = getUrlParams() as any;
+        const code = urlParams["code"];
+        if (!code) {
+            const loading = await loadingController.create({
+                cssClass: 'my-custom-class',
+                message: '微信授权中,请稍后...',
+                duration: 2000,
+            });
+            await loading.present();
+
+            getOAuthUrl().then((res: any) => {
+                if (res) {
+                    window.location.href = res;
+                } else {
+                    presentAlert("微信授权失败!");
+                }
+            });
+        } else {
+            getWxOpenId(code).then((res: any) => {
+                userStore.setOpenId(res);
+            });
+        }
+    }
+}
+
+const presentAlert = async (msg: any) => {
+    const alert = await alertController.create({
+        header: '错误!',
+        message: msg,
+        buttons: [
+            '确定'
+        ],
+    });
+
+    await alert.present();
+}

+ 37 - 0
h5app/src/views/pages/jobUserInfo/companyEdit.vue

@@ -0,0 +1,37 @@
+<template>
+  <ion-page class="list-page">
+    <ion-header class="header-theme2">
+      <ion-toolbar>
+        <ion-buttons slot="start">
+          <ion-icon :icon="arrowBackOutline" @click="onBack"></ion-icon>
+        </ion-buttons>
+        <ion-title>企业信息登记</ion-title>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content>
+      companyInfoEidt
+    </ion-content>
+  </ion-page>
+</template>
+<script>
+import {defineComponent} from "vue";
+import {arrowBackOutline} from 'ionicons/icons';
+import {useRouter} from "vue-router";
+
+export default defineComponent({
+  name: "companyInfoEidt",
+  setup() {
+    const router = useRouter();
+    const onBack = () => {
+      router.push('/jobUserInfo/index');
+    }
+    return {
+      arrowBackOutline,
+      onBack
+    }
+  }
+});
+</script>
+<style lang="less">
+
+</style>

+ 117 - 0
h5app/src/views/pages/jobUserInfo/index.vue

@@ -0,0 +1,117 @@
+<template>
+  <ion-page class="list-page">
+    <ion-header class="header-theme2 header-theme3">
+      <ion-toolbar>
+        <ion-title>信息登记</ion-title>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content>
+      <div class="bw-vue-form">
+        <div class="form-detail">
+          <ion-label>姓名</ion-label>
+          <ion-text>{{ user.name }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>工号</ion-label>
+          <ion-text>{{ user.userNo }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>身份证号</ion-label>
+          <ion-text>{{ user.IDCard }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>身份</ion-label>
+          <ion-text>驿站工作人员</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>所属驿站</ion-label>
+          <ion-text>{{ user.siteName }}</ion-text>
+        </div>
+      </div>
+      <div class="page_button">
+        <ion-button shape="round" expand="block" @click="onCompany">我是企业</ion-button>
+        <ion-button shape="round" expand="block" @click="onJobUser">我是求职者</ion-button>
+      </div>
+    </ion-content>
+  </ion-page>
+</template>
+<script>
+import {defineComponent, ref} from "vue";
+import {getUrlParams} from "@/utils/urlUtils";
+import {alertController} from "@ionic/vue";
+import {getUserByID} from "@/api/siteUserInfo";
+import {useRouter} from "vue-router";
+import {getWxOpenId} from "@/api/wechat";
+import {useUserStore} from "@/store/modules/user";
+
+
+const presentAlert = async (message) => {
+  const alert = await alertController.create({
+    header: '错误!',
+    message: message,
+    buttons: [
+      '确定'
+    ],
+  });
+
+  await alert.present();
+}
+
+export default defineComponent({
+  name: "jobUserInfoIndex",
+  setup() {
+    const router = useRouter();
+    const user = ref({userNo: '', name: '', IDCard: '', siteName: ''});
+    const urlParams = getUrlParams();
+    const userId = urlParams["userId"];
+    const userStore = useUserStore();
+
+    const getUser = async function () {
+      const reqData = await getUserByID(userId);
+      user.value = reqData;
+    };
+
+    const onCompany = function () {
+      router.push({path: '/jobUserInfo/companyedit', query: {reload: 1, openId: userStore.getOpenId}});
+    };
+
+    const onJobUser = function () {
+      router.push({path: '/jobUserInfo/useredit', query: {reload: 1, openId: userStore.getOpenId}});
+    };
+
+
+    if (!userId) {
+      presentAlert("驿站工作者信息获取失败");
+    } else {
+      getUser();
+    }
+
+    return {
+      user,
+      onCompany,
+      onJobUser
+    }
+  }
+});
+</script>
+<style lang="less">
+.bw-vue-form{
+  padding: 20px 10px;
+}
+
+.page_button {
+  display: flex;
+  justify-content: space-around;
+  padding: 20px;
+
+  ion-button {
+    width: 150px;
+  }
+}
+.header-theme3{
+  ion-title{
+    margin-left: 0px !important;
+  }
+}
+
+</style>

+ 37 - 0
h5app/src/views/pages/jobUserInfo/userEdit.vue

@@ -0,0 +1,37 @@
+<template>
+  <ion-page class="list-page">
+    <ion-header class="header-theme2">
+      <ion-toolbar>
+        <ion-buttons slot="start">
+          <ion-icon :icon="arrowBackOutline" @click="onBack"></ion-icon>
+        </ion-buttons>
+        <ion-title>求职者信息登记</ion-title>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content>
+      jobUserInfoEdit
+    </ion-content>
+  </ion-page>
+</template>
+<script>
+import {defineComponent} from "vue";
+import {arrowBackOutline} from 'ionicons/icons';
+import {useRouter} from "vue-router";
+
+export default defineComponent({
+  name: "jobUserInfoEdit",
+  setup() {
+    const router = useRouter();
+    const onBack = () => {
+      router.push('/jobUserInfo/index');
+    }
+    return {
+      arrowBackOutline,
+      onBack
+    }
+  }
+});
+</script>
+<style lang="less">
+
+</style>

+ 125 - 0
h5app/src/views/pages/userQrCode/index.vue

@@ -0,0 +1,125 @@
+<template>
+  <ion-page class="list-page">
+    <ion-header class="header-theme2">
+      <ion-toolbar>
+        <ion-buttons slot="start">
+          <ion-icon :icon="arrowBackOutline" @click="onBack"></ion-icon>
+        </ion-buttons>
+        <ion-title>我的二维码</ion-title>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content class="qr_content">
+      <div class="user_qrcode">
+        <div class="qr_item">
+          <img src="@/assets/icon/wxQrcode.jpg" :style="imgStyle">
+          <span>关注公众号</span>
+        </div>
+        <div class="qr_item">
+          <img :src="infoQrcodeUrl" :style="imgStyle">
+          <span>扫码登记</span>
+        </div>
+      </div>
+      <div class="bw-vue-form">
+        <div class="form-detail">
+          <ion-label>姓名</ion-label>
+          <ion-text>{{ user.name }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>工号</ion-label>
+          <ion-text>{{ user.userNo }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>身份证号</ion-label>
+          <ion-text>{{ user.IDCard }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>身份</ion-label>
+          <ion-text>驿站工作人员</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>所属驿站</ion-label>
+          <ion-text>{{ user.siteName }}</ion-text>
+        </div>
+      </div>
+    </ion-content>
+  </ion-page>
+</template>
+<script>
+import {defineComponent, ref} from "vue";
+import {useUserStore} from "../../../store/modules/user";
+import {arrowBackOutline} from 'ionicons/icons';
+import {useRouter} from "vue-router";
+import {getConfig} from "../../../utils/config"
+
+const infoQrcodeUrl = ref("");
+
+export default defineComponent({
+  name: "qrcode",
+  setup() {
+    const router = useRouter();
+    const userStore = useUserStore();
+    const user = ref(userStore.getUserInfo);
+    const imgStyle = ref({
+      width: '0px',
+      height: '0px',
+    });
+
+
+    const updateBrowserWidth = () => {
+      const browserWidth = window.innerWidth;
+      imgStyle.value.width = (browserWidth - 20) / 2 + 'px';
+      imgStyle.value.height = (browserWidth - 20) / 2 + 'px';
+    }
+
+    const onBack = () => {
+      router.push('../');
+    }
+
+    // 设置初始浏览器宽度
+    updateBrowserWidth();
+    // 监听窗口大小变化
+    window.addEventListener('resize', updateBrowserWidth);
+
+    return {
+      infoQrcodeUrl,
+      imgStyle,
+      user,
+      arrowBackOutline,
+      onBack
+    }
+  },
+  mounted() {
+    const userStore = useUserStore();
+    const user = ref(userStore.getUserInfo);
+    getConfig().then((data) => {
+      const qrCodeUrl = data.webSiteUrl + "/jobUserInfo/index?userId=" + user.value.userID;
+      infoQrcodeUrl.value = data.webApiServiceUrl + "/common/getQRCode?code=" + encodeURIComponent(qrCodeUrl);
+    }, () => {
+      infoQrcodeUrl.value = "";
+    })
+  }
+});
+</script>
+<style lang="less">
+.qr_content {
+  --padding-start: 10px;
+  --padding-end: 10px;
+}
+
+.user_qrcode {
+  display: flex;
+  justify-content: space-between;
+
+  .qr_item {
+    text-align: center;
+  }
+
+  img {
+    padding: 10px;
+  }
+}
+
+.bw-vue-form {
+  padding: 20px 10px 10px 10px;
+}
+</style>

+ 112 - 0
h5app/src/views/pages/work/task/detail.vue

@@ -0,0 +1,112 @@
+<template>
+  <ion-page>
+    <ion-header class="header-theme2">
+      <ion-toolbar>
+        <ion-buttons slot="start">
+          <ion-icon :icon="arrowBackOutline" @click="onCancel"></ion-icon>
+        </ion-buttons>
+        <ion-title>工作任务完成情况</ion-title>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content>
+      <div class="bw-vue-form">
+        <div class="form-title">工作任务详细信息</div>
+        <div class="form-detail">
+          <ion-label>任务名称</ion-label>
+          <ion-text>{{ taskInfo.doTaskName }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>要求完成时间</ion-label>
+          <ion-text>{{ taskInfo.finishTime ? dayjs(taskInfo.finishTime).format("YYYY-MM-DD") : '' }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>任务类型</ion-label>
+          <ion-text>{{ taskInfo.workTypeName }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>任务内容</ion-label>
+          <ion-text>{{ taskInfo.content }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>任务完成情况</ion-label>
+          <ion-text>{{ taskInfo.taskStatusName }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>任务完成时间</ion-label>
+          <ion-text>{{ dayjs(taskInfo.completeTime).format("YYYY-MM-DD") }}</ion-text>
+        </div>
+      </div>
+    </ion-content>
+
+    <ion-loading
+        :is-open="bodyLoading"
+        message="加载中..."
+        @didDismiss="setBodyLoadingOpen(false)">
+    </ion-loading>
+  </ion-page>
+</template>
+
+<script setup lang="ts">
+
+import {arrowBackOutline} from "ionicons/icons";
+import {useRoute, useRouter} from "vue-router";
+import dayjs from "dayjs";
+import {onMounted, reactive, ref} from "vue";
+import {getMyWorkTasks} from "@/api/workTask";
+
+const router = useRouter();
+const route = useRoute();
+
+// 任务信息
+const taskInfo = reactive<any>({
+  doTaskName: "",
+  finishTime: "",
+  workTypeName: "",
+  content: "",
+  taskStatusName: "",
+  completeTime: ""
+})
+// 查询数据
+const searchParamsState = reactive({
+  pageIndex: 1,
+  pageSize: 10,
+  total: 0,
+  doTaskID: '',
+  taskName: ''
+});
+// 页面加载动画开关
+const bodyLoading = ref(false);
+
+function loadData(doTaskID: any) {
+  bodyLoading.value = true;
+
+  searchParamsState.doTaskID = doTaskID;
+  getMyWorkTasks(searchParamsState).then((result: any) => {
+    const data = result.list[0];
+    Object.keys(taskInfo).forEach(key => {
+      taskInfo[key] = data[key];
+    })
+  })
+
+  bodyLoading.value = false;
+}
+
+// 设置加载动画状态
+function setBodyLoadingOpen(value: boolean) {
+  bodyLoading.value = value;
+}
+
+// 返回
+function onCancel() {
+  router.go(-1);
+}
+
+// 初始化
+onMounted(() => {
+  loadData(route.query.doTaskID)
+})
+</script>
+
+<style scoped>
+
+</style>

+ 109 - 86
h5app/src/views/pages/work/task/edit.vue

@@ -5,79 +5,79 @@
         <ion-buttons slot="start">
           <ion-icon :icon="arrowBackOutline" @click="onCancel"></ion-icon>
         </ion-buttons>
-        <ion-title>工作任务详情</ion-title>
+        <ion-title>工作任务完成情况</ion-title>
       </ion-toolbar>
     </ion-header>
     <ion-content>
-      <form autocomplete="off">
-        <ion-item>
-          <div class="panel-title2">
-            <div class="item-flag"></div>
-            基本信息
-          </div>
-        </ion-item>
-        <ion-list>
-          <ion-label class="title-item">任务名称</ion-label>
-          <ion-item> <!--:class="[workTaskValid.dataModel.doTaskName.$error?'ion-invalid':'ion-valid']"-->
-<!--            <ion-input name="doTaskName" id="doTaskName" style="text-align: left;" class="custom"
-                       placeholder="请输入任务名称" v-model="dataModel.doTaskName" ></ion-input>-->
-<!--            <ion-note slot="error">任务名称不能为空</ion-note>-->
-              {{dataModel.doTaskName}}
-          </ion-item>
-          <ion-label class="title-item">任务执行人员</ion-label>
-          <ion-item>
-            {{curTaskUserStr}}
-          </ion-item>
-          <ion-label class="title-item">完成时间</ion-label>
-          <ion-item>
-            <!--:class="[workTaskValid.dataModel.finishTime.$error?'ion-invalid':'ion-valid']"-->
-            <!--<ion-datetime-button datetime="finishTime"></ion-datetime-button>
+      <div class="bw-vue-form">
+        <div class="form-title">工作任务详细信息</div>
+        <div class="form-detail">
+          <ion-label>任务名称</ion-label>
+          <ion-text>{{ dataModel.doTaskName }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>要求完成时间</ion-label>
+          <ion-text>{{ dataModel.finishTime ? dayjs(dataModel.finishTime).format("YYYY-MM-DD") : '' }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>任务类型</ion-label>
+          <ion-text>{{ dataModel.workTypeName }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>任务内容</ion-label>
+          <ion-text>{{ dataModel.content }}</ion-text>
+        </div>
+      </div>
+      <!-- 任务完成情况选择 -->
+      <div class="bw-vue-form">
+        <div class="form-select">
+          <ion-label>
+            任务完成情况
+          </ion-label>
+          <ion-select name="doTypeID" id="doTypeID" interface="action-sheet" okText="确定" cancelText="取消"
+                      v-model="dataModel.taskStatus" placeholder="请选择任务完成情况">
+            <ion-select-option v-for="(it,key) in taskStatusCodeList" :key="key" :value="it.value">
+              {{ it.name }}
+            </ion-select-option>
+          </ion-select>
+        </div>
+        <div class="form-input">
+          <ion-label>
+            任务完成日期
+          </ion-label>
+          <div class="dateTimeBox">
+            <ion-datetime-button datetime="completeTime"></ion-datetime-button>
             <ion-modal :keep-contents-mounted="true">
-              <ion-datetime id="finishTime" placeholder="完成时间"
-                            v-model="dataModel.finishTime" :prefer-wheel="true"
+              <ion-datetime id="completeTime" placeholder="日期"
+                            v-model="dataModel.completeTime" :prefer-wheel="true"
                             dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
                             :show-default-buttons="true">
               </ion-datetime>
-            </ion-modal>-->
-            <!--<ion-note slot="error">完成时间不能为空</ion-note>-->
-              {{ dayjs(dataModel.finishTime).format("YYYY-MM-DD")}}
-          </ion-item>
-          <ion-label class="title-item">任务类型</ion-label>
-          <ion-item>
-            <!--:class="[workTaskValid.dataModel.workTypeID.$error?'ion-invalid':'ion-valid']"  style="margin-bottom: 10px;">-->
-            <!--<ion-select name="workTypeID"  id="workTypeID" okText="确定" cancelText="取消"  v-model="dataModel.workTypeID"
-                        interface="action-sheet" placeholder="请选择任务类型" style="width:100%;text-align: left;"  >
-              <ion-select-option v-for="(it,key) in taskTypeList" :key="key" :value="it.value" >
-                {{ it.name }}
-              </ion-select-option>
-            </ion-select>-->
-            <!--<ion-note slot="error">任务类型不能为空</ion-note>-->
-              {{dataModel.workTypeName}}
-          </ion-item>
-          <ion-label class="title-item">任务内容</ion-label>
-          <ion-item>
-            <!--:class="[workTaskValid.dataModel.content.$error?'ion-invalid':'ion-valid']">-->
-            <ion-textarea name="content" id="content" v-model="dataModel.content"  label-placement="stacked"
-                          placeholder="请输入工作内容" rows="8"  class="custom"></ion-textarea>
-            <!--<ion-note slot="error">任务内容不能为空</ion-note>-->
-          </ion-item>
-        </ion-list>
-      </form>
-
+            </ion-modal>
+          </div>
+        </div>
+      </div>
     </ion-content>
-    <!--<ion-footer>
+    <ion-footer>
       <ion-button shape="round" expand="block" @click="onSave">提交</ion-button>
-    </ion-footer>-->
+    </ion-footer>
+    <ion-loading
+        :is-open="bodyLoading"
+        message="加载中..."
+        @didDismiss="setBodyLoadingOpen(false)">
+    </ion-loading>
   </ion-page>
 </template>
 <script lang="ts">
-import {defineComponent, reactive, ref, toRefs} from "vue";
+import {computed, defineComponent, onMounted, reactive, ref, toRefs} from "vue";
 import {getSysDictionaryList} from '@/api/system/dictionary';
-import {getMyWorkTasks,getWorkUserList} from '@/api/workTask';
+import {getMyWorkTasks, getWorkUserList, saveWorkTask, taskFinish} from '@/api/workTask';
 import {useRoute, useRouter} from "vue-router";
-import {onIonViewDidEnter} from "@ionic/vue";
+import {alertController, onIonViewDidEnter} from "@ionic/vue";
 import {arrowBackOutline} from 'ionicons/icons';
 import dayjs from "dayjs";
+import {useVuelidate} from "@vuelidate/core";
+import {required} from "@vuelidate/validators";
 
 interface SiteUserModel{
   siteUserID:string,
@@ -91,6 +91,10 @@ interface workTaskModel {
     workTypeID: any,
     content:string,
     finishTime:any,
+    workTypeName: string,
+    taskStatus: any,
+    taskStatusName: string,
+    completeTime: any
   }
 }
 
@@ -99,12 +103,6 @@ interface SelectProps {
   value: string
 }
 
-
-interface CheckProps {
-  text: string,
-  value: string,
-  checked: boolean
-}
 export default defineComponent({
   name: 'WorkTaskEdit',
   setup() {
@@ -128,19 +126,27 @@ export default defineComponent({
         workTypeID: null,
         content:'',
         finishTime:null,
+        workTypeName: '',
+        taskStatus: null,
+        taskStatusName: '',
+        completeTime: null
     }});
-    /*const workTaskRules = computed(()=>{
+    // 任务完成状态字典
+    const taskStatusCodeList = ref<Array<any>>([]);
+    // 页面加载动画开关
+    const bodyLoading = ref(false);
+    const workTaskRules = computed(() => {
       return {dataModel:{
           doTaskName:{required},
           workTypeID:{required},
           content:{required},
           finishTime:{required},
         }}});
-    const workTaskValid = useVuelidate(workTaskRules,workTaskData);*/
+    const workTaskValid = useVuelidate(workTaskRules, workTaskData);
 
-   /* const presentAlert = async (message: string) => {
+    const presentAlert = async (header: string, message: string) => {
       const alert = await alertController.create({
-        header: '错误!',
+        header: header,
         message: message,
         buttons: [
           '确定'
@@ -148,31 +154,23 @@ export default defineComponent({
       });
 
       await alert.present();
-    }*/
+    }
 
     const selectTaskUser = (item:any)=>{
       item.checked = !item.checked;
       console.log("itemData",item);
     }
 
-
-    /*const onSave = async function (){
-      const isFormCorrect = await workTaskValid.value.$validate();
-      if(!isFormCorrect) {
-        console.log("当前数据", workTaskData.dataModel);
-        await presentAlert("请填写完整的信息!");
-        return null;
-      }
-      curTaskUserList.value =[];
-      saveWorkTask(workTaskData.dataModel).then(result => {
+    function onSave() {
+      taskFinish(workTaskData.dataModel.doTaskID, workTaskData.dataModel.completeTime).then(result => {
         if (result) {
-          router.push("./list");
+          router.go(-1);
         }
-      });
-    }*/
+      })
+    }
 
     const onCancel = () => {
-      router.push("./list");
+      router.go(-1);
     }
 
     const getWorkTypeList = async function(){
@@ -194,6 +192,8 @@ export default defineComponent({
     }
 
     const loadData = async (doTaskID: any) => {
+      bodyLoading.value = true;
+
       curTaskUserStr.value ="";
       await getWorkTypeList();
       await loadCurTaskUserList(doTaskID);
@@ -201,6 +201,8 @@ export default defineComponent({
       const reqData = await getMyWorkTasks(searchParamsState);
       workTaskData.dataModel = reqData.list[0];
       console.log("初始化dataModel",workTaskData.dataModel);
+
+      bodyLoading.value = false;
     };
 
     const reload = (doTaskID: any) => {
@@ -208,11 +210,23 @@ export default defineComponent({
       loadData(doTaskID);
     }
 
+    // 设置加载动画状态
+    function setBodyLoadingOpen(value: boolean) {
+      bodyLoading.value = value;
+    }
+
     onIonViewDidEnter(() => {
       if (route.query.reload)
         reload(route.query.doTaskID);
     });
 
+    onMounted(() => {
+      // 获取任务完成状态字典数据
+      getSysDictionaryList("TaskStatusType").then((result: any) => {
+        taskStatusCodeList.value = result;
+      })
+    })
+
 
     return {
       ...toRefs(workTaskData),
@@ -225,10 +239,13 @@ export default defineComponent({
       curTaskUserStr,
       selectTaskUser,
       loadData,
-      /*onSave,*/
+      onSave,
       onCancel,
-      dayjs
-      /*workTaskValid*/
+      dayjs,
+      workTaskValid,
+      taskStatusCodeList,
+      bodyLoading,
+      setBodyLoadingOpen
     }
   }
 });
@@ -248,5 +265,11 @@ export default defineComponent({
   font-size: 16px;
 }
 
-
+.dateTimeBox {
+  width: 100%;
+  display: flex;
+  margin-top: 5px;
+  justify-content: space-between;
+  align-content: center;
+}
 </style>

+ 16 - 7
h5app/src/views/pages/work/task/list.vue

@@ -18,16 +18,20 @@
         <ion-button slot="end" style="height: 33px;width: 70px;margin-left: 10px;--box-shadow: none;--border-radius: 14px;" @click="reload">搜索</ion-button>
       </ion-item>
       <ion-list class="list-content" >
-        <ion-item v-for="(record,key) in dataList" :key="key" detail  @click="onDetail(record.doTaskID)">
-          <ion-avatar aria-hidden="true" slot="start">
-            <img alt="" src="@/assets/icon/icon-mine-punish.png" />
-          </ion-avatar>
+        <ion-item v-for="(record,key) in dataList" :key="key" detail @click="onDetail(record)">
           <ion-label>
             <h3>{{ record.doTaskName}}</h3>
-            <p>{{ record.workTypeName }}:{{dayjs(record.finishTime).format("YYYY-MM-DD")}}</p>
+            <p style="margin-top: 8px">任务类型:{{ record.workTypeName }}</p>
+            <p>
+              要求完成时间:{{ dayjs(record.finishTime).format("YYYY-MM-DD") }}
+            </p>
+            <p v-if="record.taskStatus == 1 && record.completeTime">
+              任务完成时间:{{ dayjs(record.completeTime).format("YYYY-MM-DD") }}
+            </p>
           </ion-label>
           <ion-avatar aria-hidden="true" slot="end">
             <p>{{ record.taskStatusName}}</p>
+
           </ion-avatar>
         </ion-item>
       </ion-list>
@@ -93,8 +97,13 @@ export default defineComponent({
     const onBack =()=>{
       router.push('../');
     }
-    const onDetail = (doTaskID:string) =>{
-      router.push({path: './edit', query: {reload:1, doTaskID: doTaskID}});
+    const onDetail = (data: any) => {
+      if (data.taskStatus == 0) {
+        router.push({path: './edit', query: {reload: 1, doTaskID: data.doTaskID}});
+      }
+      if (data.taskStatus == 1) {
+        router.push({path: './detail', query: {reload: 1, doWorkID: data.doTaskID}});
+      }
     }
 
     const reload = () => {

+ 1 - 1
h5app/src/views/pages/work/task/myTask.vue

@@ -100,7 +100,7 @@ export default defineComponent({
     };
 
     const onSave = async function (){
-      taskFinish(myTaskData.dataModel.doTaskID).then(result=>{
+      taskFinish(myTaskData.dataModel.doTaskID, "").then(result => {
         if(result){
           router.back();
         }

+ 35 - 0
h5app/src/views/sapp/about.vue

@@ -0,0 +1,35 @@
+<template>
+  <ion-page class="edit-page">
+    <ion-header class="header-theme2">
+      <ion-toolbar>
+        <ion-buttons slot="start">
+          <ion-icon :icon="arrowBackOutline" @click="()=>router.go(-1)"></ion-icon>
+        </ion-buttons>
+        <ion-title>关于我们</ion-title>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content>
+      <div class="bw-vue-form">
+        <div class="form-title">关于我们</div>
+        <div class="form-detail">
+          <ion-label>当前版本</ion-label>
+          <ion-text>V1.1</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>技术支持</ion-label>
+          <ion-text>同略科技</ion-text>
+        </div>
+      </div>
+    </ion-content>
+  </ion-page>
+</template>
+
+<script setup lang="ts">
+
+import {arrowBackOutline} from "ionicons/icons";
+import router from "@/router";
+</script>
+
+<style scoped>
+
+</style>

+ 14 - 3
h5app/src/views/sapp/tabMain.vue

@@ -4,6 +4,12 @@
     <div class="tab-main-content">
       <div class="main_top"></div>
       <div class="tool-box">
+        <a class="tool-item box-line"  @click="router.push('/tabs/tabMain/userQrCode/index')">
+          <div class="tool-img">
+            <img src="@/assets/icon/qrcode.png">
+          </div>
+          <div class="tool-title">我的二维码</div>
+        </a>
         <a class="tool-item box-line"  @click="router.push('/tabs/tabMain/jobhunt/list')">
           <div class="tool-img">
             <img src="@/assets/icon/qzxx.png">
@@ -56,7 +62,7 @@
       <div class="panel">
         <div class="panel_title">
           <div class="panel_title_text">工作任务安排</div>
-          <div class="panel_more">更多></div>
+          <div class="panel_more" @click="onTaskList">更多></div>
         </div>
         <div class="panel_content">
           <div style="padding: 10px 0;">
@@ -112,7 +118,11 @@ export default defineComponent({
     }
 
     const onDetail = (doTaskID:string) =>{
-      router.push({path: "/tabs/tabMain/work/task/myTask", query: {reload:1, doTaskID: doTaskID}});
+      router.push({path: "/tabs/tabMain/work/task/edit", query: {reload: 1, doTaskID: doTaskID}});
+    }
+
+    function onTaskList() {
+      router.push("/tabs/tabMain/work/task/list");
     }
 
     const onScroll = (e: any) => {
@@ -142,7 +152,8 @@ export default defineComponent({
       onDetail,
       onScroll,
       reload,
-      dayjs
+      dayjs,
+      onTaskList
     }
   }
 });

+ 1 - 1
h5app/src/views/sapp/tabUser.vue

@@ -72,7 +72,7 @@
             </ion-item>
             <ion-item class="item-menu" detail mode="md">
               <img src="@/assets/icon/gywm.png">
-              <ion-label>关于我们</ion-label>
+              <ion-label @click="router.push('/tabs/tabUser/about')">关于我们</ion-label>
             </ion-item>
           </div>
         </div>

+ 1 - 1
pom.xml

@@ -167,7 +167,7 @@
         <dependency>
             <groupId>com.github.binarywang</groupId>
             <artifactId>weixin-java-mp</artifactId>
-            <version>2.7.0</version>
+            <version>3.7.0</version>
         </dependency>
     </dependencies>
 

+ 4 - 0
src/main/java/com/hz/employmentsite/AppConfig.java

@@ -75,6 +75,10 @@ public class AppConfig {
     public String wxAppSecret;
     @Value("${appconfig.wxconfig.messageTemplateId}")
     public String wxMessageTemplateId;
+    @Value("${appconfig.wxconfig.redirectURI}")
+    public String wxRedirectURI;
+    @Value("${appconfig.wxconfig.accessScope}")
+    public String wxAccessScope;
 
 
 

+ 1 - 0
src/main/java/com/hz/employmentsite/config/WebConfiguration.java

@@ -61,6 +61,7 @@ public class WebConfiguration implements WebMvcConfigurer {
         excludePath.add("/api/oauth/oauthLogin");//单点登录
         excludePath.add("/api/system/file/downFileToUrl/**");  //下载附件
         excludePath.add("/api/common/getQRCode");
+        excludePath.add("/api/user/getUserInfo");
         excludePath.add("/api/wx/**");
         excludePath.add("/static/**");  //静态资源
         excludePath.add("/mobile/**");  //静态资源

+ 37 - 0
src/main/java/com/hz/employmentsite/config/WxMpConfig.java

@@ -0,0 +1,37 @@
+package com.hz.employmentsite.config;
+
+import com.hz.employmentsite.AppConfig;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
+import me.chanjar.weixin.mp.config.WxMpConfigStorage;
+import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConditionalOnClass(WxMpService.class)
+public class WxMpConfig {
+    @Autowired
+    private AppConfig appConfig;
+
+    @Bean
+    @ConditionalOnMissingBean
+    public WxMpService wxMpService() {
+        WxMpService wxMpService = new WxMpServiceImpl();
+        wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
+
+        return wxMpService;
+    }
+
+    @Bean
+    @ConditionalOnMissingBean
+    public WxMpConfigStorage wxMpConfigStorage(){
+        WxMpDefaultConfigImpl wxMpDefaultConfig = new WxMpDefaultConfigImpl();
+        wxMpDefaultConfig.setAppId(appConfig.wxAppId);
+        wxMpDefaultConfig.setSecret(appConfig.wxAppSecret);
+        return wxMpDefaultConfig;
+    }
+}

+ 11 - 17
src/main/java/com/hz/employmentsite/controller/CommonController.java

@@ -4,18 +4,21 @@ import com.github.pagehelper.PageInfo;
 import com.google.zxing.BarcodeFormat;
 import com.google.zxing.EncodeHintType;
 import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.WriterException;
 import com.google.zxing.client.j2se.MatrixToImageWriter;
 import com.google.zxing.common.BitMatrix;
 import com.hz.employmentsite.filter.exception.BaseResponse;
 import com.hz.employmentsite.filter.exception.RespGenerstor;
 import com.hz.employmentsite.util.ExcelHelper;
 import com.hz.employmentsite.util.JsonMapper;
+import com.hz.employmentsite.util.QrCodeUtils;
 import com.hz.employmentsite.vo.baseSettings.SiteInfoVo;
 import lombok.Data;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -29,6 +32,9 @@ public class CommonController {
     @Autowired
     public JsonMapper jsonMapper;
 
+    @Autowired
+    private QrCodeUtils qrCodeUtils;
+
     @PostMapping(value = "/exportErrorExcel")
     public void exportErrorExcel(HttpServletResponse response,
                                  @RequestBody ResponseErrorExcelVo errorExcelVo) throws Exception {
@@ -74,26 +80,14 @@ public class CommonController {
 
     @ResponseBody
     @GetMapping("/getQRCode")
-    public BaseResponse<String> getQRCode(HttpServletResponse response, @RequestParam("code") String code) {
-        BaseResponse<String> res = new BaseResponse<>();
-        int width = 400, height = 400;
-        String format = "png", character_set = "UTF-8";
+    public void getQRCode(HttpServletResponse response, @RequestParam("code") String code, @RequestParam(required = false) Integer margin) throws IOException, WriterException {
+        String format = "png";
 
         response.setContentType("image/" + format);
 
-        // 设置字符集编码
-        Map<EncodeHintType, Object> hints = new HashMap<>();
-        hints.put(EncodeHintType.CHARACTER_SET, character_set);
-        try {
-            // 生成二维码矩阵
-            BitMatrix bitMatrix = new MultiFormatWriter().encode(code, BarcodeFormat.QR_CODE, width, height, hints);
-            OutputStream os = response.getOutputStream();
-            MatrixToImageWriter.writeToStream(bitMatrix, format, os);
-            RespGenerstor.success(code);
-        } catch (Exception ex) {
-            RespGenerstor.fail("qrcode",ex.getMessage());
-        }
-        return res;
+        OutputStream os = response.getOutputStream();
+
+        qrCodeUtils.getQrCode(os, code, margin);
     }
 
 

+ 12 - 3
src/main/java/com/hz/employmentsite/controller/WxController.java

@@ -3,9 +3,7 @@ package com.hz.employmentsite.controller;
 import com.hz.employmentsite.filter.exception.BaseResponse;
 import com.hz.employmentsite.filter.exception.RespGenerstor;
 import com.hz.employmentsite.services.service.WechatService;
-import com.hz.employmentsite.util.RemoteHelper;
-import me.chanjar.weixin.mp.api.WxMpService;
-import org.apache.commons.collections.map.AbstractMapDecorator;
+import me.chanjar.weixin.common.error.WxErrorException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -36,6 +34,17 @@ public class WxController {
     @Autowired
     private WechatService wechatService;
 
+    @GetMapping("getOAuthUrl")
+    public BaseResponse<String> getOAuthUrl() {
+        return RespGenerstor.success(wechatService.getOAuthUrl(""));
+    }
+
+
+    @GetMapping("getOpenId")
+    public BaseResponse<String> getOpenId(String code) throws WxErrorException {
+        return RespGenerstor.success(wechatService.getOpenId(code));
+    }
+
     @PostMapping("/sentMsg")
     public BaseResponse<String> sentMsg(){
         Map<String,String> data = new HashMap<>();

+ 5 - 3
src/main/java/com/hz/employmentsite/controller/baseSettings/SiteUserController.java

@@ -10,6 +10,7 @@ import com.hz.employmentsite.util.ExcelHelper;
 import com.hz.employmentsite.vo.baseSettings.SiteUserVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+
 import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -36,9 +37,10 @@ public class SiteUserController {
                                                       @RequestParam(required = false) String siteUserName,
                                                       @RequestParam(required = false) String siteID,
                                                       @RequestParam(required = false) String roleName,
-                                                      @RequestParam(required = false) String regionCode) {
+                                                      @RequestParam(required = false) String regionCode,
+                                                      @RequestParam(required = false) String userNo) {
 
-        PageInfo<SiteUserVo> result = userInfoService.getList(pageIndex,pageSize,siteUserIDList,siteUserName,siteID,roleName,regionCode);
+        PageInfo<SiteUserVo> result = userInfoService.getList(pageIndex, pageSize, siteUserIDList, siteUserName, siteID, roleName, regionCode, userNo);
 
         return RespGenerstor.success(result);
     }
@@ -75,7 +77,7 @@ public class SiteUserController {
                                @RequestParam(required = false) List<String> siteUserIDList,
                                @RequestParam(required = false) String siteUserName,
                                @RequestParam(required = false) String siteID) throws Exception{
-        PageInfo<SiteUserVo> result = userInfoService.getList(pageIndex,pageSize,siteUserIDList,siteUserName,siteID, null, null);
+        PageInfo<SiteUserVo> result = userInfoService.getList(pageIndex, pageSize, siteUserIDList, siteUserName, siteID, null, null, null);
         ExcelHelper.ExcelData data = excelHelper.new ExcelData();
         data.setTitles(Arrays.asList(new String[]{"序号","人员名称","角色", "性别", "联系电话","所属驿站"}));
         int i = 0;

+ 2 - 2
src/main/java/com/hz/employmentsite/controller/taskAndLog/DoTaskController.java

@@ -64,8 +64,8 @@ public class DoTaskController {
 
     @ResponseBody
     @PostMapping("/taskFinish")
-    public BaseResponse taskFinish(String doTaskID) {
-        var result = doTaskService.taskFinish(doTaskID, accountService.getLoginUserID());
+    public BaseResponse taskFinish(String doTaskID, Date completeTime) {
+        var result = doTaskService.taskFinish(doTaskID, accountService.getLoginUserID(), completeTime);
         return RespGenerstor.success(result);
     }
 

+ 4 - 1
src/main/java/com/hz/employmentsite/mapper/PcSiteUserMapper.java

@@ -2,9 +2,10 @@ package com.hz.employmentsite.mapper;
 
 import com.hz.employmentsite.model.PcSiteUser;
 import com.hz.employmentsite.model.PcSiteUserExample;
-import java.util.List;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 public interface PcSiteUserMapper {
     long countByExample(PcSiteUserExample example);
 
@@ -20,6 +21,8 @@ public interface PcSiteUserMapper {
 
     PcSiteUser selectByPrimaryKey(String siteUserID);
 
+    List<String> selectByMobile(@Param("mobile") String mobile);
+
     int updateByExampleSelective(@Param("row") PcSiteUser row, @Param("example") PcSiteUserExample example);
 
     int updateByExample(@Param("row") PcSiteUser row, @Param("example") PcSiteUserExample example);

+ 2 - 1
src/main/java/com/hz/employmentsite/mapper/cquery/UserInfoCQuery.java

@@ -11,7 +11,8 @@ public interface UserInfoCQuery {
                              @Param("siteUserName") String siteUserName,
                              @Param("siteID") String siteID,
                              @Param("roleName") String roleName,
-                             @Param("regionCode") String regionCode);
+                             @Param("regionCode") String regionCode,
+                             @Param("userNo") String userNo);
 
     List<SiteUserVo> getListBySiteID(@Param("siteID") String siteID);
 }

+ 12 - 0
src/main/java/com/hz/employmentsite/model/PcDotaskUser.java

@@ -1,5 +1,7 @@
 package com.hz.employmentsite.model;
 
+import java.util.Date;
+
 public class PcDotaskUser {
     private String dotaskUserID;
 
@@ -9,6 +11,8 @@ public class PcDotaskUser {
 
     private Integer userTaskStatus;
 
+    private Date completeTime;
+
     public String getDotaskUserID() {
         return dotaskUserID;
     }
@@ -40,4 +44,12 @@ public class PcDotaskUser {
     public void setUserTaskStatus(Integer userTaskStatus) {
         this.userTaskStatus = userTaskStatus;
     }
+
+    public Date getCompleteTime() {
+        return completeTime;
+    }
+
+    public void setCompleteTime(Date completeTime) {
+        this.completeTime = completeTime;
+    }
 }

+ 20 - 0
src/main/java/com/hz/employmentsite/model/PcSite.java

@@ -17,6 +17,10 @@ public class PcSite {
 
     private String siteY;
 
+    private Double siteLongitude;
+
+    private Double siteLatitude;
+
     private String siteName;
 
     private String fzrName;
@@ -152,4 +156,20 @@ public class PcSite {
     public void setRemark(String remark) {
         this.remark = remark == null ? null : remark.trim();
     }
+
+    public Double getSiteLongitude() {
+        return siteLongitude;
+    }
+
+    public void setSiteLongitude(Double siteLongitude) {
+        this.siteLongitude = siteLongitude;
+    }
+
+    public Double getSiteLatitude() {
+        return siteLatitude;
+    }
+
+    public void setSiteLatitude(Double siteLatitude) {
+        this.siteLatitude = siteLatitude;
+    }
 }

+ 20 - 0
src/main/java/com/hz/employmentsite/model/PcSiteUser.java

@@ -25,6 +25,10 @@ public class PcSiteUser {
 
     private Date updateTime;
 
+    private String userNo;
+
+    private String IDCard;
+
     public String getSiteUserID() {
         return siteUserID;
     }
@@ -112,4 +116,20 @@ public class PcSiteUser {
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
+
+    public String getUserNo() {
+        return userNo;
+    }
+
+    public void setUserNo(String userNo) {
+        this.userNo = userNo == null ? null : userNo.trim();
+    }
+
+    public String getIDCard() {
+        return IDCard;
+    }
+
+    public void setIDCard(String IDCard) {
+        this.IDCard = IDCard == null ? null : IDCard.trim();
+    }
 }

+ 140 - 0
src/main/java/com/hz/employmentsite/model/PcSiteUserExample.java

@@ -834,6 +834,146 @@ public class PcSiteUserExample {
             addCriterion("UpdateTime not between", value1, value2, "updateTime");
             return (Criteria) this;
         }
+
+        public Criteria andUserNoIsNull() {
+            addCriterion("UserNo is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNoIsNotNull() {
+            addCriterion("UserNo is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNoEqualTo(String value) {
+            addCriterion("UserNo =", value, "userNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNoNotEqualTo(String value) {
+            addCriterion("UserNo <>", value, "userNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNoGreaterThan(String value) {
+            addCriterion("UserNo >", value, "userNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNoGreaterThanOrEqualTo(String value) {
+            addCriterion("UserNo >=", value, "userNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNoLessThan(String value) {
+            addCriterion("UserNo <", value, "userNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNoLessThanOrEqualTo(String value) {
+            addCriterion("UserNo <=", value, "userNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNoLike(String value) {
+            addCriterion("UserNo like", value, "userNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNoNotLike(String value) {
+            addCriterion("UserNo not like", value, "userNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNoIn(List<String> values) {
+            addCriterion("UserNo in", values, "userNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNoNotIn(List<String> values) {
+            addCriterion("UserNo not in", values, "userNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNoBetween(String value1, String value2) {
+            addCriterion("UserNo between", value1, value2, "userNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNoNotBetween(String value1, String value2) {
+            addCriterion("UserNo not between", value1, value2, "userNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andIDCardIsNull() {
+            addCriterion("IDCard is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIDCardIsNotNull() {
+            addCriterion("IDCard is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIDCardEqualTo(String value) {
+            addCriterion("IDCard =", value, "IDCard");
+            return (Criteria) this;
+        }
+
+        public Criteria andIDCardNotEqualTo(String value) {
+            addCriterion("IDCard <>", value, "IDCard");
+            return (Criteria) this;
+        }
+
+        public Criteria andIDCardGreaterThan(String value) {
+            addCriterion("IDCard >", value, "IDCard");
+            return (Criteria) this;
+        }
+
+        public Criteria andIDCardGreaterThanOrEqualTo(String value) {
+            addCriterion("IDCard >=", value, "IDCard");
+            return (Criteria) this;
+        }
+
+        public Criteria andIDCardLessThan(String value) {
+            addCriterion("IDCard <", value, "IDCard");
+            return (Criteria) this;
+        }
+
+        public Criteria andIDCardLessThanOrEqualTo(String value) {
+            addCriterion("IDCard <=", value, "IDCard");
+            return (Criteria) this;
+        }
+
+        public Criteria andIDCardLike(String value) {
+            addCriterion("IDCard like", value, "IDCard");
+            return (Criteria) this;
+        }
+
+        public Criteria andIDCardNotLike(String value) {
+            addCriterion("IDCard not like", value, "IDCard");
+            return (Criteria) this;
+        }
+
+        public Criteria andIDCardIn(List<String> values) {
+            addCriterion("IDCard in", values, "IDCard");
+            return (Criteria) this;
+        }
+
+        public Criteria andIDCardNotIn(List<String> values) {
+            addCriterion("IDCard not in", values, "IDCard");
+            return (Criteria) this;
+        }
+
+        public Criteria andIDCardBetween(String value1, String value2) {
+            addCriterion("IDCard between", value1, value2, "IDCard");
+            return (Criteria) this;
+        }
+
+        public Criteria andIDCardNotBetween(String value1, String value2) {
+            addCriterion("IDCard not between", value1, value2, "IDCard");
+            return (Criteria) this;
+        }
     }
 
     public static class Criteria extends GeneratedCriteria {

+ 23 - 9
src/main/java/com/hz/employmentsite/services/impl/WechatServiceImpl.java

@@ -3,11 +3,12 @@ package com.hz.employmentsite.services.impl;
 import com.hz.employmentsite.AppConfig;
 import com.hz.employmentsite.services.service.WechatService;
 import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
+import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.api.WxMpService;
-import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -21,19 +22,30 @@ import java.util.Map;
 public class WechatServiceImpl implements WechatService {
 
     @Autowired
-    AppConfig appConfig;
+    private AppConfig appConfig;
 
+    @Autowired
+    private WxMpService wxMpService;
+
+    private final Logger logger;
+
+    public WechatServiceImpl() {
+        logger = LoggerFactory.getLogger(this.getClass());
+    }
+
+    public String getOAuthUrl(String state) {
+        return wxMpService.oauth2buildAuthorizationUrl(appConfig.wxRedirectURI, appConfig.wxAccessScope, state);
+    }
+
+    @Override
+    public String getOpenId(String code) throws WxErrorException {
+        return wxMpService.oauth2getAccessToken(code).getOpenId();
+    }
 
     @Override
     public Integer sentMsg(String toUserId, Map<String,String> sentData){
         String openId = "";
 
-        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
-        wxStorage.setAppId(appConfig.wxAppId); //appID
-        wxStorage.setSecret(appConfig.wxAppSecret);//app密钥
-        WxMpService wxMpService = new WxMpServiceImpl();
-        wxMpService.setWxMpConfigStorage(wxStorage);
-
         //数据
         List<WxMpTemplateData> data=new ArrayList<>();
 
@@ -59,4 +71,6 @@ public class WechatServiceImpl implements WechatService {
         return 1;
     }
 
+
+
 }

+ 6 - 2
src/main/java/com/hz/employmentsite/services/impl/baseSettings/SiteInfoImpl.java

@@ -3,8 +3,8 @@ package com.hz.employmentsite.services.impl.baseSettings;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.hz.employmentsite.filter.exception.BaseException;
-import com.hz.employmentsite.mapper.PcSiteMapper;
 import com.hz.employmentsite.mapper.PcSiteInstitutionMapper;
+import com.hz.employmentsite.mapper.PcSiteMapper;
 import com.hz.employmentsite.mapper.PcSiteUserMapper;
 import com.hz.employmentsite.mapper.cquery.SiteInfoCQuery;
 import com.hz.employmentsite.mapper.cquery.SiteInstitutionCQuery;
@@ -12,7 +12,7 @@ import com.hz.employmentsite.model.*;
 import com.hz.employmentsite.services.service.baseSettings.SiteInfoService;
 import com.hz.employmentsite.util.StringUtils;
 import com.hz.employmentsite.vo.baseSettings.SiteInfoVo;
-import com.hz.employmentsite.vo.baseSettings.SiteUserVo; 
+import com.hz.employmentsite.vo.baseSettings.SiteUserVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -119,6 +119,8 @@ public class SiteInfoImpl implements SiteInfoService {
             dbData.setFzrMobile(data.getFzrMobile());
             dbData.setSiteX(data.getSiteX());
             dbData.setSiteY(data.getSiteY());
+            dbData.setSiteLongitude(data.getSiteLongitude());
+            dbData.setSiteLatitude(data.getSiteLatitude());
             dbData.setDetailAddress(data.getDetailAddress());
             dbData.setRegionCode(data.getRegionCode());
             dbData.setStreetCode(data.getStreetCode());
@@ -135,6 +137,8 @@ public class SiteInfoImpl implements SiteInfoService {
             dbData.setFzrMobile(data.fzrMobile);
             dbData.setSiteX(data.siteX);
             dbData.setSiteY(data.siteY);
+            dbData.setSiteLongitude(data.siteLongitude);
+            dbData.setSiteLatitude(data.siteLatitude);
             dbData.setDetailAddress(data.detailAddress);
             dbData.setRegionCode(data.regionCode);
             dbData.setStreetCode(data.streetCode);

+ 26 - 7
src/main/java/com/hz/employmentsite/services/impl/baseSettings/SiteUserImpl.java

@@ -2,6 +2,7 @@ package com.hz.employmentsite.services.impl.baseSettings;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.filter.exception.BaseException;
 import com.hz.employmentsite.mapper.PcSiteUserMapper;
 import com.hz.employmentsite.mapper.SysRoleMapper;
 import com.hz.employmentsite.mapper.SysUserMapper;
@@ -47,9 +48,9 @@ public class SiteUserImpl implements SiteUserService {
     private SysUserSysRoleMapper sysUserSysRoleMapper;
 
     @Override
-    public PageInfo<SiteUserVo> getList(int pageIndex, int pageSize, List<String> siteUserIDList, String siteUserName,String siteID, String roleName, String regionCode) {
+    public PageInfo<SiteUserVo> getList(int pageIndex, int pageSize, List<String> siteUserIDList, String siteUserName, String siteID, String roleName, String regionCode, String userNo) {
         PageHelper.startPage(pageIndex, pageSize);
-        List<SiteUserVo> dataList = userInfoCQuery.getList(stringUtils.ListToInSql(siteUserIDList),siteUserName,siteID, roleName, regionCode);
+        List<SiteUserVo> dataList = userInfoCQuery.getList(stringUtils.ListToInSql(siteUserIDList), siteUserName, siteID, roleName, regionCode, userNo);
         PageInfo<SiteUserVo> result = new PageInfo(dataList);
         return result;
     }
@@ -70,13 +71,13 @@ public class SiteUserImpl implements SiteUserService {
         }else{
             ids.add(siteUserID);
         }
-        SiteUserVo model = userInfoCQuery.getList(stringUtils.ListToInSql(ids),null,null, null, null).stream().findFirst().orElse(null);
+        SiteUserVo model = userInfoCQuery.getList(stringUtils.ListToInSql(ids), null, null, null, null, null).stream().findFirst().orElse(null);
         return model;
     }
 
     @Override
     public List<SelectProps> getDataList() {
-        var dataList = getList(1,99999,null,null,null, null, null).getList();
+        var dataList = getList(1, 99999, null, null, null, null, null, null).getList();
         List<SelectProps> dataResult = new ArrayList<>();
         for (var item: dataList) {
             SelectProps  itemResult = new SelectProps();
@@ -90,14 +91,23 @@ public class SiteUserImpl implements SiteUserService {
     @Override
     public Integer save(SiteUserVo data, String userId) {
         int result = 0;
+
+        // 手机号查重
+        List<String> byMobileSiteId = pcSiteUserMapper.selectByMobile(data.mobile);
+
         SiteUserVo record = get(data.siteUserID);
-        PcSiteUser dbData = record ==null ? null : pcSiteUserMapper.selectByPrimaryKey(record.siteUserID);
+        PcSiteUser dbData = record == null ? null : pcSiteUserMapper.selectByPrimaryKey(record.siteUserID);
         Boolean isExist = dbData != null;
-        SysUser curSysUserData = data.userID != null ? sysUserMapper.selectByPrimaryKey(data.userID):null;
+        SysUser curSysUserData = data.userID != null ? sysUserMapper.selectByPrimaryKey(data.userID) : null;
         Boolean isLinkUser = curSysUserData != null;
         SysRoleExample roleExp = null;
         /*注意:这里的data.roleID为用户类型ID*/
         if (!isExist) {
+            // 添加时有重复手机号立即报错
+            if (!byMobileSiteId.isEmpty()) {
+                throw new BaseException("500", "该手机号已绑定其他驿站人员");
+            }
+
             //添加
             //处理用户表
             curSysUserData = new SysUser();
@@ -121,13 +131,20 @@ public class SiteUserImpl implements SiteUserService {
             dbData.setGender(data.getGender());
             dbData.setRoleID(data.getRoleID());
             dbData.setMobile(data.getMobile());
+            dbData.setUserNo(data.getUserNo());
+            dbData.setIDCard(data.getIdCard());
             dbData.setCreateUserID(userId);
             dbData.setCreateTime(new Date());
             result += pcSiteUserMapper.insert(dbData);
         } else {
+            // 修改时,ID列表中没有参数中的ID才报错
+            if (!byMobileSiteId.isEmpty() && !byMobileSiteId.contains(data.siteID)) {
+                throw new BaseException("500", "该手机号已绑定其他驿站人员");
+            }
+
             //修改
             //处理用户表
-            if(isLinkUser){
+            if (isLinkUser) {
                 curSysUserData.setName(data.siteUserName);
                 curSysUserData.setUserTypeID(data.roleID);
                 curSysUserData.setLoginID(StrToPinYin(data.siteUserName));
@@ -145,6 +162,8 @@ public class SiteUserImpl implements SiteUserService {
             dbData.setGender(data.gender);
             dbData.setRoleID(data.roleID);
             dbData.setMobile(data.mobile);
+            dbData.setUserNo(data.userNo);
+            dbData.setIDCard(data.idCard);
             dbData.setUpdateBy(userId);
             dbData.setUpdateTime(new Date());
             result += pcSiteUserMapper.updateByPrimaryKey(dbData);

+ 2 - 1
src/main/java/com/hz/employmentsite/services/impl/taskAndLog/DoTaskImpl.java

@@ -94,7 +94,7 @@ public class DoTaskImpl implements DoTaskService {
     }
 
     @Override
-    public int taskFinish(String doTaskID,String finishUserID){
+    public int taskFinish(String doTaskID,String finishUserID, Date completeTime){
         int result = 0;
         PcSiteUserExample siteUserExp = new PcSiteUserExample();
         PcSiteUserExample.Criteria siteUserCro = siteUserExp.createCriteria();
@@ -110,6 +110,7 @@ public class DoTaskImpl implements DoTaskService {
         var curUserTaskInfo = doTaskUserMapper.selectByExample(taskUserExp).stream().findFirst().orElse(null);
         if (curUserTaskInfo != null) {
             curUserTaskInfo.setUserTaskStatus(1);
+            curUserTaskInfo.setCompleteTime(completeTime);
             result = doTaskUserMapper.updateByExample(curUserTaskInfo,taskUserExp);
         }
         return result;

+ 6 - 0
src/main/java/com/hz/employmentsite/services/service/WechatService.java

@@ -1,9 +1,15 @@
 package com.hz.employmentsite.services.service;
 
+import me.chanjar.weixin.common.error.WxErrorException;
+
 import java.util.Map;
 
 public interface WechatService {
 
+    String getOAuthUrl(String state);
+
     Integer sentMsg(String toUserId, Map<String,String> sentData);
 
+    String getOpenId(String code) throws WxErrorException;
+
 }

+ 1 - 1
src/main/java/com/hz/employmentsite/services/service/baseSettings/SiteUserService.java

@@ -8,7 +8,7 @@ import java.util.List;
 
 public interface SiteUserService {
 
-    PageInfo<SiteUserVo> getList(int pageIndex, int pageSize, List<String> siteUserIDList, String siteUserName,String siteID, String roleName, String regionCode);
+    PageInfo<SiteUserVo> getList(int pageIndex, int pageSize, List<String> siteUserIDList, String siteUserName, String siteID, String roleName, String regionCode, String userNo);
 
     PageInfo<SiteUserVo> getListBySiteID(int pageIndex, int pageSize, String siteID);
 

+ 3 - 1
src/main/java/com/hz/employmentsite/services/service/taskAndLog/DoTaskService.java

@@ -4,6 +4,8 @@ import com.github.pagehelper.PageInfo;
 import com.hz.employmentsite.vo.taskAndLog.DoTaskUserVo;
 import com.hz.employmentsite.vo.taskAndLog.DoTaskVo;
 import com.hz.employmentsite.vo.baseSettings.SiteUserVo;
+
+import java.util.Date;
 import java.util.List;
 
 public interface DoTaskService {
@@ -18,7 +20,7 @@ public interface DoTaskService {
 
     DoTaskVo getDataById(String id);
 
-    int taskFinish(String doTaskID, String finishUserID);
+    int taskFinish(String doTaskID, String finishUserID, Date completeTime);
 
     int save(DoTaskVo data, String userId);
 

+ 61 - 0
src/main/java/com/hz/employmentsite/util/QrCodeUtils.java

@@ -0,0 +1,61 @@
+package com.hz.employmentsite.util;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.WriterException;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import com.hz.employmentsite.filter.exception.RespGenerstor;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class QrCodeUtils {
+
+    public BitMatrix getQrCode(String code) throws WriterException {
+        int width = 400, height = 400;
+        String character_set = "UTF-8";
+
+        // 设置字符集编码
+        Map<EncodeHintType, Object> hints = new HashMap<>();
+        hints.put(EncodeHintType.CHARACTER_SET, character_set);
+        // 生成二维码矩阵
+        BitMatrix bitMatrix = new MultiFormatWriter().encode(code, BarcodeFormat.QR_CODE, width, height, hints);
+
+        return reduceWhite(bitMatrix,0);
+    }
+
+    public void getQrCode(OutputStream os,String code,Integer margin) throws WriterException, IOException {
+        String format = "png";
+        MatrixToImageWriter.writeToStream(reduceWhite(getQrCode(code),margin == null ? 0 : margin), format, os);
+    }
+
+    /**
+     * 缩小生成二维码白边框(删除白边 重新添加新白边)
+     *
+     * @param matrix
+     * @return
+     */
+    private static BitMatrix reduceWhite(BitMatrix matrix, int margin) {
+        int tempM = margin * 2;
+        int[] rec = matrix.getEnclosingRectangle(); // 获取二维码图案的属性
+        int resWidth = rec[2] + tempM;
+        int resHeight = rec[3] + tempM;
+        BitMatrix resMatrix = new BitMatrix(resWidth, resHeight); // 按照自定义边框生成新的BitMatrix
+        resMatrix.clear();
+        for (int i = margin; i < resWidth - margin; i++) { // 循环,将二维码图案绘制到新的bitMatrix中
+            for (int j = margin; j < resHeight - margin; j++) {
+                if (matrix.get(i - margin + rec[0], j - margin + rec[1])) {
+                    resMatrix.set(i, j);
+                }
+            }
+        }
+        return resMatrix;
+    }
+
+}

+ 5 - 1
src/main/java/com/hz/employmentsite/vo/baseSettings/SiteInfoVo.java

@@ -2,10 +2,11 @@ package com.hz.employmentsite.vo.baseSettings;
 
 import com.hz.employmentsite.util.datarange.annotations.InstitutionID;
 import com.hz.employmentsite.util.datarange.annotations.RegionID;
+import com.hz.employmentsite.util.datarange.annotations.SiteID;
 import lombok.Data;
+
 import java.sql.Date;
 import java.util.List;
-import com.hz.employmentsite.util.datarange.annotations.SiteID;
 
 @Data
 public class SiteInfoVo {
@@ -24,6 +25,9 @@ public class SiteInfoVo {
     public String siteX;
     public String siteY;
 
+    public Double siteLongitude;
+    public Double siteLatitude;
+
     public String siteName;
     public String fzrName;
     public String fzrMobile;

+ 6 - 2
src/main/java/com/hz/employmentsite/vo/baseSettings/SiteUserVo.java

@@ -2,10 +2,11 @@ package com.hz.employmentsite.vo.baseSettings;
 
 import com.hz.employmentsite.util.datarange.annotations.InstitutionID;
 import com.hz.employmentsite.util.datarange.annotations.RegionID;
+import com.hz.employmentsite.util.datarange.annotations.SiteID;
+import com.hz.employmentsite.util.datarange.annotations.SiteUserID;
 import lombok.Data;
+
 import java.sql.Date;
-import com.hz.employmentsite.util.datarange.annotations.SiteUserID;
-import com.hz.employmentsite.util.datarange.annotations.SiteID;
 
 @Data
 public class SiteUserVo {
@@ -21,6 +22,9 @@ public class SiteUserVo {
     public Integer gender;
     public String genderName;
 
+    public String userNo;
+    public String idCard;
+
     public String userID;
     //注意:roleID已用于绑定用户表sys_user中用户类型字典,非角色类型数据
     public Integer roleID;

+ 2 - 0
src/main/java/com/hz/employmentsite/vo/taskAndLog/DoTaskVo.java

@@ -44,4 +44,6 @@ public class DoTaskVo {
 
     public String taskStatusName;
 
+    public Date completeTime;
+
 }

+ 3 - 0
src/main/java/com/hz/employmentsite/vo/user/UserInfoModel.java

@@ -25,5 +25,8 @@ public class UserInfoModel {
     public String createBy;
     public Date updateTime;
     public String updateBy;
+    public String userNo;
+    public String IDCard;
+    public String siteName;
 
 }

+ 4 - 2
src/main/resources/application.yml

@@ -118,8 +118,10 @@ appconfig:
     client_id: xxx
     client_secret: xxx
   wxconfig:
-    appId: ''
-    appSecret: ''
+    appId: 'wx74648e2f8589cc94'
+    appSecret: 'c177326e256261175288ef529e44a477'
     messageTemplateId: ''
+    redirectURI: 'http://www.bowintek.com/hzyz/mobile'
+    accessScope: 'snsapi_base'
 
 

+ 3 - 1
src/main/resources/mapping/PcDotaskUserMapper.xml

@@ -6,6 +6,7 @@
     <result column="DotaskID" jdbcType="VARCHAR" property="dotaskID" />
     <result column="SiteUserID" jdbcType="VARCHAR" property="siteUserID" />
     <result column="UserTaskStatus" jdbcType="INTEGER" property="userTaskStatus" />
+    <result column="CompleteTime" jdbcType="DATE" property="completeTime" />
   </resultMap>
   <sql id="Example_Where_Clause">
     <where>
@@ -156,7 +157,8 @@
     set DotaskUserID = #{row.dotaskUserID,jdbcType=VARCHAR},
       DotaskID = #{row.dotaskID,jdbcType=VARCHAR},
       SiteUserID = #{row.siteUserID,jdbcType=VARCHAR},
-      UserTaskStatus = #{row.userTaskStatus,jdbcType=INTEGER}
+      UserTaskStatus = #{row.userTaskStatus,jdbcType=INTEGER},
+      CompleteTime = #{row.completeTime, jdbcType=DATE}
     <if test="example != null">
       <include refid="Update_By_Example_Where_Clause" />
     </if>

+ 85 - 55
src/main/resources/mapping/PcSiteMapper.xml

@@ -2,21 +2,23 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.hz.employmentsite.mapper.PcSiteMapper">
   <resultMap id="BaseResultMap" type="com.hz.employmentsite.model.PcSite">
-    <id column="SiteID" jdbcType="VARCHAR" property="siteID" />
-    <result column="SiteCode" jdbcType="VARCHAR" property="siteCode" />
-    <result column="RegionCode" jdbcType="VARCHAR" property="regionCode" />
-    <result column="StreetCode" jdbcType="VARCHAR" property="streetCode" />
-    <result column="DetailAddress" jdbcType="VARCHAR" property="detailAddress" />
-    <result column="SiteX" jdbcType="VARCHAR" property="siteX" />
-    <result column="SiteY" jdbcType="VARCHAR" property="siteY" />
-    <result column="SiteName" jdbcType="VARCHAR" property="siteName" />
-    <result column="FzrName" jdbcType="VARCHAR" property="fzrName" />
-    <result column="FzrMobile" jdbcType="VARCHAR" property="fzrMobile" />
-    <result column="CreateUserID" jdbcType="VARCHAR" property="createUserID" />
-    <result column="CreateTime" jdbcType="TIMESTAMP" property="createTime" />
-    <result column="ModifyUserID" jdbcType="VARCHAR" property="modifyUserID" />
-    <result column="ModifyTime" jdbcType="TIMESTAMP" property="modifyTime" />
-    <result column="Remark" jdbcType="VARCHAR" property="remark" />
+    <id column="SiteID" jdbcType="VARCHAR" property="siteID"/>
+    <result column="SiteCode" jdbcType="VARCHAR" property="siteCode"/>
+    <result column="RegionCode" jdbcType="VARCHAR" property="regionCode"/>
+    <result column="StreetCode" jdbcType="VARCHAR" property="streetCode"/>
+    <result column="DetailAddress" jdbcType="VARCHAR" property="detailAddress"/>
+    <result column="SiteX" jdbcType="VARCHAR" property="siteX"/>
+    <result column="SiteY" jdbcType="VARCHAR" property="siteY"/>
+    <result column="SiteLongitude" jdbcType="DOUBLE" property="siteLongitude"/>
+    <result column="SiteLatitude" jdbcType="DOUBLE" property="siteLatitude"/>
+    <result column="SiteName" jdbcType="VARCHAR" property="siteName"/>
+    <result column="FzrName" jdbcType="VARCHAR" property="fzrName"/>
+    <result column="FzrMobile" jdbcType="VARCHAR" property="fzrMobile"/>
+    <result column="CreateUserID" jdbcType="VARCHAR" property="createUserID"/>
+    <result column="CreateTime" jdbcType="TIMESTAMP" property="createTime"/>
+    <result column="ModifyUserID" jdbcType="VARCHAR" property="modifyUserID"/>
+    <result column="ModifyTime" jdbcType="TIMESTAMP" property="modifyTime"/>
+    <result column="Remark" jdbcType="VARCHAR" property="remark"/>
   </resultMap>
   <sql id="Example_Where_Clause">
     <where>
@@ -111,18 +113,18 @@
     </if>
   </delete>
   <insert id="insert" parameterType="com.hz.employmentsite.model.PcSite">
-    insert into pc_site (SiteID, SiteCode, RegionCode, 
-      StreetCode, DetailAddress, SiteX, 
-      SiteY, SiteName, FzrName, 
-      FzrMobile, CreateUserID, CreateTime, 
-      ModifyUserID, ModifyTime, Remark
-      )
-    values (#{siteID,jdbcType=VARCHAR}, #{siteCode,jdbcType=VARCHAR}, #{regionCode,jdbcType=VARCHAR}, 
-      #{streetCode,jdbcType=VARCHAR}, #{detailAddress,jdbcType=VARCHAR}, #{siteX,jdbcType=VARCHAR}, 
-      #{siteY,jdbcType=VARCHAR}, #{siteName,jdbcType=VARCHAR}, #{fzrName,jdbcType=VARCHAR}, 
-      #{fzrMobile,jdbcType=VARCHAR}, #{createUserID,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, 
-      #{modifyUserID,jdbcType=VARCHAR}, #{modifyTime,jdbcType=TIMESTAMP}, #{remark,jdbcType=VARCHAR}
-      )
+    insert into pc_site (SiteID, SiteCode, RegionCode,
+                         StreetCode, DetailAddress, SiteX,
+                         SiteY, SiteLongitude, SiteLatitude,
+                         SiteName, FzrName, FzrMobile,
+                         CreateUserID, CreateTime, ModifyUserID,
+                         ModifyTime, Remark)
+    values (#{siteID,jdbcType=VARCHAR}, #{siteCode,jdbcType=VARCHAR}, #{regionCode,jdbcType=VARCHAR},
+            #{streetCode,jdbcType=VARCHAR}, #{detailAddress,jdbcType=VARCHAR}, #{siteX,jdbcType=VARCHAR},
+            #{siteY,jdbcType=VARCHAR}, #{siteLongitude,jdbcType=DOUBLE}, #{siteLatitude,jdbcType=DOUBLE},
+            #{siteName,jdbcType=VARCHAR}, #{fzrName,jdbcType=VARCHAR},
+            #{fzrMobile,jdbcType=VARCHAR}, #{createUserID,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP},
+            #{modifyUserID,jdbcType=VARCHAR}, #{modifyTime,jdbcType=TIMESTAMP}, #{remark,jdbcType=VARCHAR})
   </insert>
   <insert id="insertSelective" parameterType="com.hz.employmentsite.model.PcSite">
     insert into pc_site
@@ -148,6 +150,12 @@
       <if test="siteY != null">
         SiteY,
       </if>
+      <if test="siteLongitude != null">
+        SiteLongitude,
+      </if>
+      <if test="siteLatitude != null">
+        SiteLatitude,
+      </if>
       <if test="siteName != null">
         SiteName,
       </if>
@@ -195,6 +203,12 @@
       <if test="siteY != null">
         #{siteY,jdbcType=VARCHAR},
       </if>
+      <if test="siteLongitude != null">
+        #{siteLongitude,jdbcType=DOUBLE},
+      </if>
+      <if test="siteLatitude != null">
+        #{siteLatitude,jdbcType=DOUBLE},
+      </if>
       <if test="siteName != null">
         #{siteName,jdbcType=VARCHAR},
       </if>
@@ -251,6 +265,12 @@
       <if test="row.siteY != null">
         SiteY = #{row.siteY,jdbcType=VARCHAR},
       </if>
+      <if test="row.siteLongitude != null">
+        SiteLongitude = #{row.siteLongitude,jdbcType=DOUBLE},
+      </if>
+      <if test="row.siteLatitude != null">
+        SiteLatitude = #{row.siteLatitude,jdbcType=DOUBLE},
+      </if>
       <if test="row.siteName != null">
         SiteName = #{row.siteName,jdbcType=VARCHAR},
       </if>
@@ -283,20 +303,22 @@
   <update id="updateByExample" parameterType="map">
     update pc_site
     set SiteID = #{row.siteID,jdbcType=VARCHAR},
-      SiteCode = #{row.siteCode,jdbcType=VARCHAR},
-      RegionCode = #{row.regionCode,jdbcType=VARCHAR},
-      StreetCode = #{row.streetCode,jdbcType=VARCHAR},
-      DetailAddress = #{row.detailAddress,jdbcType=VARCHAR},
-      SiteX = #{row.siteX,jdbcType=VARCHAR},
-      SiteY = #{row.siteY,jdbcType=VARCHAR},
-      SiteName = #{row.siteName,jdbcType=VARCHAR},
-      FzrName = #{row.fzrName,jdbcType=VARCHAR},
-      FzrMobile = #{row.fzrMobile,jdbcType=VARCHAR},
-      CreateUserID = #{row.createUserID,jdbcType=VARCHAR},
-      CreateTime = #{row.createTime,jdbcType=TIMESTAMP},
-      ModifyUserID = #{row.modifyUserID,jdbcType=VARCHAR},
-      ModifyTime = #{row.modifyTime,jdbcType=TIMESTAMP},
-      Remark = #{row.remark,jdbcType=VARCHAR}
+    SiteCode = #{row.siteCode,jdbcType=VARCHAR},
+    RegionCode = #{row.regionCode,jdbcType=VARCHAR},
+    StreetCode = #{row.streetCode,jdbcType=VARCHAR},
+    DetailAddress = #{row.detailAddress,jdbcType=VARCHAR},
+    SiteX = #{row.siteX,jdbcType=VARCHAR},
+    SiteY = #{row.siteY,jdbcType=VARCHAR},
+    SiteLongitude = #{siteLongitude,jdbcType=DOUBLE},
+    SiteLatitude = #{siteLatitude,jdbcType=DOUBLE},
+    SiteName = #{row.siteName,jdbcType=VARCHAR},
+    FzrName = #{row.fzrName,jdbcType=VARCHAR},
+    FzrMobile = #{row.fzrMobile,jdbcType=VARCHAR},
+    CreateUserID = #{row.createUserID,jdbcType=VARCHAR},
+    CreateTime = #{row.createTime,jdbcType=TIMESTAMP},
+    ModifyUserID = #{row.modifyUserID,jdbcType=VARCHAR},
+    ModifyTime = #{row.modifyTime,jdbcType=TIMESTAMP},
+    Remark = #{row.remark,jdbcType=VARCHAR}
     <if test="example != null">
       <include refid="Update_By_Example_Where_Clause" />
     </if>
@@ -322,6 +344,12 @@
       <if test="siteY != null">
         SiteY = #{siteY,jdbcType=VARCHAR},
       </if>
+      <if test="row.siteLongitude != null">
+        SiteLongitude = #{row.siteLongitude,jdbcType=DOUBLE},
+      </if>
+      <if test="row.siteLatitude != null">
+        SiteLatitude = #{row.siteLatitude,jdbcType=DOUBLE},
+      </if>
       <if test="siteName != null">
         SiteName = #{siteName,jdbcType=VARCHAR},
       </if>
@@ -351,20 +379,22 @@
   </update>
   <update id="updateByPrimaryKey" parameterType="com.hz.employmentsite.model.PcSite">
     update pc_site
-    set SiteCode = #{siteCode,jdbcType=VARCHAR},
-      RegionCode = #{regionCode,jdbcType=VARCHAR},
-      StreetCode = #{streetCode,jdbcType=VARCHAR},
-      DetailAddress = #{detailAddress,jdbcType=VARCHAR},
-      SiteX = #{siteX,jdbcType=VARCHAR},
-      SiteY = #{siteY,jdbcType=VARCHAR},
-      SiteName = #{siteName,jdbcType=VARCHAR},
-      FzrName = #{fzrName,jdbcType=VARCHAR},
-      FzrMobile = #{fzrMobile,jdbcType=VARCHAR},
-      CreateUserID = #{createUserID,jdbcType=VARCHAR},
-      CreateTime = #{createTime,jdbcType=TIMESTAMP},
-      ModifyUserID = #{modifyUserID,jdbcType=VARCHAR},
-      ModifyTime = #{modifyTime,jdbcType=TIMESTAMP},
-      Remark = #{remark,jdbcType=VARCHAR}
+    set SiteCode      = #{siteCode,jdbcType=VARCHAR},
+        RegionCode    = #{regionCode,jdbcType=VARCHAR},
+        StreetCode    = #{streetCode,jdbcType=VARCHAR},
+        DetailAddress = #{detailAddress,jdbcType=VARCHAR},
+        SiteX         = #{siteX,jdbcType=VARCHAR},
+        SiteY         = #{siteY,jdbcType=VARCHAR},
+        SiteLongitude = #{siteLongitude,jdbcType=DOUBLE},
+        SiteLatitude  = #{siteLatitude,jdbcType=DOUBLE},
+        SiteName      = #{siteName,jdbcType=VARCHAR},
+        FzrName       = #{fzrName,jdbcType=VARCHAR},
+        FzrMobile     = #{fzrMobile,jdbcType=VARCHAR},
+        CreateUserID  = #{createUserID,jdbcType=VARCHAR},
+        CreateTime    = #{createTime,jdbcType=TIMESTAMP},
+        ModifyUserID  = #{modifyUserID,jdbcType=VARCHAR},
+        ModifyTime    = #{modifyTime,jdbcType=TIMESTAMP},
+        Remark        = #{remark,jdbcType=VARCHAR}
     where SiteID = #{siteID,jdbcType=VARCHAR}
   </update>
 </mapper>

+ 51 - 13
src/main/resources/mapping/PcSiteUserMapper.xml

@@ -13,6 +13,8 @@
     <result column="CreateTime" jdbcType="TIMESTAMP" property="createTime" />
     <result column="UpdateBy" jdbcType="VARCHAR" property="updateBy" />
     <result column="UpdateTime" jdbcType="TIMESTAMP" property="updateTime" />
+    <result column="UserNo" jdbcType="VARCHAR" property="userNo" />
+    <result column="IDCard" jdbcType="VARCHAR" property="IDCard" />
   </resultMap>
   <sql id="Example_Where_Clause">
     <where>
@@ -74,7 +76,7 @@
   </sql>
   <sql id="Base_Column_List">
     SiteUserID, SiteUserName, UserID, SiteID, Gender, Mobile, RoleID, CreateUserID, CreateTime, 
-    UpdateBy, UpdateTime
+    UpdateBy, UpdateTime, UserNo, IDCard
   </sql>
   <select id="selectByExample" parameterType="com.hz.employmentsite.model.PcSiteUserExample" resultMap="BaseResultMap">
     select
@@ -110,11 +112,13 @@
     insert into pc_site_user (SiteUserID, SiteUserName, UserID, 
       SiteID, Gender, Mobile, 
       RoleID, CreateUserID, CreateTime, 
-      UpdateBy, UpdateTime)
+      UpdateBy, UpdateTime, UserNo, 
+      IDCard)
     values (#{siteUserID,jdbcType=VARCHAR}, #{siteUserName,jdbcType=VARCHAR}, #{userID,jdbcType=VARCHAR}, 
       #{siteID,jdbcType=VARCHAR}, #{gender,jdbcType=INTEGER}, #{mobile,jdbcType=VARCHAR}, 
       #{roleID,jdbcType=INTEGER}, #{createUserID,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, 
-      #{updateBy,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP})
+      #{updateBy,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP}, #{userNo,jdbcType=VARCHAR}, 
+      #{IDCard,jdbcType=VARCHAR})
   </insert>
   <insert id="insertSelective" parameterType="com.hz.employmentsite.model.PcSiteUser">
     insert into pc_site_user
@@ -152,6 +156,12 @@
       <if test="updateTime != null">
         UpdateTime,
       </if>
+      <if test="userNo != null">
+        UserNo,
+      </if>
+      <if test="IDCard != null">
+        IDCard,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="siteUserID != null">
@@ -187,6 +197,12 @@
       <if test="updateTime != null">
         #{updateTime,jdbcType=TIMESTAMP},
       </if>
+      <if test="userNo != null">
+        #{userNo,jdbcType=VARCHAR},
+      </if>
+      <if test="IDCard != null">
+        #{IDCard,jdbcType=VARCHAR},
+      </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="com.hz.employmentsite.model.PcSiteUserExample" resultType="java.lang.Long">
@@ -231,6 +247,12 @@
       <if test="row.updateTime != null">
         UpdateTime = #{row.updateTime,jdbcType=TIMESTAMP},
       </if>
+      <if test="row.userNo != null">
+        UserNo = #{row.userNo,jdbcType=VARCHAR},
+      </if>
+      <if test="row.IDCard != null">
+        IDCard = #{row.IDCard,jdbcType=VARCHAR},
+      </if>
     </set>
     <if test="example != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -248,7 +270,9 @@
       CreateUserID = #{row.createUserID,jdbcType=VARCHAR},
       CreateTime = #{row.createTime,jdbcType=TIMESTAMP},
       UpdateBy = #{row.updateBy,jdbcType=VARCHAR},
-      UpdateTime = #{row.updateTime,jdbcType=TIMESTAMP}
+      UpdateTime = #{row.updateTime,jdbcType=TIMESTAMP},
+      UserNo = #{row.userNo,jdbcType=VARCHAR},
+      IDCard = #{row.IDCard,jdbcType=VARCHAR}
     <if test="example != null">
       <include refid="Update_By_Example_Where_Clause" />
     </if>
@@ -286,21 +310,35 @@
       <if test="updateTime != null">
         UpdateTime = #{updateTime,jdbcType=TIMESTAMP},
       </if>
+      <if test="userNo != null">
+        UserNo = #{userNo,jdbcType=VARCHAR},
+      </if>
+      <if test="IDCard != null">
+        IDCard = #{IDCard,jdbcType=VARCHAR},
+      </if>
     </set>
     where SiteUserID = #{siteUserID,jdbcType=VARCHAR}
   </update>
   <update id="updateByPrimaryKey" parameterType="com.hz.employmentsite.model.PcSiteUser">
     update pc_site_user
     set SiteUserName = #{siteUserName,jdbcType=VARCHAR},
-      UserID = #{userID,jdbcType=VARCHAR},
-      SiteID = #{siteID,jdbcType=VARCHAR},
-      Gender = #{gender,jdbcType=INTEGER},
-      Mobile = #{mobile,jdbcType=VARCHAR},
-      RoleID = #{roleID,jdbcType=INTEGER},
-      CreateUserID = #{createUserID,jdbcType=VARCHAR},
-      CreateTime = #{createTime,jdbcType=TIMESTAMP},
-      UpdateBy = #{updateBy,jdbcType=VARCHAR},
-      UpdateTime = #{updateTime,jdbcType=TIMESTAMP}
+        UserID       = #{userID,jdbcType=VARCHAR},
+        SiteID       = #{siteID,jdbcType=VARCHAR},
+        Gender       = #{gender,jdbcType=INTEGER},
+        Mobile       = #{mobile,jdbcType=VARCHAR},
+        RoleID       = #{roleID,jdbcType=INTEGER},
+        CreateUserID = #{createUserID,jdbcType=VARCHAR},
+        CreateTime   = #{createTime,jdbcType=TIMESTAMP},
+        UpdateBy     = #{updateBy,jdbcType=VARCHAR},
+        UpdateTime   = #{updateTime,jdbcType=TIMESTAMP},
+        UserNo       = #{userNo,jdbcType=VARCHAR},
+        IDCard       = #{IDCard,jdbcType=VARCHAR}
     where SiteUserID = #{siteUserID,jdbcType=VARCHAR}
   </update>
+
+  <select id="selectByMobile" resultType="String">
+    select SiteID
+    from pc_site_user
+    where mobile = #{mobile,jdbcType=VARCHAR}
+  </select>
 </mapper>

+ 1 - 1
src/main/resources/mapping/cquery/DoTaskCQuery.xml

@@ -48,7 +48,7 @@
     <select id="getListByUserID" resultType="com.hz.employmentsite.vo.taskAndLog.DoTaskVo">
         select task.dotaskID,task.workTypeID,task.content,task.dotaskName,u.`Name` as createName,task.finishTime,task.createTime,
         (select UserTaskStatus from pc_dotask_user du where DotaskID = task.DotaskID and siteUserID = #{siteUserID}) AS taskStatus,
-        dic_taskStatus.Name as taskStatusName,  city.`name` as regionName,area.`name` as streetName,item.`Name` as workTypeName,task.regionCode,task.streetCode
+        dic_taskStatus.Name as taskStatusName, doTaskUser.CompleteTime,  city.`name` as regionName,area.`name` as streetName,item.`Name` as workTypeName,task.regionCode,task.streetCode
         from pc_dotask task
         left join pc_dotask_user doTaskUser on task.dotaskID = doTaskUser.dotaskID
         left join sys_dictionary_item item  on item.`Value` = task.WorkTypeID

+ 3 - 0
src/main/resources/mapping/cquery/SiteUserCQuery.xml

@@ -26,6 +26,9 @@
         <if test="regionCode!='' and regionCode!=null">
             and site.regionCode = #{regionCode}
         </if>
+        <if test="userNo!='' and userNo!=null">
+            and siteUser.userNo like Concat('%', #{userNo}, '%')
+        </if>
     </select>
 
     <select id="getListBySiteID" resultType="com.hz.employmentsite.vo.baseSettings.SiteUserVo">

+ 4 - 1
src/main/resources/mapping/cquery/SysUserCQuery.xml

@@ -84,8 +84,11 @@
 
     <select id="selectUserInfo" resultType="com.hz.employmentsite.vo.user.UserInfoModel">
         select theUser.*,dic_userType.Name as UserTypeName,siteUser.SiteID,siteUser.SiteUserName,siteUser.Mobile as UserMobile,
-               siteUser.Gender,dic_genderType.Name as GenderName from sys_user theUser
+               siteUser.Gender,dic_genderType.Name as GenderName
+        ,siteUser.userNo,siteUser.IDCard,site.siteName
+        from sys_user theUser
         left join pc_site_user siteUser on theUser.UserID = siteUser.UserID
+        left join pc_site site on siteUser.SiteID = site.SiteID
         left join (select * from sys_dictionary_item where DictionaryCode ='UserType') dic_userType
         on theUser.UserTypeID = dic_userType.value
         left join (select * from sys_dictionary_item where DictionaryCode ='Gender') dic_genderType

+ 14 - 26
vue/src/layout/header/index.vue

@@ -1,14 +1,13 @@
 <template>
   <Layout.Header :style="headerStyle" class="layout-header">
     <Space :size="30">
-<img style="height: 52px;" src="~@/assets/images/logo-login.png" alt=""/>
+      <img style="height: 52px;" src="~@/assets/images/logo-login.png" alt=""/>
       <span style="font-size: 30px;margin-left:-10px;">惠州就业驿站管理系统</span>
     </Space>
     <Space :size="20">
       <!--      <Search />-->
       <Tooltip title="修改密码" placement="bottom" v-if="isDev">
-        <LockOutlined @click="updatePassword()"/>
-        <UpdatePassword ref="updatePasswordRef"></UpdatePassword>
+        <LockOutlined @click.prevent="onUpdatePassword"/>
       </Tooltip>
       <FullScreen/>
       <Tooltip title="退出系统" placement="bottom" v-if="isDev">
@@ -38,36 +37,23 @@
       </Dropdown> -->
       <!--      <ProjectSetting />-->
     </Space>
+    <UpdatePasswordCom ref="updatePasswordRef"></UpdatePasswordCom>
   </Layout.Header>
 </template>
 
 <script lang="tsx" setup>
-import {computed, nextTick, type CSSProperties, ref, onMounted} from 'vue';
-import {useRouter, useRoute} from 'vue-router';
-import {
-  QuestionCircleOutlined,
-  PoweroffOutlined,
-  LockOutlined,
-  ExportOutlined,
-} from '@ant-design/icons-vue';
-import {
-  message,
-  Modal,
-  Dropdown,
-  Menu,
-  Space,
-  Avatar,
-  Tooltip,
-  type MenuTheme,
-} from 'ant-design-vue';
-import {Search, FullScreen, ProjectSetting} from './components/';
+import {computed, type CSSProperties, nextTick, onMounted, ref} from 'vue';
+import {useRoute, useRouter} from 'vue-router';
+import {LockOutlined, PoweroffOutlined, QuestionCircleOutlined,} from '@ant-design/icons-vue';
+import {type MenuTheme, message, Modal, Space, Tooltip,} from 'ant-design-vue';
+import {FullScreen} from './components/';
 import {useUserStore} from '@/store/modules/user';
 import {useKeepAliveStore} from '@/store/modules/keepAlive';
 /*import {useLockscreenStore} from '@/store/modules/lockscreen';*/
 import {LOGIN_NAME} from '@/router/constant';
 import {useThemeStore} from '@/store/modules/projectConfig';
-import UpdatePassword from'@/views/system/users/updatePassword.vue';
 import {getConfig} from "@/utils/config";
+import UpdatePasswordCom from "@/views/system/users/updatePassword.vue";
 
 defineProps({
   collapsed: {
@@ -85,7 +71,6 @@ const keepAliveStore = useKeepAliveStore();
 
 const router = useRouter();
 const route = useRoute();
-const userInfo = computed(() => userStore.userInfo);
 const headerStyle = computed<CSSProperties>(() => {
   const {navTheme, layout} = themeStore;
   const isDark = navTheme === 'dark' && layout === 'topmenu';
@@ -124,8 +109,11 @@ const doLogout = () => {
   });
 };
 
-const updatePassword = () => {
-  updatePasswordRef.value.show(userInfo.value.userId,userInfo.value.userName,userInfo.value.loginId);
+function onUpdatePassword() {
+  const userInfo = JSON.parse(JSON.stringify(userStore.getUserInfo));
+  console.log(userInfo)
+  updatePasswordRef.value.show(userInfo.userID, userInfo.name, userInfo.loginID);
+  // updatePasswordRef.value.show(userStore.getUserInfo, data.userName, 111);
 };
 
 onMounted(() => {

+ 19 - 5
vue/src/views/baseSettings/siteInfo/edit.vue

@@ -59,13 +59,27 @@
           </a-form-item>
         </a-col>
         <a-col :span="8">
-          <a-form-item label="驿站坐标"  name="sitePosition" :label-col="{span:7}" :rules="[{ required: true, message: '请选择驿站坐标!' }]">
-            <label v-if="opCategory==3">{{dataModel.sitePosition}}</label>
-            <a-input v-model:value="dataModel.sitePosition" placeholder=""/>
+          <a-form-item label="经度"  name="siteLongitude" :label-col="{span:7}" :rules="[{ required: true, message: '请输入经度!' }]">
+            <label v-if="opCategory==3">{{dataModel.siteLongitude }}</label>
+            <a-input-number style="width: 100%" :controls="false" v-model:value="dataModel.siteLongitude" placeholder=""/>
           </a-form-item>
         </a-col>
-        <a-col :span="1">
-            <a-button type="primary"  @click='' >选择</a-button>
+<!--        <a-col :span="8">-->
+<!--          <a-form-item label="驿站坐标"  name="sitePosition" :label-col="{span:7}" :rules="[{ required: true, message: '请选择驿站坐标!' }]">-->
+<!--            <label v-if="opCategory==3">{{dataModel.sitePosition}}</label>-->
+<!--            <a-input v-model:value="dataModel.sitePosition" placeholder=""/>-->
+<!--          </a-form-item>-->
+<!--        </a-col>-->
+<!--        <a-col :span="1">-->
+<!--            <a-button type="primary"  @click='' >选择</a-button>-->
+<!--        </a-col>-->
+      </a-row>
+      <a-row type="flex">
+        <a-col :span="7">
+          <a-form-item label="纬度"  name="siteLatitude" :label-col="{span:7}" :rules="[{ required: true, message: '请输入站点负责人!' }]">
+            <label v-if="opCategory==3">{{dataModel.siteLatitude }}</label>
+            <a-input-number style="width: 100%" :controls="false" v-model:value="dataModel.siteLatitude" placeholder=""/>
+          </a-form-item>
         </a-col>
       </a-row>
 <!--      <a-divider orientation="left">管理人员 共计:{{manageUsers.length}}</a-divider>

+ 34 - 8
vue/src/views/baseSettings/siteUser/edit.vue

@@ -25,13 +25,30 @@
       </a-row>
       <a-row type="flex">
         <a-col :span="7">
-          <a-form-item label="用户类型"  name="roleID" :label-col="{span:7}" :rules="[{ required: true, message: '请选择用户类型!' }]">
-            <label v-if="opCategory==3">{{dataModel.roleID }}</label>
-            <a-select ref="select" v-model:value="dataModel.roleID" :options="roleList"
-                      :field-names="{ label: 'name', value: 'value' }" :allow-clear="false" > </a-select>
+          <a-form-item label="工号" name="roleID" :label-col="{span:7}"
+                       :rules="[{ required: true, message: '请输入工号!' }]">
+            <label v-if="opCategory==3">{{ dataModel.userNo }}</label>
+            <a-input v-model:value="dataModel.userNo" placeholder=""/>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item label="身份证" name="roleID" :label-col="{span:7}"
+                       :rules="[{ required: true, message: '请输入身份证!' }]">
+            <label v-if="opCategory==3">{{ dataModel.idCard }}</label>
+            <a-input v-model:value="dataModel.idCard" placeholder=""/>
           </a-form-item>
         </a-col>
         <a-col :span="8">
+          <a-form-item label="用户类型" name="roleID" :label-col="{span:8}"
+                       :rules="[{ required: true, message: '请选择用户类型!' }]">
+            <label v-if="opCategory==3">{{ dataModel.roleID }}</label>
+            <a-select ref="select" v-model:value="dataModel.roleID" :options="roleList"
+                      :field-names="{ label: 'name', value: 'value' }" :allow-clear="false"></a-select>
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row type="flex">
+        <a-col :span="7">
           <a-form-item label="所属驿站"  name="siteID" :label-col="{span:7}" :rules="[{ required: true, message: '请选择所属驿站!' }]">
             <a-select
               ref="select"
@@ -41,9 +58,6 @@
             </a-select>
           </a-form-item>
         </a-col>
-        <a-col :span="7">
-
-        </a-col>
       </a-row>
       <a-form-item class="buttom-btns">
         <a-button @click="onClose">取消</a-button>
@@ -58,8 +72,8 @@ import {useTabsViewStore} from "@/store/modules/tabsView";
 import {getSiteUserByID, saveSiteUser} from "@/api/baseSettings/userInfo";
 import BUploadFile from "@/components/file/uploadFile.vue";
 import type {SelectProps} from "ant-design-vue";
-import {getSysDictionaryList} from "@/api/system/dictionary";
 import {message} from "ant-design-vue";
+import {getSysDictionaryList} from "@/api/system/dictionary";
 import {getSiteList} from "@/api/baseSettings/siteInfo";
 
 interface siteUserModel {
@@ -129,6 +143,17 @@ export default defineComponent({
       }
     };
 
+    function idCardValidate() {
+      isAllowCommit.value = true;
+      let _IDRe18 = /^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
+      let _IDre15 = /^([1-6][1-9]|50)\d{4}\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}$/
+      // 校验身份证
+      if (!_IDRe18.test(formData.dataModel.idCard) && !_IDre15.test(formData.dataModel.idCard)) {
+        message.error("输入的身份证格式有误!");
+        isAllowCommit.value = false;
+      }
+    }
+
     const onClose = (reload: any) => {
       tabsViewStore.closeCurrentTabByPath('/baseSettings/user/add');
       tabsViewStore.closeCurrentTabByPath('/baseSettings/user/edit');
@@ -137,6 +162,7 @@ export default defineComponent({
 
     const onFinish = () => {
       mobileValidate();
+      idCardValidate();
       if(isAllowCommit.value){
         saveSiteUser(formData.dataModel).then(result => {
           if (result) {

+ 13 - 9
vue/src/views/baseSettings/siteUser/index.vue

@@ -7,6 +7,11 @@
             <a-input v-model:value="searchParams.siteUserName" placeholder="" :allow-clear="true"/>
           </a-form-item>
         </a-col>
+        <a-col :span="6">
+          <a-form-item label="工号" :label-col="{span:8}" name="userNo">
+            <a-input v-model:value="searchParams.userNo" placeholder="" :allow-clear="true"/>
+          </a-form-item>
+        </a-col>
         <a-col :span="6">
           <a-form-item label="所属驿站" :label-col="{span:8}" name="siteID">
             <a-select
@@ -20,9 +25,6 @@
             </a-select>
           </a-form-item>
         </a-col>
-        <a-col :span="6">
-
-        </a-col>
       <a-col :span="6" style="text-align: left">
           <a-button type="primary" html-type="submit" @click="onSearch">查询</a-button>
           <a-button
@@ -64,15 +66,14 @@
 </template>
 
 <script lang="ts">
-import {reactive, ref, computed, defineComponent, createVNode} from 'vue';
+import {computed, createVNode, defineComponent, reactive, ref} from 'vue';
 import {useTabsViewStore} from "@/store/modules/tabsView";
 import {DownOutlined, ExclamationCircleOutlined, UpOutlined} from '@ant-design/icons-vue';
-import type {FormInstance} from 'ant-design-vue';
-import type {TableColumnsType, TableProps} from 'ant-design-vue';
-import {getSiteUserList,delSiteUser} from '@/api/baseSettings/userInfo';
+import type {FormInstance, TableColumnsType, TableProps} from 'ant-design-vue';
+import {message, Modal} from "ant-design-vue";
+import {delSiteUser, getSiteUserList} from '@/api/baseSettings/userInfo';
 import BExportExcel from "@/components/basic/excel/exportExcel/exportExcel.vue";
 import {getPaginationTotalTitle} from "@/utils/common";
-import {message, Modal} from "ant-design-vue";
 import {getSiteList} from "@/api/baseSettings/siteInfo";
 
 export default defineComponent({
@@ -86,7 +87,8 @@ export default defineComponent({
       pageIndex: 1,
       pageSize: 20,
       siteUserName: '',
-      siteID:''
+      siteID: '',
+      userNo: ""
     });
     const formState = reactive({
       total: 0,
@@ -95,10 +97,12 @@ export default defineComponent({
     });
     const columns: TableColumnsType = [
       {title: '序号', align: "center",key: 'siteUserID',customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`},
+      {title: '工号', dataIndex: 'userNo', key: 'userNo', align: "center"},
       {title: '人员名称', dataIndex: 'siteUserName', key: 'siteUserName', align: "center"},
       {title: '用户类型', dataIndex: 'roleName', key: 'roleName',width:120, align: "center"},
       {title: '性别', dataIndex: 'genderName', key: 'genderName', align: "center"},
       {title: '联系电话', dataIndex: 'mobile', key: 'mobile', align: "center"},
+      {title: '身份证号', dataIndex: 'idCard', key: 'idCard', align: "center"},
       {title: '所属驿站', dataIndex: 'siteName', key: 'siteName', align: "center"},
       {title: '操作', key: 'operation', fixed: 'right',width:100, align: "center"},
     ];

+ 2 - 2
vue/src/views/companyService/post/edit.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="card-edit">
     <a-form :model="dataModel" autocomplete="off" @finish="onFinish">
-      <h1>关联企业信息</h1>
+      <h1>岗位基础信息</h1>
       <a-row justify="start" :gutter="24" >
         <a-col flex="800px">
           <a-form-item label="企业名称" :label-col="{ span: 3}"
@@ -15,7 +15,7 @@
           </a-form-item>
         </a-col>
       </a-row>
-      <h1>岗位基础信息</h1>
+
       <a-row justify="start">
         <a-col flex="520px">
           <a-form-item label="岗位名称" :label-col="{ span: 5 }"

+ 1 - 0
vue/src/views/system/users/updatePassword.vue

@@ -94,6 +94,7 @@ export default defineComponent({
     const {validate, validateInfos} = useForm(dataModel, rulesRef);
 
     const show = (userID: any, userName: any, loginID: any) => {
+      console.log(userID, userName, loginID)
       visible.value = true;
       dataModel.value.userID = userID;
       dataModel.value.userName = userName;