Forráskód Böngészése

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

pengjing 1 éve
szülő
commit
48d6a36e8c
26 módosított fájl, 20364 hozzáadás és 267 törlés
  1. 9860 0
      doc/就业驿站管理系统.pdb
  2. 9880 0
      doc/就业驿站管理系统.pdm
  3. 30 0
      h5app/package-lock.json
  4. 1 0
      h5app/package.json
  5. 5 2
      h5app/src/api/workTask/index.ts
  6. 4 0
      h5app/src/router/index.ts
  7. 160 129
      h5app/src/views/pages/company/edit.vue
  8. 134 22
      h5app/src/views/pages/company/list.vue
  9. 2 5
      h5app/src/views/pages/company/postList.vue
  10. 1 1
      h5app/src/views/pages/jobhunt/jobHuntEdit.vue
  11. 1 1
      h5app/src/views/pages/post/edit.vue
  12. 1 1
      h5app/src/views/pages/post/recommendJob.vue
  13. 112 0
      h5app/src/views/pages/work/task/detail.vue
  14. 109 86
      h5app/src/views/pages/work/task/edit.vue
  15. 16 7
      h5app/src/views/pages/work/task/list.vue
  16. 1 1
      h5app/src/views/pages/work/task/myTask.vue
  17. 8 3
      h5app/src/views/sapp/tabMain.vue
  18. 13 2
      src/main/java/com/hz/employmentsite/controller/companyService/CompanyController.java
  19. 2 2
      src/main/java/com/hz/employmentsite/controller/taskAndLog/DoTaskController.java
  20. 12 0
      src/main/java/com/hz/employmentsite/model/PcDotaskUser.java
  21. 2 1
      src/main/java/com/hz/employmentsite/services/impl/taskAndLog/DoTaskImpl.java
  22. 3 1
      src/main/java/com/hz/employmentsite/services/service/taskAndLog/DoTaskService.java
  23. 2 0
      src/main/java/com/hz/employmentsite/vo/taskAndLog/DoTaskVo.java
  24. 3 1
      src/main/resources/mapping/PcDotaskUserMapper.xml
  25. 1 1
      src/main/resources/mapping/cquery/CompanyCQuery.xml
  26. 1 1
      src/main/resources/mapping/cquery/DoTaskCQuery.xml

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 9860 - 0
doc/就业驿站管理系统.pdb


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 9880 - 0
doc/就业驿站管理系统.pdm


+ 30 - 0
h5app/package-lock.json

@@ -20,6 +20,7 @@
         "core-js": "^3.6.5",
         "crypto-js": "^4.1.1",
         "dayjs": "~1.11.5",
+        "ion-multi-picker": "^2.1.3",
         "ionicons": "^6.0.3",
         "pinia": "~2.0.18",
         "vue": "^3.2.47",
@@ -8613,6 +8614,23 @@
         "node": ">=10"
       }
     },
+    "node_modules/ion-multi-picker": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmmirror.com/ion-multi-picker/-/ion-multi-picker-2.1.3.tgz",
+      "integrity": "sha512-O8dE44jJGWRVJXzlWK75lTDkpAfpB77VE1Dxg6r4X1wZCyvreKb5RQQQlscnHANoq12woyzztfTjYF05thjehw==",
+      "engines": {
+        "node": ">=8.0.0"
+      },
+      "peerDependencies": {
+        "ionic-angular": "^3.0.0"
+      }
+    },
+    "node_modules/ionic-angular": {
+      "version": "3.9.10",
+      "resolved": "https://registry.npmmirror.com/ionic-angular/-/ionic-angular-3.9.10.tgz",
+      "integrity": "sha512-4nmGrdpu4Zy3SZwF0AaS/3gDrbFGU1dV+zn1eqInFgFj9q20N1cIITgvyIcoxUI/IoqYiohsJX1rGY5vB/HrhQ==",
+      "peer": true
+    },
     "node_modules/ionicons": {
       "version": "6.1.3",
       "integrity": "sha512-ptzz38dd/Yq+PgjhXegh7yhb/SLIk1bvL9vQDtLv1aoSc7alO6mX2DIMgcKYzt9vrNWkRu1f9Jr78zIFFyOXqw==",
@@ -22877,6 +22895,18 @@
       "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
       "dev": true
     },
