Browse Source

app-工作任务初步实现1

liao-sea 1 year ago
parent
commit
3922feeded

+ 48 - 0
h5app/src/api/workTask/index.ts

@@ -0,0 +1,48 @@
+import {request} from '@/utils/request';
+
+export function getWorkTaskList(params: any) {
+    return request(
+        {
+            url: 'taskAndLog/dotask/getList',
+            method: 'get',
+            params: params,
+        },
+        { isNew: true },
+    );
+}
+
+export function getWorkTaskByID(id: any) {
+    return request(
+        {
+            url: 'taskAndLog/dotask/getDataById',
+            method: 'get',
+            params: {id:id},
+        },
+        { isNew: true },
+    );
+}
+
+export function saveWorkTask(data: any) {
+    return request(
+        {
+            url: 'taskAndLog/dotask/save',
+            method: 'get',
+            data: data,
+        },
+        { isNew: true },
+    );
+}
+
+export function getMyWorkTasks(params: any) {
+    return request(
+        {
+            url: 'taskAndLog/dotask/getMyWorkTasks',
+            method: 'get',
+            params: params,
+        },
+        { isNew: true },
+    );
+}
+
+
+

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

@@ -72,6 +72,10 @@ const routes: Array<RouteRecordRaw> = [
                 path: 'tabMain/work/task/list',
                 component: () => import('@/views/pages/work/task/list.vue')
             },
