Browse Source

Merge branch 'master' of http://39.98.153.250:9080/bowintek/EmploymentSite

pengjing 11 months ago
parent
commit
ec848d876e

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

@@ -38,4 +38,43 @@ export function saveWorkLog(data: any) {
     );
 }
 
+/**
+ * 删除工作日志
+ * @param ids 工作日志ID集合
+ */
+export function deleteWorkLog(ids: Array<any>) {
+    return request(
+        {
+            url: "taskAndLog/doWork/delete",
+            method: 'post',
+            data: ids
+        },
+        {
+            isNew: true,
+            errorMsg: '提交失败!'
+        },
+    );
+}
+
+/**
+ * 按登记用户ID和工作日期查询驿站人员当天工作所记录的业务数据数量
+ * @param userId 用户ID
+ * @param workTime 工作时间
+ */
+export function getRecordsCount(userId: string, workTime: string) {
+    return request<object>(
+        {
+            url: 'taskAndLog/doWork/getRecordsCount',
+            method: 'get',
+            params: {
+                userId,
+                workTime,
+            }
+        },
+        {
+            isNew: true,
+        }
+    )
+}
+
 

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

@@ -52,6 +52,10 @@ const routes: Array<RouteRecordRaw> = [
                 path: 'tabMain/company/list',
                 component: () => import('@/views/pages/company/list.vue')
             },
