Browse Source

出差申请H5支持

chenjun 1 year ago
parent
commit
1c9ae1929c

+ 33 - 0
client_h5/src/pages/attendanceNote/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%;
+    }
+  }

+ 282 - 0
client_h5/src/pages/attendanceNote/index.vue

@@ -0,0 +1,282 @@
+
+<template>
+  <flow-form :data="formData" @submit="submitNextActivity">
+    <card title="基础信息">
+      <van-form required="auto" ref="form" :readonly="formRead">
+        <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-field
+            v-model="formData.createTime"
+            name="申请时间"
+            label="申请时间"
+            placeholder="申请时间"
+            readonly
+            :rules="[{ required: true, message: '请填写申请时间' }]"
+          />
+          <van-field
+            v-model="formData.attendanceNoteNo"
+            name="说明单号"
+            label="说明单号"
+            placeholder="说明单号"
+            readonly
+          />
+          <van-field
+            v-model="formData.attendanceNoteReason"
+            name="考勤说明"
+            label="考勤说明"
+            placeholder="考勤说明"
+            type="textarea"
+            rows="3"
+            autosize
+            :rules="[{ required: true, message: '请填写考勤说明' }]"
+          />
+        </van-cell-group>
+      </van-form>
+    </card>
+    <card title="考勤说明时间信息">
+      <template #right>
+        <button class="add_btn" @click="popupShow = true" v-if="!formRead">
+          新增
+        </button>
+      </template>
+      <template #default>
+        <div v-for="(item, index) in formData.attendanceNoteTimeCreateList" :key="index">
+          <van-swipe-cell :disabled="formRead">
+            <card-cell>
+              <van-cell title="起始时间" :value="item.startTime" />
+              <van-cell title="截止时间" :value="item.endTime" />
+              <van-cell title="备注" :value="item.bz1" />
+            </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>
+  <van-popup class="detail-popup" v-model:show="popupShow" position="bottom">
+    <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"
+        name="备注"
+        label="备注"
+        placeholder="备注"
+        type="textarea"
+        rows="3"
+        autosize
+      />
+    </van-cell-group>
+    <div class="fixed-btn">
+      <van-button round block type="primary" @click="saveHandle">
+        保存
+      </van-button>
+    </div>
+  </van-popup>
+</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";
+import { showSuccessToast, showFailToast } from "vant";
+
+const popupShow = ref<boolean>(false);
+const form = ref(null);
+const route = useRoute();
+interface FormDataType {
+  instanceId: string;
+  id: string;
+  leaveHours: number | null;
+  userNickname: string;
+  deptName: string;
+  createTime: string;
+  attendanceNoteNo: string;
+  attendanceNoteReason: string;
+  attendanceNoteTimeCreateList: {
+    attendanceNoteId: string;
+    startTime: string;
+    endTime: string;
+    bz1: string;
+  }[];
+}
+const formData = ref<FormDataType>({
+  instanceId: "",
+  id: "",
+  leaveHours: null,
+  userNickname: "",
+  deptName: "",
+  createTime: "",
+  attendanceNoteNo: "",
+  attendanceNoteReason: "",
+  attendanceNoteTimeCreateList: [],
+});
+const detailData = ref({
+  attendanceNoteId: "",
+  startTime: "",
+  endTime: "",
+  bz1: "",
+});
+const detailEdit = ref(false);
+const formRead = ref(false);
+const detailIndex = ref<any>(null);
+const showPicker = ref(false);
+const { activityInstanceId, participant, flowInstanceId, read, _o } =
+  route.query as {
+    activityInstanceId: string;
+    participant: string;
+    flowInstanceId: string;
+    read: string;
+    _o: string;
+  };
+const activityData: FlowDTO = {
+  activityInstanceId,
+  participantId: participant,
+  flowOpinion: "",
+};
+
+const submitNextActivity = async (activeOpinion: any) => {
+  form.value.validate().then(async () => {
+    formData.value.attendanceNoteTimeCreateList.forEach((x: any) => {
+      x.startTime = Date.parse(x.startTime);
+      x.endTime = Date.parse(x.endTime);
+    });
+    //更新表单业务数据
+    const result = await reqest.post("/business/Leave/update", formData.value);
+    if (result.code === 200 || result.code === 0) {
+      //工作流转件
+      activityData.activityInstanceId = activityInstanceId;
+      activityData.participantId = participant;
+      activityData.flowOpinion = JSON.stringify(activeOpinion);
+      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/AttendanceNote/mobileAdd?flowInstanceId=${flowInstanceId}`
+  );
+  formData.value = result.data;
+};
+
+/** 细节数据保存 */
+const saveHandle = async () => {
+  detailData.value.attendanceNoteId = formData.value.id;
+  if (detailEdit.value) {
+    formData.value.attendanceNoteTimeCreateList[detailIndex.value] = detailData.value;
+  } else {
+    formData.value.attendanceNoteTimeCreateList.push(detailData.value);
+  }
+  detailData.value = {
+    attendanceNoteId: "",
+    startTime: "",
+    endTime: "",
+    bz1: "",
+  };
+  popupShow.value = false;
+  detailEdit.value = false;
+  detailIndex.value = null;
+};
+
+/** 细节编辑 */
+const detailView = (index: number, item: any) => {
+  popupShow.value = true;
+  detailEdit.value = true;
+  detailIndex.value = index;
+  detailData.value = item;
+};
+
+/** 细节删除 */
+const detailDelte = (index: number) => {
+  formData.value.attendanceNoteTimeCreateList.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();
+  if (read === "1" || _o === "v") {
+    formRead.value = true;
+  }
+});
+</script>
+
+<style lang="scss" scoped>
+@import "./index.scss";
+</style>

+ 1 - 1
client_h5/src/pages/loan/index.vue

@@ -181,7 +181,7 @@ const initFormData = async () => {
 };
 const getProjectList = async () => {
   const result = await reqest.get(
-    `/business/project/getListByUser?userId=${flowInstanceId}`
+    `/business/project/getListByUser`
   );
   columns = result.data;
 };

+ 33 - 0
client_h5/src/pages/travel/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%;
+    }
+  }

+ 330 - 0
client_h5/src/pages/travel/index.vue

@@ -0,0 +1,330 @@
+
+<template>
+  <flow-form :data="formData" @submit="submitNextActivity">
+    <card title="基础信息">
+      <van-form required="auto" ref="form" :readonly="formRead">
+        <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-field
+            v-model="formData.createTime"
+            name="申请时间"
+            label="申请时间"
+            placeholder="申请时间"
+            readonly
+            :rules="[{ required: true, message: '请填写申请时间' }]"
+          />
+          <van-field
+            v-model="formData.travelNo"
+            name="出差单号"
+            label="出差单号"
+            placeholder="出差单号"
+            readonly
+            :rules="[{ required: true, message: '未获取出差单号' }]"
+          />
+          <van-field
+            v-model="formData.travelPlace"
+            name="出差的地点"
+            label="出差的地点"
+            placeholder="出差的地点"
+            :rules="[{ required: true, message: '请填写出差的地点' }]"
+          />
+          <van-field
+            v-model="formData.projectName"
+            name="项目名称"
+            label="项目名称"
+            readonly
+            placeholder="点击选择项目"
+            @click="showPicker = true"
+            :rules="[{ required: true, message: '请选择项目' }]"
+          />
+          <van-popup v-model:show="showPicker" position="bottom">
+            <van-picker
+              :columns="columns"
+              @confirm="onConfirm"
+              @cancel="showPicker = false"
+              :columns-field-names="customFieldName"
+            />
+          </van-popup>
+          <van-field
+            v-model="formData.travelReason"
+            name="出差安排"
+            label="出差安排"
+            placeholder="出差安排"
+            type="textarea"
+            rows="3"
+            autosize
+            :rules="[{ required: true, message: '请填写出差安排' }]"
+          />
+        </van-cell-group>
+      </van-form>
+    </card>
+    <card title="考勤出差时间信息">
+      <template #right>
+        <button class="add_btn" @click="popupShow = true" v-if="!formRead">
+          新增
+        </button>
+      </template>
+      <template #default>
+        <div v-for="(item, index) in formData.travelTimeCreateList" :key="index">
+          <van-swipe-cell :disabled="formRead">
+            <card-cell>
+              <van-cell title="起始时间" :value="item.startTime" />
+              <van-cell title="截止时间" :value="item.endTime" />
+              <van-cell title="备注" :value="item.bz1" />
+            </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>
+  <van-popup class="detail-popup" v-model:show="popupShow" position="bottom">
+    <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"
+        name="备注"
+        label="备注"
+        placeholder="备注"
+        type="textarea"
+        rows="3"
+        autosize
+      />
+    </van-cell-group>
+    <div class="fixed-btn">
+      <van-button round block type="primary" @click="saveHandle">
+        保存
+      </van-button>
+    </div>
+  </van-popup>
+</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";
+import { showSuccessToast, showFailToast } from "vant";
+
+const popupShow = ref<boolean>(false);
+const form = ref(null);
+const route = useRoute();
+interface FormDataType {
+  instanceId: string;
+  id: string;
+  userNickname: string;
+  deptName: string;
+  createTime: string;
+  travelNo: string;
+  travelPlace: string;
+  travelReason: string;
+  projectId: string;
+  projectName: string;
+  travelTimeCreateList: {
+    businessTravelId: string;
+    startTime: string;
+    endTime: string;
+    bz1: string;
+  }[];
+}
+const formData = ref<FormDataType>({
+  instanceId: "",
+  id: "",
+  userNickname: "",
+  deptName: "",
+  createTime: "",
+  travelNo: "",
+  travelPlace: "",
+  travelReason: "",
+  projectId: "",
+  projectName: "",
+  travelTimeCreateList: [],
+});
+const detailData = ref({
+  businessTravelId: "",
+  startTime: "",
+  endTime: "",
+  bz1: "",
+});
+const detailEdit = ref(false);
+const formRead = ref(false);
+const detailIndex = ref<any>(null);
+const showPicker = ref(false);
+let columns = [];
+const { activityInstanceId, participant, flowInstanceId, read, _o } =
+  route.query as {
+    activityInstanceId: string;
+    participant: string;
+    flowInstanceId: string;
+    read: string;
+    _o: string;
+  };
+const activityData: FlowDTO = {
+  activityInstanceId,
+  participantId: participant,
+  flowOpinion: "",
+};
+
+const submitNextActivity = async (activeOpinion: any) => {
+  form.value.validate().then(async () => {
+    formData.value.travelTimeCreateList.forEach((x: any) => {
+      x.startTime = Date.parse(x.startTime);
+      x.endTime = Date.parse(x.endTime);
+    });
+    //更新表单业务数据
+    const result = await reqest.post("/business/BusinessTravel/update", formData.value);
+    if (result.code === 200 || result.code === 0) {
+      //工作流转件
+      activityData.activityInstanceId = activityInstanceId;
+      activityData.participantId = participant;
+      activityData.flowOpinion = JSON.stringify(activeOpinion);
+      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/BusinessTravel/mobileAdd?flowInstanceId=${flowInstanceId}`
+  );
+  formData.value = result.data;
+};
+
+/** 细节数据保存 */
+const saveHandle = async () => {
+  detailData.value.businessTravelId = formData.value.id;
+  if (detailEdit.value) {
+    formData.value.travelTimeCreateList[detailIndex.value] = detailData.value;
+  } else {
+    formData.value.travelTimeCreateList.push(detailData.value);
+  }
+  detailData.value = {
+    businessTravelId: "",
+    startTime: "",
+    endTime: "",
+    bz1: "",
+  };
+  popupShow.value = false;
+  detailEdit.value = false;
+  detailIndex.value = null;
+};
+
+/** 细节编辑 */
+const detailView = (index: number, item: any) => {
+  popupShow.value = true;
+  detailEdit.value = true;
+  detailIndex.value = index;
+  detailData.value = item;
+};
+
+/** 细节删除 */
+const detailDelte = (index: number) => {
+  formData.value.travelTimeCreateList.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 = "";
+  }
+};
+/** 获取项目列表 */
+const getProjectList = async () => {
+  const result = await reqest.get(
+    `/business/project/getListByUser`
+  );
+  columns = result.data;
+};
+const customFieldName = {
+  text: "xmmc",
+  value: "id",
+};
+/** 项目选址事件 */
+const onConfirm = (value: any) => {
+  formData.value.projectId = value.selectedValues[0];
+  formData.value.projectName = value.selectedOptions[0].xmmc;
+  showPicker.value = false;
+};
+/** 初始化 */
+onMounted(() => {
+  initFormData();
+  getProjectList()
+  if (read === "1" || _o === "v") {
+    formRead.value = true;
+  }
+});
+</script>
+
+<style lang="scss" scoped>
+@import "./index.scss";
+</style>

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

@@ -45,6 +45,22 @@ const routes: RouteRecordRaw[] = [
         },
         component: () => import("@/pages/leave/index.vue"),
       },