+            {
+                path: 'tabMain/work/task/edit',
+                component: () => import('@/views/pages/work/task/edit.vue')
+            },
             {
                 path: 'tabMain/sitemap/index',
                 component: () => import('@/views/pages/sitemap/index.vue')

+ 66 - 77
h5app/src/views/pages/jobuser/edit.vue

@@ -1,5 +1,5 @@
 <template>
-  <ion-page>
+  <ion-page  class="list-page">
     <ion-header>
       <ion-toolbar>
         <ion-buttons slot="start">
@@ -8,19 +8,18 @@
         <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 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>
-      <form ref="editForm" @submit.prevent="onSave">
-        <div class="panel-content"  v-if="curStepData.statusVal==1">
+    </div>
+    <ion-content>
+        <div  v-if="curStepData.statusVal==1">
           <ion-item-group>
             <ion-item>
               <div class="panel-title2">
@@ -193,74 +192,66 @@
             </ion-item>
           </ion-item-group>
         </div>
-        <div class="panel-content"  v-if="curStepData.statusVal==2">
+       <!-----------------------------------------教育经历----------------------------------------------->
+        <div  v-if="curStepData.statusVal==2" >
           <ion-item>
-            <div class="panel-title2">
+            <ion-item class="panel-title2">
               <div class="item-flag"></div>
               教育经历
-            </div>
+            </ion-item>
             <ion-buttons slot="end">
               <ion-icon :icon="addCircleOutline"  class="iconBtn"
                         @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-item v-for="(record,key) in educationList" :key="key" detail
+                    @click="onPathForward('./educationEdit',record.educationID,null,2)">
               <ion-label>
                 <h3>{{record.schoolName}}</h3>
                 <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>
-          <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>
+          <b-empty v-if="educationList.length==0"  :loading="loading" />
         </div>
-        <div class="panel-content"  v-if="curStepData.statusVal==3">
-          <ion-item>
-            <div class="panel-title2">
-              <div class="item-flag"></div>
-              求职意向
-            </div>
-            <ion-buttons slot="end">
-              <ion-icon :icon="addCircleOutline" class="iconBtn"
-                        @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>
-              <p>期望薪资:{{record.minSalary}}-{{record.maxSalary}}</p>
-            </ion-label>
-            <img alt="" src="@/assets/icon/forward.png" class="iconBtn"
-                 @click="onPathForward( './jobHuntEdit',null,record.jobHuntID,3)"  />
-          </ion-item>
-          <div v-show="jobHuntList.length==0" class="grid-content" style="padding:10px 10px">
-            <ion-text color="tertiary">
-              <h6>查询无数据</h6>
-            </ion-text>
+
+      <!--------------------------------------------求职意向-------------------------------------------->
+      <div v-if="curStepData.statusVal==3">
+        <ion-item>
+          <div class="panel-title2">
+            <div class="item-flag"></div>
+            求职意向
           </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>
+          <ion-buttons slot="end">
+            <ion-icon :icon="addCircleOutline" class="iconBtn"
+                      @click="onPathForward('./jobHuntEdit',null,null,3)"></ion-icon>
+          </ion-buttons>
+        </ion-item>
+        <ion-item  v-for="(record,key) in jobHuntList" :key="key" detail
+                   @click="onPathForward( './jobHuntEdit',null,record.jobHuntID,3)">
+          <ion-label>
+            <h3>{{record.jobUserTypeStr}}</h3>
+            <p>期望薪资:{{record.minSalary}}-{{record.maxSalary}}</p>
+          </ion-label>
+        </ion-item>
+        <b-empty  v-if="jobHuntList.length==0"  :loading="loading" />
+      </div>
+
+        <!--<ion-refresher pulling-text="下拉刷新" @ionRefresh="onRefresh"></ion-refresher>-->
+        <ion-infinite-scroll v-if="curStepData.statusVal!=1" 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>
     </ion-content>
+    <ion-footer>
+      <ion-toolbar>
+        <div slot="end">
+          <ion-button class="next-btn" @click="onSave"  v-if="curStepData.statusVal!=3">下一步</ion-button>
+          <ion-button class="next-btn" @click="onFinish" v-if="curStepData.statusVal==3">完  成</ion-button>
+        </div>
+      </ion-toolbar>
+    </ion-footer>
   </ion-page>
 </template>
 <script lang="ts">
@@ -293,6 +284,7 @@ export default defineComponent({
     const route = useRoute();
     const editForm = ref();
     const expand = ref<boolean>(false);
+    const loading = ref(true);
     const siteInfoList = ref<SelectProps[]>([]);
     const curStepData = ref<StepParams>({
       name:"",
@@ -344,7 +336,7 @@ export default defineComponent({
       }});
     const pageParams = reactive({
       pageIndex: 1,
-      pageSize: 5,
+      pageSize: 7,
       total:0,
       jobUserID:''
     });
@@ -406,17 +398,13 @@ 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;
+            pageParams.pageSize += 10;
             loadData(pageParams.jobUserID,curStepData.value.statusVal);
           }
         }, 500);
@@ -469,6 +457,7 @@ export default defineComponent({
     }
 
     const loadData = async (jobUserID: any,status:any) => {
+      loading.value = true;
       pageParams.jobUserID = jobUserID;
       baseInfoData.baseData.jobUserID = jobUserID;
       curStepData.value.statusVal = status;
@@ -491,6 +480,7 @@ export default defineComponent({
         pageParams.total = reqData.total;
         console.log("jobHuntList",jobHuntList.value);
       }
+      loading.value = false;
     };
 
     watch(() => route.query, () => {
@@ -500,8 +490,8 @@ export default defineComponent({
     });
 
     const reload = (jobUserID:any,status:any) => {
+      pageParams.pageIndex = 1;
       expand.value = false;
-      onRefresh();
       loadData(jobUserID,status);
     }
 
@@ -517,6 +507,7 @@ export default defineComponent({
       route,
       router,
       expand,
+      loading,
       editForm,
       stepList,
       curStepData,
@@ -541,7 +532,6 @@ export default defineComponent({
       onSave,
       onBack,
       onFinish,
-      onRefresh,
       onScroll,
       onPathForward,
       loadData,
@@ -566,10 +556,9 @@ export default defineComponent({
 </script>
 <style lang="less">
 .next-btn {
-  width: 100%;
-  --border-radius: 0px;
-  --background: #f2f2f5;
-  margin: 20px 0 0 0;
+  width: 80px;
+  border-radius: 5px;
+  background-color:#3a7be0;
   color: #363432;
   font-size: 14px;
 }

+ 13 - 6
h5app/src/views/pages/jobuser/educationEdit.vue

@@ -73,9 +73,16 @@
             </ion-item>
           </ion-item-group>
         </ion-list>
-        <ion-button class="next-btn" type="submit" >保  存</ion-button>
+
       </form>
     </ion-content>
+    <ion-footer>
+      <ion-toolbar>
+        <div slot="end">
+          <ion-button class="next-btn" @click="onSave" >保  存</ion-button>
+        </div>
+      </ion-toolbar>
+    </ion-footer>
   </ion-page>
 </template>
 <script lang="ts">
@@ -114,7 +121,8 @@ export default defineComponent({
         {title: '教育经历', desc: '完事个人教育经历',val: 2},
         {title: '求职意向', desc: '个人求职意向', val: 3}]);
     const cultureRankList = ref<SelectProps[]>([]);
-    const educationData = reactive<educationModel>({ dataModel:{
+    const educationData = reactive<educationModel>({
+      dataModel:{
         jobuserID:null,
         schoolName:'',
         cultureRank:0,
@@ -203,10 +211,9 @@ export default defineComponent({
 </script>
 <style lang="less">
 .next-btn {
-  width: 100%;
-  --border-radius: 0px;
-  --background: #f2f2f5;
-  margin: 20px 0 0 0;
+  width: 80px;
+  border-radius: 5px;
+  background-color:#3a7be0;
   color: #363432;
   font-size: 14px;
 }

+ 10 - 7
h5app/src/views/pages/jobuser/jobHuntEdit.vue

@@ -21,7 +21,6 @@
           </div>
         </div>
       </div>
-      <form ref="editForm" @submit.prevent="onSave">
         <ion-list class="canvasWrapper" >
           <ion-item-group>
             <ion-item>
@@ -74,9 +73,14 @@
             </ion-item>
           </ion-item-group>
         </ion-list>
-        <ion-button class="next-btn" type="submit" >保  存</ion-button>
-      </form>
     </ion-content>
+    <ion-footer>
+      <ion-toolbar>
+        <div slot="end">
+          <ion-button class="next-btn" @click="onSave">保  存</ion-button>
+        </div>
+      </ion-toolbar>
+    </ion-footer>
   </ion-page>
 </template>
 <script lang="ts">
@@ -217,10 +221,9 @@ export default defineComponent({
 </script>
 <style lang="less">
 .next-btn {
-  width: 100%;
-  --border-radius: 0px;
-  --background: #f2f2f5;
-  margin: 20px 0 0 0;
+  width: 80px;
+  border-radius: 5px;
+  background-color:#3a7be0;
   color: #363432;
   font-size: 14px;
 }

+ 28 - 25
h5app/src/views/pages/jobuser/list.vue

@@ -12,26 +12,25 @@
       </ion-toolbar>
     </ion-header>
     <ion-content>
-      <ion-item style="margin: 10px 0;">
+      <ion-item  class="search-item">
         <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">
+        <ion-item v-for="(record,key) in dataList" :key="key" detail  @click="onDetail(record.jobUserID)">
           <ion-avatar aria-hidden="true" slot="start">
             <img alt="" src="@/assets/icon/avatar.svg" />
           </ion-avatar>
           <ion-label>
             <h3>{{ record.name }}</h3>
-            <p>已推荐岗位:{{formState.total}}</p>
+            <p>已推荐岗位:{{searchParamsState.total}}</p>
           </ion-label>
-          <img alt="" src="@/assets/icon/forward.png" style="width:32px;height:32px;"  @click="onDetail(record.jobUserID)"  />
         </ion-item>
       </ion-list>
-      <b-empty v-if="dataList.length<=0" :loading="formState.loading"/>
+      <b-empty v-if="dataList.length<=0" :loading="loading"/>
       <ion-infinite-scroll threshold="100px" @ionInfinite="onScroll($event)">
         <ion-infinite-scroll-content
-            :loadingText="pagination.total>pagination.current*pagination.pageSize?'正在加载...':'暂无更多'"
+            :loadingText="searchParamsState.total>searchParamsState.pageIndex*searchParamsState.pageSize?'正在加载...':'暂无更多'"
             loadingSpinner="bubbles">
         </ion-infinite-scroll-content>
       </ion-infinite-scroll>
@@ -41,7 +40,7 @@
 
 <script lang="ts">
 import {useRouter} from "vue-router";
-import {computed, defineComponent, reactive, ref} from 'vue';
+import {defineComponent, reactive, ref} from 'vue';
 import {arrowBackOutline,addCircleOutline} from 'ionicons/icons';
 import {IonIcon, onIonViewDidEnter} from '@ionic/vue';
 import {getJobUserList} from "@/api/jobUserInfo";
@@ -53,29 +52,21 @@ export default defineComponent({
     const searchParamsState = reactive({
       pageIndex: 1,
       pageSize: 10,
+      total:0,
       name:''
     });
-    const formState = reactive({
-      total: 0,
-      selectedRowKeys: [],
-      loading: false
-    });
-    const pagination = computed(() => ({
-      current: searchParamsState.pageIndex,
-      pageSize: searchParamsState.pageSize,
-      total: formState.total,
-    }));
+    const loading = ref(true);
     const dataList = ref<any>([]);
     const router = useRouter();
     const colors = ref(["secondary", "tertiary", "success", "warning"]);
 
     const loadData = async function () {
-      formState.loading = true;
+      loading.value = true;
       const result: any = await getJobUserList(searchParamsState);
       dataList.value = dataList.value.concat(result.list);
       console.log("dataList",dataList.value);
-      formState.total = result.total;
-      formState.loading = false;
+      searchParamsState.total = result.total;
+      loading.value = false;
     }
 
     const reload = () => {
@@ -87,15 +78,15 @@ export default defineComponent({
     const onScroll = (e: any) => {
       setTimeout(() => {
         e.target.complete();
-        if (pagination.value.total > pagination.value.current * pagination.value.pageSize) {
-          pagination.value.current += 1;
+        if (searchParamsState.total > searchParamsState.pageIndex * searchParamsState.pageSize) {
+          searchParamsState.pageSize += 10;
           loadData();
         }
       }, 500);
     }
 
     const onAdd = () => {
-      router.push({path: './edit', query: {reload:1,id:null,status:1}});
+      router.push({path: './edit', query: {reload:1,jobUserID:null,status:1}});
     }
 
     const onBack =()=>{
@@ -115,8 +106,7 @@ export default defineComponent({
       router,
       colors,
       dataList,
-      formState,
-      pagination,
+      loading,
       searchParamsState,
       onScroll,
       onAdd,
@@ -132,6 +122,19 @@ export default defineComponent({
 </script>
 
 <style lang="less">
+.search-item{
+  margin: 10px 0;
+  font-size: 14px;
+  ion-input{
+    border: 1px solid #f2f2f5;border-radius: 4px;--padding-start: 10px;
+    width: 100px;
+  }
+
+  input{
+    padding: 6px !important;
+  }
+}
+
 .jobuser-list-page{
   .list-content{
     background-color: white !important;

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

@@ -27,9 +27,9 @@
                             :show-default-buttons="true">
               </ion-datetime>
             </ion-modal>
-            <ion-note slot="error">日志类型不能为空</ion-note>
+            <ion-note slot="error">工作日志日期不能为空</ion-note>
           </ion-item>
-          <ion-item  mode="md" :class="[workLogValid.dataModel.doTypeID.$error?'ion-invalid':'ion-valid']">
+          <ion-item  mode="md" :class="[workLogValid.dataModel.doTypeID.$error?'ion-invalid':'ion-valid']" style="margin-bottom: 10px;">
             <ion-label>日志类型<span class="danger">*</span></ion-label>
             <ion-select name="doTypeID"  id="doTypeID" okText="确定" cancelText="取消" v-model="dataModel.doTypeID"
                         interface="action-sheet" placeholder="请选择日志类型" >

+ 15 - 24
h5app/src/views/pages/work/log/list.vue

@@ -13,9 +13,10 @@
     </ion-header>
     <ion-content>
       <ion-item class="search-item">
-        <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-input type="date" mode="md" v-model="searchParamsState.workStartDate" placeholder="开始时间" @change="reload"></ion-input>
+        <ion-label style="margin-right:10px;margin-left: 10px;">至</ion-label>
+        <ion-input type="date" mode="md" v-model="searchParamsState.workEndDate"  placeholder="结束时间"  @change="reload"></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" detail>
@@ -41,10 +42,10 @@
           </ion-grid>
         </ion-item>
       </ion-list>
-      <b-empty v-if="dataList.length<=0" :loading="formState.loading"/>
+      <b-empty v-if="dataList.length<=0" :loading="loading"/>
       <ion-infinite-scroll threshold="100px" @ionInfinite="onScroll($event)">
         <ion-infinite-scroll-content
-            :loadingText="pagination.total>pagination.current*pagination.pageSize?'正在加载...':'暂无更多'"
+            :loadingText="searchParamsState.total>searchParamsState.pageIndex*searchParamsState.pageSize?'正在加载...':'暂无更多'"
             loadingSpinner="bubbles">
         </ion-infinite-scroll-content>
       </ion-infinite-scroll>
@@ -55,7 +56,7 @@
 <script lang="ts">
 
 import {useRouter} from "vue-router";
-import {computed, defineComponent, reactive, ref} from 'vue';
+import {defineComponent, reactive, ref} from 'vue';
 import {arrowBackOutline, ellipse, addCircleOutline} from 'ionicons/icons';
 import {IonIcon, onIonViewDidEnter} from '@ionic/vue';
 import {getWorkLogList} from '@/api/workLog';
@@ -68,39 +69,30 @@ export default defineComponent({
     const searchParamsState = reactive({
       pageIndex: 1,
       pageSize: 10,
+      total:0,
       workStartDate:'2023-12-01',
       workEndDate:'2023-12-31'
     })
-    const formState = reactive({
-      total: 0,
-      selectedRowKeys: [],
-      loading: false
-    });
-    const pagination = computed(() => ({
-      current: searchParamsState.pageIndex,
-      pageSize: searchParamsState.pageSize,
-      total: formState.total,
-    }));
+    const loading = ref(true);
     const dataList = ref<any>([]);
     const router = useRouter();
     const colors = ref(["secondary", "tertiary", "success", "warning"]);
 
-
     const loadData = async function () {
-      formState.loading = true;
+      loading.value = true;
       const result: any = await getWorkLogList(searchParamsState);
       dataList.value = dataList.value.concat(result.list);
       console.log("dataList",dataList.value);
-      formState.total = result.total;
-      formState.loading = false;
+      searchParamsState.total = result.total;
+      loading.value = false;
     }
 
 
     const onScroll = (e: any) => {
       setTimeout(() => {
         e.target.complete();
-        if (pagination.value.total > pagination.value.current * pagination.value.pageSize) {
-          pagination.value.current += 1;
+        if (searchParamsState.total > searchParamsState.pageIndex * searchParamsState.pageSize) {
+          searchParamsState.pageSize += 10;
           loadData();
         }
       }, 500);
@@ -132,8 +124,7 @@ export default defineComponent({
       router,
       colors,
       dataList,
-      formState,
-      pagination,
+      loading,
       searchParamsState,
       onScroll,
       onAdd,

+ 200 - 0
h5app/src/views/pages/work/task/edit.vue

@@ -0,0 +1,200 @@
+<template>
+  <ion-page class="work-log-page">
+    <ion-header class="header-theme2">
+      <ion-toolbar>
+        <ion-buttons slot="start">
+          <ion-icon :icon="arrowBackOutline" @click="onCancel"></ion-icon>
+        </ion-buttons>
+        <ion-title>工作任务录入</ion-title>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content>
+      <form autocomplete="off">
+        <ion-item>
+          <div class="panel-title2">
+            <div class="item-flag"></div>
+            基本信息
+          </div>
+        </ion-item>
+        <ion-list>
+          <ion-item :class="[workTaskValid.dataModel.dotaskName.$error?'ion-invalid':'ion-valid']" style="margin-bottom: 10px;">
+            <ion-label>任务名称<span class="danger">*</span></ion-label>
+            <ion-input name="dotaskName" id="dotaskName" style="text-align: right;" placeholder="请输入任务名称" v-model="dataModel.dotaskName" ></ion-input>
+            <ion-note slot="error">任务名称不能为空</ion-note>
+          </ion-item>
+          <ion-label style="padding-left:16px;">任务内容<span class="danger">*</span></ion-label>
+          <ion-item  :class="[workTaskValid.dataModel.content.$error?'ion-invalid':'ion-valid']">
+            <ion-textarea name="content" id="content" v-model="dataModel.content"  label-placement="stacked"
+                          style="text-align: right;" placeholder="请输入工作内容" rows="8"></ion-textarea>
+            <ion-note slot="error">任务内容不能为空</ion-note>
+          </ion-item>
+          <ion-item :class="[workTaskValid.dataModel.finishTime.$error?'ion-invalid':'ion-valid']">
+            <ion-label>完成时间<span class="danger">*</span></ion-label>
+            <ion-datetime-button datetime="finishTime"></ion-datetime-button>
+            <ion-modal :keep-contents-mounted="true">
+              <ion-datetime id="finishTime" placeholder="完成时间"
+                            v-model="dataModel.finishTime"
+                            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 :class="[workTaskValid.dataModel.workTypeID.$error?'ion-invalid':'ion-valid']" >
+            <ion-label>任务类型<span class="danger">*</span></ion-label>
+            <ion-select name="workTypeID"  id="workTypeID" okText="确定" cancelText="取消" v-model="dataModel.workTypeID"
+                        interface="action-sheet" placeholder="请选择日志类型" >
+              <ion-select-option v-for=" (it,key) in taskTypeList" :key="key" :value="it.value">
+                {{ it.name }}
+              </ion-select-option>
+            </ion-select>
+            <ion-note slot="error">任务类型不能为空</ion-note>
+          </ion-item>
+          <ion-item  mode="md"  :class="[workTaskValid.dataModel.content.$error?'ion-invalid':'ion-valid']">
+            <ion-label>指派人<span class="danger">*</span></ion-label>
+            <ion-select-option v-for=" (it,key) in siteUserList" :key="key" :value="it.value">
+              {{ it.name }}
+            </ion-select-option>
+            <ion-note slot="error">工作内容不能为空</ion-note>
+          </ion-item>
+        </ion-list>
+      </form>
+
+    </ion-content>
+    <ion-footer>
+      <ion-button class="save-btn" @click="onSave">提交</ion-button>
+    </ion-footer>
+  </ion-page>
+</template>
+<script lang="ts">
+import {computed, defineComponent, reactive, ref, toRefs} from "vue";
+import {getSysDictionaryList} from '@/api/system/dictionary';
+import {getWorkTaskByID,saveWorkTask} from '@/api/workTask';
+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 workTaskModel {
+  dataModel:any
+}
+interface SelectProps {
+  name: string,
+  value: string
+}
+
+export default defineComponent({
+  name: 'WorkLogEdit',
+  setup() {
+    const router = useRouter();
+    const route = useRoute();
+    const editForm = ref();
+    const taskTypeList=ref<SelectProps[]>([]);
+    const workTaskData = reactive<workTaskModel>({
+      dataModel:{
+        siteUserID:null,
+        dotaskName: null,
+        workTypeID: null,
+        content:null,
+        finishTime:null,
+    }});
+    const workTaskRules = computed(()=>{
+      return {dataModel:{
+          siteUserID:{required},
+          dotaskName:{required},
+          workTypeID:{required},
+          content:{required},
+          finishTime:{required},
+        }}});
+    const workTaskValid = useVuelidate(workTaskRules,workTaskData);
+
+    const presentAlert = async (message: string) => {
+      const alert = await alertController.create({
+        header: '错误!',
+        message: message,
+        buttons: [
+          '确定'
+        ],
+      });
+
+      await alert.present();
+    }
+
+    const onSave = async function (){
+      const isFormCorrect = await workTaskValid.value.$validate();
+      if(!isFormCorrect){
+        console.log("当前数据",workTaskData.dataModel);
+        await presentAlert("请填写完整的信息!");
+        return null;
+      }
+      saveWorkTask(workTaskData.dataModel).then(result => {
+        if (result) {
+          router.push("./list");
+        }
+      });
+    }
+
+    const onCancel = () => {
+      router.push("./list");
+    }
+
+    const getWorkTypeList = async function(){
+      const data:any =await getSysDictionaryList("TaskType");
+      taskTypeList.value = data;
+      console.log("taskTypeList",taskTypeList.value);
+    }
+
+    const loadData = async (doTaskID: any) => {
+      await getWorkTypeList();
+      const reqData = await getWorkTaskByID(doTaskID);
+      workTaskData.dataModel = reqData;
+      console.log("初始化dataModel",workTaskData.dataModel);
+    };
+
+
+    const reload = (doTaskID: any) => {
+      loadData(doTaskID);
+    }
+
+    onIonViewDidEnter(() => {
+      if (route.query.reload)
+        reload(route.query.doTaskID);
+    });
+
+
+    return {
+      ...toRefs(workTaskData),
+      arrowBackOutline,
+      editForm,
+      taskTypeList,
+      onSave,
+      onCancel,
+      loadData,
+      route,
+      router,
+      workTaskValid
+    }
+  }
+});
+</script>
+
+<style lang="less">
+.work-log-page {
+  .save-btn {
+    width: 100%;
+    --border-radius: 0px;
+    --background: #f2f2f5;
+    margin: 20px 0 0 0;
+    color: #363432;
+    font-size: 14px;
+  }
+
+  /*input[type="date"]:before {
+    content: attr(placeholder);
+    color: #00d9ff;
+  }*/
+}
+
+
+</style>

+ 50 - 37
h5app/src/views/pages/work/task/list.vue

@@ -3,23 +3,34 @@
     <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-buttons>-->
+        <ion-buttons slot="end">
+          <ion-icon :icon="addCircleOutline" @click="onAdd"></ion-icon>
+        </ion-buttons>
       </ion-toolbar>
     </ion-header>
     <ion-content>
       <ion-item style="margin: 10px 0;">
-        <ion-input style="border: 1px solid #f2f2f5;border-radius: 8px;--padding-start: 10px;"></ion-input>
-        <ion-button slot="end" style="height: 40px;width: 70px;margin-left: 10px;">搜索</ion-button>
+        <ion-input style="border: 1px solid #f2f2f5;height: 33px;width: 70px;margin-left: 10px;border-radius: 14px;--padding-start: 10px;"></ion-input>
+        <ion-button slot="end" style="height: 33px;width: 70px;margin-left: 10px;--box-shadow: none;--border-radius: 14px;">搜索</ion-button>
       </ion-item>
+      <ion-list class="list-content" >
+        <ion-item v-for="(record,key) in dataList" :key="key" detail  @click="onDetail(record.dotaskID)">
+          <ion-avatar aria-hidden="true" slot="start">
+            <img alt="" src="@/assets/icon/icon-mine-punish.png" />
+          </ion-avatar>
+          <ion-label>
+            <h3>{{ record.workTypeName }}</h3>
+            <p>{{ record.dotaskName }}:{{record.content}}</p>
+          </ion-label>
+        </ion-item>
+      </ion-list>
       <b-empty v-if="dataList.length<=0" :loading="loading"/>
       <ion-infinite-scroll threshold="100px" @ionInfinite="onScroll($event)">
         <ion-infinite-scroll-content
-            :loadingText="pagination.total>pagination.current*pagination.pageSize?'正在加载...':'暂无更多'"
+            :loadingText="searchParamsState.total>searchParamsState.pageIndex*searchParamsState.pageSize?'正在加载...':'暂无更多'"
             loadingSpinner="bubbles">
         </ion-infinite-scroll-content>
       </ion-infinite-scroll>
@@ -29,61 +40,63 @@
 
 <script lang="ts">
 
-import {computed, defineComponent, reactive, ref} from 'vue';
+import {defineComponent, reactive, ref} from 'vue';
 import dayjs from "dayjs";
-import {useRoute, useRouter} from "vue-router";
+import {useRouter} from "vue-router";
 import {arrowBackOutline, ellipse, addCircleOutline} from 'ionicons/icons';
 import {IonIcon, onIonViewDidEnter} from '@ionic/vue';
 import BEmpty from "@/components/empty.vue";
+import {getWorkTaskList} from '@/api/workTask';
 
 export default defineComponent({
   name: 'PracticeIntention',
   components: {IonIcon, BEmpty},
   setup() {
-    const loading = ref(true);
-    const pagination = computed(() => ({
-      total: total,
-      current: searchParamsState.page,
-      pageSize: searchParamsState.rows
-    }));
+    const searchParamsState = reactive({
+      pageIndex: 1,
+      pageSize: 10,
+      total:0,
+      writeStatus: null
+    })
+    const loading =ref(true);
     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);
+      const result: any = await getWorkTaskList(searchParamsState);
       dataList.value = dataList.value.concat(result.list);
-      total.value = result.total;*/
-
-      /*dataList.value = [{companyName: '惠州市AA信息科技有限公司', statusName: "正在跟进",updateTime:'2023-12-11'},
-        {companyName: '惠州市BB信息科技有限公司', statusName: "正在跟进",updateTime:'2023-12-12'},{companyName: '惠州市CC信息科技有限公司', statusName: "正在跟进",updateTime:'2023-12-13'}];*/
+      console.log("dataList",dataList.value);
+      searchParamsState.total = result.total;
       loading.value = 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) {
-          pagination.value.current += 1;
+        if (searchParamsState.total > searchParamsState.pageIndex * searchParamsState.pageSize) {
+          searchParamsState.pageSize += 10;
           loadData();
         }
       }, 500);
     }
 
     const onAdd = (item: any) => {
-      router.push({path: './edit', query: {reload: 1, id: ""}});
+      router.push({path: './edit', query: {reload: 1, doTaskID: ""}});
+    }
+    const onBack =()=>{
+      router.push('../');
+    }
+    const onDetail = (doTaskID:string) =>{
+      router.push({path: './edit', query: {reload:1, doTaskID: doTaskID}});
+    }
+
+    const reload = () => {
+      dataList.value = [];
+      searchParamsState.pageIndex = 1;
+      loadData();
     }
 
     onIonViewDidEnter(() => {
@@ -92,17 +105,17 @@ export default defineComponent({
 
     return {
       router,
-      pagination,
       colors,
-      reload,
       loading,
-      searchParamsState,
       dataList,
-      total,
+      searchParamsState,
       dayjs,
       onScroll,
       onAdd,
+      onBack,
+      onDetail,
       loadData,
+      reload,
       ellipse,
       arrowBackOutline,
       addCircleOutline,

+ 75 - 19
h5app/src/views/sapp/tabMain.vue

@@ -43,36 +43,92 @@
               </div>
               <div class="tool-title">驿站地图</div>
             </a>
-
           </div>
           <div class="panel-title">
             我的任务
           </div>
-          <div class="panel-list">
-            2023年12月12日工作任务已安排,请按时完成!
-          </div>
-          <div class="panel-list">
-            2023年12月11日工作任务已安排,请按时完成!
-          </div>
-          <div class="panel-list">
-            2023年12月10日工作任务已安排,请按时完成!
-        </div>
-          <div class="panel-list">
-            2023年12月09日工作任务已安排,请按时完成!
-          </div>
-          <div class="panel-list">
-            2023年12月08日工作任务已安排,请按时完成!
-          </div>
+          <ion-list class="list-content" >
+            <ion-item v-for="(record,key) in dataList" :key="key" detail>
+              <ion-avatar aria-hidden="true" slot="end" style="width:70px;">
+                {{dayjs(record.finishTime).format("YYYY年MM-DD")}}
+              </ion-avatar>
+              <ion-label>
+                <p>任务名称:{{ record.dotaskName }}</p>
+                <p>任务详情:{{record.content}}</p>
+              </ion-label>
+            </ion-item>
+          </ion-list>
+          <b-empty v-if="dataList.length<=0" :loading="loading"/>
+          <ion-infinite-scroll threshold="100px" @ionInfinite="onScroll($event)">
+            <ion-infinite-scroll-content
+                :loadingText="searchParamsState.total>searchParamsState.pageIndex*searchParamsState.pageSize?'正在加载...':'暂无更多'"
+                loadingSpinner="bubbles">
+            </ion-infinite-scroll-content>
+          </ion-infinite-scroll>
         </div>
       </div>
     </div>
   </ion-page>
 </template>
 
-<script setup lang="ts">
-import router from '@/router';
-// import ExploreContainer from '@/components/ExploreContainer.vue';
+<script lang="ts">
+import {defineComponent, reactive, ref} from "vue";
+import {useRouter} from "vue-router";
+import {getMyWorkTasks} from '@/api/workTask';
+import {onIonViewDidEnter} from "@ionic/vue";
+import dayjs from "dayjs";
+
+export default defineComponent({
+  name:"TabMainList",
+  setup() {
+    const router = useRouter();
+    const dataList = ref<any>([]);
+    const loading = ref(true);
+    const searchParamsState = reactive({
+      pageIndex: 1,
+      pageSize: 5,
+      total:0,
+    })
+
+    const loadData = async function () {
+      loading.value = true;
+      const result: any = await getMyWorkTasks(searchParamsState);
+      dataList.value = dataList.value.concat(result.list);
+      console.log("dataList",dataList.value);
+      searchParamsState.total = result.total;
+      loading.value = false;
+    }
 
+    const onScroll = (e: any) => {
+      setTimeout(() => {
+        e.target.complete();
+        if (searchParamsState.total > searchParamsState.pageIndex * searchParamsState.pageSize) {
+          searchParamsState.pageIndex += 1;
+          loadData();
+        }
+      }, 500);
+    }
+    const reload = () => {
+      dataList.value = [];
+      searchParamsState.pageIndex = 1;
+      loadData();
+    }
+
+    onIonViewDidEnter(() => {
+      reload();
+    });
+
+    return {
+      router,
+      dataList,
+      searchParamsState,
+      loadData,
+      onScroll,
+      reload,
+      dayjs
+    }
+  }
+});
 </script>
 
 <style lang="less">

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

@@ -7,12 +7,15 @@ import com.hz.employmentsite.filter.exception.BaseResponse;
 import com.hz.employmentsite.filter.exception.RespGenerstor;
 import com.hz.employmentsite.services.service.AccountService;
 import com.hz.employmentsite.services.service.companyService.PostService;
+import com.hz.employmentsite.services.service.taskAndLog.DoWorkService;
 import com.hz.employmentsite.services.service.taskAndLog.DotaskService;
 import com.hz.employmentsite.util.DateUtils;
 import com.hz.employmentsite.util.ExcelHelper;
 import com.hz.employmentsite.vo.taskAndLog.DoTaskUserVo;
+import com.hz.employmentsite.vo.taskAndLog.DoWorkVo;
 import com.hz.employmentsite.vo.taskAndLog.DotaskVo;
 import com.hz.employmentsite.vo.taskAndLog.SiteUserVo;
+import com.hz.employmentsite.vo.user.UserModel;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -40,12 +43,19 @@ public class DotaskController {
                                 @RequestParam(required = false) String name, @RequestParam(required = false) String startTime,
                                 @RequestParam(required = false) String endTime, @RequestParam(required = false) String finishStartTime,
                                 @RequestParam(required = false) String finishEndTime, @RequestParam(required = false) String regionCode,
-                                @RequestParam(required = false) String streetCode, @RequestParam(required = false) String workTypeId
-    ) {
+                                @RequestParam(required = false) String streetCode, @RequestParam(required = false) String workTypeId)
+    {
         PageInfo<DotaskVo> result = dotaskService.getList(pageIndex, pageSize, name, startTime, endTime, finishStartTime, finishEndTime, regionCode, streetCode, workTypeId);
         return RespGenerstor.success(result);
     }
 
+    @ResponseBody
+    @GetMapping("/getMyWorkTasks")
+    public BaseResponse getMyTasks(@RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize) {
+        PageInfo<DotaskVo> result = dotaskService.getMyTasks(pageIndex,pageSize,accountService.getLoginUserID());
+        return RespGenerstor.success(result);
+    }
+
     @ResponseBody
     @GetMapping("/getDataById")
     public BaseResponse getDataById(String id) {

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

@@ -11,7 +11,8 @@ import java.util.Date;
 public interface DotaskCQuery {
     List<DotaskVo> getList(@Param("id") String id,@Param("name") String name, @Param("startTime") String startTime, @Param("endTime") String endTime,
                            @Param("finishStartTime") String finishStartTime, @Param("finishEndTime") String finishEndTime,
-                           @Param("regionCode") String regionCode, @Param("streetCode") String streetCode, @Param("workTypeId") String workTypeId);
+                           @Param("regionCode") String regionCode, @Param("streetCode") String streetCode,
+                           @Param("workTypeId") String workTypeId);
 
     List<DoTaskUserVo> getWorkUserList(String dotaskID);
 

+ 31 - 3
src/main/java/com/hz/employmentsite/services/impl/taskAndLog/DotaskImpl.java

@@ -1,14 +1,13 @@
 package com.hz.employmentsite.services.impl.taskAndLog;
 
+import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.hz.employmentsite.mapper.PcDotaskMapper;
 import com.hz.employmentsite.mapper.PcDotaskUserMapper;
 import com.hz.employmentsite.mapper.cquery.DotaskCQuery;
-import com.hz.employmentsite.mapper.cquery.PostCQuery;
 import com.hz.employmentsite.model.*;
 import com.hz.employmentsite.services.service.taskAndLog.DotaskService;
 import com.hz.employmentsite.util.StringUtils;
-import com.hz.employmentsite.vo.companyService.PostVo;
 import com.hz.employmentsite.vo.taskAndLog.DoTaskUserVo;
 import com.hz.employmentsite.vo.taskAndLog.DotaskVo;
 import com.hz.employmentsite.vo.taskAndLog.SiteUserVo;
@@ -16,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.sql.SQLException;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.UUID;
@@ -38,6 +38,7 @@ public class DotaskImpl implements DotaskService {
     @Override
     public PageInfo<DotaskVo> getList(Integer page, Integer rows, String name, String startTime, String endTime, String finishStartTime, String finishEndTime, String regionCode, String streetCode, String workTypeId) {
         try {
+            PageHelper.startPage(page, rows);
             List<DotaskVo> list = dotaskCQuery.getList(null, name, startTime, endTime, finishStartTime, finishEndTime, regionCode, streetCode, workTypeId);
             PageInfo<DotaskVo> result = new PageInfo(list);
             return result;
@@ -46,6 +47,31 @@ public class DotaskImpl implements DotaskService {
         }
     }
 
+    @Override
+    public PageInfo<DotaskVo> getMyTasks(Integer page, Integer rows,String curUserID) {
+        PcDotaskUserExample exp = new PcDotaskUserExample();
+        PcDotaskUserExample.Criteria cro = exp.createCriteria();
+        cro.andDotaskUserIDEqualTo(curUserID);
+        var curDoTaskUserInfo = dotaskUserMapper.selectByExample(exp).stream().toList();
+        List<String> curDoTaskIDs = new ArrayList<String>();
+        if (curDoTaskUserInfo.size()>0){
+            curDoTaskUserInfo.forEach(item -> {
+                curDoTaskIDs.add(item.getDotaskID());
+            });
+        };
+        try {
+            if(curDoTaskIDs.size()>0){
+                PageHelper.startPage(page,rows);
+                List<DotaskVo> list = dotaskCQuery.getList(stringUtils.ListToInSql(curDoTaskIDs),null,null,null,null,null,null,null,null);
+                PageInfo<DotaskVo> result = new PageInfo(list);
+                return result;
+            }
+            return null;
+        } catch (Exception e) {
+            throw new RuntimeException("Database query exception: " + e.getMessage(), e);
+        }
+    }
+
     @Override
     public List<DoTaskUserVo> getWorkUserList(String dotaskID) {
         List<DoTaskUserVo> list = dotaskCQuery.getWorkUserList(dotaskID);
@@ -63,7 +89,9 @@ public class DotaskImpl implements DotaskService {
         if (stringUtils.IsNullOrEmpty(id)) {
             return null;
         }
-        return dotaskCQuery.getList(id, null, null, null, null, null, null, null, null).stream().findFirst().orElse(null);
+        List<String> ids = new ArrayList<>();
+        ids.add(id);
+        return dotaskCQuery.getList(stringUtils.ListToInSql(ids), null, null, null, null, null, null, null, null).stream().findFirst().orElse(null);
     }
 
     @Override

+ 2 - 0
src/main/java/com/hz/employmentsite/services/service/taskAndLog/DotaskService.java

@@ -12,6 +12,8 @@ public interface DotaskService {
     PageInfo<DotaskVo> getList(Integer page, Integer rows, String name, String startTime, String endTime, String finishStartTime, String finishEndTime,
                                String regionCode, String streetCode, String workTypeId);
 
+    PageInfo<DotaskVo> getMyTasks(Integer page, Integer rows,String userID);
+
     List<DoTaskUserVo> getWorkUserList(String dotaskID);
 
     List<SiteUserVo> getUserList();

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

@@ -17,7 +17,7 @@
         on area.`code` = task.StreetCode
         where item.DictionaryCode='TaskType'
         <if test="id != '' and id != null">
-            and task.dotaskID = #{id}
+            and task.dotaskID in (${id})
         </if>
         <if test="name != '' and name != null">
             and task.dotaskName like Concat('%',#{name},'%')