Browse Source

bug处理4

liao-sea 1 year ago
parent
commit
2d4f881124
32 changed files with 859 additions and 330 deletions
  1. 6 0
      doc/待更新脚本
  2. 11 0
      h5app/src/api/education/index.ts
  3. 34 0
      h5app/src/api/experience/index.ts
  4. 4 0
      h5app/src/router/index.ts
  5. 6 3
      h5app/src/views/login.vue
  6. 1 1
      h5app/src/views/pages/company/edit.vue
  7. 0 1
      h5app/src/views/pages/company/editPost.vue
  8. 9 30
      h5app/src/views/pages/company/postList.vue
  9. 48 13
      h5app/src/views/pages/jobhunt/edit.vue
  10. 5 3
      h5app/src/views/pages/jobhunt/educationEdit.vue
  11. 311 0
      h5app/src/views/pages/jobhunt/experienceEdit.vue
  12. 2 2
      h5app/src/views/pages/jobhunt/jobHuntEdit.vue
  13. 2 1
      src/main/java/com/hz/employmentsite/controller/jobUserManager/EducationController.java
  14. 52 0
      src/main/java/com/hz/employmentsite/controller/jobUserManager/ExperienceController.java
  15. 2 1
      src/main/java/com/hz/employmentsite/controller/jobUserManager/JobUserController.java
  16. 1 1
      src/main/java/com/hz/employmentsite/controller/taskAndLog/DoTaskController.java
  17. 3 3
      src/main/java/com/hz/employmentsite/controller/taskAndLog/DoWorkController.java
  18. 13 0
      src/main/java/com/hz/employmentsite/mapper/cquery/ExperienceCQuery.java
  19. 1 2
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/EducationServiceImpl.java
  20. 75 0
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/ExperienceServiceImpl.java
  21. 1 1
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/JobUserServiceImpl.java
  22. 13 0
      src/main/java/com/hz/employmentsite/services/service/jobUserManager/ExperienceService.java
  23. 17 0
      src/main/resources/mapping/cquery/ExperienceCQuery.xml
  24. 2 2
      vue/src/components/basic/excel/importExcel/importExcel.vue
  25. 2 1
      vue/src/utils/downloadFile.ts
  26. 15 17
      vue/src/views/companyService/post/index.vue
  27. 110 123
      vue/src/views/jobUserManager/jobuser/edit.vue
  28. 71 80
      vue/src/views/system/role/roleUser.vue
  29. 2 1
      vue/src/views/system/users/addUser.vue
  30. 1 2
      vue/src/views/system/users/index.vue
  31. 27 33
      vue/src/views/taskAndLog/dotask/index.vue
  32. 12 9
      vue/src/views/taskAndLog/dowork/index.vue

+ 6 - 0
doc/待更新脚本

@@ -0,0 +1,6 @@
+-------------2024-01-24
+--表字段添加
+alter table pc_site add Remark varchar(200)
+alter table pc_jobhunt add OtherDemand varchar(200)
+--功能表数据添加
+INSERT INTO sys_function_code VALUES ('T0199010105', '新增用户', 'T01990101', 5);

+ 11 - 0
h5app/src/api/education/index.ts

@@ -11,6 +11,17 @@ export function getEducationListByJobUserID(params:any){
     );
 }
 