+            {
+                path: 'tabMain/company/detail',
+                component: () => import('@/views/pages/company/detail.vue')
+            },
             {
                 path: 'tabMain/company/menu',
                 component: () => import('@/views/pages/company/menu.vue')
@@ -84,6 +88,10 @@ const routes: Array<RouteRecordRaw> = [
                 path: 'tabMain/work/log/edit',
                 component: () => import('@/views/pages/work/log/edit.vue')
             },
+            {
+                path: 'tabMain/work/log/detail',
+                component: () => import('@/views/pages/work/log/detail.vue')
+            },
             {
                 path: 'tabMain/work/task/list',
                 component: () => import('@/views/pages/work/task/list.vue')

+ 214 - 0
h5app/src/views/pages/company/detail.vue

@@ -0,0 +1,214 @@
+<template>
+  <ion-page>
+    <ion-header class="header-theme2">
+      <ion-toolbar>
+        <ion-buttons slot="start">
+          <ion-icon :icon="arrowBackOutline" @click="onBack"></ion-icon>
+        </ion-buttons>
+        <ion-title>
+          企业信息详情
+        </ion-title>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content>
+      <div class="bw-vue-form">
+        <div class="form-detail">
+          <ion-label>企业名称</ion-label>
+          <ion-text>{{ dataModel.companyName }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>统一信用代码</ion-label>
+          <ion-text>{{ dataModel.companyCode }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>企业地址</ion-label>
+          <ion-text>{{ dataModel.companyAddress }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>所属驿站</ion-label>
+          <ion-text>{{ dataModel.siteName }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>联系人</ion-label>
+          <ion-text>{{ dataModel.userName }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>联系电话</ion-label>
+          <ion-text>{{ dataModel.userMobile }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>企业简介</ion-label>
+          <ion-text>{{ dataModel.companyDesc }}</ion-text>
+        </div>
+      </div>
+    </ion-content>
+    <ion-footer>
+    </ion-footer>
+  </ion-page>
+</template>
+<script lang="ts">
+import {defineComponent, ref, reactive, watch, toRefs} from "vue";
+import {getCompanyById} from "@/api/company";
+import {useRoute, useRouter} from "vue-router";
+import {onIonViewDidEnter} from "@ionic/vue";
+import {arrowBackOutline} from 'ionicons/icons';
+
+
+interface FormData{
+  dataModel:any
+}
+export default defineComponent({
+  name: 'CompanyMenu',
+  setup() {
+    const router = useRouter();
+    const route = useRoute();
+    const loading = ref<boolean>(false);
+    const formData = reactive<FormData>({
+      dataModel: {
+        companyID:null,
+        companyName:null
+      }
+    });
+    const onBack=()=>{
+      router.push({path:'./list',query:{reload:1}});
+    };
+
+    const onPathForward = (pathValue:string,statusValue:any)=>{
+      router.push({path: pathValue, query: {reload:1,id:formData.dataModel.companyID,status:statusValue}});
+    };
+
+    const loadData = async (companyID:any)=>{
+      loading.value = true;
+      const reqData = await getCompanyById(companyID);
+      formData.dataModel = reqData;
+      console.log("dataModel",formData.dataModel);
+      loading.value = false;
+    };
+
+    const reload = (companyID:any) => {
+      loadData(companyID);
+    };
+
+    watch(() => route.query, () => {
+      if (route.query.reload) {
+        reload(route.query.id);
+      }
+    });
+
+    onIonViewDidEnter(() => {
+      if (route.query.reload) {
+        reload(route.query.id)
+      }
+    });
+
+
+    return {
+      ...toRefs(formData),
+      arrowBackOutline,
+      route,
+      loading,
+      onPathForward,
+      onBack,
+      loadData,
+      router,
+    }
+  },
+  mounted() {
+    const companyID = this.route.query.id;
+    this.loadData(companyID);
+  }
+});
+</script>
+
+<style lang="less">
+ion-item {
+  --border-width: 0;
+  --border-style: none;
+
+  ion-label, ion-input, ion-select, ion-datetime-button {
+    font-size: 14px !important;
+  }
+}
+
+.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>

+ 0 - 4
h5app/src/views/pages/company/edit.vue

@@ -289,7 +289,6 @@ export default defineComponent({
       {value: 0, name: '否'},
     ];
 
-
     const getCompanyModelList = async function(){
       const companyModelResult :any = await getSysDictionaryList("CompanyModel");
       companyModelList.value = companyModelResult;
@@ -395,10 +394,7 @@ export default defineComponent({
     };
 
     const onBack=()=>{
-      if(isAdd.value)
         router.push({path: './list', query: {reload:1}});
-      else if(curStepData.value.statusVal==1)
-        router.push({path: './menu', query: {reload:1,id:formState.dataModel.companyID,status:2}});
     }
 
     const getRegionListData = () => {

+ 23 - 44
h5app/src/views/pages/company/list.vue

@@ -18,46 +18,26 @@
         <ion-button slot="end" style="height: 33px;width: 70px;margin-left: 10px;--box-shadow: none;--border-radius: 14px;" @click="reload" >搜索
         </ion-button>
       </ion-item>
-      <ion-list class="list-content">
-        <ion-item v-for="(record,key) in dataList" :key="key" detail @click="onEdit(record.companyID)">
-          <ion-grid>
-            <ion-row>
-              <ion-col>
-                <ion-label style="display: flex;justify-content: space-between;">
-                  <ion-text>
-                    {{ record.companyName }}
-                  </ion-text>
-                  <ion-label slot="end">
-                    <ion-text style="text-align:right;color:#3a7be0;">◆</ion-text>
-                    <ion-text style="text-align:right;">正在跟进</ion-text>
-                  </ion-label>
-                </ion-label>
-              </ion-col>
-            </ion-row>
-            <ion-row>
-              <ion-col>
-                <ion-label>
-                  <p>
-                    最新跟进时间:{{ dayjs(record.modifyTime).format("YYYY-MM-DD")}}
-                  </p>
-                </ion-label>
-              </ion-col>
-            </ion-row>
-            <ion-row>
-              <ion-col>
-                <ion-label style="display: flex;justify-content: space-between;">
-                  <p>
-                    参保人数:{{ record.insuredCount==null?"0":record.insuredCount }}人
-                  </p>
-                  <p>
-                    岗位数量:{{ record.postCount }}
-                  </p>
-                </ion-label>
-              </ion-col>
-            </ion-row>
-          </ion-grid>
-        </ion-item>
-      </ion-list>
+
+      <div class="bw-vue-list">
+        <div class="list-content">
+          <ion-list>
+            <ion-item v-for="(record,key) in dataList" :key="key" detail @click="onDetail(record.companyID)">
+              <ion-label>
+                <div class="multi-title">
+                  <h2>{{ record.companyName }}</h2>
+                </div>
+                <p>地点:{{record.companyAddress}}</p>
+                <p>联系人:{{record.userName}}</p>
+                <div class="multi-title">
+                  <p>联系电话:{{record.userMobile}}</p>
+                  <p>岗位数量:{{ record.postCount }}</p>
+                </div>
+              </ion-label>
+            </ion-item>
+          </ion-list>
+        </div>
+      </div>
       <b-empty v-if="dataList.length<=0" :loading="loading"/>
       <ion-infinite-scroll threshold="100px" @ionInfinite="onScroll($event)">
         <ion-infinite-scroll-content
@@ -130,8 +110,8 @@ export default defineComponent({
       router.push({path: './edit', query: {reload: 1,id: null,status: 1}});
     }
 
-    const onEdit = (companyID:string) => {
-      router.push({path: './menu', query: {reload: 1,id: companyID,status: 2}});
+    const onDetail = (companyID:string) => {
+      router.push({path: './detail', query: {reload: 1,id: companyID}});
     }
 
 
@@ -156,7 +136,7 @@ export default defineComponent({
       searchParams,
       onBack,
       onAdd,
-      onEdit,
+      onDetail,
       onScroll,
       loadData,
       reload,
@@ -182,7 +162,6 @@ export default defineComponent({
     ion-item {
       margin-top: 10px;
       font-size: 14px;
-      border: 1px solid rgb(242, 242, 245);
 
       p {
         font-size: 12px;

+ 148 - 0
h5app/src/views/pages/work/log/detail.vue

@@ -0,0 +1,148 @@
+<template>
+  <ion-page class="list-page">
+    <ion-header class="header-theme2">
+      <ion-toolbar>
+        <ion-buttons slot="start">
+          <ion-icon :icon="arrowBackOutline" @click="onCancel"></ion-icon>
+        </ion-buttons>
+        <ion-title>工作日志详情</ion-title>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content>
+      <!-- 详情 -->
+      <div class="bw-vue-form">
+        <div class="form-title">基本信息</div>
+        <div class="form-detail">
+          <ion-label>工作日志日期</ion-label>
+          <ion-text>{{ workLogData.dataModel.workTime }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>日志类型</ion-label>
+          <ion-text>{{ workLogData.dataModel.logTypeName }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>工作内容</ion-label>
+          <ion-text>{{ workLogData.dataModel.workContent }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>走访企业数量</ion-label>
+          <ion-text>{{ recordsCount.RecordsCompanyNum }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>收集岗位</ion-label>
+          <ion-text>{{ recordsCount.RecordsPostNum }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>登记求职人员</ion-label>
+          <ion-text>{{ recordsCount.RecordsJobuserNum }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>求职意向</ion-label>
+          <ion-text>{{ recordsCount.RecordsJobhuntNum }}</ion-text>
+        </div>
+      </div>
+    </ion-content>
+    <ion-loading
+        :is-open="loading"
+        message="加载中..."
+        @didDismiss="setOpen(false)" >
+    </ion-loading>
+  </ion-page>
+</template>
+<script setup lang="ts">
+import {computed, defineComponent, reactive, ref, toRefs} from "vue";
+import {getSysDictionaryList} from '@/api/system/dictionary';
+import {getRecordsCount, 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";
+import dayjs from "dayjs";
+
+interface workLogModel {
+  dataModel:any
+}
+interface SelectProps {
+  name: string,
+  value: string
+}
+
+const router = useRouter();
+const route = useRoute();
+const loading = ref(false);
+const logTypeList=ref<SelectProps[]>([]);
+const workLogData = reactive<workLogModel>({
+  dataModel:{
+    doWorkID: null,
+    workTime: dayjs().format("YYYY-MM-DD"),
+    doTypeID:null,
+    workContent: null
+  }});
+// 日志当天完成工作量数据
+const recordsCount = reactive<any>({
+  RecordsCompanyNum: null,
+  RecordsJobuserNum: null,
+  RecordsPostNum: null,
+  RecordsJobhuntNum: null,
+});
+
+const onCancel = () => {
+  router.push("./list");
+}
+
+const getWorkTypeList = async function(){
+  const data:any =await getSysDictionaryList("LogType");
+  logTypeList.value = data;
+};
+
+const setOpen = (isOpen: boolean) => {
+  loading.value = isOpen;
+};
+
+const loadData = async (doWorkID: any) => {
+  loading.value = true;
+  await getWorkTypeList();
+  const reqData = await getWorkLogById(doWorkID);
+  workLogData.dataModel = reqData;
+  if(workLogData.dataModel.workTime==null){
+    workLogData.dataModel.workTime = dayjs(new Date().toLocaleDateString()).format("YYYY-MM-DD")+"T00:00:00.000+08:00";
+  }
+  console.log("初始化dataModel",workLogData.dataModel);
+  // 查询当天登记业务数据数量
+  await getRecordsCount(workLogData.dataModel.userId, workLogData.dataModel.workTime).then((res:any)=>{
+    Object.keys(recordsCount).forEach((key)=>{
+      recordsCount[key] = res[key];
+    })
+  });
+  loading.value = false;
+};
+
+
+const reload = (doWorkID: any) => {
+  workLogData.dataModel = {};
+  loadData(doWorkID);
+}
+
+onIonViewDidEnter(() => {
+  if (route.query.reload)
+    reload(route.query.doWorkID);
+});
+</script>
+
+<style lang="less">
+
+.custom{
+  --placeholder-color: gray;
+  --placeholder-font-style:italic;
+  --placeholder-opacity: 1;
+}
+
+.title-item{
+  margin-left: 15px;
+  color:#1c3d70 !important;
+  font-size: 14px !important;
+  font-weight: bold;
+}
+
+</style>

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

@@ -1,65 +1,58 @@
 <template>
-  <ion-page>
+  <ion-page class="list-page">
     <ion-header class="header-theme2">
       <ion-toolbar>
         <ion-buttons slot="start">
           <ion-icon :icon="arrowBackOutline" @click="onCancel"></ion-icon>
         </ion-buttons>
-        <ion-title>{{isAdd?"工作日志录入":"工作日志详情"}}</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>
-            基本信息
+      <!-- 编辑 -->
+      <form>
+        <div class="bw-vue-form">
+          <div class="form-title">基本信息</div>
+          <div class="form-input">
+            <ion-label>
+              工作日志日期
+              <span class="danger">*</span>
+            </ion-label>
+            <div class="dateTimeBox">
+              <ion-datetime-button class="dateTimeBtn" datetime="workTime"></ion-datetime-button>
+              <ion-modal :keep-contents-mounted="true">
+                <ion-datetime id="workTime" placeholder="日期"
+                              v-model="dataModel.workTime"  :prefer-wheel="true"
+                              dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                              :show-default-buttons="true">
+                </ion-datetime>
+              </ion-modal>
+<!--              <span style="margin-right: 5px; color: #02a6f1">选择</span>-->
+            </div>
           </div>
-        </ion-item>
-        <ion-list>
-          <ion-label class="title-item">工作日志日期<span class="danger">*</span></ion-label>
-          <ion-item  mode="md"  :class="[workLogValid.dataModel.workTime.$error?'ion-invalid':'ion-valid']" v-if="isAdd">
-            <ion-datetime-button datetime="workTime" ></ion-datetime-button>
-            <ion-modal :keep-contents-mounted="true">
-              <ion-datetime id="workTime" placeholder="日期"
-                            v-model="dataModel.workTime"  :prefer-wheel="true"
-                            dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
-                            :show-default-buttons="true">
-              </ion-datetime>
-            </ion-modal>
-            <ion-note slot="error">工作日志日期不能为空</ion-note>
-          </ion-item>
-          <ion-item v-if="!isAdd">
-            <ion-label >{{dataModel.workTime}}</ion-label>
-          </ion-item>
-          <ion-label class="title-item">日志类型<span class="danger">*</span></ion-label>
-          <ion-item  mode="md" :class="[workLogValid.dataModel.doTypeID.$error?'ion-invalid':'ion-valid']"  v-if="isAdd">
-            <ion-select name="doTypeID"  id="doTypeID" okText="确定" cancelText="取消" v-model="dataModel.doTypeID"
-                        interface="action-sheet" placeholder="请选择日志类型" style="width:100%;text-align: left;">
-              <ion-select-option v-for=" (it,key) in logTypeList" :key="key" :value="it.value">
+          <div class="form-select">
+            <ion-label>
+              日志类型
+              <span class="danger">*</span>
+            </ion-label>
+            <ion-select name="doTypeID" id="doTypeID" interface="action-sheet" okText="确定" cancelText="取消" v-model="dataModel.doTypeID" 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 v-if="!isAdd">
-            <ion-label >{{dataModel.logTypeName}}</ion-label>
-          </ion-item>
-          <ion-label class="title-item">工作内容<span class="danger">*</span></ion-label>
-          <ion-item mode="md" :class="[workLogValid.dataModel.workContent.$error?'ion-invalid':'ion-valid']" v-if="isAdd">
-              <ion-textarea name="workContent" id="workContent" class="custom"
-                            v-model="dataModel.workContent"  label-placement="stacked"
-                            style="text-align: left;" placeholder="请输入工作内容" rows="4"></ion-textarea>
-            <ion-note slot="error">工作内容不能为空</ion-note>
-          </ion-item>
-          <ion-item v-if="!isAdd">
-            <ion-label >{{dataModel.workContent}}</ion-label>
-          </ion-item>
-        </ion-list>
+          </div>
+          <div class="form-input">
+            <ion-label>
+              工作内容
+              <span class="danger">*</span>
+            </ion-label>
+            <ion-textarea name="workContent" id="workContent" placeholder="请输入工作内容" :rows="3" v-model="dataModel.workContent"></ion-textarea>
+          </div>
+        </div>
       </form>
     </ion-content>
     <ion-footer>
-      <ion-button shape="round" expand="block" v-if="isAdd" @click="onSave">提交</ion-button>
+      <ion-button shape="round" expand="block" @click="onSave">提交</ion-button>
     </ion-footer>
     <ion-loading
         :is-open="loading"
@@ -71,7 +64,7 @@
 <script lang="ts">
 import {computed, defineComponent, reactive, ref, toRefs} from "vue";
 import {getSysDictionaryList} from '@/api/system/dictionary';
-import {getWorkLogById,saveWorkLog} from '@/api/workLog';
+import {getWorkLogById, saveWorkLog} from '@/api/workLog';
 import {useRoute, useRouter} from "vue-router";
 import {alertController, onIonViewDidEnter} from "@ionic/vue";
 import {arrowBackOutline} from 'ionicons/icons';
@@ -92,7 +85,6 @@ export default defineComponent({
   setup() {
     const router = useRouter();
     const route = useRoute();
-    const isAdd = ref<boolean>(false);
     const loading = ref(false);
     const logTypeList=ref<SelectProps[]>([]);
     const workLogData = reactive<workLogModel>({
@@ -102,6 +94,13 @@ export default defineComponent({
         doTypeID:null,
         workContent: null
     }});
+    // 日志当天完成工作量数据
+    const recordsCount = reactive<any>({
+      RecordsCompanyNum: null,
+      RecordsJobuserNum: null,
+      RecordsPostNum: null,
+      RecordsJobhuntNum: null,
+    });
     const workLogRules = computed(()=>{
       return {dataModel:{
           workTime:{required},
@@ -150,7 +149,6 @@ export default defineComponent({
 
     const loadData = async (doWorkID: any) => {
       loading.value = true;
-      isAdd.value = doWorkID == null;
       await getWorkTypeList();
       const reqData = await getWorkLogById(doWorkID);
       workLogData.dataModel = reqData;
@@ -176,7 +174,6 @@ export default defineComponent({
     return {
       ...toRefs(workLogData),
       arrowBackOutline,
-      isAdd,
       logTypeList,
       setOpen,
       onSave,
@@ -185,7 +182,8 @@ export default defineComponent({
       route,
       router,
       loading,
-      workLogValid
+      workLogValid,
+      recordsCount
     }
   }
 });
@@ -206,4 +204,11 @@ export default defineComponent({
   font-weight: bold;
 }
 
+.dateTimeBox {
+  width: 100%;
+  display: flex;
+  margin-top: 5px;
+  justify-content: space-between;
+  align-content: center;
+}
 </style>

+ 192 - 39
h5app/src/views/pages/work/log/list.vue

@@ -12,36 +12,70 @@
       </ion-toolbar>
     </ion-header>
     <ion-content>
-      <ion-item class="search-item">
-        <ion-input type="date" mode="md" v-model="searchParamsState.workStartDate" style="width: 105px;"></ion-input>
-        <ion-label style="margin:0px 5px 0px 5px">至</ion-label>
-        <ion-input type="date" mode="md" v-model="searchParamsState.workEndDate" style="width: 105px;"></ion-input>
+      <ion-item style="font-size: 10px;--border-style: none;">
+        <label>日期:</label>
+        <ion-datetime-button datetime="reportDateBegin"></ion-datetime-button>
+        <span style="margin:0 5px">至</span>
+        <ion-modal :keep-contents-mounted="true">
+          <ion-datetime id="reportDateBegin" placeholder="日期"
+                        v-model="searchParamsState.workStartDate"
+                        dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                        @ionChange="onSearch"
+                        :show-default-buttons="true">
+          </ion-datetime>
+        </ion-modal>
+        <ion-datetime-button datetime="reportDateEnd"></ion-datetime-button>
+        <ion-modal :keep-contents-mounted="true">
+          <ion-datetime id="reportDateEnd" placeholder="日期"
+                        v-model="searchParamsState.workEndDate"
+                        dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                        @ionChange="onSearch"
+                        :show-default-buttons="true">
+          </ion-datetime>
+        </ion-modal>
         <ion-button slot="end" style="height: 33px;width:70px;margin-left: 10px;--box-shadow: none;--border-radius: 14px;" @click="onSearch">搜索</ion-button>
       </ion-item>
-      <ion-list class="list-content">
-        <ion-item v-for="(record,key) in dataList" :key="key" detail>
-          <ion-grid @click="onDetail(record.doWorkID)" >
-            <ion-row>
-              <ion-col>
-                <ion-label style="display: flex;justify-content: space-between;">
-                  <ion-text>
-                    {{ record.workTime }}工作日志
-                  </ion-text>
-                </ion-label>
-              </ion-col>
-            </ion-row>
-            <ion-row>
-              <ion-col>
-                <ion-label>
-                  <p>
-                    日志类型:{{ record.logTypeName }}
-                  </p>
-                </ion-label>
-              </ion-col>
-            </ion-row>
-          </ion-grid>
-        </ion-item>
-      </ion-list>
+      <!-- 滑动数据列表 -->
+      <div class="panel-content" v-if="!loading">
+        <div v-for="(record,key) in dataList" :key="key" style="border: 1px solid rgb(242, 242, 245); margin: 10px; border-radius: 10px">
+          <ion-item-sliding>
+            <ion-item>
+              <ion-grid @click="onDetail(record.doWorkID)">
+                <ion-row>
+                  <ion-col>
+                    <ion-label style="display: flex;justify-content: space-between;">
+                      <ion-text>
+                        {{ record.workTime }}工作日志
+                      </ion-text>
+                    </ion-label>
+                  </ion-col>
+                </ion-row>
+                <ion-row>
+                  <ion-col>
+                    <ion-label>
+                      <p>
+                        日志类型:{{ record.logTypeName }}
+                      </p>
+                    </ion-label>
+                  </ion-col>
+                </ion-row>
+              </ion-grid>
+              <span @click="onDetail(record.doWorkID)">
+                <ion-icon :icon="chevronForwardOutline" slots="end"></ion-icon>
+              </span>
+            </ion-item>
+
+            <ion-item-options>
+              <ion-item-option @click="onEdit(record.doWorkID)">
+                <ion-icon :icon="buildOutline"></ion-icon>
+              </ion-item-option>
+              <ion-item-option color="danger" @click="setDelAlertOpen(true, record.doWorkID)">
+                <ion-icon :icon="trashOutline"></ion-icon>
+              </ion-item-option>
+            </ion-item-options>
+          </ion-item-sliding>
+        </div>
+      </div>
       <b-empty v-if="dataList.length<=0" :loading="loading"/>
       <ion-infinite-scroll threshold="100px" @ionInfinite="onScroll($event)">
         <ion-infinite-scroll-content
@@ -50,18 +84,41 @@
         </ion-infinite-scroll-content>
       </ion-infinite-scroll>
     </ion-content>
+
+    <ion-alert
+        :is-open="delAlertOpen"
+        header="删除确认"
+        message="确定要删除该工作日志吗?"
+        :buttons="delAlertButtons"
+        @didDismiss="setDelAlertOpen(false, null)"
+    ></ion-alert>
+
+    <ion-alert
+        :is-open="infoAlertOpen"
+        :header="infoAlterData.title"
+        :message="infoAlterData.message"
+        :buttons="infoAlertButtons"
+        @didDismiss="setInfoAlertOpen(false)"
+    ></ion-alert>
+
+    <ion-loading
+        :is-open="delLoading"
+        message="删除中..."
+        @didDismiss="setDelLoadingOpen(false)" >
+    </ion-loading>
   </ion-page>
 </template>
 
 <script lang="ts">
 
 import {useRouter} from "vue-router";
-import {defineComponent, reactive, ref} from 'vue';
-import {arrowBackOutline, ellipse, addCircleOutline} from 'ionicons/icons';
+import {defineComponent, onMounted, reactive, ref} from 'vue';
+import {arrowBackOutline, addCircleOutline} from 'ionicons/icons';
 import {IonIcon, onIonViewDidEnter} from '@ionic/vue';
-import {getWorkLogList} from '@/api/workLog';
+import {deleteWorkLog, getWorkLogList} from '@/api/workLog';
 import BEmpty from "@/components/empty.vue";
 import dayjs from "dayjs";
+import {chevronForwardOutline,buildOutline,trashOutline} from 'ionicons/icons';
 
 export default defineComponent({
   name: 'WorkLogList',
@@ -79,6 +136,61 @@ export default defineComponent({
     const router = useRouter();
     const colors = ref(["secondary", "tertiary", "success", "warning"]);
 
+    // 删除警告弹窗按钮定义
+    const delAlertButtons = [
+      {
+        text: '取消',
+        role: 'cancel',
+        handler: () => {
+          console.log('Alert canceled');
+        },
+      },
+      {
+        text: '确定',
+        role: 'confirm',
+        handler: () => {
+          delLoading.value = true
+          deleteWorkLog(delWorkIds.value).then((res) => {
+            infoAlterData.title = "提示";
+            infoAlterData.message = "删除成功";
+            setInfoAlertOpen(true);
+          }).finally(()=>{
+            delLoading.value = false
+          })
+        },
+      },
+    ];
+    // 删除警告弹窗开关
+    const delAlertOpen = ref(false);
+    // 删除数据
+    const delWorkIds = ref<Array<any>>([])
+    // 删除加载
+    const delLoading = ref(false);
+    // 信息弹窗开关
+    const infoAlertOpen = ref(false);
+    // 信息弹窗内容
+    const infoAlterData = reactive({
+      title:"",
+      message:""
+    })
+    // 删除警告弹窗按钮定义
+    const infoAlertButtons = [
+      {
+        text: '确定',
+        role: 'confirm',
+        handler: () => {
+          loading.value = true;
+          getWorkLogList(searchParamsState).then(res=>{
+            dataList.value = res.list;
+            searchParamsState.total = res.total;
+          }).finally(() => {
+            loading.value = false;
+          })
+        },
+      },
+    ];
+
+
     const loadData = async function () {
       loading.value = true;
       const result: any = await getWorkLogList(searchParamsState);
@@ -103,23 +215,29 @@ export default defineComponent({
       router.push({path: './edit', query: {reload: 1, doWorkID: null}});
     }
 
+    const onEdit = (doWorkID: string) => {
+      router.push({path: './edit', query: {reload: 1, doWorkID: doWorkID}});
+    }
+
     const onBack =()=>{
       router.push('../');
     }
 
     const onDetail = (doWorkID:string) =>{
-      router.push({path: './edit', query: {reload:1, doWorkID: doWorkID}});
+      router.push({path: './detail', query: {reload:1, doWorkID: doWorkID}});
     }
 
     const reload = () => {
+      // 设置查询初始截止日期为当天
       const firstDay = new Date();
-      firstDay.setMonth(firstDay.getMonth());
-      firstDay.setDate(1);
-      const lastDay = new Date(firstDay.getFullYear(), firstDay.getMonth() + 1, 0);
+      // 设置查询初始开始时间为当天的一个月前
+      const lastDay = new Date();
+      lastDay.setDate(firstDay.getDate() - 30);
+
       dataList.value = [];
       searchParamsState.pageIndex = 1;
-      searchParamsState.workStartDate=dayjs(firstDay.toLocaleDateString()).format('YYYY-MM-DD');
-      searchParamsState.workEndDate = dayjs(lastDay.toLocaleDateString()).format('YYYY-MM-DD');
+      searchParamsState.workStartDate=dayjs(lastDay.toLocaleDateString()).format('YYYY-MM-DD');
+      searchParamsState.workEndDate = dayjs(firstDay.toLocaleDateString()).format('YYYY-MM-DD');
       loadData();
     }
 
@@ -129,9 +247,31 @@ export default defineComponent({
       loadData();
     }
 
-    onIonViewDidEnter(() => {
+    // 设置要删除的日志
+    function setDelAlertOpen(value: boolean, doWorkId: any) {
+      delAlertOpen.value = value;
+      if(doWorkId != null) {
+        delWorkIds.value = new Array(doWorkId);
+      }
+    }
+
+    // 设置删除弹窗开启关闭
+    function setDelLoadingOpen(value: boolean) {
+      delLoading.value = value
+    }
+
+    // 设置信息提示弹窗开关
+    function setInfoAlertOpen(value: boolean) {
+      infoAlertOpen.value = value;
+    }
+
+    // onIonViewDidEnter(() => {
+    //   reload();
+    // });
+
+    onMounted(() => {
       reload();
-    });
+    })
 
     return {
       router,
@@ -148,6 +288,19 @@ export default defineComponent({
       reload,
       arrowBackOutline,
       addCircleOutline,
+      chevronForwardOutline,
+      buildOutline,
+      trashOutline,
+      onEdit,
+      delAlertButtons,
+      delAlertOpen,
+      setDelAlertOpen,
+      delLoading,
+      setDelLoadingOpen,
+      infoAlertOpen,
+      infoAlterData,
+      setInfoAlertOpen,
+      infoAlertButtons
     }
   }
 });

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

@@ -6,7 +6,7 @@
         <a-col flex="800px">
           <a-form-item label="企业名称" :label-col="{ span: 3}"
                        name="companyID" :rules="[{ required: true, message: '请选择关联企业!' }]" >
-            <a-select ref="select" show-search optionFilterProp="label" v-model:value="dataModel.companyID" >
+            <a-select :disabled="isEdit" ref="select" show-search optionFilterProp="label" v-model:value="dataModel.companyID" >
               <a-select-option v-for="item in companyList" :label="item.companyName" :value="item.companyID"
                                :key="item.companyID">
                 <span>{{ item.companyName }}</span>
@@ -207,7 +207,7 @@ export default defineComponent(
 
       const fullpath = router.currentRoute.value.fullPath;
       const tabsViewStore = useTabsViewStore();
-      const isEdit = ref(false);
+      const isEdit = ref<boolean>(false);
 
       const cultureLevelList = ref<SelectProps['options']>();
       const WorkYearTypeList = ref<SelectProps['options']>();
@@ -301,7 +301,9 @@ export default defineComponent(
 
       }
 
+
       const loadData = (id: any) => {
+        isEdit.value = id != null;
         getFirstProfessionList();
         getPostByID(id).then(result => {
           console.log(result);