+      {
+        path: "travel",
+        name: "Travel",
+        meta: {
+          title: "出差",
+        },
+        component: () => import("@/pages/travel/index.vue"),
+      },
+      {
+        path: "attendanceNote",
+        name: "AttendanceNote",
+        meta: {
+          title: "考勤说明条",
+        },
+        component: () => import("@/pages/attendanceNote/index.vue"),
+      },
       {
         path: "recruit",
         name: "Recruit",

+ 4 - 0
zjugis-business/src/main/java/com/zjugis/business/converter/businesstravel/TravelConvert.java

@@ -1,5 +1,6 @@
 package com.zjugis.business.converter.businesstravel;
 
+import com.zjugis.business.flow.businesstravel.controller.vo.TravelRespVO;
 import com.zjugis.business.flow.businesstravel.controller.vo.TravelUpdateReqVO;
 import com.zjugis.business.flow.businesstravel.entity.TravelDO;
 import org.mapstruct.Mapper;
@@ -18,4 +19,7 @@ public interface TravelConvert {
     TravelDO convert(TravelUpdateReqVO reqVO);
 
     TravelUpdateReqVO convert(TravelDO entity);
+
+    TravelRespVO convert01(TravelDO TravelDO);
+
 }

+ 2 - 0
zjugis-business/src/main/java/com/zjugis/business/converter/businesstravel/TravelTimeConvert.java

@@ -21,4 +21,6 @@ public interface TravelTimeConvert {
 
     List<TravelTimeDO> convertList(List<TravelTimeCreateReqVO> list);
 
+    List<TravelTimeCreateReqVO> convertList01(List<TravelTimeDO> list);
+
 }

+ 8 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/businesstravel/controller/TravelController.java

@@ -1,7 +1,9 @@
 package com.zjugis.business.flow.businesstravel.controller;
 
+import com.zjugis.business.flow.businesstravel.controller.vo.TravelRespVO;
 import com.zjugis.business.flow.businesstravel.controller.vo.TravelUpdateReqVO;
 import com.zjugis.business.flow.businesstravel.service.TravelService;
+import com.zjugis.framework.common.pojo.CommonResult;
 import com.zjugis.framework.workflow.model.BaseController;
 import com.zjugis.framework.workflow.workflow.WorkFlow;
 import io.swagger.v3.oas.annotations.Operation;
@@ -36,6 +38,12 @@ public class TravelController extends BaseController {
         return resultPage(map);
     }
 
+    @GetMapping("/mobileAdd")
+    public CommonResult<TravelRespVO> mobileAdd(String activityTemplateId, String flowInstanceId, String userId) {
+        return CommonResult.success(travelService.flowAdd(flowInstanceId, userId));
+    }
+
+
     @PostMapping("/update")
     @Operation(summary = "更新请假流程")
     public String updateTravel(@Valid @RequestBody TravelUpdateReqVO updateReqVO) {

+ 37 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/businesstravel/controller/vo/TravelRespVO.java

@@ -0,0 +1,37 @@
+package com.zjugis.business.flow.businesstravel.controller.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Author 陈俊
+ * @Date 2024/5/10 16:10
+ * @Version 1.0
+ */
+@Schema(description = "工作流程 - 出差流程 respVO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class TravelRespVO extends TravelBaseVO {
+
+    @Schema(description = "主键ID")
+    private String id;
+
+    @Schema(description = "申请时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @Schema(description = "明细数据出差时间")
+    private List<TravelTimeCreateReqVO> travelTimeCreateList;
+
+    @Schema(description = "项目名称")
+    private String projectName;
+}

+ 3 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/businesstravel/controller/vo/TravelTimeBaseVO.java

@@ -1,5 +1,6 @@
 package com.zjugis.business.flow.businesstravel.controller.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -21,10 +22,12 @@ public class TravelTimeBaseVO {
 
     @Schema(description = "起始时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
     private LocalDateTime startTime;
 
     @Schema(description = "结束时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
     private LocalDateTime endTime;
 
     @Schema(description = "备注")

+ 9 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/businesstravel/service/TravelService.java

@@ -1,5 +1,6 @@
 package com.zjugis.business.flow.businesstravel.service;
 
+import com.zjugis.business.flow.businesstravel.controller.vo.TravelRespVO;
 import com.zjugis.business.flow.businesstravel.controller.vo.TravelUpdateReqVO;
 import com.zjugis.business.flow.businesstravel.entity.TravelDO;
 
@@ -34,4 +35,12 @@ public interface TravelService {
      * @return
      */
     TravelDO findByInstanceId(String flowInstanceId);
+
+    /**
+     * 流程数据添加
+     * @param flowInstanceId
+     * @param userId
+     * @return
+     */
+    TravelRespVO flowAdd(String flowInstanceId, String userId);
 }

+ 37 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/businesstravel/service/TravelServiceImpl.java

@@ -6,6 +6,7 @@ import com.zjugis.business.bean.entity.Project;
 import com.zjugis.business.constants.FlowStatusConstants;
 import com.zjugis.business.converter.businesstravel.TravelConvert;
 import com.zjugis.business.converter.businesstravel.TravelTimeConvert;
+import com.zjugis.business.flow.businesstravel.controller.vo.TravelRespVO;
 import com.zjugis.business.flow.businesstravel.controller.vo.TravelUpdateReqVO;
 import com.zjugis.business.flow.businesstravel.dao.TravelDao;
 import com.zjugis.business.flow.businesstravel.dao.TravelTimeDao;
@@ -131,6 +132,42 @@ public class TravelServiceImpl implements TravelService {
         return travelDao.findByInstanceId(flowInstanceId);
     }
 
+    @Override
+    public TravelRespVO flowAdd(String flowInstanceId, String userId) {
+        if (StringUtils.isNotBlank(SecurityFrameworkUtils.getLoginUserId())) {
+            userId = SecurityFrameworkUtils.getLoginUserId();
+        }
+        CommonResult<IFlowInstance> flowResult = workflowClient.flowInstance(flowInstanceId);
+        if (flowResult.isSuccess()) {
+            IFlowInstance flowInstance = flowResult.getData();
+            TravelDO entity = findByInstanceId(flowInstanceId);
+            if (Objects.isNull(entity)) {
+                entity = new TravelDO();
+                entity.setInstanceId(flowInstanceId);
+                entity.setUserId(userId);
+                entity.setTravelNo(flowInstance.getCode());
+                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());
+                }
+                travelDao.insert(entity);
+            }
+            TravelRespVO respVO = TravelConvert.INSTANCE.convert01(entity);
+            if(StringUtils.isNotBlank(entity.getProjectId())){
+                Project project = projectService.selectById(entity.getProjectId());
+                respVO.setProjectName(project.getXmmc());
+            }
+            List<TravelTimeDO> detailList = travelTimeService.getListByTravelId(entity.getId());
+            respVO.setTravelTimeCreateList(TravelTimeConvert.INSTANCE.convertList01(detailList));
+            return respVO;
+        }
+        return null;
+    }
+
     private void validateTravelExists(String id) {
         if (travelDao.selectById(id) == null) {
             throw exception(BUSINESS_TRAVEL_NOT_EXISTS);