+    "ion-multi-picker": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmmirror.com/ion-multi-picker/-/ion-multi-picker-2.1.3.tgz",
+      "integrity": "sha512-O8dE44jJGWRVJXzlWK75lTDkpAfpB77VE1Dxg6r4X1wZCyvreKb5RQQQlscnHANoq12woyzztfTjYF05thjehw==",
+      "requires": {}
+    },
+    "ionic-angular": {
+      "version": "3.9.10",
+      "resolved": "https://registry.npmmirror.com/ionic-angular/-/ionic-angular-3.9.10.tgz",
+      "integrity": "sha512-4nmGrdpu4Zy3SZwF0AaS/3gDrbFGU1dV+zn1eqInFgFj9q20N1cIITgvyIcoxUI/IoqYiohsJX1rGY5vB/HrhQ==",
+      "peer": true
+    },
     "ionicons": {
       "version": "6.1.3",
       "integrity": "sha512-ptzz38dd/Yq+PgjhXegh7yhb/SLIk1bvL9vQDtLv1aoSc7alO6mX2DIMgcKYzt9vrNWkRu1f9Jr78zIFFyOXqw==",

+ 1 - 0
h5app/package.json

@@ -23,6 +23,7 @@
     "core-js": "^3.6.5",
     "crypto-js": "^4.1.1",
     "dayjs": "~1.11.5",
+    "ion-multi-picker": "^2.1.3",
     "ionicons": "^6.0.3",
     "pinia": "~2.0.18",
     "vue": "^3.2.47",

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

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

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

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

+ 160 - 129
h5app/src/views/pages/company/edit.vue

@@ -24,60 +24,70 @@
         </div>
       </div>
       <form autocomplete="off">
-        <ion-list>
-          <ion-item>
-            <div class="panel-title2">
-              <div class="item-flag"></div>
-              基本信息
-            </div>
-          </ion-item>
-          <ion-label class="title-item">统一信用代码<span class="danger">*</span></ion-label>
-          <ion-item mode="md" :class="[v$.dataModel.companyCode.$error?'ion-invalid':'ion-valid']">
+        <div class="bw-vue-form">
+          <div class="form-title">基本信息</div>
+          <div class="form-input">
+          <ion-label>企业名称<span class="danger">*</span></ion-label>
+          <ion-input placeholder="请输入企业名称" label-placement="stacked" :clear-input="true"
+                     v-model="dataModel.companyName" class="custom">
+          </ion-input>
+<!--          <ion-note slot="error">企业名称不能为空</ion-note>-->
+        </div>
+          <div class="form-input">
+            <ion-label>统一信用代码<span class="danger">*</span></ion-label>
             <ion-input placeholder="请输入统一信用代码" label-placement="stacked" :clear-input="true"
                        v-model="dataModel.companyCode" class="custom">
             </ion-input>
-            <ion-note slot="error">统一信用代码不能为空</ion-note>
-          </ion-item>
-          <ion-label class="title-item">企业名称<span class="danger">*</span></ion-label>
-          <ion-item mode="md" :class="[v$.dataModel.companyName.$error?'ion-invalid':'ion-valid']">
-            <ion-input placeholder="请输入企业名称" label-placement="stacked" :clear-input="true"
-                       v-model="dataModel.companyName" class="custom">
-            </ion-input>
-            <ion-note slot="error">企业名称不能为空</ion-note>
-          </ion-item>
-          <ion-label class="title-item">服务驿站<span class="danger">*</span></ion-label>
-          <ion-item mode="md" :class="[v$.dataModel.siteID.$error?'ion-invalid':'ion-valid']">
-              <ion-select id="siteID" name="siteID"  cancel-text="取消"  v-model="dataModel.siteID"
-                          interface="action-sheet" placeholder="请选择服务驿站"  style="width: 100%;text-align: left;">
-                <ion-select-option v-for="(record,key) in siteList" :key="key"  v-model:value="record.siteID">
-                  {{ record.siteName }}
-                </ion-select-option>
-              </ion-select>
-            <ion-note slot="error">服务驿站不能为空</ion-note>
-          </ion-item>
-          <ion-label class="title-item">企业办公地址<span class="danger">*</span></ion-label>
-          <ion-item mode="md" :class="[v$.dataModel.companyAddress.$error?'ion-invalid':'ion-valid']">
-            <ion-textarea placeholder="请输入企业办公地址" label-placement="stacked" :rows="3" :clear-input="true"
-                       v-model="dataModel.companyAddress" class="custom" >
+<!--            <ion-note slot="error">统一信用代码不能为空</ion-note>-->
+          </div>
+         <div class="form-select">
+           <ion-label>所属街道<span class="danger">*</span></ion-label>
+<!--           <ion-multi-picker item-content v-model="dataModel.regionCode"-->
+<!--                             :placeholder="defaultAddText" :multiPickerColumns="cityColumns"-->
+<!--                             cancelText="取消" doneText="选择">-->
+<!--           </ion-multi-picker>-->
+           <ion-select interface="action-sheet" placeholder="请选择所属街道" cancel-text="取消"
+                       id="streetCode" v-model="dataModel.streetCode" style="width: 100%;text-align: left;">
+             <ion-select-option v-for="(record,key) in streetList" :key="key"
+                                v-model:value="record.code">
+               {{ record.name }}
+             </ion-select-option>
+           </ion-select>
+
+          </div>
+          <div class="form-select">
+            <ion-label>所属驿站<span class="danger">*</span></ion-label>
+            <ion-select id="siteID" name="siteID"  cancel-text="取消"  v-model="dataModel.siteID"
+                        interface="action-sheet" placeholder="请选择服务驿站"  style="width: 100%;text-align: left;">
+              <ion-select-option v-for="(record,key) in siteList" :key="key"  v-model:value="record.siteID">
+                {{ record.siteName }}
+              </ion-select-option>
+            </ion-select>
+<!--            <ion-note slot="error">服务驿站不能为空</ion-note>-->
+          </div>
+          <div class="form-input">
+            <ion-label>办公地址<span class="danger">*</span></ion-label>
+            <ion-textarea placeholder="请输入办公地址" label-placement="stacked" :rows="3" :clear-input="true"
+                          v-model="dataModel.companyAddress" class="custom" style="border-bottom: 1px solid #fff2e8;">
             </ion-textarea>
-            <ion-note slot="error">企业办公地址不能为空</ion-note>
-          </ion-item>
-          <ion-label class="title-item">企业联系人<span class="danger">*</span></ion-label>
-          <ion-item mode="md" :class="[v$.dataModel.userName.$error?'ion-invalid':'ion-valid']">
+<!--            <ion-note slot="error">办公地址不能为空</ion-note>-->
+          </div>
+          <div class="form-input">
+            <ion-label>企业联系人<span class="danger">*</span></ion-label>
             <ion-input placeholder="请输入企业联系人" label-placement="stacked" :clear-input="true"
                        v-model="dataModel.userName" class="custom">
             </ion-input>
-            <ion-note slot="error">企业联系人不能为空</ion-note>
-          </ion-item>
-          <ion-label class="title-item">联系电话<span class="danger">*</span></ion-label>
-          <ion-item mode="md" :class="[v$.dataModel.userMobile.$error?'ion-invalid':'ion-valid']">
+<!--            <ion-note slot="error">企业联系人不能为空</ion-note>-->
+          </div>
+          <div class="form-input">
+            <ion-label>联系电话<span class="danger">*</span></ion-label>
             <ion-input placeholder="请输入联系电话" label-placement="stacked" :clear-input="true"
                        v-model="dataModel.userMobile" class="custom">
             </ion-input>
-            <ion-note slot="error">企业联系电话不能为空</ion-note>
-          </ion-item>
-          <ion-label class="title-item">企业状态<span class="danger">*</span></ion-label>
-          <ion-item mode="md" :class="[v$.dataModel.recordStatus.$error?'ion-invalid':'ion-valid']">
+<!--            <ion-note slot="error">企业联系电话不能为空</ion-note>-->
+          </div>
+          <div class="form-select">
+            <ion-label>企业状态<span class="danger">*</span></ion-label>
             <ion-select id="recordStatus" name="recordStatus" cancel-text="取消"  v-model="dataModel.recordStatus"
                         interface="action-sheet" placeholder="请选择企业状态" style="width: 100%;text-align: left;">
               <ion-select-option v-for="(record,key) in companyStatusList" :key="key"
@@ -85,10 +95,10 @@
                 {{ record.name }}
               </ion-select-option>
             </ion-select>
-            <ion-note slot="error">企业状态不能为空</ion-note>
-          </ion-item>
-          <ion-label class="title-item">是否缺工<span class="danger">*</span></ion-label>
-          <ion-item mode="md" :class="[v$.dataModel.isShortage.$error?'ion-invalid':'ion-valid']">
+<!--            <ion-note slot="error">企业状态不能为空</ion-note>-->
+          </div>
+          <div class="form-select">
+            <ion-label>是否缺工<span class="danger">*</span></ion-label>
             <ion-select id="isShortAge" name="isShortAge" cancel-text="取消"  v-model="dataModel.isShortage"
                         interface="action-sheet" placeholder="请选择是否缺工" style="width: 100%;text-align: left;">
               <ion-select-option v-for="(record,key) in shortAgeTypeList" :key="key"
@@ -96,34 +106,31 @@
                 {{ record.name }}
               </ion-select-option>
             </ion-select>
-            <ion-note slot="error">企业状态不能为空</ion-note>
-          </ion-item>
+<!--            <ion-note slot="error">是否缺工不能为空</ion-note>-->
+          </div>
+          <div class="form-title">
+            其他信息
+            <div style="float:right;">
+                <ion-icon :icon="chevronDownOutline" @click="isShow=!isShow" v-show="!isShow"
+                          style="font-size: 24px;"></ion-icon>
+                <ion-icon :icon="chevronUpOutline" @click="isShow=!isShow" v-show="isShow"
+                          style="font-size: 24px;"></ion-icon>
+              </div>
+          </div>
 
-          <ion-item mode="md" >
-            <div class="panel-title2" style="width: 25%;">
-              <div class="item-flag"></div>
-              其他信息
-            </div>
-            <div style="width: 75%;text-align: right;">
-              <ion-icon :icon="chevronDownOutline" @click="isShow=!isShow" v-show="!isShow"
-                        style="font-size: 24px;"></ion-icon>
-              <ion-icon :icon="chevronUpOutline" @click="isShow=!isShow" v-show="isShow"
-                        style="font-size: 24px;"></ion-icon>
-            </div>
-          </ion-item>
-          <ion-list v-show="isShow" >
-            <ion-label class="title-item">法定代表人(负责人)</ion-label>
-            <ion-item mode="md">
+          <div v-show="isShow" >
+            <div class="form-input">
+              <ion-label>法定代表人(负责人)</ion-label>
               <ion-input placeholder="请输入法定代表人" label-placement="stacked" :clear-input="true"
                          v-model="dataModel.frName" class="custom">
               </ion-input>
-            </ion-item>
-            <ion-label class="title-item">营业执照有效期</ion-label>
-            <ion-item mode="md">
+            </div>
+            <div class="form-input">
+              <ion-label>营业执照有效期</ion-label>
               <div>
                 <ion-radio v-model:checked="isLongDate" justify="start" labelPlacement="end"
                            @click="changeLongDate" style="height:30px;">至长期</ion-radio>
-                <ion-datetime-button datetime="validDate" style=""></ion-datetime-button>
+                <ion-datetime-button datetime="validDate" style="position:relative;right:110px;"></ion-datetime-button>
                 <ion-modal :keep-contents-mounted="true" >
                   <ion-datetime id="validDate" name="validDate" placeholder="营业执照有效期"
                                 v-model="dataModel.validDate"  :prefer-wheel="true"  @ionChange="changeValidDate"
@@ -132,25 +139,25 @@
                   </ion-datetime>
                 </ion-modal>
               </div>
-            </ion-item>
-            <ion-label class="title-item">企业邮箱</ion-label>
-            <ion-item mode="md">
+            </div>
+            <div class="form-input" >
+              <ion-label>企业邮箱</ion-label>
               <ion-input placeholder="请输入企业邮箱" label-placement="stacked" :clear-input="true"
                          v-model="dataModel.companyEmail" class="custom">
               </ion-input>
-            </ion-item>
-            <ion-label class="title-item">企业归类</ion-label>
-            <ion-item mode="md">
-              <ion-select interface="action-sheet" placeholder="请选择企业类" cancel-text="取消"
+            </div>
+            <div class="form-select">
+            <ion-label>企业分类</ion-label>
+              <ion-select interface="action-sheet" placeholder="请选择企业类" cancel-text="取消"
                           id="companyType" v-model="dataModel.companyType"  style="width: 100%;text-align: left;">
                 <ion-select-option v-for="(record,key) in companyTypeList" :key="key"
                                    v-model:value="record.code">
                   {{ record.name }}
                 </ion-select-option>
               </ion-select>
-            </ion-item>
-            <ion-label class="title-item">企业规模</ion-label>
-            <ion-item mode="md">
+            </div>
+            <div class="form-select">
+            <ion-label>企业规模</ion-label>
               <ion-select interface="action-sheet" placeholder="请选择企业规模" cancel-text="取消"
                           id="companyModel" v-model="dataModel.companyModel"  style="width: 100%;text-align: left;">
                 <ion-select-option v-for="(record,key) in companyModelList" :key="key"
@@ -158,53 +165,33 @@
                   {{ record.name }}
                 </ion-select-option>
               </ion-select>
-            </ion-item>
-            <ion-label class="title-item">所属县区</ion-label>
-            <ion-item mode="md">
-              <ion-select interface="action-sheet" placeholder="请选择所属县区" cancel-text="取消" @ionChange="changeCity"
-                          id="regionCode" v-model="dataModel.regionCode" style="width:100%;text-align: left;">
-                <ion-select-option v-for="(record,key) in regionList" :key="key"
-                                   v-model:value="record.code">
-                  {{ record.name }}
-                </ion-select-option>
-              </ion-select>
-            </ion-item>
-            <ion-label class="title-item">所属街道</ion-label>
-            <ion-item  mode="md">
-              <ion-select interface="action-sheet" placeholder="请选择所属街道" cancel-text="取消"
-                          id="streetCode" v-model="dataModel.streetCode" style="width: 100%;text-align: left;">
-                <ion-select-option v-for="(record,key) in streetList" :key="key"
-                                   v-model:value="record.code">
-                  {{ record.name }}
-                </ion-select-option>
-              </ion-select>
-            </ion-item>
-            <ion-label class="title-item">用工情况(人)</ion-label>
-            <ion-item mode="md">
+            </div>
+            <div class="form-input">
+            <ion-label>用工情况(人)</ion-label>
               <ion-input type="number" placeholder="请输入用工人数" label-placement="stacked" :clear-input="true"
                          v-model="dataModel.workSituation" class="custom">
               </ion-input>
-            </ion-item>
-            <ion-label class="title-item">参保人数(人)</ion-label>
-            <ion-item mode="md">
+            </div>
+            <div class="form-input">
+            <ion-label>参保人数(人)</ion-label>
               <ion-input type="number" placeholder="请输入参保人数" label-placement="stacked" :clear-input="true"
                          v-model="dataModel.insuredCount" class="custom">
               </ion-input>
-            </ion-item>
-            <ion-label class="title-item">经营范围</ion-label>
-            <ion-item mode="md">
+            </div>
+            <div class="form-input">
+            <ion-label>经营范围</ion-label>
               <ion-textarea placeholder="请输入经营范围" :rows="3" label-placement="stacked" :clear-input="true"
                             v-model="dataModel.businScope" class="custom">
               </ion-textarea>
-            </ion-item>
-            <ion-label class="title-item">企业简介</ion-label>
-            <ion-item mode="md">
+            </div>
+            <div class="form-input">
+            <ion-label>企业简介</ion-label>
               <ion-textarea placeholder="请输入企业简介" :rows="3" label-placement="stacked" :clear-input="true"
-                         v-model="dataModel.companyDesc" class="custom">
+                            v-model="dataModel.companyDesc" class="custom">
               </ion-textarea>
-            </ion-item>
-          </ion-list>
-        </ion-list>
+            </div>
+          </div>
+        </div>
       </form>
     </ion-content>
     <ion-footer>
@@ -217,14 +204,15 @@
   </ion-page>
 </template>
 <script lang="ts">
-import {defineComponent, ref, reactive, computed, watch, toRefs} from "vue";
+import {defineComponent, ref, reactive, computed, toRefs} from "vue";
+// import {MultiPickerModule} from 'ion-multi-picker';
 import {chevronDownOutline, chevronUpOutline, arrowBackOutline} from 'ionicons/icons';
 import {getRegionList, getSiteList, getStreeList} from '@/api/company/index'
 import {useRoute,useRouter} from "vue-router";
-import {alertController, onIonViewDidEnter} from "@ionic/vue";
+import {alertController, IonIcon, onIonViewDidEnter} from "@ionic/vue";
 import {useVuelidate} from "@vuelidate/core";
 import {getCompanyById,saveCompanyInfo} from "@/api/company";
-import {minLength,required} from "@vuelidate/validators";
+import {required} from "@vuelidate/validators";
 import {getSysDictionaryList} from "@/api/system/dictionary";
 import dayjs from "dayjs";
 
@@ -236,6 +224,7 @@ interface StepParams{
 
 export default defineComponent({
   name: 'CompanyEdit',
+  // components: {MultiPickerModule},
   setup() {
     const route = useRoute();
     const router = useRouter();
@@ -289,6 +278,51 @@ export default defineComponent({
       {value: 0, name: '否'},
     ];
 
+    // 选中省市区
+    const cityDefault = ref<string >('');
+    //数据数组
+    const provinceColumns = ref<any>([{name:"广东省",code:"440000000000000"}]);
+    const cityColumns = ref<any>([{name:"惠州市",code:"441300000000000"}]);
+    const regionColumns = ref<any>([]);
+    const streetColumns = ref<any>([]);
+
+    // /** 选择的区域 */
+    // const regionChecked= ref<string>('');
+    // // /** 选择的街道 */
+    // const streetChecked= ref<string>('');
+    //
+    // // /** 编辑传入的地址 */
+    // const defaultAddText= ref<string>('');
+    //
+    // const allData = ref<any>({
+    //   province: [],
+    //   city: [],
+    //   region: [{name:"",code:""}],
+    //   street: [{name:"",code:""}]
+    // });
+    //
+    // //获取选定的省市区
+    // const getCityArea = () =>{
+    //   // 城市选中后默认为字符串,并且获取到的是编码不是直接内容,为了把省份 城市 区域分为三个字段,所以把字符串分割为数组,在每个单独赋值
+    //   let cities = cityDefault.value.split(' ');
+    //   allData.value.province = provinceColumns.value;
+    //   allData.value.city = cityColumns.value;
+    //   allData.value.region = regionColumns.value[0].options;
+    //   allData.value.street = streetColumns.value[0].options;
+    //
+    //   /*  循环城市数组,通过获取到的省市区编码来查询对应的文字内容 **/
+    //   allData.value.region.map(v=>{
+    //     if(v.code == cities[0]){
+    //       regionChecked.value = v.name; /* 县区 */
+    //     }
+    //   })
+    //   allData.value.street.map(v => {
+    //     if (v.code == cities[1]) {
+    //       streetChecked.value = v.name;  /* 街道 */
+    //     }
+    //   })
+    // }
+
     const getCompanyModelList = async function(){
       const companyModelResult :any = await getSysDictionaryList("CompanyModel");
       companyModelList.value = companyModelResult;
@@ -360,7 +394,7 @@ export default defineComponent({
       }
       const emailReg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/;
       // 这里由于企业邮箱非必填所以先判断是否填写了企业邮箱
-      if(formState.dataModel.companyEmail!==""){
+      if(formState.dataModel.companyEmail!=null&&formState.dataModel.companyEmail!=""){
         if(!emailReg.test(formState.dataModel.companyEmail)){
           presentAlert("输入的企业邮箱有误!");
           isAllowCommit.value = false;
@@ -374,20 +408,12 @@ export default defineComponent({
         await presentAlert('请输入完整信息!');
         return null;
       }
-      /*const jsonStr = JSON.stringify(formState.dataModel);
-      localStorage.removeItem('companyData');
-      localStorage.setItem("companyData", jsonStr);*/
       companyCodeValidate();
       inputDataValidate();
       if(isAllowCommit.value){
         saveCompanyInfo(formState.dataModel).then(result => {
           if (result) {
-            if(isAdd.value){
-              router.push({path: './menu', query: {reload:1,id:formState.dataModel.companyID,status:2}});
-            }
-            else{
               router.push({path: './postList', query: {reload:1,id:formState.dataModel.companyID,status:3}});
-            }
           }
         });
       }
@@ -475,6 +501,12 @@ export default defineComponent({
       siteList,
       regionList,
       streetList,
+      // defaultAddText,
+      // cityDefault,
+      // provinceColumns,
+      // cityColumns ,
+      // regionColumns ,
+      // streetColumns,
       shortAgeTypeList,
       companyStatusList,
       companyModelList,
@@ -500,8 +532,7 @@ export default defineComponent({
 
 .custom{
   --placeholder-color: gray;
-  --placeholder-font-style:italic;
-  --placeholder-opacity: 1;
+  --placeholder-opacity: 0.5;
 }
 
 .title-item{

+ 134 - 22
h5app/src/views/pages/company/list.vue

@@ -20,21 +20,33 @@
       </ion-item>
 
       <div class="bw-vue-list">
-        <div class="list-content">
+        <div class="list-content" v-if="!loading">
           <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>
+            <div v-for="(record,key) in dataList" :key="key">
+              <ion-item-sliding>
+                <ion-item  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-item-options>
+                  <ion-item-option @click="onEdit(record.companyID)">
+                    <ion-icon :icon="buildOutline"></ion-icon>
+                  </ion-item-option>
+                  <ion-item-option color="danger" @click="setDelAlertOpen(true, record.companyID)">
+                    <ion-icon :icon="trashOutline"></ion-icon>
+                  </ion-item-option>
+                </ion-item-options>
+              </ion-item-sliding>
+            </div>
           </ion-list>
         </div>
       </div>
@@ -46,6 +58,26 @@
         </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>
 
@@ -57,7 +89,9 @@ import {useRoute, useRouter} from "vue-router";
 import {arrowBackOutline, ellipse, addCircleOutline} from 'ionicons/icons';
 import {IonIcon, onIonViewDidEnter} from '@ionic/vue';
 import BEmpty from "@/components/empty.vue";
-import {getCompanyList} from '@/api/company/index'
+import {getCompanyList} from '@/api/company/index';
+import {chevronForwardOutline,buildOutline,trashOutline} from 'ionicons/icons';
+import {get} from "@/api/common";
 
 export default defineComponent({
   name: 'CompanyList',
@@ -67,16 +101,16 @@ export default defineComponent({
     const route = useRoute();
     const total = ref(10);
     const loading = ref(true);
-    const pagination = computed(() => ({
-      total: total,
-      current: searchParams.pageIndex,
-      pageSize: searchParams.pageSize
-    }));
     const searchParams = reactive({
       pageIndex: 1,
       pageSize: 5,
       companyName: '',
     });
+    const pagination = computed(() => ({
+      total: total,
+      current: searchParams.pageIndex,
+      pageSize: searchParams.pageSize
+    }));
     const dataList = ref<any>([]);
     const colors = ref(["secondary", "tertiary", "success", "warning"]);
 
@@ -109,12 +143,77 @@ export default defineComponent({
     const onAdd = () => {
       router.push({path: './edit', query: {reload: 1,id: null,status: 1}});
     }
+    const onEdit = (companyID: string) => {
+      router.push({path: './edit', query: {reload: 1, id: companyID,status: 1}});
+    }
+    // 信息弹窗内容
+    const infoAlterData = reactive({
+      title:"",
+      message:""
+    })
+    // 删除警告弹窗开关
+    const delAlertOpen = ref(false);
+    // 删除警告弹窗按钮定义
+    const infoAlertButtons = [
+      {
+        text: '确定',
+        role: 'confirm',
+        handler: () => {
+          reload();
+        },
+      },
+    ];
 
+    // 删除数据
+    const delCompanyID = ref("");
+    // 删除加载
+    const delLoading = ref(false);
+    // 信息弹窗开关
+    const infoAlertOpen = ref(false);
+    // 删除警告弹窗按钮定义
+    const delAlertButtons = [
+      {
+        text: '取消',
+        role: 'cancel',
+        handler: () => {
+          reload();
+        },
+      },
+      {
+        text: '确定',
+        role: 'confirm',
+        handler: () => {
+          delLoading.value = true;
+          get("companyService/company/delete",{id:delCompanyID.value}).then((res) => {
+            infoAlterData.title = "提示";
+            infoAlterData.message = "删除成功";
+            setInfoAlertOpen(true);
+          }).finally(()=>{
+            delLoading.value = false;
+            reload();
+          });
+        },
+      },
+    ];
+    // 设置要删除的日志
+    function setDelAlertOpen(value: boolean, companyID: any) {
+      delAlertOpen.value = value;
+      if(companyID != null) {
+        delCompanyID.value = companyID;
+      }
+    }
+    // 设置信息提示弹窗开关
+    function setInfoAlertOpen(value: boolean) {
+      infoAlertOpen.value = value;
+    }
+    // 设置删除弹窗开启关闭
+    function setDelLoadingOpen(value: boolean) {
+      delLoading.value = value;
+    }
     const onDetail = (companyID:string) => {
       router.push({path: './detail', query: {reload: 1,id: companyID}});
     }
 
-
     const onBack = () => {
       router.push('../');
     }
@@ -127,6 +226,9 @@ export default defineComponent({
       ellipse,
       arrowBackOutline,
       addCircleOutline,
+      chevronForwardOutline,
+      buildOutline,
+      trashOutline,
       router,
       colors,
       total,
@@ -134,10 +236,21 @@ export default defineComponent({
       dataList,
       pagination,
       searchParams,
+      delCompanyID,
+      delAlertButtons,
+      infoAlertButtons,
+      delAlertOpen,
+      infoAlertOpen,
+      delLoading,
+      infoAlterData,
       onBack,
       onAdd,
       onDetail,
       onScroll,
+      onEdit,
+      setDelAlertOpen,
+      setInfoAlertOpen,
+      setDelLoadingOpen,
       loadData,
       reload,
       dayjs,
@@ -160,7 +273,6 @@ export default defineComponent({
     border-radius: 0 !important;
 
     ion-item {
-      margin-top: 10px;
       font-size: 14px;
 
       p {

+ 2 - 5
h5app/src/views/pages/company/postList.vue

@@ -151,10 +151,7 @@ export default defineComponent({
       router.push({path: './editPost', query: {reload:1,id:postID,companyID:pageParams.companyID}});
     };
     const onBack = () => {
-      if(curStepData.value.statusVal==3)
-        router.push({path: './menu', query: {reload:1,id:pageParams.companyID,status:2}});
-      else if(curStepData.value.statusVal==2)
-        router.push({path: './edit', query: {reload:1,companyID:pageParams.companyID,status:1}});
+        router.push({path: './edit', query: {reload:1,id:pageParams.companyID,status:1}});
     };
 
     const onFinish = () => {
@@ -174,7 +171,7 @@ export default defineComponent({
       loading.value = true;
       pageParams.companyID = companyID;
       curStepData.value.statusVal = status;
-      console.log(pageParams);
+      console.log("S",pageParams);
       const result:any = await getCompanyPostList(pageParams);
       postList.value = postList.value.concat(result.list);
       pageParams.total = result.total;

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

@@ -215,7 +215,7 @@ export default defineComponent({
     }
 
     const getAllPostList = async function(){
-      const allPostResult :any = await getPostList();
+      const allPostResult :any = await getPostList({pageIndex:1,pageSize:10000});
       allPostList.value = allPostResult.list;
       console.log("allPostList",allPostList.value);
     }

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

@@ -277,7 +277,7 @@ export default defineComponent({
     }
 
     const getCompanyBySiteIDList = async function () {
-      let siteID = userStore.getUserInfo.siteID;
+      const siteID = userStore.getUserInfo.siteID;
       const data: any = await getCompanyBySiteID(siteID);
       companyList.value = data;
     }

+ 1 - 1
h5app/src/views/pages/post/recommendJob.vue

@@ -108,7 +108,7 @@ export default defineComponent({
         recommendType: 0
       });
       addRecommend(addRecommendList.value).then(() => {
-        let index = dataList.value.findIndex((x: any) => x.recommendMgtID == item.recommendMgtID);
+        const index = dataList.value.findIndex((x: any) => x.recommendMgtID == item.recommendMgtID);
         dataList.value.splice(index, 1)
         addRecommendList.value = [];
       });

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

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

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

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

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

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

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

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

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

@@ -62,7 +62,7 @@
       <div class="panel">
         <div class="panel_title">
           <div class="panel_title_text">工作任务安排</div>
-          <div class="panel_more">更多></div>
+          <div class="panel_more" @click="onTaskList">更多></div>
         </div>
         <div class="panel_content">
           <div style="padding: 10px 0;">
@@ -118,7 +118,11 @@ export default defineComponent({
     }
 
     const onDetail = (doTaskID:string) =>{
-      router.push({path: "/tabs/tabMain/work/task/myTask", query: {reload:1, doTaskID: doTaskID}});
+      router.push({path: "/tabs/tabMain/work/task/edit", query: {reload: 1, doTaskID: doTaskID}});
+    }
+
+    function onTaskList() {
+      router.push("/tabs/tabMain/work/task/list");
     }
 
     const onScroll = (e: any) => {
@@ -148,7 +152,8 @@ export default defineComponent({
       onDetail,
       onScroll,
       reload,
-      dayjs
+      dayjs,
+      onTaskList
     }
   }
 });

+ 13 - 2
src/main/java/com/hz/employmentsite/controller/companyService/CompanyController.java

@@ -5,7 +5,11 @@ import com.hz.employmentsite.filter.exception.BaseErrorEnum;
 import com.hz.employmentsite.filter.exception.BaseResponse;
 import com.hz.employmentsite.filter.exception.RespGenerstor;
 import com.hz.employmentsite.model.PcCompany;
+import com.hz.employmentsite.mapper.PcSiteMapper;
+import com.hz.employmentsite.mapper.PcSiteUserMapper;
 import com.hz.employmentsite.model.PcSite;
+import com.hz.employmentsite.model.PcSiteExample;
+import com.hz.employmentsite.model.PcSiteUserExample;
 import com.hz.employmentsite.util.DateUtils;
 import com.hz.employmentsite.util.ExcelHelper;
 import com.hz.employmentsite.vo.companyService.AppCompanyPostVo;
@@ -29,10 +33,10 @@ public class CompanyController {
     private CompanyService companyService;
 
     @Autowired
-    private DateUtils dateUtils;
+    private PcSiteUserMapper pcSiteUserMapper;
 
     @Autowired
-    private ExcelHelper excelHelper;
+    private DateUtils dateUtils;
 
 
     @ResponseBody
@@ -62,6 +66,13 @@ public class CompanyController {
             data.recordStatus = 1;
             data.validDate = dateUtils.StrToDate("2099-12-31 00:00:00") ;
             data.isShortage = 1;
+            PcSiteUserExample siteUserExp = new PcSiteUserExample();
+            PcSiteUserExample.Criteria siteUserCro = siteUserExp.createCriteria();
+            siteUserCro.andUserIDEqualTo(accountService.getLoginUserID());
+            var curSiteUserInfo = pcSiteUserMapper.selectByExample(siteUserExp).stream().findFirst().orElse(null);
+            if(curSiteUserInfo != null){
+                data.siteID = curSiteUserInfo.getSiteID();
+            }
         }
         return RespGenerstor.success(data);
     }

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

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

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

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

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

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

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

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

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

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

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

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

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

@@ -4,7 +4,7 @@
     <select id="getList" resultType="com.hz.employmentsite.vo.companyService.CompanyVo">
         select company.*,city.name as regionName,area.name as streetName,sys_cmodel.Name as companyModelType,
         (select count(*) from pc_post where CompanyID=company.CompanyID) as postCount,u.`Name` as createUserName
-        ,inSites.InstitutionID as institutionID
+        ,inSites.InstitutionID as institutionID,site.SiteName
         from pc_company company
         left join sys_user u on u.UserID = company.CreateUserID
         left join (select * from sys_dictionary_item where DictionaryCode ='CompanyModel') sys_cmodel on company.CompanyModel = sys_cmodel.Value

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

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