+export function getExperienceListByJobUserID(params:any){
+    return request(
+        {
+            url: 'jobUserService/education/getListByJobUserID',
+            method: 'get',
+            params: params,
+        },
+        { isNew: true },
+    );
+}
+
 export function getEducationByID(educationID: any) {
     return request(
         {

+ 34 - 0
h5app/src/api/experience/index.ts

@@ -0,0 +1,34 @@
+import {request} from '@/utils/request';
+
+export function getExperienceListByJobUserID(params:any){
+    return request(
+        {
+            url: 'jobUserService/experience/getListByJobUserID',
+            method: 'get',
+            params: params,
+        },
+        { isNew: true },
+    );
+}
+
+export function getExperienceByID(experienceID: any) {
+    return request(
+        {
+            url: 'jobUserService/experience/getById',
+            method: 'get',
+            params: {experienceID:experienceID},
+        },
+        { isNew: true },
+    );
+}
+
+export function saveExperience(data:any) {
+    return request(
+        {
+            url: 'jobUserService/experience/save',
+            method: 'post',
+            data: data,
+        },
+        { isNew: true },
+    );
+}

+ 4 - 0
h5app/src/router/index.ts

@@ -36,6 +36,10 @@ const routes: Array<RouteRecordRaw> = [
                 path: 'tabMain/jobhunt/educationEdit',
                 component: () => import('@/views/pages/jobhunt/educationEdit.vue')
             },
+            {
+                path: 'tabMain/jobhunt/experienceEdit',
+                component: () => import('@/views/pages/jobhunt/experienceEdit.vue')
+            },
             {
                 path: 'tabMain/jobhunt/jobHuntEdit',
                 component: () => import('@/views/pages/jobhunt/jobHuntEdit.vue')

+ 6 - 3
h5app/src/views/login.vue

@@ -41,8 +41,8 @@
 </template>
 
 <script setup lang="ts">
-import {reactive, ref, toRef, computed, onMounted, getCurrentInstance} from 'vue';
-import {alertController} from '@ionic/vue';
+import {reactive, ref, toRef, computed, onMounted, getCurrentInstance, onActivated} from 'vue';
+import {alertController, onIonViewDidEnter} from '@ionic/vue';
 import {useUserStore} from '@/store/modules/user';
 import router from '../router';
 import {useVuelidate} from '@vuelidate/core'
@@ -109,7 +109,6 @@ const handleSubmit = async () => {
   const userReq = userStore.login(state.formInline);
   userReq.then((data: any) => {
     state.loading = false;
-    state.formInline.password = '';
     router.push('/tabs/tabMain');
   }, (err) => {
     state.loading = false;
@@ -118,6 +117,10 @@ const handleSubmit = async () => {
   });
 };
 
+onIonViewDidEnter(() => {
+  state.formInline.password = '';
+});
+
 
 onMounted(() => {
   globalProperties.$routeActive = false;

+ 1 - 1
h5app/src/views/pages/company/edit.vue

@@ -210,7 +210,7 @@
     <ion-footer>
       <ion-toolbar>
         <div slot="end">
-          <ion-button shape="round" expand="block" @click="onNext">完成</ion-button>
+          <ion-button shape="round" expand="block" @click="onNext">提交</ion-button>
         </div>
       </ion-toolbar>
     </ion-footer>

+ 0 - 1
h5app/src/views/pages/company/editPost.vue

@@ -18,7 +18,6 @@
               <div class="item-flag"></div>
               基础信息
             </div>
-            <ion-icon slot="end" :icon="addCircleOutline" @click="onAdd()" style="font-size: 24px;"></ion-icon>
           </ion-item>
           <ion-label class="title-item">岗位名称<span class="danger">*</span></ion-label>
           <ion-item mode="md" :class="[v$.dataModel.postName.$error?'ion-invalid':'ion-valid']">

+ 9 - 30
h5app/src/views/pages/company/postList.vue

@@ -71,13 +71,13 @@
         </ion-infinite-scroll-content>
       </ion-infinite-scroll>
     </ion-content>
-<!--    <ion-footer>
+    <ion-footer>
       <ion-toolbar>
         <div slot="end">
-          <ion-button shape="round" expand="block" @click="onSave">提交</ion-button>
+          <ion-button shape="round" expand="block" @click="onFinish">完成</ion-button>
         </div>
       </ion-toolbar>
-    </ion-footer>-->
+    </ion-footer>
   </ion-page>
 </template>
 <script lang="ts">
@@ -156,32 +156,11 @@ export default defineComponent({
       else if(curStepData.value.statusVal==2)
         router.push({path: './edit', query: {reload:1,companyID:pageParams.companyID,status:1}});
     };
-    /*const onSave = () => {
-      if (postList.value.length == 0) {
-        presentAlert('没有要提交的岗位信息!');
-        return null;
-      }
-      /!*if (route.query.id) {
-        getCompanyById(route.query.id + "").then(data => {
-          formState.dataModel = data;
-          formState.dataModel.postData = postList.value;
-          saveCompanyPost(formState.dataModel).then(result => {
-            if (result) {
-              router.push({path: './list', query: {success: 1}});
-            }
-          })
-        });
-      } else {
-        const jsonDataModel = localStorage.getItem("companyData");
-        formState.dataModel = JSON.parse(jsonDataModel ?? "");
-        formState.dataModel.postData = postList.value;
-        saveCompanyPost(formState.dataModel).then(result => {
-          if (result) {
-            router.push({path: './list', query: {success: 1}});
-          }
-        })
-      }*!/
-    };*/
+
+    const onFinish = () => {
+      router.push({path: './list', query: {reload:1}});
+    }
+
     const onScroll = (e: any) => {
       setTimeout(() => {
         e.target.complete();
@@ -229,7 +208,7 @@ export default defineComponent({
       onBack,
       onAdd,
       onEdit,
-      /*onSave,*/
+      onFinish,
       onScroll,
       loadData,
       presentAlert,

+ 48 - 13
h5app/src/views/pages/jobhunt/edit.vue

@@ -240,6 +240,7 @@
           </ion-item>
         </ion-item-group>
       </ion-list>
+
       <ion-list  v-if="curStepData.statusVal==2" >
         <ion-item>
           <div class="panel-title2"  slot="start">
@@ -248,11 +249,11 @@
           </div>
           <ion-buttons slot="end">
             <ion-icon :icon="addCircleOutline"  class="iconBtn"
-                      @click="onPathForward('./educationEdit',null,null,2)"></ion-icon>
+                      @click="onPathForward('./educationEdit',null,null,null,2)"></ion-icon>
           </ion-buttons>
         </ion-item>
         <ion-item v-for="(record,key) in educationList" :key="key" detail
-                  @click="onPathForward('./educationEdit',record.educationID,null,2)">
+                  @click="onPathForward('./educationEdit',record.educationID,null,null,2)">
           <ion-label>
             <h3>{{record.schoolName}}</h3>
             <p>{{dayjs(record.schoolTime).format("YYYY-MM-DD")}}至{{dayjs(record.overTime).format("YYYY-MM-DD")}}</p>
@@ -260,7 +261,29 @@
         </ion-item>
         <b-empty v-if="educationList.length==0"  :loading="loading" />
       </ion-list>
-      <ion-list  v-if="curStepData.statusVal==3">
+
+      <ion-list  v-if="curStepData.statusVal==3" >
+        <ion-item>
+          <div class="panel-title2"  slot="start">
+            <div class="item-flag"></div>
+            工作经验
+          </div>
+          <ion-buttons slot="end">
+            <ion-icon :icon="addCircleOutline"  class="iconBtn"
+                      @click="onPathForward('./experienceEdit',null,null,null,3)"></ion-icon>
+          </ion-buttons>
+        </ion-item>
+        <ion-item v-for="(record,key) in experienceList" :key="key" detail
+                  @click="onPathForward('./experienceEdit',null,record.experienceID,null,3)">
+          <ion-label>
+            <h3>{{record.workAddress}}</h3>
+            <p>{{dayjs(record.startTime).format("YYYY-MM-DD")}}至{{dayjs(record.endTime).format("YYYY-MM-DD")}}</p>
+          </ion-label>
+        </ion-item>
+        <b-empty v-if="experienceList.length==0"  :loading="loading" />
+      </ion-list>
+
+      <ion-list  v-if="curStepData.statusVal==4">
         <ion-item>
           <div class="panel-title2"  slot="start">
             <div class="item-flag"></div>
@@ -268,11 +291,11 @@
           </div>
           <ion-buttons slot="end">
             <ion-icon :icon="addCircleOutline" class="iconBtn"
-                      @click="onPathForward('./jobHuntEdit',null,null,3)"></ion-icon>
+                      @click="onPathForward('./jobHuntEdit',null,null,null,4)"></ion-icon>
           </ion-buttons>
         </ion-item>
         <ion-item  v-for="(record,key) in jobHuntList" :key="key" detail
-                   @click="onPathForward( './jobHuntEdit',null,record.jobHuntID,3)">
+                   @click="onPathForward( './jobHuntEdit',null,null,record.jobHuntID,4)">
           <ion-label>
             <h3>{{record.postName}}</h3>
             <p>期望薪资:{{record.minSalary}}-{{record.maxSalary}}</p>
@@ -291,8 +314,8 @@
     <ion-footer>
       <ion-toolbar>
         <div slot="end">
-          <ion-button shape="round" expand="block" @click="onSave"   v-if="curStepData.statusVal!=3">下一步</ion-button>
-          <ion-button shape="round" expand="block" @click="onFinish" v-if="curStepData.statusVal==3">完  成</ion-button>
+          <ion-button shape="round" expand="block" @click="onSave"   v-if="curStepData.statusVal!=4">下一步</ion-button>
+          <ion-button shape="round" expand="block" @click="onFinish" v-if="curStepData.statusVal==4">完  成</ion-button>
         </div>
       </ion-toolbar>
     </ion-footer>
@@ -307,6 +330,7 @@ import {useVuelidate} from "@vuelidate/core";
 import {getRegionCodeList,getStreetCodeList} from "@/api/system/area";
 import {getJobUserById,baseInfoSave} from "@/api/jobUserInfo";
 import {getEducationListByJobUserID} from "@/api/education";
+import {getExperienceListByJobUserID} from "@/api/experience";
 import {getJobHuntListByJobUserID} from "@/api/jobHuntInfo";
 import {getSiteDataList} from "@/api/siteInfo";
 import {getSysDictionaryList} from '@/api/system/dictionary';
@@ -334,9 +358,10 @@ export default defineComponent({
       statusVal: 1
     });
     const stepList = ref([
-        {title: '个人基础信息', desc: '个人基础信息', val: 1},
-        {title: '完善教育经历', desc: '完善个人教育经历',val: 2},
-        {title: '个人求职意向', desc: '个人求职意向', val: 3}
+        {title: '基础信息', desc: '个人基础信息', val: 1},
+        {title: '教育经历', desc: '完善教育经历',val: 2},
+        {title: '工作经验', desc: '完善工作经验', val: 3},
+        {title: '求职意向', desc: '个人求职意向', val: 4},
     ]);
     const genderList = ref<SelectProps[]>([]);
     const jobUserStatusList = ref<SelectProps[]>([]);
@@ -352,7 +377,8 @@ export default defineComponent({
     const regionList  = ref<SelectProps[]>([]);
     const streetList  = ref<SelectProps[]>([]);
     const educationList = ref([]);
-    const jobHuntList = ref<SelectProps[]>([]);
+    const experienceList = ref([]);
+    const jobHuntList = ref([]);
     const baseInfoData = reactive({
       baseData:{
         jobUserID:null,
@@ -444,11 +470,13 @@ export default defineComponent({
       }
       else if (curStepData.value.statusVal==2){
          await router.push({path: './edit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:3}});
+      }else if (curStepData.value.statusVal==3){
+        await router.push({path: './edit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:4}});
       }
     }
 
-    const onPathForward = (pathValue:string,educationIDValue:any,jobHuntIDValue:any,statusValue:any)=>{
-      router.push({path: pathValue, query: {reload:1,educationID:educationIDValue,jobHuntID:jobHuntIDValue,jobUserID: baseInfoData.baseData.jobUserID,status:statusValue}});
+    const onPathForward = (pathValue:string,educationIDValue:any,experienceIDValue:any,jobHuntIDValue:any,statusValue:any)=>{
+      router.push({path: pathValue, query: {reload:1,educationID:educationIDValue,experienceID:experienceIDValue,jobHuntID:jobHuntIDValue,jobUserID: baseInfoData.baseData.jobUserID,status:statusValue}});
     }
 
 
@@ -532,6 +560,12 @@ export default defineComponent({
         console.log("educationList",educationList.value);
       }
       else if(curStepData.value.statusVal==3){
+        const reqData = await getExperienceListByJobUserID(pageParams);
+        experienceList.value= reqData.list;
+        pageParams.total = reqData.total;
+        console.log("experienceList",experienceList.value);
+      }
+      else if(curStepData.value.statusVal==4){
         const reqData = await getJobHuntListByJobUserID(pageParams);
         jobHuntList.value= reqData.list;
         pageParams.total = reqData.total;
@@ -584,6 +618,7 @@ export default defineComponent({
       regionList,
       streetList,
       educationList,
+      experienceList,
       jobHuntList,
       expandChange,
       provinceChange,

+ 5 - 3
h5app/src/views/pages/jobhunt/educationEdit.vue

@@ -124,9 +124,11 @@ export default defineComponent({
       statusVal: 2
     });
     const stepList = ref([
-      {title: '个人基础信息', desc: '个人基础信息', val: 1},
-      {title: '完善教育经历', desc: '完善个人教育经历',val: 2},
-      {title: '个人求职意向', desc: '个人求职意向', val: 3}]);
+      {title: '基础信息', desc: '个人基础信息', val: 1},
+      {title: '教育经历', desc: '完善教育经历',val: 2},
+      {title: '工作经验', desc: '完善工作经验', val: 3},
+      {title: '求职意向', desc: '个人求职意向', val: 4},
+    ]);
     const cultureRankList = ref<SelectProps[]>([]);
     const educationData = reactive<educationModel>({
       dataModel:{

+ 311 - 0
h5app/src/views/pages/jobhunt/experienceEdit.vue

@@ -0,0 +1,311 @@
+<template>
+  <ion-page>
+    <ion-header>
+      <ion-toolbar>
+        <ion-buttons slot="start">
+          <ion-icon :icon="arrowBackOutline" @click="onCancel" style="padding-left:10px;width:24px;height:24px;"></ion-icon>
+        </ion-buttons>
+        <ion-title>工作经验收集</ion-title>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content>
+      <div class="stepFlex">
+        <div v-for="(record,key) in stepList" :key="key" class="stepFlex-item">
+          <div
+              :class="[(record.val < curStepData?.statusVal || curStepData?.statusVal==stepList.val) ? 'greenCircle' :record.val == curStepData?.statusVal ? 'now' : 'grayCircle']"></div>
+          <div v-if="key !== stepList.length - 1"
+               :class="[record.val < curStepData?.statusVal ? 'greenLine' : 'grayLine']"></div>
+          <div class="stepFlex-item-label">
+            <p class="stepFlex-item-label-title">{{ record.title }}</p>
+<!--            <p class="stepFlex-item-label-desc">{{ record.desc }}</p>-->
+          </div>
+        </div>
+      </div>
+      <form ref="editForm" @submit.prevent="onSave">
+        <ion-list class="canvasWrapper" >
+          <ion-item-group>
+            <ion-item>
+              <div class="panel-title2">
+                <div class="item-flag"></div>
+                工作经验
+              </div>
+            </ion-item>
+            <ion-label class="title-item">工作单位<span class="danger">*</span></ion-label>
+            <ion-item :class="[experienceValid.dataModel.workAddress.$error?'ion-invalid':'ion-valid']">
+              <ion-input name="workAddress" id="workAddress" style="text-align: left;" class="custom"
+                         placeholder="请输入工作单位" v-model="dataModel.workAddress" ></ion-input>
+              <ion-note slot="error">工作单位不能为空</ion-note>
+            </ion-item>
+            <ion-label class="title-item">职务<span class="danger">*</span></ion-label>
+            <ion-item :class="[experienceValid.dataModel.duties.$error?'ion-invalid':'ion-valid']">
+              <ion-input name="duties" id="duties" style="text-align: left;" class="custom"
+                         placeholder="请输入职务" v-model="dataModel.duties" ></ion-input>
+              <ion-note slot="error">职务不能为空</ion-note>
+            </ion-item>
+            <ion-label class="title-item">工作内容<span class="danger">*</span></ion-label>
+            <ion-item :class="[experienceValid.dataModel.workOffice.$error?'ion-invalid':'ion-valid']">
+              <ion-textarea name="workOffice" id="workOffice"  style="text-align: left;" class="custom" rows="4"
+                            placeholder="请输入工作内容" v-model="dataModel.workOffice" ></ion-textarea>
+              <ion-note slot="error">工作内容不能为空</ion-note>
+            </ion-item>
+            <ion-label class="title-item">起止日期<span class="danger">*</span></ion-label>
+            <ion-item mode="md">
+              <ion-datetime-button datetime="startTime"></ion-datetime-button>
+              <ion-modal :keep-contents-mounted="true">
+                <ion-datetime id="startTime" placeholder="日期"
+                              v-model="dataModel.startTime" :prefer-wheel="true"
+                              dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                              :show-default-buttons="true">
+                </ion-datetime>
+              </ion-modal>
+              至
+              <ion-datetime-button datetime="endTime"></ion-datetime-button>
+              <ion-modal :keep-contents-mounted="true">
+                <ion-datetime id="endTime" placeholder="日期"
+                              v-model="dataModel.endTime" :prefer-wheel="true"
+                              dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                              :show-default-buttons="true">
+                </ion-datetime>
+              </ion-modal>
+            </ion-item>
+          </ion-item-group>
+        </ion-list>
+      </form>
+    </ion-content>
+    <ion-footer>
+      <ion-toolbar>
+        <div slot="end">
+          <ion-button shape="round" expand="block"  @click="onSave" >保  存</ion-button>
+        </div>
+      </ion-toolbar>
+    </ion-footer>
+    <ion-loading
+        :is-open="loading"
+        message="加载中..."
+        @didDismiss="setOpen(false)" >
+    </ion-loading>
+  </ion-page>
+</template>
+<script lang="ts">
+import {arrowBackOutline} from 'ionicons/icons';
+import {reactive,defineComponent, computed,ref,toRefs} from "vue";
+import {useRoute,useRouter} from "vue-router";
+import {required} from "@vuelidate/validators";
+import {useVuelidate} from "@vuelidate/core";
+import {getExperienceByID,saveExperience} from "@/api/experience";
+import {alertController, onIonViewDidEnter} from "@ionic/vue";
+
+interface experienceModel {
+  dataModel:any
+}
+interface SelectProps {
+  name: string,
+  value: string
+}
+interface StepParams{
+  name: string,
+  statusVal: number
+}
+export default defineComponent({
+  name: 'educationEdit',
+  setup() {
+    const router = useRouter();
+    const route = useRoute();
+    const loading = ref(false);
+    const editForm = ref();
+    const curStepData = ref<StepParams>({
+      name:"",
+      statusVal: 2
+    });
+    const stepList = ref([
+      {title: '基础信息', desc: '个人基础信息', val: 1},
+      {title: '教育经历', desc: '完善教育经历',val: 2},
+      {title: '工作经验', desc: '完善工作经验', val: 3},
+      {title: '求职意向', desc: '个人求职意向', val: 4},
+    ]);
+    const cultureRankList = ref<SelectProps[]>([]);
+    const experienceData = reactive<experienceModel>({
+      dataModel:{
+        jobuserID:null,
+        workAddress:'',
+        duties:'',
+        workOffice:'',
+        startTime:null,
+        endTime:null,
+    }});
+    const experienceRules = computed(()=>{
+      return {dataModel:{
+          workAddress:{required},
+          duties:{required},
+          workOffice:{required},
+          startTime:{required},
+          endTime:{required},
+        }}});
+    const experienceValid = useVuelidate(experienceRules,experienceData);
+    const setOpen = (isOpen: boolean) => {
+      loading.value = isOpen;
+    };
+    const presentAlert = async (message: string) => {
+      const alert = await alertController.create({
+        header: '错误!',
+        message: message,
+        buttons: [
+          '确定'
+        ],
+      });
+
+      await alert.present();
+    }
+
+    const onSave = async function (){
+      const isFormCorrect = await experienceValid.value.$validate();
+      if(!isFormCorrect){
+        console.log("当前工作经验数据",experienceData.dataModel);
+        await presentAlert("请填写完整的信息!");
+        return null;
+      }
+      saveExperience(experienceData.dataModel).then(result => {
+        if (result) {
+          router.push({path: './edit', query: {reload:1,jobUserID: experienceData.dataModel.jobuserID,status:3}});
+        }
+      });
+    }
+
+    const onCancel = () => {
+      router.push({path: './edit', query: {reload:1,jobUserID: experienceData.dataModel.jobuserID,status:3}});
+    }
+
+
+    const loadData = async (educationID: any,jobUserID:any,status:any) => {
+      loading.value = true;
+      const reqData = await getExperienceByID(educationID);
+      experienceData.dataModel = reqData;
+      experienceData.dataModel.jobuserID = jobUserID;
+      console.log("初始化教育经历",experienceData.dataModel);
+      curStepData.value.statusVal = status;
+      loading.value = false;
+    };
+
+    const reload = (educationID: any,jobUserID:any,status:any) => {
+      experienceData.dataModel = {};
+      loadData(educationID,jobUserID,status);
+    }
+
+    onIonViewDidEnter(() => {
+      if (route.query.reload)
+        reload(route.query.experienceID,route.query.jobUserID,route.query.status);
+    });
+
+    return {
+      ...toRefs(experienceData),
+      arrowBackOutline,
+      editForm,
+      curStepData,
+      stepList,
+      cultureRankList,
+      setOpen,
+      onSave,
+      onCancel,
+      loadData,
+      route,
+      router,
+      loading,
+      experienceValid
+    }
+  }
+});
+</script>
+<style lang="less">
+
+ion-input.custom{
+  --placeholder-color: gray;
+  --placeholder-font-style:oblique;
+  --placeholder-opacity: 1;
+}
+
+.title-item{
+  margin-left: 15px;
+  color:#1c3d70 !important;
+  font-size: 14px !important;
+  font-weight: bold;
+}
+
+.stepFlex {
+  margin: 0;
+  display: flex;
+  width: 100%;
+
+  .stepFlex-item {
+    position: relative;
+    flex: 1;
+    text-align: center;
+    margin-top: -10px;
+
+    .stepFlex-item-label {
+      padding-top: 60px;
+      font-size: 14px;
+
+      .stepFlex-item-label-title{
+        margin-top:30px;
+      }
+
+      .stepFlex-item-label-desc{
+        margin-top:5px;color: #b9b9bd;
+      }
+    }
+  }
+
+  .greenCircle {
+    top: calc(50% - 15px);
+    left: calc(50% - 4px);
+    position: absolute;
+    z-index: 2;
+    width: 10px;
+    height: 10px;
+    border-radius: 50%;
+    background-color: #31A2FE;
+  }
+
+  .now {
+    top: calc(50% - 18px);
+    left: calc(50% - 8px);
+    position: absolute;
+    z-index: 3;
+    width: 16px;
+    height: 16px;
+    border-radius: 50%;
+    background-color: #31A2FE;
+    border: 4px solid #c5e8f9;
+  }
+
+  .grayCircle {
+    top: calc(50% - 15px);
+    left: calc(50% - 4px);
+    position: absolute;
+    z-index: 2;
+    width: 10px;
+    height: 10px;
+    border-radius: 50%;
+    background-color: #ccc;
+  }
+
+  .greenLine {
+    width: 100%;
+    top: calc(50% - 11px);
+    left: calc(50% - 2px);
+    height: 2px;
+    background-color: #31A2FE;
+    position: absolute;
+  }
+
+  .grayLine {
+    height: 0;
+    border: 1px dashed #ccc;
+    width: 100%;
+    top: calc(50% - 11px);
+    left: calc(50% - 2px);
+    position: absolute;
+  }
+}
+
+</style>

+ 2 - 2
h5app/src/views/pages/jobhunt/jobHuntEdit.vue

@@ -241,13 +241,13 @@ export default defineComponent({
       }
       saveJobHunt(jobHuntData.dataModel).then(result => {
         if (result) {
-          router.push({path: './edit', query: {reload:1,jobUserID: jobHuntData.dataModel.jobUserID,status:3}});
+          router.push({path: './edit', query: {reload:1,jobUserID: jobHuntData.dataModel.jobUserID,status:4}});
         }
       });
     }
 
     const onCancel = () => {
-      router.push({path: './edit', query: {reload:1,jobUserID: jobHuntData.dataModel.jobUserID,status:3}});
+      router.push({path: './edit', query: {reload:1,jobUserID: jobHuntData.dataModel.jobUserID,status:4}});
     }
 
 

+ 2 - 1
src/main/java/com/hz/employmentsite/controller/jobUserManager/EducationController.java

@@ -6,6 +6,7 @@ import com.hz.employmentsite.filter.exception.RespGenerstor;
 import com.hz.employmentsite.model.PcEducation;
 import com.hz.employmentsite.services.service.AccountService;
 import com.hz.employmentsite.services.service.jobUserManager.EducationService;
+import com.hz.employmentsite.vo.jobUserManager.JobHuntVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import java.util.Date;
@@ -30,7 +31,7 @@ public class EducationController {
 
     @ResponseBody
     @GetMapping("/getById")
-    public BaseResponse getById(@RequestParam(required = false) String educationID) {
+    public BaseResponse<PcEducation> getById(@RequestParam(required = false) String educationID) {
         PcEducation dataModel = new PcEducation();
         if (educationID == null || educationID == ""){
             dataModel.setEducationID(UUID.randomUUID().toString());

+ 52 - 0
src/main/java/com/hz/employmentsite/controller/jobUserManager/ExperienceController.java

@@ -0,0 +1,52 @@
+package com.hz.employmentsite.controller.jobUserManager;
+
+import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.filter.exception.BaseResponse;
+import com.hz.employmentsite.filter.exception.RespGenerstor;
+import com.hz.employmentsite.model.PcExperience;
+import com.hz.employmentsite.services.service.AccountService;
+import com.hz.employmentsite.services.service.jobUserManager.ExperienceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.UUID;
+
+@RestController
+@RequestMapping(value = "/api/jobUserService/experience")
+public class ExperienceController {
+
+    @Autowired
+    private ExperienceService experienceService;
+    @Autowired
+    private AccountService accountService;
+
+    @ResponseBody
+    @GetMapping("/getListByJobUserID")
+    public BaseResponse getListByJobUserID(@RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize, @RequestParam(required = false) String jobUserID) {
+
+        PageInfo<PcExperience> result = experienceService.getListByJobUserID(pageIndex, pageSize,jobUserID);
+        return RespGenerstor.success(result);
+    }
+
+    @ResponseBody
+    @GetMapping("/getById")
+    public BaseResponse<PcExperience> getById(@RequestParam(required = false) String experienceID) {
+        PcExperience dataModel = new PcExperience();
+        if (experienceID == null || experienceID == ""){
+            dataModel.setExperienceID(UUID.randomUUID().toString());
+            dataModel.setStartTime(new Date());
+            dataModel.setEndTime(new Date());
+        }else{
+            dataModel = experienceService.getById(experienceID);
+        }
+        return RespGenerstor.success(dataModel);
+    }
+
+    @PostMapping("save")
+    public BaseResponse<Integer> save(@RequestBody PcExperience data) {
+        return RespGenerstor.success(experienceService.save(data,accountService.getLoginUserID()));
+    }
+
+
+}

+ 2 - 1
src/main/java/com/hz/employmentsite/controller/jobUserManager/JobUserController.java

@@ -5,6 +5,7 @@ import com.hz.employmentsite.filter.exception.BaseErrorEnum;
 import com.hz.employmentsite.filter.exception.BaseException;
 import com.hz.employmentsite.filter.exception.BaseResponse;
 import com.hz.employmentsite.filter.exception.RespGenerstor;
+import com.hz.employmentsite.model.PcJobuser;
 import com.hz.employmentsite.model.SelectProps;
 import com.hz.employmentsite.services.service.AccountService;
 import com.hz.employmentsite.services.service.jobUserManager.JobUserService;
@@ -45,7 +46,7 @@ public class JobUserController {
 
     @ResponseBody
     @GetMapping("/getDataById")
-    public BaseResponse getDataById(String id) {
+    public BaseResponse<PcJobuser> getDataById(@RequestParam(required = false) String id) {
         var data = jobuserService.getDataById(id);
         if (data == null) {
             data = new JobUserVo();

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

@@ -53,7 +53,7 @@ public class DoTaskController {
 
     @ResponseBody
     @GetMapping("/getDataById")
-    public BaseResponse getDataById(String id) {
+    public BaseResponse<DoTaskVo> getDataById(@RequestParam(required = false) String id) {
         var result = doTaskService.getDataById(id);
         if (result == null) {
             result = new DoTaskVo();

+ 3 - 3
src/main/java/com/hz/employmentsite/controller/taskAndLog/DoWorkController.java

@@ -74,7 +74,7 @@ public class DoWorkController {
         ExcelHelper.ExcelData data = excelHelper.new ExcelData();
         data.setTitles(Arrays.asList(new String[]{"序号","姓名","工作日期", "日志类型", "工作情况","所属县区","所属街道"}));
         int i = 0;
-        List<List<Object>> rowDatas = new ArrayList();
+        List<List<Object>> rowsData = new ArrayList();
         for (DoWorkVo item : result.getList()) {
             List<Object> row = new ArrayList();
             ++i;
@@ -85,9 +85,9 @@ public class DoWorkController {
             row.add(item.workContent);
             row.add(item.regionName);
             row.add(item.streetName);
-            rowDatas.add(row);
+            rowsData.add(row);
         }
-        data.setRows(rowDatas);
+        data.setRows(rowsData);
         excelHelper.exportExcel(response, data);
         return null;
     }

+ 13 - 0
src/main/java/com/hz/employmentsite/mapper/cquery/ExperienceCQuery.java

@@ -0,0 +1,13 @@
+package com.hz.employmentsite.mapper.cquery;
+
+import com.hz.employmentsite.model.PcExperience;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface ExperienceCQuery {
+    List<PcExperience> getListByJobUserID(@Param("jobUserID") String jobUserID);
+
+    PcExperience getById(@Param("experienceID") String experienceID);
+
+}

+ 1 - 2
src/main/java/com/hz/employmentsite/services/impl/jobUserManager/EducationServiceImpl.java

@@ -59,7 +59,6 @@ public class EducationServiceImpl implements EducationService {
             dbData.setCreateUserID(userId);
             result = pcEducationMapper.insert(dbData);
         } else {
-            dbData.setEducationID(data.getEducationID());
             dbData.setJobuserID(data.getJobuserID());
             dbData.setCultureRank(data.getCultureRank());
             dbData.setSchoolTime(data.getSchoolTime());
@@ -72,7 +71,7 @@ public class EducationServiceImpl implements EducationService {
             dbData.setCreateUserID(userId);
             dbData.setModifyTime(new Date());
             dbData.setModifyUserID(userId);
-            result = pcEducationMapper.updateByPrimaryKeySelective(dbData);
+            result = pcEducationMapper.updateByPrimaryKey(dbData);
         }
         return result;
     }

+ 75 - 0
src/main/java/com/hz/employmentsite/services/impl/jobUserManager/ExperienceServiceImpl.java

@@ -0,0 +1,75 @@
+package com.hz.employmentsite.services.impl.jobUserManager;
+
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.mapper.PcExperienceMapper;
+import com.hz.employmentsite.mapper.cquery.ExperienceCQuery;
+import com.hz.employmentsite.model.PcEducation;
+import com.hz.employmentsite.model.PcExperience;
+import com.hz.employmentsite.services.service.jobUserManager.ExperienceService;
+import com.hz.employmentsite.util.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+@Service("ExperienceService")
+public class ExperienceServiceImpl implements ExperienceService {
+
+    @Autowired
+    private ExperienceCQuery experienceCQuery;
+    @Autowired
+    private StringUtils stringUtils;
+    @Autowired
+    private PcExperienceMapper pcExperienceMapper;
+
+    @Override
+    public PageInfo<PcExperience> getListByJobUserID(Integer pageIndex, Integer pageSize, String jobUserID) {
+        PageHelper.startPage(pageIndex, pageSize);
+        List<PcExperience> list = experienceCQuery.getListByJobUserID(jobUserID);
+        PageInfo<PcExperience> result = new PageInfo(list);
+        return result;
+    }
+
+    @Override
+    public PcExperience getById(String experienceID) {
+        if (stringUtils.IsNullOrEmpty(experienceID)) {
+            return null;
+        }
+        PcExperience data = experienceCQuery.getById(experienceID);
+        return data;
+    }
+
+    @Override
+    public Integer save(PcExperience data, String userId) {
+        int result = 0;
+        PcExperience dbData = pcExperienceMapper.selectByPrimaryKey(data.getExperienceID());
+        if (dbData == null) {
+            dbData = new PcExperience();
+            dbData.setExperienceID(data.getExperienceID());
+            dbData.setJobuserID(data.getJobuserID());
+            dbData.setStartTime(data.getStartTime());
+            dbData.setEndTime(data.getEndTime());
+            dbData.setWorkAddress(data.getWorkAddress());
+            dbData.setDuties(data.getDuties());
+            dbData.setWorkOffice(data.getWorkOffice());
+            dbData.setCreateTime(new Date());
+            dbData.setCreateUserID(userId);
+            result = pcExperienceMapper.insert(dbData);
+        } else {
+            dbData.setExperienceID(data.getExperienceID());
+            dbData.setJobuserID(data.getJobuserID());
+            dbData.setStartTime(data.getStartTime());
+            dbData.setEndTime(data.getEndTime());
+            dbData.setWorkAddress(data.getWorkAddress());
+            dbData.setDuties(data.getDuties());
+            dbData.setWorkOffice(data.getWorkOffice());
+            dbData.setModifyTime(new Date());
+            dbData.setModifyUserID(userId);
+            result = pcExperienceMapper.updateByPrimaryKey(dbData);
+        }
+        return result;
+    }
+
+}

+ 1 - 1
src/main/java/com/hz/employmentsite/services/impl/jobUserManager/JobUserServiceImpl.java

@@ -146,7 +146,7 @@ public class JobUserServiceImpl implements JobUserService {
             jobHuntExample.or().andJobUserIDEqualTo(curJobUserID);
             var curJobUserHuntList = pcJobhuntMapper.selectByExample(jobHuntExample).stream().toList();
             if( curJobUserHuntList != null && curJobUserHuntList.size()>0){
-                throw new BaseException("10004","所选求职人员已有关联求职意向信息,不允许删除!");
+                throw new BaseException("10004","所选求职人员已有关联求职意向,不允许删除!");
             }else{
                 PcJobuserExample jobuserExp = new PcJobuserExample();
                 jobuserExp.or().andJobuserIDIn(ids);

+ 13 - 0
src/main/java/com/hz/employmentsite/services/service/jobUserManager/ExperienceService.java

@@ -0,0 +1,13 @@
+package com.hz.employmentsite.services.service.jobUserManager;
+
+import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.model.PcExperience;
+
+public interface ExperienceService {
+
+    PageInfo<PcExperience> getListByJobUserID(Integer pageIndex, Integer pageSize,String jobUserID);
+
+    PcExperience getById(String experienceID);
+
+    Integer save(PcExperience data, String userId);
+}

+ 17 - 0
src/main/resources/mapping/cquery/ExperienceCQuery.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.hz.employmentsite.mapper.cquery.ExperienceCQuery">
+    <select id="getListByJobUserID" resultType="com.hz.employmentsite.model.PcExperience">
+        select * from pc_experience where 1=1
+        <if test="jobUserID != null and jobUserID != ''">
+            and jobUserID = #{jobUserID}
+        </if>
+        order by CreateTime desc
+    </select>
+    <select id="getById" resultType="com.hz.employmentsite.model.PcExperience">
+        select * from pc_experience where 1=1
+        <if test="experienceID != null and experienceID != ''">
+            and experienceID = #{experienceID}
+        </if>
+    </select>
+</mapper>

+ 2 - 2
vue/src/components/basic/excel/importExcel/importExcel.vue

@@ -125,8 +125,8 @@ export default defineComponent({
     }
 
     const downTemp = () => {
-      console.log(downTempLoad.value);
-      console.log(props.options);
+      console.log("downTempLoad",downTempLoad.value);
+      console.log("props",props.options);
 
       if (!downTempLoad.value) {
         if (props.options?.template?.url) {

+ 2 - 1
vue/src/utils/downloadFile.ts

@@ -100,7 +100,8 @@ export function download(fileId, fileName) {
 };
 
 export function downloadTempFile(fileName) {
-  return handleDownloadByGet("/api/system/file/downloadTempFile", {fileName: fileName}, fileName.split(".")[0] + "[" + dayjs().format('YYYYMMDDHHmmssSSS') + "]."+fileName.split(".")[1], "导出失败!");
+  return handleDownloadByGet("/api/system/file/downloadTempFile", {fileName: fileName}, fileName, "导出失败!");
+  // return handleDownloadByGet("/api/system/file/downloadTempFile", {fileName: fileName}, fileName.split(".")[0] + "[" + dayjs().format('YYYYMMDDHHmmssSSS') + "]."+fileName.split(".")[1], "导出失败!");
 };
 
 export function exportExcel(url, params, fileName) {

+ 15 - 17
vue/src/views/companyService/post/index.vue

@@ -8,25 +8,23 @@
           </a-form-item>
         </a-col>
         <a-col :span="6">
-          <a-form-item label="" :label-col="{span:6}" name="">
-            <label style="margin-left:26px;">招聘人数:</label>
-            <a-input type="number" v-model:value="searchParams.minCount" style="width: 30%;margin-right: 10px;"
-                     placeholder=""/>
-            <a-input type="number" v-model:value="searchParams.maxCount" style="width: 30%;" placeholder=""
-            />
-          </a-form-item>
+        <a-form-item label="招聘企业" :label-col="{span:6}" name="companyName">
+          <a-select ref="select" @change="loadData"
+                    show-search optionFilterProp="label"
+                    v-model:value="searchParams.companyName"
+                    :allow-clear="true">
+            <a-select-option v-for="item in companyList" :label="item.companyName" :value="item.companyName"
+                             :key="item.companyID">
+              <span>{{ item.companyName }}</span>
+            </a-select-option>
+          </a-select>
+        </a-form-item>
         </a-col>
         <a-col :span="6">
-          <a-form-item label="招聘企业" :label-col="{span:6}" name="companyName">
-           <a-select ref="select" @change="loadData"
-                      show-search optionFilterProp="label"
-                      v-model:value="searchParams.companyName"
-                      :allow-clear="true">
-              <a-select-option v-for="item in companyList" :label="item.companyName" :value="item.companyName"
-                               :key="item.companyID">
-                <span>{{ item.companyName }}</span>
-              </a-select-option>
-            </a-select>
+          <a-form-item label="招聘人数" :label-col="{span:6}" name="recruitCount">
+            <a-input type="number" v-model:value="searchParams.minCount" style="width:110px;" placeholder="" />
+            <label style="margin:10px;">-</label>
+            <a-input type="number" v-model:value="searchParams.maxCount" style="width:110px;" placeholder="" />
           </a-form-item>
         </a-col>
         <a-col :span="6" style="text-align: left">

+ 110 - 123
vue/src/views/jobUserManager/jobuser/edit.vue

@@ -16,18 +16,87 @@
           </a-form-item>
         </a-col>
         <a-col :span="8">
-          <a-form-item label="性别" :label-col="{span:6}"
-                       name="sex" :rules="[{ required: true, message: '请选择性别!' }]">
+        <a-form-item label="性别" :label-col="{span:6}"
+                     name="sex" :rules="[{ required: true, message: '请选择性别!' }]">
+          <a-select
+            ref="select"
+            v-model:value="dataModel.sex"
+            :options="genderList"
+            :field-names="{ label: 'name', value: 'value' }"
+            :allow-clear="true"
+          >
+          </a-select>
+        </a-form-item>
+      </a-col>
+      </a-row>
+
+      <a-row :gutter="24">
+        <a-col :span="8">
+          <a-form-item label="重点人员类别" :label-col="{span:6}" name="keyPersonTypeID"
+                       :rules="[{ required: true, message: '请选择重点人员类别!' }]">
             <a-select
               ref="select"
-              v-model:value="dataModel.sex"
-              :options="genderList"
+              v-model:value="dataModel.keyPersonTypeID"
+              :options="keyPersonTypeList"
+              :field-names="{ label: 'name', value: 'value' }"
+              :allow-clear="true"
+            >
+            </a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item label="就业状态" :label-col="{span:6}" name="jobStatusID"
+                       :rules="[{ required: true, message: '请选择就业状态!' }]">
+            <a-select
+              ref="select"
+              v-model:value="dataModel.jobStatusID"
+              :options="jobStatusList"
               :field-names="{ label: 'name', value: 'value' }"
               :allow-clear="true"
             >
             </a-select>
           </a-form-item>
         </a-col>
+        <a-col :span="8">
+          <a-form-item label="所属驿站" :label-col="{span:6}" name="siteID"
+                       :rules="[{ required: true, message: '请选择所属驿站!' }]">
+            <a-select
+              ref="select"
+              v-model:value="dataModel.siteID"
+              :options="siteList"
+              :field-names="{ label: 'siteName', value: 'siteID' }"
+              :allow-clear="true"
+            >
+            </a-select>
+          </a-form-item>
+        </a-col>
+      </a-row>
+
+      <a-row :gutter="24">
+        <a-col :span="8">
+          <a-form-item
+            label="联系人"
+            :label-col="{ span: 6 }"
+            name="userName">
+            <a-input v-model:value="dataModel.userName" placeholder=""/>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item label="联系电话" :label-col="{ span: 6 }"
+                       name="userMobile" :rules="[{ required: true, message: '请选择性别!' }]">
+            <a-input v-model:value="dataModel.userMobile" placeholder=""/>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item
+            label="地址"
+            :label-col="{ span: 6 }"
+            name="address"
+            :rules="[{ required: true, message: '请输入地址!' }]"
+          >
+            <a-input v-model:value="dataModel.address" placeholder=""/>
+          </a-form-item>
+        </a-col>
       </a-row>
 
       <a-row :gutter="24">
@@ -103,6 +172,18 @@
             </a-select>
           </a-form-item>
         </a-col>
+        <a-col :span="8">
+        <a-form-item label="婚姻状况" :label-col="{span:6}" name="maritalStatusID">
+          <a-select
+            ref="select"
+            v-model:value="dataModel.maritalStatusID"
+            :options="maritalStatusList"
+            :field-names="{ label: 'name', value: 'value' }"
+            :allow-clear="true"
+          >
+          </a-select>
+        </a-form-item>
+      </a-col>
         <a-col :span="8">
           <a-form-item
             label="血型"
@@ -118,43 +199,31 @@
             </a-select>
           </a-form-item>
         </a-col>
-        <a-col :span="8">
-          <a-form-item
-            label="身高"
-            :label-col="{ span: 6 }"
-            name="height">
-            <a-input v-model:value="dataModel.height" placeholder=""/>
-          </a-form-item>
-        </a-col>
       </a-row>
 
       <a-row :gutter="24">
         <a-col :span="8">
           <a-form-item
-            label="视力"
+            label="身高(cm)"
             :label-col="{ span: 6 }"
-            name="vision">
-            <a-input v-model:value="dataModel.vision" placeholder=""/>
+            name="height">
+            <a-input v-model:value="dataModel.height" placeholder=""/>
           </a-form-item>
         </a-col>
         <a-col :span="8">
           <a-form-item
-            label="体重"
+            label="体重(kg)"
             :label-col="{ span: 6 }"
             name="weight" >
             <a-input v-model:value="dataModel.weight" placeholder=""/>
           </a-form-item>
         </a-col>
         <a-col :span="8">
-          <a-form-item label="婚姻状况" :label-col="{span:6}" name="maritalStatusID">
-            <a-select
-              ref="select"
-              v-model:value="dataModel.maritalStatusID"
-              :options="maritalStatusList"
-              :field-names="{ label: 'name', value: 'value' }"
-              :allow-clear="true"
-            >
-            </a-select>
+          <a-form-item
+            label="视力"
+            :label-col="{ span: 6 }"
+            name="vision">
+            <a-input v-model:value="dataModel.vision" placeholder=""/>
           </a-form-item>
         </a-col>
       </a-row>
@@ -199,32 +268,7 @@
         </a-col>
       </a-row>
 
-      <a-row :gutter="24">
-        <a-col :span="8">
-          <a-form-item
-            label="联系人"
-            :label-col="{ span: 6 }"
-            name="userName">
-            <a-input v-model:value="dataModel.userName" placeholder=""/>
-          </a-form-item>
-        </a-col>
-        <a-col :span="8">
-          <a-form-item label="联系电话" :label-col="{ span: 6 }"
-                       name="userMobile" :rules="[{ required: true, message: '请选择性别!' }]">
-            <a-input v-model:value="dataModel.userMobile" placeholder=""/>
-          </a-form-item>
-        </a-col>
-        <a-col :span="8">
-          <a-form-item
-            label="地址"
-            :label-col="{ span: 6 }"
-            name="address"
-            :rules="[{ required: true, message: '请输入地址!' }]"
-          >
-            <a-input v-model:value="dataModel.address" placeholder=""/>
-          </a-form-item>
-        </a-col>
-      </a-row>
+
 
       <a-row :gutter="24">
         <a-col :span="8">
@@ -253,65 +297,18 @@
         </a-col>
       </a-row>
 
-      <a-row :gutter="24">
-        <a-col :span="8">
-          <a-form-item label="所属驿站" :label-col="{span:6}" name="siteID"
-                       :rules="[{ required: true, message: '请选择所属驿站!' }]">
-            <a-select
-              ref="select"
-              v-model:value="dataModel.siteID"
-              :options="siteList"
-              :field-names="{ label: 'siteName', value: 'siteID' }"
-              :allow-clear="true"
-            >
-            </a-select>
-          </a-form-item>
-        </a-col>
-        <a-col :span="8">
-          <a-form-item label="就业状态" :label-col="{span:6}" name="jobStatusID"
-                       :rules="[{ required: true, message: '请选择就业状态!' }]">
-            <a-select
-              ref="select"
-              v-model:value="dataModel.jobStatusID"
-              :options="jobStatusList"
-              :field-names="{ label: 'name', value: 'value' }"
-              :allow-clear="true"
-            >
-            </a-select>
-          </a-form-item>
-        </a-col>
-        <a-col :span="8">
-          <a-form-item label="重点人员类别" :label-col="{span:6}" name="keyPersonTypeID"
-                       :rules="[{ required: true, message: '请选择重点人员类别!' }]">
-            <a-select
-              ref="select"
-              v-model:value="dataModel.keyPersonTypeID"
-              :options="keyPersonTypeList"
-              :field-names="{ label: 'name', value: 'value' }"
-              :allow-clear="true"
-            >
-            </a-select>
-          </a-form-item>
-        </a-col>
-      </a-row>
 
       <a-row :gutter="24">
-        <a-col :span="11">
-          <a-form-item
-            label="兴趣爱好"
-            :label-col="{ span: 4 }"
-            name="hobby" >
-            <a-textarea v-model:value="dataModel.hobby" placeholder="兴趣爱好" :rows="2" style="margin-left: 8px;"/>
+        <a-col :span="16">
+          <a-form-item label="兴趣爱好" :label-col="{ span: 3}" name="hobby" >
+            <a-textarea v-model:value="dataModel.hobby" placeholder="兴趣爱好" :rows="2" />
           </a-form-item>
         </a-col>
       </a-row>
       <a-row :gutter="24">
-        <a-col :span="11">
-          <a-form-item
-            label="其他"
-            :label-col="{ span: 4 }"
-            name="personalSkills" >
-            <a-textarea v-model:value="dataModel.personalSkills" placeholder="个人技能" :rows="4" style="margin-left: 8px;"/>
+        <a-col :span="16">
+          <a-form-item label="个人技能" :label-col="{ span: 3 }" name="personalSkills" >
+            <a-textarea v-model:value="dataModel.personalSkills" placeholder="个人技能" :rows="4" />
           </a-form-item>
         </a-col>
       </a-row>
@@ -330,14 +327,11 @@
       <a-divider orientation="left">教育经历</a-divider>
       <a-row>
         <a-col style="margin-bottom: 20px;">
-          <a-table :columns="educationColumns" :data-source="educationData" :pagination="false"
-                   bordered>
+          <a-table :columns="educationColumns" :data-source="educationData" :pagination="false" bordered>
             <template #bodyCell="{ column ,index}">
               <template v-if="column.key === 'schoolName'">
                 <div>
-                  <a-input
-                    v-model:value="educationData[index][column.key]" style="width: 200px"
-                  />
+                  <a-input v-model:value="educationData[index][column.key]" style="width: 200px" />
                 </div>
               </template>
               <template v-if="column.key === 'cultureRank'">
@@ -347,8 +341,7 @@
                     v-model:value="educationData[index][column.key]"
                     :options="cultureList"
                     :field-names="{ label: 'name', value: 'value' }"
-                    :allow-clear="true" style="width: 200px"
-                  >
+                    :allow-clear="false" style="width: 200px" >
                   </a-select>
                 </div>
               </template>
@@ -356,7 +349,7 @@
                 <div>
                   <a-date-picker
                     v-model:value="educationData[index][column.key]"
-                    picker="date"
+                    picker="date" :allow-clear="false"
                     value-format="YYYY-MM-DD"
                   />
                 </div>
@@ -365,7 +358,7 @@
                 <div>
                   <a-date-picker
                     v-model:value="educationData[index][column.key]"
-                    picker="date"
+                    picker="date" :allow-clear="false"
                     value-format="YYYY-MM-DD"
                   />
                 </div>
@@ -404,20 +397,14 @@
             <template #bodyCell="{ column ,index}">
               <template v-if="column.key === 'startTime'">
                 <div>
-                  <a-date-picker
-                    v-model:value="experienceData[index][column.key]"
-                    picker="date"
-                    value-format="YYYY-MM-DD"
-                  />
+                  <a-date-picker v-model:value="experienceData[index][column.key]"
+                                 picker="date" value-format="YYYY-MM-DD" :allow-clear="false"  />
                 </div>
               </template>
               <template v-if="column.key === 'endTime'">
                 <div>
-                  <a-date-picker
-                    v-model:value="experienceData[index][column.key]"
-                    picker="date"
-                    value-format="YYYY-MM-DD"
-                  />
+                  <a-date-picker v-model:value="experienceData[index][column.key]"
+                                 picker="date" value-format="YYYY-MM-DD" :allow-clear="false"  />
                 </div>
               </template>
               <template v-if="column.key === 'workAddress'">

+ 71 - 80
vue/src/views/system/role/roleUser.vue

@@ -42,55 +42,34 @@
         <a-table :columns="columns" :data-source="roleUserList" :scroll="{ x: 500, y: 500 }" :pagination="pagination"
                  :loading="formState.loading"
                  @change="handleTableChange"
-                 :row-selection="{ selectedRowKeys: formState.selectedRowKeys, onChange: onSelectChange}"
+                 :row-selection="{ selectedRowKeys: formState.selectedRowKeys,onChange:onSelectChange}"
                  :row-key="record=>record.userID"
                  bordered>
         </a-table>
       </div>
     </div>
-    <a-modal v-model:visible="visibleUserModal" title="新增角色用户" cancel-text="取消" :width="700"
-             @ok="saveRoleUser">
-      <a-transfer
-        v-model:target-keys="targetKeys"
-        :data-source="userList"
-        show-search
-        :filter-option="(inputValue, item) => (item.name.indexOf(inputValue) !== -1 || item.loginId.indexOf(inputValue) !== -1)"
-        :show-select-all="false"
-        :list-style="{width: '600px',height: '640px', }"
-      >
-        <template
-          #children="{
-          direction,
-          filteredItems,
-          selectedKeys,
-          disabled: listDisabled,
-          onItemSelectAll,
-          onItemSelect,
-        }"
-        >
-          <a-table
-            :scroll="{ x: 300, y: 500 }"
-            :row-key="record=>record.userID"
-            :row-selection="
-            getRowSelection({
-              disabled:true,
-              selectedKeys,
-              onItemSelectAll,
-              onItemSelect,
-            })
-          "
-            :columns="direction === 'left' ? leftColumns : rightColumns"
-            :data-source="filteredItems"
-            size="small"
-            :custom-row="
-            ({ key }) => ({
-              onClick: () => {
-                onItemSelect(key, !selectedKeys.includes(key));
-              },
-            })
-          "
-            :pagination="false"
-          />
+    <a-modal v-model:visible="visibleUserModal" title="新增角色用户" cancel-text="取消" :width="700"  @ok="saveRoleUser">
+      <a-transfer v-model:target-keys="targetKeys"  :data-source="userList" :disabled="disabled"
+                  :show-search="true" :filter-option="(inputValue, item) => (item.name.indexOf(inputValue) !== -1 || item.loginID.indexOf(inputValue) !== -1)"
+                  :show-select-all="false"  :list-style="{width: '600px',height: '640px', }" >
+          <template #children="{ direction, filteredItems, selectedKeys, disabled:listDisabled, onItemSelectAll, onItemSelect, }"  >
+            <!-- :row-key="record=>record.userID"-->
+          <a-table :row-selection="getRowSelection({
+                      disabled:listDisabled,
+                      selectedKeys,
+                      onItemSelectAll,
+                      onItemSelect,
+                   })"
+                   :columns="direction === 'left' ? leftColumns : rightColumns"
+                   :data-source="filteredItems" size="small"
+                   :scroll="{ x: 300, y: 500 }"
+                   :style="{ pointerEvents: listDisabled ? 'none' : null}"
+                   :custom-row="({ key, disabled: itemDisabled }) => ({
+                      onClick: () => {
+                        if (itemDisabled || listDisabled) return;
+                        onItemSelect(key, !selectedKeys.includes(key));
+                      },
+                   })" />
         </template>
       </a-transfer>
     </a-modal>
@@ -104,27 +83,14 @@ import {deleteRoleUser, getRoleUserList, getUserForSettingList, saveRoleUserList
 import {message, Modal} from "ant-design-vue";
 import {ExclamationCircleOutlined} from "@ant-design/icons-vue";
 
+interface userModel{
+  key:string;
+  userID:string;
+  name:string,
+  loginID:string;
+}
 type tableColumn = Record<string, string>;
-const leftTableColumns = [
-  {
-    dataIndex: 'name',
-    title: '用户名',
-  },
-  {
-    dataIndex: 'loginId',
-    title: '帐号',
-  },
-];
-const rightTableColumns = [
-  {
-    dataIndex: 'name',
-    title: '用户名',
-  },
-  {
-    dataIndex: 'loginId',
-    title: '帐号',
-  }
-];
+
 
 export default defineComponent({
   props: {
@@ -135,7 +101,7 @@ export default defineComponent({
   },
   setup() {
     const roleUserList = ref([]);
-    const userList = ref([]);
+    const userList = ref<userModel[] >([]);
     const visible = ref<boolean>(false);
     const visibleUserModal = ref<boolean>(false);
     const confirmLoading = ref<boolean>(false);
@@ -156,8 +122,8 @@ export default defineComponent({
         key: 'userID',
         customRender: item => `${searchParamsState.rows * (searchParamsState.page - 1) + item.index + 1}`
       },
-      {title: '帐号', dataIndex: 'loginID', key: 'loginID', width: 150},
       {title: '用户名称', width: 150, dataIndex: 'name', key: 'name',},
+      {title: '帐号', dataIndex: 'loginID', key: 'loginID', width: 150},
     ];
     const formState = reactive({
       total: 0,
@@ -170,38 +136,62 @@ export default defineComponent({
       pageSize: searchParamsState.rows,
       showSizeChanger: true
     }));
-    const targetKeys = ref<string[]>();
+
+    const leftTableColumns = [
+      {
+        dataIndex: 'name',
+        title: '用户名',
+      },
+      {
+        dataIndex: 'loginID',
+        title: '帐号',
+      },
+    ];
+    const rightTableColumns = [
+      {
+        dataIndex: 'name',
+        title: '用户名',
+      },
+      {
+        dataIndex: 'loginID',
+        title: '帐号',
+      },
+    ];
     const leftColumns = ref<tableColumn[]>(leftTableColumns);
     const rightColumns = ref<tableColumn[]>(rightTableColumns);
+    const targetKeys = ref<string[]>();
+    const disabled = ref<boolean>(false);
     const getRowSelection = ({
+                               disabled,
                                selectedKeys,
                                onItemSelectAll,
                                onItemSelect,
                              }: Record<string, any>) => {
       return {
-        onSelectAll(selected: boolean, selectedRows: any[]) {
-          const treeSelectedKeys = selectedRows.map((record) => record.userID);
+        getCheckboxProps: (item: Record<string, string | boolean>) => ({
+          disabled: disabled || item.disabled,
+        }),
+        onSelectAll(selected: boolean, selectedRows:Record<string, string | boolean>[]) {
+          const treeSelectedKeys = selectedRows.filter(item=> !item.disabled).map(({key})=>key);
           onItemSelectAll(treeSelectedKeys, selected);
-         /* console.log("当前选择的用户id集合",targetKeys.value);
-          console.log("selectedKeys",selectedKeys);*/
         },
-        onSelect(record: any, selected: boolean) {
-          onItemSelect(record.userID, selected);
-          /*console.log("当前userList",userList.value);
-          console.log("当前选择的用户id集合",targetKeys.value);
-          console.log("selectedKeys",selectedKeys);*/
+        onSelect({ key }: Record<string, string>, selected: boolean) {
+          onItemSelect(key, selected);
         },
         selectedRowKeys: selectedKeys,
       };
     };
 
-
     const onSelectChange = (selectedRowKeys: any) => {
       formState.selectedRowKeys = selectedRowKeys;
     };
     const getUserList = () => {
       getUserForSettingList({userType: userTypeID.value, roleID: searchParamsState.roleID}).then((result: any) => {
         userList.value = result;
+        (userList.value as userModel[]).map(item =>{
+          item.key = item.userID;
+        })
+        /*console.log("userList",userList.value);*/
       });
     };
     const handleTableChange: TableProps['onChange'] = (
@@ -288,16 +278,17 @@ export default defineComponent({
       show,
       handleCancel,
       handleTableChange,
-      onSelectChange,
-      formState,
       onDelete,
-      visibleUserModal,
       addRoleUser,
+      onSelectChange,
       saveRoleUser,
+      formState,
       userList,
+      disabled,
       targetKeys,
       leftColumns,
       rightColumns,
+      visibleUserModal,
       getRowSelection,
       loadRoleUserList
     };

+ 2 - 1
vue/src/views/system/users/addUser.vue

@@ -20,7 +20,8 @@
           </a-col>
           <a-col :span="8">
             <a-form-item label="密码" :label-col="{span:6}" name="password" :rules="[{ required: true, message: '请输入密码!' }]">
-              <a-input v-model:value="dataModel.password" placeholder="" ></a-input>
+<!--              type="password"-->
+              <a-input  v-model:value="dataModel.password" placeholder="" ></a-input>
             </a-form-item>
           </a-col>
         </a-row>

+ 1 - 2
vue/src/views/system/users/index.vue

@@ -37,8 +37,7 @@
       </a-row>
       <a-row class="edit-operation">
         <a-col :span="24" style="text-align: right">
-<!--          functioncode="T01030202"-->
-          <a-button type="primary" html-type="submit" @click='onAdd' >新增</a-button>
+          <a-button type="primary" html-type="submit" functioncode="T0199010105" @click='onAdd' >新增</a-button>
         </a-col>
       </a-row>
     </a-form>

+ 27 - 33
vue/src/views/taskAndLog/dotask/index.vue

@@ -9,28 +9,17 @@
         </a-col>
         <a-col  :span="6">
           <a-form-item label="下达时间" :label-col="{span:6}" name="orderDate">
-            <a-range-picker format="YYYY-MM-DD" :placeholder="['开始日期', '结束日期']" @change="onRangeChange"/>
+            <a-range-picker format="YYYY-MM-DD" v-model:value="orderDate" :placeholder="['开始日期', '结束日期']" @change="onRangeChange"/>
           </a-form-item>
         </a-col>
         <a-col  :span="6">
           <a-form-item label="完成时间" :label-col="{span:6}" name="finishDate">
-            <a-range-picker format="YYYY-MM-DD" :placeholder="['开始日期', '结束日期']" @change="onFinishChange"/>
+            <a-range-picker format="YYYY-MM-DD" v-model:value="finishDate" :placeholder="['开始日期', '结束日期']" @change="onFinishChange"/>
           </a-form-item>
         </a-col>
-        <a-col :span="5" style="text-align: left">
+        <a-col :span="6" style="text-align: left">
           <a-button type="primary" html-type="submit" @click="onSearch">查询</a-button>
-          <a-button
-            style="margin: 0 8px"
-            @click='
-              () => {
-                /*searchParams.StartTime = dayjs().format("YYYY-MM-DD");
-                searchParams.EndTime = dayjs().format("YYYY-MM-DD");
-                searchParams.finishStartTime = dayjs().format("YYYY-MM-DD");
-                searchParams.finishEndTime = dayjs().format("YYYY-MM-DD");*/
-                formRef.resetFields();
-                loadData();
-              }
-            '>重置</a-button>
+          <a-button style="margin: 0 8px" @click="formRef.resetFields();onReset();">重置</a-button>
           <a style="font-size: 12px" @click="expand = !expand">
             <template v-if="expand">
               <UpOutlined />
@@ -183,6 +172,8 @@ export default defineComponent({
     const regionList = ref<SelectProps['options']>();
     const streetList = ref<SelectProps['options']>();
     const taskTypeList = ref<SelectProps['options']>();
+    const orderDate = ref([]);
+    const finishDate = ref([]);
     const dataList = ref([]);
     const expand = ref(false);
 
@@ -232,18 +223,31 @@ export default defineComponent({
       formState.selectedRowKeys = selectedRowKeys;
     };
 
-    const onRangeChange=(dateString)=>{
+    const onRangeChange = (dateString) => {
+      orderDate.value = dateString;
       searchParams.startTime = dateString ? dateString[0].format("YYYY-MM-DD") : '';
       searchParams.endTime = dateString ? dateString[1].format("YYYY-MM-DD") : '';
       loadData();
     }
 
-    const onFinishChange=(dateString)=>{
+    const onFinishChange = (dateString) => {
+      finishDate.value = dateString;
       searchParams.finishStartTime = dateString ? dateString[0].format("YYYY-MM-DD") : '';
       searchParams.finishEndTime = dateString ? dateString[1].format("YYYY-MM-DD") : '';
       loadData();
     }
 
+    const onReset =()=>{
+      orderDate.value =[];
+      finishDate.value =[];
+      searchParams.startTime = '';
+      searchParams.endTime = '';
+      searchParams.finishStartTime =  '';
+      searchParams.finishEndTime =  '';
+      loadData();
+    };
+
+
     const onSearch = () => {
       loadData();
     }
@@ -277,19 +281,10 @@ export default defineComponent({
 
     };
 
-    const importPost = () => {
-      console.log('导入');
-    }
-    const exportPost = () => {
-      console.log('导出');
-    }
-    const onOperates = () => {
-      console.log('新增');
-    };
-
     return {
-      changeCity,
       expand,
+      orderDate,
+      finishDate,
       regionList,
       streetList,
       taskTypeList,
@@ -300,14 +295,13 @@ export default defineComponent({
       pagination,
       dataList,
       handleTableChange,
-      onSelectChange,
-      onSearch,
-      onOperates,
-      importPost,
-      exportPost,
       onDel,
+      onReset,
+      onSearch,
+      onSelectChange,
       onRangeChange,
       onFinishChange,
+      changeCity,
       loadData,
       onAdd,
       onEdit,

+ 12 - 9
vue/src/views/taskAndLog/dowork/index.vue

@@ -8,8 +8,9 @@
           </a-form-item>
         </a-col>
         <a-col :span="6">
-          <a-form-item label="工作日期" :label-col="{span:6}" name="workTime">
-            <a-range-picker format="YYYY-MM-DD" :placeholder="['开始日期', '结束日期']" @change="onRangeChange"/>
+          <a-form-item label="工作日期" :label-col="{span:6}" name="workDate">
+            <a-range-picker format="YYYY-MM-DD"  :placeholder="['开始日期', '结束日期']"
+                            v-model:value="workDate" @change="onRangeChange"/>
           </a-form-item>
         </a-col>
         <a-col :span="6">
@@ -22,9 +23,7 @@
         </a-col>
         <a-col :span="6" style="text-align: left">
           <a-button type="primary" html-type="submit" @click="onSearch">查询</a-button>
-          <a-button style="margin: 0 8px" @click="
-          formRef.resetFields();
-          onReset();">重置</a-button>
+          <a-button style="margin: 0 8px" @click="formRef.resetFields();onReset();">重置</a-button>
           <a style="font-size: 12px" @click="expand = !expand">
             <template v-if="expand">
               <UpOutlined />
@@ -111,12 +110,13 @@ export default defineComponent({
     const formRef = ref<FormInstance>();
     const tabsViewStore = useTabsViewStore();
     const expand = ref(false);
+    const workDate = ref([]);
     const searchParams = reactive({
       pageIndex: 1,
       pageSize: 20,
       userName:'',
-      workStartDate:null,
-      workEndDate:null,
+      workStartDate:'',
+      workEndDate:'',
       doTypeID: null,
       regionCode:'',
       streetCode:''
@@ -201,6 +201,7 @@ export default defineComponent({
     };
 
     const onRangeChange=(dateString)=>{
+      workDate.value = dateString;
       searchParams.workStartDate = dateString ? dateString[0].format("YYYY-MM-DD") : '';
       searchParams.workEndDate = dateString ? dateString[1].format("YYYY-MM-DD") : '';
       loadData();
@@ -250,14 +251,16 @@ export default defineComponent({
     };
 
     const onReset =()=>{
-        searchParams.workStartDate = null;
-        searchParams.workEndDate = null;
+        workDate.value =[];
+        searchParams.workStartDate = '';
+        searchParams.workEndDate = '';
         loadData();
     };
 
     return {
       formRef,
       expand,
+      workDate,
       logTypeList,
       regionList,
       streetList,