浏览代码

Merge branch 'master' of http://114.55.67.98:8070/Natural_p1/zjugis_OA

songxy 1 年之前
父节点
当前提交
42790a5cc7

+ 2 - 0
client_h5/src/components/dateTimeRange.vue

@@ -31,6 +31,7 @@ const props = defineProps<{
 }>()
 const emit = defineEmits<{
   (e: 'update:modelValue', payload: any): void
+  (e: 'change', payload: string):void
 }>()
 const currentYear: number = new Date().getFullYear();
 const currentMonth: number = new Date().getMonth()+1;
@@ -162,6 +163,7 @@ const confirmHandle = () => {
   const dateTimeStr:string = formatDateTimeByArr(selectDateTime.value);
   currentDateTime.value = dateTimeStr
   emit('update:modelValue', dateTimeStr)
+  emit('change', dateTimeStr)
   popupShow.value = false;
 }
 const cancelHandle = () => {

+ 46 - 3
client_h5/src/pages/leave/index.vue

@@ -68,7 +68,7 @@
             </van-cell-group>
           </van-form>
         </card>
-        <card title="详情信息">
+        <card title="请假时间信息">
             <template #right>
               <button class="add_btn" @click="popupShow = true">新增</button>
             </template>
@@ -90,17 +90,19 @@
         </card>
   </flow-form>
   <van-popup class="detail-popup" v-model:show="popupShow" position="bottom">
-    <h4 class="title">详细信息新增</h4>
+    <h4 class="title">新增请假时间</h4>
     <van-cell-group inset>
       <date-time-range 
         label="起始时间"
         v-model="detailData.startTime"
         placeholder="请选择起始时间"
+        @change="startTimeChange"
         />
       <date-time-range 
         label="截止时间"
         v-model="detailData.endTime"
         placeholder="请选择截止时间"
+        @change="endTimeChange"
         />
       <van-field
         v-model="detailData.bz1"
@@ -128,6 +130,7 @@ import DateTimeRange from '@/components/dateTimeRange.vue';
 import FlowForm from '@/components/flowForm.vue';
 import Card from '@/components/card.vue';
 import CardCell from '@/components/cardCell.vue';
+import { showSuccessToast, showFailToast } from 'vant';
 
 const popupShow = ref<boolean>(false)
 const route = useRoute();
@@ -235,7 +238,7 @@ const initFormData= async () => {
 }
 
 /** 细节数据保存 */
-const saveHandle = () => {
+const saveHandle = async () => {
   detailData.value.leaveId = formData.value.id
   formData.value.leaveTimeCreateList.push(detailData.value)
   detailData.value = {
@@ -244,6 +247,32 @@ const saveHandle = () => {
     endTime: '',
     bz1: ''
   }
+  const prarms: Object[] = []
+  formData.value.leaveTimeCreateList.forEach((x:any)=>{
+    const startTime = Date.parse(x.startTime)
+    const endTime = Date.parse(x.endTime)
+    const obj = new Object({
+      startTime: startTime,
+      endTime: endTime
+    })
+    prarms.push(obj)
+  })
+  const result = await reqest.post(`/business/Leave/getLeaveDays`,prarms)
+  if(result.data){
+    const totalMin = result.data;
+    const totalHours = totalMin / 60;
+    const totalDays = Math.floor(totalHours/7.5);
+    const subHours = totalHours%7.5;
+    let leaveDaysText = '';
+    if(totalDays>0){
+        leaveDaysText += totalDays + '天'
+    }
+    if(subHours>0){
+        leaveDaysText += subHours + '小时'
+    }
+    formData.value.leaveDays = leaveDaysText
+    formData.value.leaveHours = totalHours
+  }
   popupShow.value=false
 }
 
@@ -258,6 +287,20 @@ const detailView = (index:number,item:any) =>{
 const detailDelte = (index:number) =>{
   formData.value.leaveTimeCreateList.splice(index,1)
 }
+/** 起始时间变化事件 */
+const startTimeChange = (value:string) =>{
+  if(Date.parse(value)>Date.parse(detailData.value.endTime)){
+    showFailToast('起始时间不能大于开始时间!')
+    detailData.value.startTime=''
+  }
+}
+/** 截止时间变化事件 */
+const endTimeChange = (value:string) =>{
+  if(Date.parse(value)<Date.parse(detailData.value.startTime)){
+    showFailToast('截止时间不能小于开始时间!')
+    detailData.value.endTime=''
+  }
+}
 /** 初始化 */
 onMounted(() => {
   initFormData()

+ 33 - 0
client_h5/src/pages/recruit/index.scss

@@ -0,0 +1,33 @@
+.van-cell-group {
+  margin: 0px;
+}
+.van-overlay {
+  background: rgba(0,0,0,0.3);
+}
+.add_btn {
+  background-color: #1989fa;
+  padding: 5px 10px;
+  border: 0px;
+  outline: none;
+  font-size: 13px;
+  color: #fff;
+  border-radius: 2px;
+}
+.detail-popup {
+  >.title {
+    font-size: 15px;
+    padding-left: 10px;
+  }
+  >.fixed-btn {
+    padding: 15px;
+  }
+}
+  :deep(.van-swipe-cell__right) {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    >button {
+      height: 50%;
+    }
+  }

+ 154 - 0
client_h5/src/pages/recruit/index.vue

@@ -0,0 +1,154 @@
+
+<template>
+  <flow-form :data="formData" @submit="submitNextActivity">
+    <card title="基础信息" style="height: auto">
+      <van-form required="true">
+        <van-cell-group inset>
+          <van-field
+              v-model="formData.userNickname"
+              name="申请人"
+              label="申请人"
+              placeholder="申请人"
+              readonly
+              :rules="[{ required: true, message: '未获取申请人' }]"
+          />
+          <van-field
+              v-model="formData.deptName"
+              name="所在部门"
+              label="所在部门"
+              placeholder="所在部门"
+              readonly
+              :rules="[{ required: true, message: '未获取所在部门' }]"
+          />
+        </van-cell-group>
+      </van-form>
+    </card>
+    <card title="详情信息">
+      <template #default>
+        <div v-for="(item,index) in formData.detail" :key="index">
+          <van-swipe-cell>
+            <card-cell>
+              <van-cell title="岗位" :value="item.post"/>
+              <van-cell title="需求人数" :value="item.requireNum"/>
+              <van-cell title="任职要求" :value="item.jobRequest"/>
+              <van-cell title="岗位职责" :value="item.postDuty"/>
+              <van-cell title="所属类别" :value="item.type"/>
+              <van-cell title="已招人数" :value="item.recruitNum"/>
+              <van-cell title="落实情况" :value="item.remark"/>
+            </card-cell>
+            <template #right>
+              <van-button square type="primary" text="编辑" @click="detailView(index,item)" />
+              <van-button square type="danger" text="删除" @click="detailDelte(index)" />
+            </template>
+          </van-swipe-cell>
+        </div>
+      </template>
+    </card>
+  </flow-form>
+</template>
+
+<script setup lang="ts">
+import { useRoute } from 'vue-router';
+import { FlowDTO, getNextActivity } from '@/service/flow';
+import reqest from "@/utils/request";
+import DateTimeRange from '@/components/dateTimeRange.vue';
+import FlowForm from '@/components/flowForm.vue';
+import Card from '@/components/card.vue';
+import CardCell from '@/components/cardCell.vue';
+
+const popupShow = ref<boolean>(false)
+const route = useRoute();
+interface FormDataType {
+  instanceId: undefined,
+  id: undefined,
+  userNickname: undefined,
+  deptName: undefined,
+  detail: {
+    text: string
+  }[]
+}
+const formData = ref<FormDataType>({
+  instanceId: undefined,
+  id: undefined,
+  userNickname: undefined,
+  deptName: undefined,
+  detail: []
+})
+const detailData = ref({
+  post: '',
+  requireNum: '',
+  jobRequest: '',
+  postDuty: '',
+  type: '',
+  recruitNum: '',
+  remark: ''
+})
+const leaveTypePiker = ref(['11']);
+const showPicker = ref(false);
+const columns = [
+  { text: '事假', value: '11' },
+  { text: '病假', value: '12' },
+  { text: '婚假', value: '13' },
+  { text: '产假', value: '14' },
+  { text: '陪产假', value: '15' },
+  { text: '工伤', value: '16' },
+  { text: '年假', value: '17' },
+  { text: '调休', value: '18' },
+  { text: '其他', value: '20' },
+];
+const { activityInstanceId, participantId,flowInstanceId } = route.query as {
+  activityInstanceId: string;
+  participantId: string;
+  flowInstanceId: string;
+};
+const activityData: FlowDTO = {
+  activityInstanceId,
+  participantId,
+  flowOpinion: ''
+}
+const submitNextActivity = async () => {
+  console.log(formData)
+  //更新表单业务数据
+  const result = await reqest.post("/business/recruit/update",formData.value)
+  if(result.code ===200||result.code ===0){
+    //工作流转件
+    activityData.activityInstanceId='018f23b914660a07729e8f224db60203'
+    activityData.participantId='018f23b9148b0a07729e8f224db60205'
+    activityData.flowOpinion='{"id":"018f23b914970a07729e8f224db60206","opinionContent":"同意","opinionTime":"2024-04-28"}'
+    const result = await getNextActivity(jsonToFormData(activityData))
+    // getNextActivity(activityData).then(result => {
+    //   console.log(result)
+    // }).catch((err) => {
+    //   console.error(err)
+    // })
+  }
+}
+const jsonToFormData = (json: any): FormData | null => {
+  const keys: string[] = Object.keys(json)
+  if (keys.length > 0) {
+    const formData = new FormData();
+    keys.forEach((key) => {
+      formData.append(key, (json[key] instanceof Object) ? JSON.stringify(json[key]) : json[key]);
+    });
+    return formData;
+  }
+  return null;
+}
+
+/** 初始化表单数据 */
+const initFormData= async () => {
+  const result = await reqest.get(`/business/recruit/mobileAdd?flowInstanceId=${flowInstanceId}`)
+  formData.value = result.data
+  console.log(formData.value)
+}
+
+
+/** 初始化 */
+onMounted(() => {
+  initFormData()
+})
+</script>
+
+<style lang="scss" scoped>
+@import "./index.scss";
+</style>

+ 8 - 0
client_h5/src/router/routes.ts

@@ -21,6 +21,14 @@ const routes: RouteRecordRaw[] = [
         },
         component: () => import("@/pages/leave/index.vue"),
       },
+      {
+        path: "recruit",
+        name: "Recruit",
+        meta: {
+          title: "招聘需求",
+        },
+        component: () => import("@/pages/recruit/index.vue"),
+      },
     ] as RouteRecordRaw[],
   },
 ] as RouteRecordRaw[];

+ 5 - 0
zjugis-business/src/main/java/com/zjugis/business/converter/recruit/RecruitConvert.java

@@ -3,6 +3,7 @@ package com.zjugis.business.converter.recruit;
 import com.zjugis.business.flow.leave.controller.vo.LeaveCreateReqVO;
 import com.zjugis.business.flow.recruit.controller.vo.RecruitDetailVO;
 import com.zjugis.business.flow.recruit.controller.vo.RecruitPageReqVO;
+import com.zjugis.business.flow.recruit.controller.vo.RecruitReqVO;
 import com.zjugis.business.flow.recruit.controller.vo.RecruitVO;
 import com.zjugis.business.flow.recruit.entity.RecruitDO;
 import com.zjugis.business.flow.recruit.entity.RecruitDetailDO;
@@ -32,4 +33,8 @@ public interface RecruitConvert {
     RecruitDetailDO convert(RecruitPageReqVO vo);
 
     RecruitDetailDO convert(RecruitDetailVO vo);
+
+    List<RecruitDetailVO> convertList01(List<RecruitDetailDO> list);
+
+    RecruitReqVO convert01(RecruitDO entity);
 }

+ 19 - 1
zjugis-business/src/main/java/com/zjugis/business/flow/leave/service/LeaveServiceImpl.java

@@ -163,9 +163,26 @@ public class LeaveServiceImpl implements LeaveService {
         LocalTime finishPmFlag = LocalTime.parse(afternoonFinishTime, formatter);
         long totalTime = 0;
         for (LeaveDaysReqVO leaveDaysReqVO : reqVO) {
-            //起始日期和结束日期同一天
             LocalDateTime startTime = leaveDaysReqVO.getStartTime();
             LocalDateTime endTime = leaveDaysReqVO.getEndTime();
+            if(startTime.toLocalTime().compareTo(normalTimeAm)<0){
+                startTime = startTime.withHour(normalTimeAm.getHour()).withMinute(normalTimeAm.getMinute());
+            }
+            if(startTime.toLocalTime().compareTo(finishAmFlag)>0&&startTime.toLocalTime().compareTo(normalTimePm)<0){
+                startTime = endTime.withHour(finishAmFlag.getHour()).withMinute(finishAmFlag.getMinute());
+            }
+            if(startTime.toLocalTime().compareTo(finishPmFlag)>0){
+               startTime = startTime.withHour(finishPmFlag.getHour()).withMinute(finishPmFlag.getMinute());
+            }
+            if(endTime.toLocalTime().compareTo(normalTimeAm)<0){
+                endTime = endTime.withHour(normalTimeAm.getHour()).withMinute(normalTimeAm.getMinute());
+            }
+            if(endTime.toLocalTime().compareTo(finishAmFlag)>0&&endTime.toLocalTime().compareTo(normalTimePm)<0){
+                endTime = endTime.withHour(finishAmFlag.getHour()).withMinute(finishAmFlag.getMinute());
+            }
+            if(endTime.toLocalTime().compareTo(finishPmFlag)>0){
+                endTime = endTime.withHour(finishPmFlag.getHour()).withMinute(finishPmFlag.getMinute());
+            }
             WorkdayListReqDTO reqDTO = new WorkdayListReqDTO();
             reqDTO.setDateDay(new LocalDateTime[]{startTime.withHour(0).withMinute(0), endTime.withHour(0).withMinute(0)});
             List<WorkdayRespDTO> workdays = workdayApi.getWorkdayList(reqDTO).getCheckedData();
@@ -188,6 +205,7 @@ public class LeaveServiceImpl implements LeaveService {
                 }
             }
             totalTime = totalTime - (offDays * (6 * 75));
+            //起始日期和结束日期同一天
             if (LocalDateTimeUtil.isSameDay(startTime, endTime)) {
                 //起始时间在上午下班之前结束之前在下午上班之后
                 if ((startTime.toLocalTime().compareTo(finishAmFlag)) <= 0 && (endTime.toLocalTime().compareTo(normalTimePm)) >= 0) {

+ 12 - 3
zjugis-business/src/main/java/com/zjugis/business/flow/recruit/controller/RecruitDemandController.java

@@ -1,11 +1,12 @@
 package com.zjugis.business.flow.recruit.controller;
 
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.zjugis.business.flow.recruit.controller.vo.*;
+import com.zjugis.business.flow.recruit.controller.vo.PageRecruitVO;
+import com.zjugis.business.flow.recruit.controller.vo.RecruitPageReqVO;
+import com.zjugis.business.flow.recruit.controller.vo.RecruitPageVO;
+import com.zjugis.business.flow.recruit.controller.vo.RecruitReqVO;
 import com.zjugis.business.flow.recruit.service.RecruitDemandService;
 import com.zjugis.business.flow.recruit.service.RecruitDetailService;
 import com.zjugis.framework.common.pojo.CommonResult;
-import com.zjugis.framework.common.pojo.PageResult;
 import com.zjugis.framework.workflow.model.BaseController;
 import com.zjugis.framework.workflow.workflow.WorkFlow;
 import com.zjugis.framework.workflow.workflow.WorkFlowMobile;
@@ -62,6 +63,14 @@ public class RecruitDemandController extends BaseController {
         return resultPage(map);
     }
 
+    /**
+     * 招聘表单钉钉端
+     */
+    @GetMapping("/mobileAdd")
+    public CommonResult<RecruitReqVO> mobileAdd(String activityTemplateId, String flowInstanceId, String userId){
+        return CommonResult.success(recruitDemandService.flowAdd(flowInstanceId, userId));
+    }
+
     /**
      * 招聘需求申请列表查询
      */

+ 3 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/recruit/controller/vo/RecruitDetailVO.java

@@ -15,6 +15,9 @@ public class RecruitDetailVO {
     @Schema(description = "岗位")
     private Integer post;
 
+    @Schema(description = "主表id")
+    private String recruitId;
+
 
     @Schema(description = "需求人数")
     private Integer requireNum;

+ 1 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/recruit/service/RecruitDemandService.java

@@ -49,4 +49,5 @@ public interface RecruitDemandService {
     RecruitPageReqVO detail(String id);
 
 
+    RecruitReqVO flowAdd(String flowInstanceId, String userId);
 }

+ 33 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/recruit/service/impl/RecruitDemandServiceImpl.java

@@ -30,6 +30,7 @@ import com.zjugis.framework.workflow.utils.Select;
 import com.zjugis.module.system.api.dict.DictDataApi;
 import com.zjugis.module.system.api.user.AdminUserApi;
 import com.zjugis.module.system.api.user.dto.AdminUserRespDTO;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -178,7 +179,39 @@ public class RecruitDemandServiceImpl implements RecruitDemandService {
         return res;
     }
 
+    @Override
+    public RecruitReqVO flowAdd(String flowInstanceId, String userId) {
+        RecruitReqVO res = new RecruitReqVO();
+
+        if (StringUtils.isNotBlank(SecurityFrameworkUtils.getLoginUserId())) {
+            userId = SecurityFrameworkUtils.getLoginUserId();
+        }
+        CommonResult<IFlowInstance> flowResult = workflowClient.flowInstance(flowInstanceId);
+        if (flowResult.isSuccess()) {
+            RecruitDO entity = recruitDAO.findByInstanceId(flowInstanceId);
+            if (Objects.isNull(entity)) {
+                entity = new RecruitDO();
+                entity.setInstanceId(flowInstanceId);
+                entity.setUserId(userId);
+                entity.setCreateTime(LocalDateTime.now());
+                entity.setFlowStatus(FlowStatusConstants.FLOW_NOT_START);
+                CommonResult<AdminUserRespDTO> result = adminUserApi.getUser(userId);
+                if (result.isSuccess()) {
+                    entity.setUserNickname(result.getData().getNickname());
+                    entity.setDeptId(result.getData().getDeptId());
+                    entity.setDeptName(result.getData().getDeptName());
+                }
+                recruitDAO.insert(entity);
+            }
+            res = RecruitConvert.INSTANCE.convert01(entity);
+            List<RecruitDetailDO> list = recruitDetailService.getDetailListById(entity.getId());
+            if (CollectionUtil.isNotEmpty(list)) {
+                res.setDetail(RecruitConvert.INSTANCE.convertList01(list));
+            }
+        }
 
+        return res;
+    }
 
 
     private Map<String, Object> createMap(String flowInstanceId, RecruitDO entity, String userId) {