Browse Source

app-工作日志

liao-sea 1 year ago
parent
commit
f255901243

+ 2 - 2
h5app/src/api/jobUserInfo/index.ts

@@ -1,6 +1,6 @@
 import {request} from '@/utils/request';
 
-export function getList(params: any) {
+export function getJobUserList(params: any) {
     return request(
         {
             url: 'jobUserService/jobUser/getList',
@@ -24,7 +24,7 @@ export function getJobUserDataList(){
     );
 }
 
-export function getDataById(id: any) {
+export function getJobUserById(id: any) {
     return request(
         {
             url: 'jobUserService/jobUser/getDataById',

+ 41 - 0
h5app/src/api/workLog/index.ts

@@ -0,0 +1,41 @@
+import {request} from '@/utils/request';
+
+export function getWorkLogList(params: any) {
+    return request(
+        {
+            url: 'doWork/getList',
+            method: 'get',
+            params: params,
+        },
+        { isNew: true },
+    );
+}
+
+
+
+export function getWorkLogById(doWorkID:string) {
+    return request(
+        {
+            url: 'doWork/get',
+            method: 'get',
+            params: {doWorkID:doWorkID},
+        },
+        { isNew: true },
+    );
+}
+
+export function saveWorkLog(data: any) {
+    return request(
+        {
+            url: "doWork/save",
+            method: 'post',
+            data: data
+        },
+        {
+            isNew: true,
+            errorMsg: '提交失败!'
+        },
+    );
+}
+
+

+ 110 - 98
h5app/src/views/pages/jobuser/edit.vue

@@ -20,7 +20,7 @@
         </div>
       </div>
       <form ref="editForm" @submit.prevent="onSave">
-        <ion-list class="canvasWrapper"  v-if="curStepData.statusVal==1">
+        <div class="panel-content"  v-if="curStepData.statusVal==1">
           <ion-item-group>
             <ion-item>
               <div class="panel-title2">
@@ -28,27 +28,27 @@
                 基本信息
               </div>
             </ion-item>
-            <ion-item :class="[baseDataValid.baseData.name.$error?'ion-invalid':'ion-valid']">
+            <ion-item mode="md" :class="[baseDataValid.baseData.name.$error?'ion-invalid':'ion-valid']">
               <ion-label>姓名<span class="danger">*</span></ion-label>
               <ion-input name="name" id="name" style="text-align: right;"  placeholder="请输入姓名" v-model="baseData.name" ></ion-input>
               <ion-note slot="error">姓名不能为空</ion-note>
             </ion-item>
-            <ion-item :class="[baseDataValid.baseData.identityNumber.$error?'ion-invalid':'ion-valid']">
+            <ion-item mode="md" :class="[baseDataValid.baseData.identityNumber.$error?'ion-invalid':'ion-valid']">
               <ion-label>公民身份号码<span class="danger">*</span></ion-label>
               <ion-input name="identityNumber" id="identityNumber" style="text-align: right;"  placeholder="请输入身份证号码" v-model="baseData.identityNumber" ></ion-input>
               <ion-note slot="error">公民身份号码不能为空</ion-note>
             </ion-item>
-            <ion-item :class="[baseDataValid.baseData.sex.$error?'ion-invalid':'ion-valid']">
+            <ion-item mode="md" :class="[baseDataValid.baseData.sex.$error?'ion-invalid':'ion-valid']">
               <ion-label>性别<span class="danger">*</span></ion-label>
-              <ion-select name="sex" id="sex" okText="确定" cancelText="取消" v-model="baseData.sex"
-                          interface="action-sheet" placeholder="请选择性别" >
-                <ion-select-option v-for=" (it,key) in genderList" :key="key" :value="it.value">
+              <ion-select name="sex" id="sex" okText="确定" cancelText="取消"
+                          interface="action-sheet"   v-model="baseData.sex" placeholder="请选择性别" >
+                <ion-select-option v-for=" (it,key) in genderList" :key="key"  :value="it.value">
                   {{ it.name }}
                 </ion-select-option>
               </ion-select>
               <ion-note slot="error">性别不能为空</ion-note>
             </ion-item>
-            <ion-item :class="[baseDataValid.baseData.jobStatusID.$error?'ion-invalid':'ion-valid']">
+            <ion-item mode="md" :class="[baseDataValid.baseData.jobStatusID.$error?'ion-invalid':'ion-valid']">
               <ion-label>就业状态<span class="danger">*</span></ion-label>
               <ion-select name="jobStatusID"  id="jobStatusID" okText="确定" cancelText="取消" v-model="baseData.jobStatusID"
                           interface="action-sheet" placeholder="请选择就业状态" >
@@ -58,7 +58,7 @@
               </ion-select>
               <ion-note slot="error">就业状态不能为空</ion-note>
             </ion-item>
-            <ion-item :class="[baseDataValid.baseData.keyPersonTypeID.$error?'ion-invalid':'ion-valid']">
+            <ion-item mode="md" :class="[baseDataValid.baseData.keyPersonTypeID.$error?'ion-invalid':'ion-valid']">
               <ion-label>重点人员类别<span class="danger">*</span></ion-label>
               <ion-select name="keyPersonTypeID"  id="keyPersonTypeID" okText="确定" cancelText="取消" v-model="baseData.keyPersonTypeID"
                           interface="action-sheet" placeholder="请选择重点人员类别" >
@@ -68,17 +68,17 @@
               </ion-select>
               <ion-note slot="error">重点人员类别不能为空</ion-note>
             </ion-item>
-            <ion-item :class="[baseDataValid.baseData.userMobile.$error?'ion-invalid':'ion-valid']">
+            <ion-item mode="md" :class="[baseDataValid.baseData.userMobile.$error?'ion-invalid':'ion-valid']">
               <ion-label>联系电话<span class="danger">*</span></ion-label>
               <ion-input name="userMobile" id="userMobile"  style="text-align: right;" placeholder="请输入联系电话" v-model="baseData.userMobile" ></ion-input>
               <ion-note slot="error">联系电话不能为空</ion-note>
             </ion-item>
-            <ion-item :class="[baseDataValid.baseData.address.$error?'ion-invalid':'ion-valid']">
+            <ion-item mode="md" :class="[baseDataValid.baseData.address.$error?'ion-invalid':'ion-valid']">
               <ion-label>地址<span class="danger">*</span></ion-label>
               <ion-input name="address" id="address"  style="text-align: right;"  placeholder="请输入地址" v-model="baseData.address" ></ion-input>
               <ion-note slot="error">地址不能为空</ion-note>
             </ion-item>
-            <ion-item :class="[baseDataValid.baseData.siteID.$error?'ion-invalid':'ion-valid']"  >
+            <ion-item mode="md" :class="[baseDataValid.baseData.siteID.$error?'ion-invalid':'ion-valid']"  >
               <ion-label>所属驿站<span class="danger">*</span></ion-label>
               <ion-select name="siteID"  id="siteID" okText="确定" cancelText="取消" v-model="baseData.siteID"
                           interface="action-sheet" placeholder="请选择所属驿站" >
@@ -192,8 +192,8 @@
               <ion-input name="hobby" id="hobby"  style="text-align: right;"  placeholder="请输入兴趣爱好" v-model="baseData.hobby" ></ion-input>
             </ion-item>
           </ion-item-group>
-        </ion-list>
-        <ion-list class="canvasWrapper"  v-if="curStepData.statusVal==2">
+        </div>
+        <div class="panel-content"  v-if="curStepData.statusVal==2">
           <ion-item>
             <div class="panel-title2">
               <div class="item-flag"></div>
@@ -204,16 +204,28 @@
                         @click="onPathForward('./educationEdit',null,null,2)"></ion-icon>
             </ion-buttons>
           </ion-item>
+          <!--<ion-refresher pulling-text="下拉刷新" @ionRefresh="onRefresh()"></ion-refresher>-->
           <ion-item v-for="(record,key) in educationList" :key="key" >
               <ion-label>
                 <h3>{{record.schoolName}}</h3>
-                <p>{{record.schoolTimeStr}}至{{record.overTimeStr}}</p>
+                <p>{{dayjs(record.schoolTime).format("YYYY-MM-DD")}}至{{dayjs(record.overTime).format("YYYY-MM-DD")}}</p>
               </ion-label>
               <img alt="" src="@/assets/icon/forward.png" style="width:32px;height:32px;"
                    @click="onPathForward('./educationEdit',record.educationID,null,2)"  />
-            </ion-item>
-        </ion-list>
-        <ion-list class="canvasWrapper"  v-if="curStepData.statusVal==3">
+          </ion-item>
+          <div v-show="educationList.length==0" class="grid-content" style="padding:10px 10px">
+            <ion-text color="tertiary">
+              <h6>查询无数据</h6>
+            </ion-text>
+          </div>
+          <ion-infinite-scroll  threshold="100px" @ionInfinite="onScroll($event)">
+            <ion-infinite-scroll-content
+                :loadingText="pageParams.total>pageParams.pageIndex*pageParams.pageSize?'正在加载...':'暂无更多'"
+                loadingSpinner="bubbles">
+            </ion-infinite-scroll-content>
+          </ion-infinite-scroll>
+        </div>
+        <div class="panel-content"  v-if="curStepData.statusVal==3">
           <ion-item>
             <div class="panel-title2">
               <div class="item-flag"></div>
@@ -224,6 +236,7 @@
                         @click="onPathForward('./jobHuntEdit',null,null,3)"></ion-icon>
             </ion-buttons>
           </ion-item>
+          <!--<ion-refresher pulling-text="下拉刷新" @ionRefresh="onRefresh"></ion-refresher>-->
           <ion-item v-for="(record,key) in jobHuntList" :key="key" >
             <ion-label>
               <h3>{{record.jobUserTypeStr}}</h3>
@@ -232,7 +245,18 @@
             <img alt="" src="@/assets/icon/forward.png" class="iconBtn"
                  @click="onPathForward( './jobHuntEdit',null,record.jobHuntID,3)"  />
           </ion-item>
-        </ion-list>
+          <div v-show="jobHuntList.length==0" class="grid-content" style="padding:10px 10px">
+            <ion-text color="tertiary">
+              <h6>查询无数据</h6>
+            </ion-text>
+          </div>
+          <ion-infinite-scroll  threshold="100px" @ionInfinite="onScroll($event)">
+            <ion-infinite-scroll-content
+                :loadingText="pageParams.total>pageParams.pageIndex*pageParams.pageSize?'正在加载...':'暂无更多'"
+                loadingSpinner="bubbles">
+            </ion-infinite-scroll-content>
+          </ion-infinite-scroll>
+        </div>
         <ion-button class="next-btn" type="submit" v-if="curStepData.statusVal!=3">下一步</ion-button>
         <ion-button class="next-btn" @click="onFinish" v-if="curStepData.statusVal==3">完  成</ion-button>
       </form>
@@ -246,7 +270,7 @@ import {useRoute, useRouter} from "vue-router";
 import {required} from "@vuelidate/validators";
 import {useVuelidate} from "@vuelidate/core";
 import {getRegionCodeList,getStreetCodeList} from "@/api/system/area";
-import {getDataById,baseInfoSave} from "@/api/jobUserInfo";
+import {getJobUserById,baseInfoSave} from "@/api/jobUserInfo";
 import {getEducationListByJobUserID} from "@/api/education";
 import {getJobHuntListByJobUserID} from "@/api/jobHuntInfo";
 import {getSiteDataList} from "@/api/siteInfo";
@@ -258,13 +282,6 @@ interface SelectProps {
   name: string,
   value: string
 }
-interface educationModel{
-  schoolName:string,
-  schoolTimeStr:string,
-  schoolTime:Date,
-  overTimeStr:string
-  overTime:Date
-}
 interface StepParams{
   name: string,
   statusVal: number
@@ -296,11 +313,8 @@ export default defineComponent({
     const provinceList  = ref([{code:'440000000000000',name:'广东省'}]);
     const regionList  = ref<SelectProps[]>([]);
     const streetList  = ref<SelectProps[]>([]);
-
-
-    const educationList = ref<educationModel[]>([]);
+    const educationList = ref([]);
     const jobHuntList = ref<SelectProps[]>([]);
-
     const baseInfoData = reactive({baseData:{
         jobUserID:null,
         siteID:null,
@@ -328,10 +342,10 @@ export default defineComponent({
         hobby:null,
         personalSkills:null,
       }});
-
     const pageParams = reactive({
       pageIndex: 1,
-      pageSize: 10,
+      pageSize: 5,
+      total:0,
       jobUserID:''
     });
     const baseDataRule = computed(()=>{
@@ -360,6 +374,16 @@ export default defineComponent({
 
       await alert.present();
     }
+
+    const onBack = () => {
+      curStepData.value.statusVal-=1;
+      if(curStepData.value.statusVal > 0){
+        router.push({path:"./edit", query: {reload:0,educationID:null,jobHuntID:null,jobUserID: baseInfoData.baseData.jobUserID,status:curStepData.value.statusVal}});
+      }else{
+        router.push("./list");
+      }
+    }
+
     const onSave = async function (){
       if (curStepData.value.statusVal==1){
         const isFormCorrect = await baseDataValid.value.$validate();
@@ -369,12 +393,12 @@ export default defineComponent({
         }
         baseInfoSave(baseInfoData.baseData).then(result => {
           if (result) {
-            router.push({path: './edit', query: {reload:1,jobUserID: baseInfoData.baseData.jobUserID,status:2}});
+            router.push({path: './edit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:2}});
           }
         });
       }
       else if (curStepData.value.statusVal==2){
-         await router.push({path: './edit', query: {reload:1,jobUserID: baseInfoData.baseData.jobUserID,status:3}});
+         await router.push({path: './edit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:3}});
       }
     }
 
@@ -382,51 +406,48 @@ export default defineComponent({
       router.push({path: pathValue, query: {reload:1,educationID:educationIDValue,jobHuntID:jobHuntIDValue,jobUserID: baseInfoData.baseData.jobUserID,status:statusValue}});
     }
 
+    const onRefresh =() => {
+      pageParams.pageIndex = 1;
+      loadData(pageParams.jobUserID,curStepData.value.statusVal);
+    }
+
+    const onScroll = (e: any) => {
+        console.log("total",pageParams.total);
+        setTimeout(() => {
+          e.target.complete();
+          if (pageParams.total > pageParams.pageIndex * pageParams.pageSize) {
+            pageParams.pageIndex += 1;
+            loadData(pageParams.jobUserID,curStepData.value.statusVal);
+          }
+        }, 500);
+    }
+
     const onFinish = () => {
       router.push("./list");
     }
 
-    const onBack = () => {
-      curStepData.value.statusVal-=1;
-      if(curStepData.value.statusVal > 0){
-        onPathForward("./edit",null,null,curStepData.value.statusVal);
-      }else{
-        router.push("./list");
-      }
+    /*下拉字典查询*/
+    const getSelectorDataList = async function(){
+      const genderResult :any = await getSysDictionaryList("Gender");
+      genderList.value = genderResult;
+      const jobUserStatusResult :any = await getSysDictionaryList("JobStatus");
+      jobUserStatusList.value = jobUserStatusResult;
+      const keyPersonTypeResult :any = await getSysDictionaryList("KeyPersonType");
+      keyPersonTypeList.value = keyPersonTypeResult;
+      const cultureRankResult :any = await getSysDictionaryList("CultureLevel");
+      cultureRankList.value = cultureRankResult;
+      const userHealthResult :any = await getSysDictionaryList("Health");
+      userHealthList.value = userHealthResult;
+      const bloodTypeResult :any = await getSysDictionaryList("BloodType");
+      bloodTypeList.value = bloodTypeResult;
+      const maritalStatusResult :any = await getSysDictionaryList("MaritalStatus");
+      maritalStatusList.value = maritalStatusResult;
     }
 
     const getSiteInfoList = async function(){
       const siteInfoResult :any = await getSiteDataList();
       siteInfoList.value = siteInfoResult;
     }
-    const getGenderList = async function(){
-      const data :any = await getSysDictionaryList("Gender");
-      genderList.value = data;
-    }
-    const getJobUserStatusList = async function() {
-      const data :any = await getSysDictionaryList("JobStatus");
-      jobUserStatusList.value = data;
-    }
-    const getKeyPersonTypeList = async function() {
-      const data :any = await getSysDictionaryList("KeyPersonType");
-      keyPersonTypeList.value = data;
-    }
-    const getCultureRankList = async function(){
-      const data :any = await getSysDictionaryList("CultureLevel");
-      cultureRankList.value = data;
-    }
-    const getHealthTypeList = async function(){
-      const data :any = await getSysDictionaryList("Health");
-      userHealthList.value = data;
-    }
-    const getBloodTypeList = async function(){
-      const data :any = await getSysDictionaryList("BloodType");
-      bloodTypeList.value = data;
-    }
-    const getMaritalStatusList = async function(){
-      const data :any = await getSysDictionaryList("MaritalStatus");
-      maritalStatusList.value = data;
-    }
     const getRegionList = async function(){
       const regionResult: any = await getRegionCodeList();
       regionList.value = regionResult;
@@ -449,26 +470,25 @@ export default defineComponent({
 
     const loadData = async (jobUserID: any,status:any) => {
       pageParams.jobUserID = jobUserID;
-      console.log("当前jobUserID",pageParams);
       baseInfoData.baseData.jobUserID = jobUserID;
       curStepData.value.statusVal = status;
+      console.log("当前jobUserID",jobUserID);
       if(curStepData.value.statusVal==1){
-        const reqData = await getDataById(jobUserID);
+        const reqData = await getJobUserById(jobUserID);
         baseInfoData.baseData = reqData;
         console.log('baseData',baseInfoData.baseData);
         await getStreetList();
       }
       else if(curStepData.value.statusVal==2){
-        const data :any = await getEducationListByJobUserID(pageParams);
-        educationList.value = data.list;
-        educationList.value.map(item=>{
-          item.schoolTimeStr = dayjs(item.schoolTime).format('YYYY-MM-DD');
-          item.overTimeStr = dayjs(item.overTime).format('YYYY-MM-DD');
-        })
+        const reqData :any = await getEducationListByJobUserID(pageParams);
+        educationList.value = reqData.list;
+        pageParams.total = reqData.total;
+        console.log("educationList",educationList.value);
       }
       else if(curStepData.value.statusVal==3){
         const reqData = await getJobHuntListByJobUserID(pageParams);
         jobHuntList.value= reqData.list;
+        pageParams.total = reqData.total;
         console.log("jobHuntList",jobHuntList.value);
       }
     };
@@ -481,6 +501,7 @@ export default defineComponent({
 
     const reload = (jobUserID:any,status:any) => {
       expand.value = false;
+      onRefresh();
       loadData(jobUserID,status);
     }
 
@@ -493,10 +514,13 @@ export default defineComponent({
       ...toRefs(baseInfoData),
       arrowBackOutline,
       addCircleOutline,
-      editForm,
+      route,
+      router,
       expand,
-      curStepData,
+      editForm,
       stepList,
+      curStepData,
+      baseDataValid,
       siteInfoList,
       genderList,
       pageParams,
@@ -517,33 +541,21 @@ export default defineComponent({
       onSave,
       onBack,
       onFinish,
+      onRefresh,
+      onScroll,
       onPathForward,
       loadData,
       reload,
-      route,
-      router,
-      baseDataValid,
       getSiteInfoList,
-      getGenderList,
-      getJobUserStatusList,
-      getKeyPersonTypeList,
-      getCultureRankList,
-      getHealthTypeList,
-      getBloodTypeList,
-      getMaritalStatusList,
+      getSelectorDataList,
       getRegionList,
-      getStreetList
+      getStreetList,
+      dayjs
     }
   },
   mounted(){
     this.getSiteInfoList();
-    this.getGenderList();
-    this.getJobUserStatusList();
-    this.getKeyPersonTypeList();
-    this.getCultureRankList();
-    this.getHealthTypeList();
-    this.getBloodTypeList();
-    this.getMaritalStatusList();
+    this.getSelectorDataList();
     this.getRegionList();
     this.getStreetList();
     const jobUserID = this.route.query.jobUserID;

+ 2 - 4
h5app/src/views/pages/jobuser/educationEdit.vue

@@ -60,7 +60,7 @@
                               dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
                               :show-default-buttons="true">
                 </ion-datetime>
-              </ion-modal>
+              </ion-modal>-
               <ion-datetime-button datetime="overTime"></ion-datetime-button>
               <ion-modal :keep-contents-mounted="true">
                 <ion-datetime id="overTime" placeholder="日期"
@@ -79,7 +79,7 @@
   </ion-page>
 </template>
 <script lang="ts">
-import {arrowBackOutline, addCircleOutline} from 'ionicons/icons';
+import {arrowBackOutline} from 'ionicons/icons';
 import {reactive,defineComponent, computed,ref,toRefs} from "vue";
 import {useRoute,useRouter} from "vue-router";
 import {required} from "@vuelidate/validators";
@@ -87,7 +87,6 @@ import {useVuelidate} from "@vuelidate/core";
 import {getEducationByID,saveEducation} from "@/api/education";
 import {getSysDictionaryList} from '@/api/system/dictionary';
 import {alertController, onIonViewDidEnter} from "@ionic/vue";
-import type {Datetime} from "@ionic/core/dist/types/components/datetime/datetime";
 
 interface educationModel {
   dataModel:any
@@ -188,7 +187,6 @@ export default defineComponent({
     return {
       ...toRefs(educationData),
       arrowBackOutline,
-      addCircleOutline,
       editForm,
       curStepData,
       stepList,

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

@@ -57,9 +57,9 @@
             </ion-item>
             <ion-item :class="[huntDataValid.dataModel.maxSalary.$error||huntDataValid.dataModel.minSalary.$error?'ion-invalid':'ion-valid']">
               <ion-label>月薪要求<span class="danger">*</span></ion-label>
-              <ion-input name="minSalary" id="minSalary" style="text-align: right;" placeholder="输入最低薪资" v-model="dataModel.minSalary" ></ion-input>
+              <ion-input name="minSalary" id="minSalary" style="text-align: center;" placeholder="输入最低薪资" v-model="dataModel.minSalary" ></ion-input>
-              <ion-input name="maxSalary" id="maxSalary" style="text-align: right;" placeholder="输入最高薪资" v-model="dataModel.maxSalary" ></ion-input>
+              <ion-input name="maxSalary" id="maxSalary" style="text-align: center;" placeholder="输入最高薪资" v-model="dataModel.maxSalary" ></ion-input>
               <ion-note slot="error">月薪要求不能为空</ion-note>
             </ion-item>
             <ion-item :class="[huntDataValid.dataModel.workYear.$error?'ion-invalid':'ion-valid']">

+ 7 - 6
h5app/src/views/pages/jobuser/list.vue

@@ -13,8 +13,8 @@
     </ion-header>
     <ion-content>
       <ion-item style="margin: 10px 0;">
-        <ion-input style="border: 1px solid #f2f2f5;border-radius: 14px;--padding-start: 10px;height: 35px;"></ion-input>
-        <ion-button slot="end" style="height: 33px;width: 70px;margin-left: 10px;--box-shadow: none;--border-radius: 14px;">搜索</ion-button>
+        <ion-input v-model="searchParamsState.name" style="border: 1px solid #f2f2f5;border-radius: 14px;--padding-start: 10px;height: 35px;"></ion-input>
+        <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">
@@ -44,7 +44,7 @@ import {useRouter} from "vue-router";
 import {computed, defineComponent, reactive, ref} from 'vue';
 import {arrowBackOutline,addCircleOutline} from 'ionicons/icons';
 import {IonIcon, onIonViewDidEnter} from '@ionic/vue';
-import {getList} from "@/api/jobUserInfo";
+import {getJobUserList} from "@/api/jobUserInfo";
 
 export default defineComponent({
   name: 'jobUserList',
@@ -52,7 +52,8 @@ export default defineComponent({
   setup() {
     const searchParamsState = reactive({
       pageIndex: 1,
-      pageSize: 10
+      pageSize: 10,
+      name:''
     });
     const formState = reactive({
       total: 0,
@@ -68,10 +69,9 @@ export default defineComponent({
     const router = useRouter();
     const colors = ref(["secondary", "tertiary", "success", "warning"]);
 
-
     const loadData = async function () {
       formState.loading = true;
-      const result: any = await getList(searchParamsState);
+      const result: any = await getJobUserList(searchParamsState);
       dataList.value = dataList.value.concat(result.list);
       console.log("dataList",dataList.value);
       formState.total = result.total;
@@ -97,6 +97,7 @@ export default defineComponent({
     const onAdd = () => {
       router.push({path: './edit', query: {reload:1,id:null,status:1}});
     }
+
     const onBack =()=>{
       router.push('../');
     }

+ 100 - 69
h5app/src/views/pages/work/log/edit.vue

@@ -3,29 +3,47 @@
     <ion-header class="header-theme2">
       <ion-toolbar>
         <ion-buttons slot="start">
-          <ion-icon :icon="arrowBackOutline" @click="()=>router.push('./list')"></ion-icon>
+          <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-item>
-            <ion-input type="date" label="工作日志日期" label-placement="stacked" :clear-input="true"
-                       placeholder="工作日志日期"
-                       v-model="dataModel.logDate">
-            </ion-input>
+          <ion-item  mode="md"  :class="[workLogValid.dataModel.workTime.$error?'ion-invalid':'ion-valid']">
+            <ion-label>工作日志日期<span class="danger">*</span></ion-label>
+            <ion-datetime-button datetime="workTime"></ion-datetime-button>
+            <ion-modal :keep-contents-mounted="true">
+              <ion-datetime id="workTime" placeholder="日期"
+                            v-model="dataModel.workTime"
+                            dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                            :show-default-buttons="true">
+              </ion-datetime>
+            </ion-modal>
+            <ion-note slot="error">日志类型不能为空</ion-note>
           </ion-item>
-          <ion-item>
-            <ion-input label="日志类型" label-placement="stacked" :clear-input="true"
-                       placeholder="日志类型">
-            </ion-input>
+          <ion-item  mode="md" :class="[workLogValid.dataModel.doTypeID.$error?'ion-invalid':'ion-valid']">
+            <ion-label>日志类型<span class="danger">*</span></ion-label>
+            <ion-select name="doTypeID"  id="doTypeID" okText="确定" cancelText="取消" v-model="dataModel.doTypeID"
+                        interface="action-sheet" placeholder="请选择日志类型" >
+              <ion-select-option v-for=" (it,key) in logTypeList" :key="key" :value="it.value">
+                {{ it.name }}
+              </ion-select-option>
+            </ion-select>
+            <ion-note slot="error">日志类型不能为空</ion-note>
           </ion-item>
-          <ion-item>
-            <ion-textarea label="工作内容" label-placement="stacked" placeholder="工作内容" rows="8"></ion-textarea>
+          <ion-label style="padding-left:16px;padding-top:10px;">工作内容<span class="danger">*</span></ion-label>
+          <ion-item  mode="md"  :class="[workLogValid.dataModel.workContent.$error?'ion-invalid':'ion-valid']">
+              <ion-textarea name="workContent" id="workContent" v-model="dataModel.workContent"  label-placement="stacked"
+                            style="text-align: right;" placeholder="请输入工作内容" rows="8"></ion-textarea>
+            <ion-note slot="error">工作内容不能为空</ion-note>
           </ion-item>
         </ion-list>
       </form>
@@ -36,16 +54,21 @@
   </ion-page>
 </template>
 <script lang="ts">
-import {defineComponent, ref, watch} from "vue";
-/*import {getPracticeBaseForStudentList,getSysAreaList} from "@/api/system/dictionary";
-import {get, save} from "@/api/practice/intention";*/
+import {computed, defineComponent, reactive, ref, toRefs} from "vue";
+import {getSysDictionaryList} from '@/api/system/dictionary';
+import {getWorkLogById,saveWorkLog} from '@/api/workLog';
 import {useRoute, useRouter} from "vue-router";
 import {alertController, onIonViewDidEnter} from "@ionic/vue";
 import {arrowBackOutline} from 'ionicons/icons';
+import {required} from "@vuelidate/validators";
+import {useVuelidate} from "@vuelidate/core";
 
-interface DataModel {
+interface workLogModel {
+  dataModel:any
+}
+interface SelectProps {
   name: string,
-  logDate: null
+  value: string
 }
 
 export default defineComponent({
@@ -53,78 +76,86 @@ export default defineComponent({
   setup() {
     const router = useRouter();
     const route = useRoute();
-    const dataModel = ref<DataModel>({
-      name: '',
-      logDate: null
-    });
+    const editForm = ref();
+    const logTypeList=ref<SelectProps[]>([]);
+    const workLogData = reactive<workLogModel>({dataModel:{
+        doWorkID: null,
+        workTime: null,
+        doTypeID:null,
+        workContent:''
+    }});
+    const workLogRules = computed(()=>{
+      return {dataModel:{
+          workTime:{required},
+          doTypeID:{required},
+          workContent:{required},
+        }}});
+    const workLogValid = useVuelidate(workLogRules,workLogData);
 
-    const onSave = () => {
-      if (!dataModel.value.name) {
-        presentAlert("请填写姓名!");
-        return false;
-      }
+    const presentAlert = async (message: string) => {
+      const alert = await alertController.create({
+        header: '错误!',
+        message: message,
+        buttons: [
+          '确定'
+        ],
+      });
+
+      await alert.present();
+    }
 
-      /*save(dataModel.value as any).then(result => {
+    const onSave = async function (){
+      const isFormCorrect = await workLogValid.value.$validate();
+      if(!isFormCorrect){
+        console.log("当前数据",workLogData.dataModel);
+        await presentAlert("请填写完整的信息!");
+        return null;
+      }
+      saveWorkLog(workLogData.dataModel).then(result => {
         if (result) {
-          router.push({path: './index', query: {reload: 1}});
+          router.push("./list");
         }
-      });*/
+      });
     }
 
     const onCancel = () => {
-      router.push("./index");
+      router.push("./list");
     }
 
-    const loadData = (practiceTaskStudentID: any) => {
-      /*get(practiceTaskStudentID).then((result: any) => {
-        dataModel.value = result;
+    const getWorkTypeList = async function(){
+      const data:any =await getSysDictionaryList("LogType");
+      logTypeList.value = data;
+    }
 
-        loadPracticeBaseList(dataModel.value.schoolYearID);
-        loadCityList();
-      });*/
+    const loadData = async (doWorkID: any) => {
+      await getWorkTypeList();
+      const reqData = await getWorkLogById(doWorkID);
+      workLogData.dataModel = reqData;
+      console.log("初始化dataModel",workLogData.dataModel);
     };
 
-    const initData = (id: any) => {
-      dataModel.value = {name: '', logDate: null};
-      loadData(id);
-    };
+
+    const reload = (doWorkID: any) => {
+      loadData(doWorkID);
+    }
 
     onIonViewDidEnter(() => {
       if (route.query.reload)
-        initData(route.query.id);
+        reload(route.query.doWorkID);
     });
 
-    const presentAlert = async (message: string) => {
-      const alert = await alertController.create({
-        header: '错误!',
-        message: message,
-        buttons: [
-          '确定'
-        ],
-      });
-
-      await alert.present();
-    }
-
-    /* const inputBlur = (e: any) => {
-       if (dataModel.value.logDate == null)
-         e.target.setAttribute('placeholder', '出生年月日');
-     }
-     const inputFocus = (e: any) => {
-       e.target.removeAttribute('placeholder');
-     }*/
-
 
     return {
-      dataModel,
-      initData,
+      ...toRefs(workLogData),
+      arrowBackOutline,
+      editForm,
+      logTypeList,
       onSave,
       onCancel,
+      loadData,
       route,
-      arrowBackOutline,
       router,
-      /* inputBlur,
-       inputFocus*/
+      workLogValid
     }
   }
 });

+ 51 - 46
h5app/src/views/pages/work/log/list.vue

@@ -3,31 +3,28 @@
     <ion-header class="header-theme2">
       <ion-toolbar>
         <ion-buttons slot="start">
-          <ion-icon :icon="arrowBackOutline" @click="()=>router.push('../')"></ion-icon>
+          <ion-icon :icon="arrowBackOutline" @click="onBack"></ion-icon>
         </ion-buttons>
         <ion-title>工作日志</ion-title>
         <ion-buttons slot="end">
-          <ion-icon :icon="addCircleOutline" @click="onAdd()"></ion-icon>
+          <ion-icon :icon="addCircleOutline" @click="onAdd"></ion-icon>
         </ion-buttons>
       </ion-toolbar>
     </ion-header>
     <ion-content>
       <ion-item class="search-item">
-        <ion-input type="date"
-                   placeholder="开始时间" mode="md"></ion-input>
-        —
-        <ion-input type="date"
-                   placeholder="结束时间" mode="md"></ion-input>
-        <ion-button slot="end" style="height: 30px;width: 60px;margin-left: 10px;--box-shadow: none;">搜索</ion-button>
+        <ion-input type="date" v-model="searchParamsState.workStartDate" placeholder="开始时间" mode="md"></ion-input>  —
+        <ion-input type="date" v-model="searchParamsState.workEndDate"  placeholder="结束时间" mode="md"></ion-input>
+        <ion-button slot="end" style="height: 30px;width: 60px;margin-left: 10px;--box-shadow: none;" @click="reload">搜索</ion-button>
       </ion-item>
       <ion-list class="list-content">
         <ion-item v-for="(record,key) in dataList" :key="key" detail>
-          <ion-grid>
+          <ion-grid @click="onDetail(record.doWorkID)" >
             <ion-row>
               <ion-col>
                 <ion-label style="display: flex;justify-content: space-between;">
                   <ion-text>
-                    {{ record.name }}
+                    {{ record.workTime }}工作日志
                   </ion-text>
                 </ion-label>
               </ion-col>
@@ -44,7 +41,7 @@
           </ion-grid>
         </ion-item>
       </ion-list>
-      <b-empty v-if="dataList.length<=0" :loading="loading"/>
+      <b-empty v-if="dataList.length<=0" :loading="formState.loading"/>
       <ion-infinite-scroll threshold="100px" @ionInfinite="onScroll($event)">
         <ion-infinite-scroll-content
             :loadingText="pagination.total>pagination.current*pagination.pageSize?'正在加载...':'暂无更多'"
@@ -57,57 +54,52 @@
 
 <script lang="ts">
 
+import {useRouter} from "vue-router";
 import {computed, defineComponent, reactive, ref} from 'vue';
-import dayjs from "dayjs";
-import {useRoute, useRouter} from "vue-router";
 import {arrowBackOutline, ellipse, addCircleOutline} from 'ionicons/icons';
 import {IonIcon, onIonViewDidEnter} from '@ionic/vue';
+import {getWorkLogList} from '@/api/workLog';
 import BEmpty from "@/components/empty.vue";
 
 export default defineComponent({
   name: 'WorkLogList',
   components: {IonIcon, BEmpty},
   setup() {
-    const loading = ref(true);
+    const searchParamsState = reactive({
+      pageIndex: 1,
+      pageSize: 10,
+      workStartDate:'2023-12-01',
+      workEndDate:'2023-12-31'
+    })
+    const formState = reactive({
+      total: 0,
+      selectedRowKeys: [],
+      loading: false
+    });
     const pagination = computed(() => ({
-      total: total,
-      current: searchParamsState.page,
-      pageSize: searchParamsState.rows
+      current: searchParamsState.pageIndex,
+      pageSize: searchParamsState.pageSize,
+      total: formState.total,
     }));
     const dataList = ref<any>([]);
     const router = useRouter();
-    const route = useRoute();
-    const total = ref(15);
     const colors = ref(["secondary", "tertiary", "success", "warning"]);
 
-    const searchParamsState = reactive({page: 1, rows: 10, writeStatus: null})
 
     const loadData = async function () {
-      loading.value = true;
-
-      /*const result: any = await getMyIntentionList(searchParamsState);
+      formState.loading = true;
+      const result: any = await getWorkLogList(searchParamsState);
       dataList.value = dataList.value.concat(result.list);
-      total.value = result.total;*/
-
-      dataList.value = [{name: '2023年11月23日工作日志', logTypeName: "上门服务", updateTime: '2023-12-11'},
-        {
-          name: '2023年11月22日工作日志',
-          logTypeName: "客户服务",
-          updateTime: '2023-12-12'
-        }, {name: '2023年11月21日工作日志', logTypeName: "客户服务", updateTime: '2023-12-13'}];
-      loading.value = false;
+      console.log("dataList",dataList.value);
+      formState.total = result.total;
+      formState.loading = false;
     }
 
-    const reload = () => {
-      dataList.value = [];
-      searchParamsState.page = 1;
-      loadData();
-    }
 
     const onScroll = (e: any) => {
       setTimeout(() => {
         e.target.complete();
-        if (pagination.value.total.value > pagination.value.current * pagination.value.pageSize) {
+        if (pagination.value.total > pagination.value.current * pagination.value.pageSize) {
           pagination.value.current += 1;
           loadData();
         }
@@ -115,7 +107,21 @@ export default defineComponent({
     }
 
     const onAdd = (item: any) => {
-      router.push({path: './edit', query: {reload: 1, id: ""}});
+      router.push({path: './edit', query: {reload: 1, doWorkID: null}});
+    }
+
+    const onBack =()=>{
+      router.push('../');
+    }
+
+    const onDetail = (doWorkID:string) =>{
+      router.push({path: './edit', query: {reload:1, doWorkID: doWorkID}});
+    }
+
+    const reload = () => {
+      dataList.value = [];
+      searchParamsState.pageIndex = 1;
+      loadData();
     }
 
     onIonViewDidEnter(() => {
@@ -124,18 +130,17 @@ export default defineComponent({
 
     return {
       router,
-      pagination,
       colors,
-      reload,
-      loading,
-      searchParamsState,
       dataList,
-      total,
-      dayjs,
+      formState,
+      pagination,
+      searchParamsState,
       onScroll,
       onAdd,
+      onBack,
+      onDetail,
       loadData,
-      ellipse,
+      reload,
       arrowBackOutline,
       addCircleOutline,
     }

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

@@ -6,11 +6,8 @@ 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 org.apache.poi.ss.formula.functions.Now;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-
-import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.UUID;
 
@@ -37,8 +34,8 @@ public class EducationController {
         PcEducation dataModel = new PcEducation();
         if (educationID == null || educationID == ""){
             dataModel.setEducationID(UUID.randomUUID().toString());
-            dataModel.setSchoolTime(new Date(new Date().getYear()-4,8,1));
-            dataModel.setOverTime(new Date(new Date().getYear()-1,10,20));
+            dataModel.setSchoolTime(new java.sql.Date(new Date().getTime()));
+            dataModel.setOverTime(new java.sql.Date(new Date().getTime()));
         }else{
             dataModel = educationService.getById(educationID);
         }

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

@@ -52,6 +52,7 @@ public class JobUserController {
         return RespGenerstor.success(result);
     }
 
+
     @ResponseBody
     @GetMapping("/getDataList")
     public BaseResponse<ArrayList<SelectProps>> getDataList() {

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

@@ -6,15 +6,14 @@ import com.hz.employmentsite.filter.exception.RespGenerstor;
 import com.hz.employmentsite.services.service.AccountService;
 import com.hz.employmentsite.services.service.taskAndLog.DoWorkService;
 import com.hz.employmentsite.util.ExcelHelper;
-import com.hz.employmentsite.vo.baseSettings.UserInfoVo;
 import com.hz.employmentsite.vo.taskAndLog.DoWorkVo;
 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;
 import java.util.List;
+import java.util.Date;
 import java.util.UUID;
 
 @RestController
@@ -44,6 +43,7 @@ public class DoWorkController {
         DoWorkVo dataModel = new DoWorkVo();
         if (doWorkID == null || doWorkID == ""){
             dataModel.doWorkID = UUID.randomUUID().toString();
+            dataModel.setWorkTime(new java.sql.Date(new Date().getTime()));
         }else{
             dataModel = doWorkService.get(doWorkID);
         }