|
@@ -1,64 +1,63 @@
|
|
|
<template>
|
|
|
- <HcCard actionUi="text-center">
|
|
|
- <template #header>
|
|
|
- <div class="hc-expense-total-title">出差天数:{{ formModel?.durationAll ||''}}</div>
|
|
|
- </template>
|
|
|
- <div class="hac-card-project-box">
|
|
|
- <div class="left-box">
|
|
|
- <el-scrollbar>
|
|
|
- <el-form ref="formRef" :model="formModel" :rules="formRules" label-width="auto" size="large" :disabled="dataType === 'view'">
|
|
|
- <div class="project-form-top">
|
|
|
-
|
|
|
- <el-form-item label="出差事由:" prop="tripDesc">
|
|
|
- <el-input v-model="formModel.tripDesc"/>
|
|
|
- </el-form-item>
|
|
|
- <HcCardItem :title="'行程'+ Number(index+1) " class="mt-2 hc-card-item-box" v-for="(item,index) in formModel.journeyList" ui="hac-bg-grey">
|
|
|
-
|
|
|
- <el-form :ref="(el) => setFormItemRefs(el, index)" :model="item" :rules="formItemRules" label-position="left" size="large">
|
|
|
- <el-form-item label="交通工具" prop="trafficType">
|
|
|
- <el-select v-model="item.trafficType" block clearable placeholder="请选择">
|
|
|
- <el-option v-for="item in trafficTypeData" :label="item.dictName" :value="item.dictValue"/>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="单程往返" prop="isSingletonType">
|
|
|
- <el-select v-model="item.isSingletonType" block clearable placeholder="请选择">
|
|
|
- <el-option v-for="item in wayType" :label="item.name" :value="item.key"/>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="出发城市" prop="startCity">
|
|
|
- <el-input v-model="item.startCity" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="目的城市" prop="endCity">
|
|
|
- <el-input v-model="item.endCity" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="开始时间" prop="startDate">
|
|
|
- <el-date-picker
|
|
|
- v-model="item.startDate"
|
|
|
- type="date"
|
|
|
- placeholder="请选择开始时间"
|
|
|
- style="width: 100%;"
|
|
|
- format="YYYY-MM-DD"
|
|
|
- value-format="YYYY-MM-DD"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="结束时间" prop="endDate">
|
|
|
- <el-date-picker
|
|
|
- :getwarin="getwarin(item)"
|
|
|
- v-model="item.endDate"
|
|
|
- type="date"
|
|
|
- placeholder="请选择结束时间"
|
|
|
- style="width: 100%;"
|
|
|
- format="YYYY-MM-DD"
|
|
|
- value-format="YYYY-MM-DD"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="时长" prop="duration">
|
|
|
- <el-input v-model="item.duration" disabled :getdata="getDiffDaydata(item)"/>
|
|
|
- </el-form-item>
|
|
|
-
|
|
|
- </el-form>
|
|
|
- <span class="tip ml-8">时长将自动计入考勤统计</span>
|
|
|
- <!-- <template #extra>
|
|
|
+ <HcCard action-ui="text-center">
|
|
|
+ <template #header>
|
|
|
+ <div class="hc-expense-total-title">
|
|
|
+ 出差天数:{{ formModel?.durationAll || '' }}
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <div class="hac-card-project-box">
|
|
|
+ <div class="left-box">
|
|
|
+ <el-scrollbar>
|
|
|
+ <el-form ref="formRef" :model="formModel" :rules="formRules" label-width="auto" size="large" :disabled="dataType === 'view'">
|
|
|
+ <div class="project-form-top">
|
|
|
+ <el-form-item label="出差事由:" prop="tripDesc">
|
|
|
+ <el-input v-model="formModel.tripDesc" />
|
|
|
+ </el-form-item>
|
|
|
+ <HcCardItem v-for="(item, index) in formModel.journeyList" :title="`行程${Number(index + 1)}` " class="mt-2 hc-card-item-box" ui="hac-bg-grey">
|
|
|
+ <el-form :ref="(el) => setFormItemRefs(el, index)" :model="item" :rules="formItemRules" label-position="left" size="large">
|
|
|
+ <el-form-item label="交通工具" prop="trafficType">
|
|
|
+ <el-select v-model="item.trafficType" block clearable placeholder="请选择">
|
|
|
+ <el-option v-for="item in trafficTypeData" :label="item.dictName" :value="item.dictValue" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="单程往返" prop="isSingletonType">
|
|
|
+ <el-select v-model="item.isSingletonType" block clearable placeholder="请选择">
|
|
|
+ <el-option v-for="item in wayType" :label="item.name" :value="item.key" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="出发城市" prop="startCity">
|
|
|
+ <el-input v-model="item.startCity" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="目的城市" prop="endCity">
|
|
|
+ <el-input v-model="item.endCity" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="开始时间" prop="startDate">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="item.startDate"
|
|
|
+ type="date"
|
|
|
+ placeholder="请选择开始时间"
|
|
|
+ style="width: 100%;"
|
|
|
+ format="YYYY-MM-DD"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="结束时间" prop="endDate">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="item.endDate"
|
|
|
+ :getwarin="getwarin(item)"
|
|
|
+ type="date"
|
|
|
+ placeholder="请选择结束时间"
|
|
|
+ style="width: 100%;"
|
|
|
+ format="YYYY-MM-DD"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="时长" prop="duration">
|
|
|
+ <el-input v-model="item.duration" disabled :getdata="getDiffDaydata(item)" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <span class="tip ml-8">时长将自动计入考勤统计</span>
|
|
|
+ <!-- <template #extra>
|
|
|
<el-button type="primary" size="small" @click="addJourney(item,index)">
|
|
|
<HcIcon name="add"/>
|
|
|
<span>增加行程</span>
|
|
@@ -68,110 +67,117 @@
|
|
|
<span>删除行程</span>
|
|
|
</el-button>
|
|
|
</template> -->
|
|
|
- <template #extra>
|
|
|
- <el-button type="danger" size="small" @click="delJourney(index)" v-if="index > 0">
|
|
|
- <HcIcon name="delete-bin"/>
|
|
|
- <span>删除行程</span>
|
|
|
- </el-button>
|
|
|
- </template>
|
|
|
- </HcCardItem>
|
|
|
- <div class="mt-16" style="margin-bottom: 40px;">
|
|
|
+ <template #extra>
|
|
|
+ <el-button v-if="index > 0" type="danger" size="small" @click="delJourney(index)">
|
|
|
+ <HcIcon name="delete-bin" />
|
|
|
+ <span>删除行程</span>
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </HcCardItem>
|
|
|
+ <div class="mt-16" style="margin-bottom: 40px;">
|
|
|
<el-divider content-position="right" border-style="dashed">
|
|
|
- <el-button type="primary" hc-btn @click="addJourney(item,index)">
|
|
|
- <HcIcon name="add"/>
|
|
|
- <span>添加行程</span>
|
|
|
- </el-button>
|
|
|
- </el-divider>
|
|
|
- </div>
|
|
|
+ <el-button type="primary" hc-btn @click="addJourney(item, index)">
|
|
|
+ <HcIcon name="add" />
|
|
|
+ <span>添加行程</span>
|
|
|
+ </el-button>
|
|
|
+ </el-divider>
|
|
|
+ </div>
|
|
|
|
|
|
- <el-form-item label="出差天数:" prop="durationAll" class="mt-4">
|
|
|
- <el-input v-model="formModel.durationAll" disabled/>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="出差备注:" prop="remarks" >
|
|
|
- <el-input v-model="formModel.remarks" type="textarea"/>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="同行人" prop="fellowTravelerUserIds">
|
|
|
+ <el-form-item label="出差天数:" prop="durationAll" class="mt-4">
|
|
|
+ <el-input v-model="formModel.durationAll" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="出差备注:" prop="remarks">
|
|
|
+ <el-input v-model="formModel.remarks" type="textarea" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="同行人" prop="fellowTravelerUserIds">
|
|
|
<el-select
|
|
|
- v-model="fellowTravelerUserIds"
|
|
|
- block clearable
|
|
|
- placeholder="请选择"
|
|
|
- style="width: 100%"
|
|
|
- multiple
|
|
|
- >
|
|
|
- <el-option v-for="item in partneroptions" :label="item.name" :value="item.id" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="所属项目" prop="projectId" >
|
|
|
- <el-select v-model="formModel.projectId" block clearable placeholder="请选择">
|
|
|
- <el-option v-for="item in projectType" :label="item.projectName" :value="item.projectId"/>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="关联预算计划" prop="key">
|
|
|
- <el-button type="primary" size="small" @click="budgetModalShow(item,index)">
|
|
|
- <HcIcon name="add"/>
|
|
|
- <span>关联预算计划</span>
|
|
|
+ v-model="fellowTravelerUserIds"
|
|
|
+ block clearable
|
|
|
+ placeholder="请选择"
|
|
|
+ style="width: 100%"
|
|
|
+ multiple
|
|
|
+ >
|
|
|
+ <el-option v-for="item in partneroptions" :label="item.name" :value="item.id" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="所属项目" prop="projectId">
|
|
|
+ <el-select v-model="formModel.projectId" block clearable placeholder="请选择">
|
|
|
+ <el-option v-for="item in projectType" :label="item.projectName" :value="item.projectId" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="关联预算计划" prop="key">
|
|
|
+ <el-button type="primary" size="small" @click="budgetModalShow(item, index)">
|
|
|
+ <HcIcon name="add" />
|
|
|
+ <span>关联预算计划</span>
|
|
|
</el-button>
|
|
|
- </el-form-item>
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- </div>
|
|
|
-
|
|
|
- </el-form>
|
|
|
- </el-scrollbar>
|
|
|
- </div>
|
|
|
- <div class="right-box">
|
|
|
- <div class="record-flow-box">
|
|
|
- <div class="title">流程</div>
|
|
|
- <div class="content">
|
|
|
- <el-scrollbar>
|
|
|
- <el-timeline>
|
|
|
- <el-timeline-item v-for="(item, index) in timeLineData" :key="index">
|
|
|
- <div class="timeline-title">{{item.title}}</div>
|
|
|
- <div class="timeline-section">{{item.section}}</div>
|
|
|
- </el-timeline-item>
|
|
|
- </el-timeline>
|
|
|
- </el-scrollbar>
|
|
|
- </div>
|
|
|
- <div class="action">
|
|
|
- <el-button type="warning" hc-btn @click="tempDraftData" :loading="tempLoading">
|
|
|
- <HcIcon name="draft"/>
|
|
|
- <span>暂存草稿</span>
|
|
|
- </el-button>
|
|
|
- <el-button type="primary" hc-btn @click="saveClick" :loading="saveLoading">
|
|
|
- <HcIcon name="check-double"/>
|
|
|
- <span>提交出差申请</span>
|
|
|
- </el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ </el-form>
|
|
|
+ </el-scrollbar>
|
|
|
+ </div>
|
|
|
+ <div class="right-box">
|
|
|
+ <div class="record-flow-box">
|
|
|
+ <div class="title">
|
|
|
+ 流程
|
|
|
+ </div>
|
|
|
+ <div class="content">
|
|
|
+ <el-scrollbar>
|
|
|
+ <el-timeline>
|
|
|
+ <el-timeline-item v-for="(item, index) in timeLineData" :key="index">
|
|
|
+ <div class="timeline-title">
|
|
|
+ {{ item.title }}
|
|
|
+ </div>
|
|
|
+ <div class="timeline-section">
|
|
|
+ {{ item.section }}
|
|
|
+ </div>
|
|
|
+ </el-timeline-item>
|
|
|
+ </el-timeline>
|
|
|
+ </el-scrollbar>
|
|
|
+ </div>
|
|
|
+ <div class="action">
|
|
|
+ <el-button type="warning" hc-btn :loading="tempLoading" @click="tempDraftData">
|
|
|
+ <HcIcon name="draft" />
|
|
|
+ <span>暂存草稿</span>
|
|
|
+ </el-button>
|
|
|
+ <el-button type="primary" hc-btn :loading="saveLoading" @click="saveClick">
|
|
|
+ <HcIcon name="check-double" />
|
|
|
+ <span>提交出差申请</span>
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <!--关联预算计划-->
|
|
|
- <HcDialog bgColor="#ffffff" isToBody isTable
|
|
|
- title="关联预算计划" widths="80%" saveText="保存"
|
|
|
- :show="budgetModal"
|
|
|
- @close="budgetCloseClick"
|
|
|
- @save="budgetSaveClick"
|
|
|
+ </div>
|
|
|
+ <!-- 关联预算计划 -->
|
|
|
+ <HcDialog
|
|
|
+ bg-color="#ffffff" is-to-body is-table
|
|
|
+ title="关联预算计划" widths="80%" save-text="保存"
|
|
|
+ :show="budgetModal"
|
|
|
+ @close="budgetCloseClick"
|
|
|
+ @save="budgetSaveClick"
|
|
|
>
|
|
|
<HcTable :column="tableBudgetColumn" :datas="tableBudgetData" :loading="tableBudgetLoading">
|
|
|
- <template #action="{row,index}">
|
|
|
- <el-button size="small" type="danger" @click="row.relevance = false" v-if="row.relevance">取消关联</el-button>
|
|
|
- <el-button size="small" type="primary" @click="row.relevance = true" v-else>关联</el-button>
|
|
|
+ <template #action="{ row, index }">
|
|
|
+ <el-button v-if="row.relevance" size="small" type="danger" @click="row.relevance = false">
|
|
|
+ 取消关联
|
|
|
+ </el-button>
|
|
|
+ <el-button v-else size="small" type="primary" @click="row.relevance = true">
|
|
|
+ 关联
|
|
|
+ </el-button>
|
|
|
</template>
|
|
|
</HcTable>
|
|
|
- </HcDialog>
|
|
|
- </HcCard>
|
|
|
+ </HcDialog>
|
|
|
+ </HcCard>
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
|
-import {ref, onActivated,watch} from "vue";
|
|
|
-import {useRoute, useRouter} from 'vue-router'
|
|
|
-import {getProjectList, getDictInfo,getuserList} from "~api/other";
|
|
|
-import {arrIndex, deepClone, formValidate, getArrValue} from "js-fast-way";
|
|
|
-import businessApi from '~api/attendance/business-trip.js';
|
|
|
-import {getDiffDay} from "~uti/tools";
|
|
|
-import {useAppStore} from "~src/store";
|
|
|
-const useAppState = useAppStore();
|
|
|
+import { onActivated, ref, watch } from 'vue'
|
|
|
+import { useRoute, useRouter } from 'vue-router'
|
|
|
+import { getDictInfo, getProjectList, getuserList } from '~api/other'
|
|
|
+import { arrIndex, deepClone, formValidate, getArrValue } from 'js-fast-way'
|
|
|
+import businessApi from '~api/attendance/business-trip.js'
|
|
|
+import { getDiffDay } from '~uti/tools'
|
|
|
+import { useAppStore } from '~src/store'
|
|
|
+const useAppState = useAppStore()
|
|
|
|
|
|
const router = useRouter()
|
|
|
const useRoutes = useRoute()
|
|
@@ -193,8 +199,8 @@ const getDetailsData = async () => {
|
|
|
if (dataType.value === 'view') {
|
|
|
//预览详情
|
|
|
let newDetails = {}, newDetails1 = {}
|
|
|
- const {error, code, data, msg} = await businessApi.detail({
|
|
|
- id: dataId.value
|
|
|
+ const { error, code, data, msg } = await businessApi.detail({
|
|
|
+ id: dataId.value,
|
|
|
})
|
|
|
//判断状态
|
|
|
if (!error && code === 200) {
|
|
@@ -210,7 +216,7 @@ const getDetailsData = async () => {
|
|
|
newDetails1.id = res?.id
|
|
|
|
|
|
newDetails.details = [newDetails1]
|
|
|
- fellowTravelerUserIds.value=res.fellowTravelerUserIds.split(',')
|
|
|
+ fellowTravelerUserIds.value = res.fellowTravelerUserIds.split(',')
|
|
|
} else {
|
|
|
newDetails = detailsObj
|
|
|
newDetails.details = [detailsObj1]
|
|
@@ -220,8 +226,8 @@ const getDetailsData = async () => {
|
|
|
detailsData.value = newDetails
|
|
|
} else if (dataType.value === 'draft') {
|
|
|
//草稿详情
|
|
|
- const {error, code, data} = await businessApi.draftDetail({
|
|
|
- eMDraftIds: dataId.value
|
|
|
+ const { error, code, data } = await businessApi.draftDetail({
|
|
|
+ eMDraftIds: dataId.value,
|
|
|
})
|
|
|
//判断状态
|
|
|
const res = getArrValue(data)
|
|
@@ -244,32 +250,32 @@ const getDetailsData = async () => {
|
|
|
|
|
|
})
|
|
|
newDetails.journeyList = newDetailsArr
|
|
|
- fellowTravelerUserIds.value=res[0].fellowTravelerUserIds.split(',')
|
|
|
- console.log(formModel.value,'formModel.value');
|
|
|
+ fellowTravelerUserIds.value = res[0].fellowTravelerUserIds.split(',')
|
|
|
+ console.log(formModel.value, 'formModel.value')
|
|
|
formModel.value = newDetails
|
|
|
} else {
|
|
|
|
|
|
formModel.value = {
|
|
|
...detailsObj,
|
|
|
- details: [detailsObj1]
|
|
|
+ details: [detailsObj1],
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
|
|
|
formModel.value = {
|
|
|
...detailsObj,
|
|
|
- details: [detailsObj1]
|
|
|
+ details: [detailsObj1],
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
//获取间隔天数
|
|
|
-const getDiffDaydata=(item)=>{
|
|
|
- let time= getDiffDay(item.startDate,item.endDate)
|
|
|
+const getDiffDaydata = (item)=>{
|
|
|
+ let time = getDiffDay(item.startDate, item.endDate)
|
|
|
|
|
|
- item.duration=time||0
|
|
|
+ item.duration = time || 0
|
|
|
}
|
|
|
-const getwarin=(item)=>{
|
|
|
- if(item.endDate<item.startDate){
|
|
|
+const getwarin = (item)=>{
|
|
|
+ if (item.endDate < item.startDate) {
|
|
|
window.$message.warning('结束时间不能小于开始时间')
|
|
|
|
|
|
}
|
|
@@ -279,42 +285,42 @@ const formItemRules = {
|
|
|
isSingletonType: {
|
|
|
required: true,
|
|
|
trigger: 'blur',
|
|
|
- message: "请选择单程往返"
|
|
|
+ message: '请选择单程往返',
|
|
|
},
|
|
|
trafficType: {
|
|
|
required: true,
|
|
|
trigger: 'blur',
|
|
|
- message: "请选择交通工具"
|
|
|
+ message: '请选择交通工具',
|
|
|
},
|
|
|
startCity: {
|
|
|
required: true,
|
|
|
trigger: 'blur',
|
|
|
- message: "请选择出发城市"
|
|
|
+ message: '请选择出发城市',
|
|
|
},
|
|
|
endCity: {
|
|
|
required: true,
|
|
|
trigger: 'blur',
|
|
|
- message: "请选择目的城市"
|
|
|
+ message: '请选择目的城市',
|
|
|
},
|
|
|
startDate: {
|
|
|
required: true,
|
|
|
trigger: 'blur',
|
|
|
- message: "请选择开始时间"
|
|
|
+ message: '请选择开始时间',
|
|
|
},
|
|
|
endDate: {
|
|
|
required: true,
|
|
|
trigger: 'blur',
|
|
|
- message: "请选择结束时间"
|
|
|
+ message: '请选择结束时间',
|
|
|
},
|
|
|
duration: {
|
|
|
required: true,
|
|
|
trigger: 'blur',
|
|
|
- message: "请输入时长"
|
|
|
+ message: '请输入时长',
|
|
|
},
|
|
|
durationAll:{
|
|
|
required: true,
|
|
|
trigger: 'blur',
|
|
|
- message: "请输入天数"
|
|
|
+ message: '请输入天数',
|
|
|
},
|
|
|
}
|
|
|
const formRefs = ref([])
|
|
@@ -324,7 +330,7 @@ const setFormItemRefs = (el, index) => {
|
|
|
if (indexs !== -1) {
|
|
|
formRefs.value[index].ref = el
|
|
|
} else {
|
|
|
- formRefs.value.push({index: index, ref: el});
|
|
|
+ formRefs.value.push({ index: index, ref: el })
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -336,26 +342,26 @@ const getFormRef = async (index) => {
|
|
|
}
|
|
|
|
|
|
//增加行程addJourney
|
|
|
-const addJourney=(item,index)=>{
|
|
|
+const addJourney = (item, index)=>{
|
|
|
formModel.value?.journeyList.push({})
|
|
|
}
|
|
|
-const delJourney=(item,index)=>{
|
|
|
- console.log(index,'index');
|
|
|
+const delJourney = (item, index)=>{
|
|
|
+ console.log(index, 'index')
|
|
|
formModel?.value.journeyList.splice(index, 1)
|
|
|
}
|
|
|
//单程往返
|
|
|
const wayType = ref([
|
|
|
- {name: '单程', key: 1},
|
|
|
- {name: '往返', key: 2},
|
|
|
+ { name: '单程', key: 1 },
|
|
|
+ { name: '往返', key: 2 },
|
|
|
|
|
|
])
|
|
|
//交通工具
|
|
|
-const trafficTypeData=ref([
|
|
|
+const trafficTypeData = ref([
|
|
|
|
|
|
])
|
|
|
//交通类型字典
|
|
|
-const getTrafficType= async () => {
|
|
|
- const {error, code, data} = await getDictInfo('traffic_type')
|
|
|
+const getTrafficType = async () => {
|
|
|
+ const { error, code, data } = await getDictInfo('traffic_type')
|
|
|
//判断状态
|
|
|
if (!error && code === 200) {
|
|
|
trafficTypeData.value = getArrValue(data)
|
|
@@ -364,11 +370,11 @@ const getTrafficType= async () => {
|
|
|
}
|
|
|
}
|
|
|
//出发城市cityType
|
|
|
-const cityType=ref([
|
|
|
- {name: '北京', key: '1'},
|
|
|
- {name: '上海', key: '2'},
|
|
|
- {name: '深圳', key: '3'},
|
|
|
- {name: '成都', key: '4'},
|
|
|
+const cityType = ref([
|
|
|
+ { name: '北京', key: '1' },
|
|
|
+ { name: '上海', key: '2' },
|
|
|
+ { name: '深圳', key: '3' },
|
|
|
+ { name: '成都', key: '4' },
|
|
|
])
|
|
|
//项目类型
|
|
|
const projectType = ref([
|
|
@@ -378,7 +384,7 @@ const projectType = ref([
|
|
|
//获取项目数据
|
|
|
|
|
|
const getProjectData = async () => {
|
|
|
- const {error, code, data} = await getProjectList()
|
|
|
+ const { error, code, data } = await getProjectList()
|
|
|
//判断状态
|
|
|
if (!error && code === 200) {
|
|
|
projectType.value = getArrValue(data)
|
|
@@ -388,10 +394,10 @@ const getProjectData = async () => {
|
|
|
}
|
|
|
//同行人
|
|
|
|
|
|
-const partneroptions=ref([])
|
|
|
+const partneroptions = ref([])
|
|
|
|
|
|
-const getUserDict=async()=>{
|
|
|
- const {error, code, data} = await getuserList({tenantId:useAppState.tenantId})
|
|
|
+const getUserDict = async ()=>{
|
|
|
+ const { error, code, data } = await getuserList({ tenantId:useAppState.tenantId })
|
|
|
if (!error && code === 200) {
|
|
|
partneroptions.value = getArrValue(data)
|
|
|
|
|
@@ -402,11 +408,11 @@ const getUserDict=async()=>{
|
|
|
}
|
|
|
//合同类型
|
|
|
const contractType = ref([
|
|
|
- {name: '咨询服务+软件', key: '1'},
|
|
|
- {name: '软件', key: '2'},
|
|
|
- {name: '咨询服务', key: '3'},
|
|
|
- {name: '后期服务+软件', key: '4'},
|
|
|
- {name: '数字化扫描+软件', key: '5'},
|
|
|
+ { name: '咨询服务+软件', key: '1' },
|
|
|
+ { name: '软件', key: '2' },
|
|
|
+ { name: '咨询服务', key: '3' },
|
|
|
+ { name: '后期服务+软件', key: '4' },
|
|
|
+ { name: '数字化扫描+软件', key: '5' },
|
|
|
])
|
|
|
|
|
|
|
|
@@ -414,29 +420,29 @@ const contractType = ref([
|
|
|
//顶部表单数据
|
|
|
const formRef = ref(null)
|
|
|
const formModel = ref({
|
|
|
- journeyList:[{}]
|
|
|
+ journeyList:[{}],
|
|
|
})
|
|
|
//深度监听
|
|
|
watch(() => [
|
|
|
- formModel.value.journeyList
|
|
|
+ formModel.value.journeyList,
|
|
|
], ([datas]) => {
|
|
|
- let timeall=0
|
|
|
+ let timeall = 0
|
|
|
formModel.value.journeyList.forEach((ele)=>{
|
|
|
- timeall=ele.duration+timeall
|
|
|
+ timeall = ele.duration + timeall
|
|
|
})
|
|
|
- formModel.value.durationAll=timeall//计算总时长
|
|
|
-}, {deep: true})
|
|
|
+ formModel.value.durationAll = timeall//计算总时长
|
|
|
+}, { deep: true })
|
|
|
const formRules = {
|
|
|
tripDesc: {
|
|
|
required: true,
|
|
|
trigger: 'blur',
|
|
|
- message: "请输入项出差事由"
|
|
|
+ message: '请输入项出差事由',
|
|
|
},
|
|
|
|
|
|
projectId: {
|
|
|
required: true,
|
|
|
trigger: 'blur',
|
|
|
- message: "请选择项目"
|
|
|
+ message: '请选择项目',
|
|
|
},
|
|
|
|
|
|
|
|
@@ -445,7 +451,7 @@ const formRules = {
|
|
|
|
|
|
//日期时间被选择
|
|
|
const betweenTime = ref(null)
|
|
|
-const betweenTimeUpdate = ({arr, query}) => {
|
|
|
+const betweenTimeUpdate = ({ arr, query }) => {
|
|
|
betweenTime.value = arr
|
|
|
//formModel.value.betweenTime = query
|
|
|
}
|
|
@@ -453,10 +459,10 @@ const betweenTimeUpdate = ({arr, query}) => {
|
|
|
|
|
|
//时间线数据
|
|
|
const timeLineData = ref([
|
|
|
- {title: '审批人', section: '部门负责人'},
|
|
|
- {title: '人事审批', section: '人事'},
|
|
|
+ { title: '审批人', section: '部门负责人' },
|
|
|
+ { title: '人事审批', section: '人事' },
|
|
|
|
|
|
- {title: '抄送人', section: '总经理'},
|
|
|
+ { title: '抄送人', section: '总经理' },
|
|
|
|
|
|
])
|
|
|
|
|
@@ -478,7 +484,7 @@ const budgetModalShow = (item, index) => {
|
|
|
budgetModal.value = true
|
|
|
budgetIndex.value = index
|
|
|
// budgetIds.value = item.budgetPlanIds?.split(',') || []
|
|
|
- budgetIds.value=formModel.value.projectId
|
|
|
+ budgetIds.value = formModel.value.projectId
|
|
|
getBudgetTableData(formModel.value.projectId)
|
|
|
}
|
|
|
const budgetCloseClick = () => {
|
|
@@ -490,18 +496,18 @@ const budgetSaveClick = () => {
|
|
|
|
|
|
//关联预算计划表格
|
|
|
const tableBudgetColumn = [
|
|
|
- {key: 'key1', name: '任务所属项目'},
|
|
|
- {key: 'key2', name: '状态', width: '120', align: 'center'},
|
|
|
- {key: 'key3', name: '任务描述'},
|
|
|
- {key: 'key4', name: '完成指标', width: '120', align: 'center'},
|
|
|
- {key: 'action', name: '操作', width: '100', align: 'center'},
|
|
|
+ { key: 'key1', name: '任务所属项目' },
|
|
|
+ { key: 'key2', name: '状态', width: '120', align: 'center' },
|
|
|
+ { key: 'key3', name: '任务描述' },
|
|
|
+ { key: 'key4', name: '完成指标', width: '120', align: 'center' },
|
|
|
+ { key: 'action', name: '操作', width: '100', align: 'center' },
|
|
|
]
|
|
|
|
|
|
const tableBudgetData = ref([])
|
|
|
-const tableBudgetLoading=ref(false)
|
|
|
+const tableBudgetLoading = ref(false)
|
|
|
const getBudgetTableData = async (projectId) => {
|
|
|
tableBudgetLoading.value = true
|
|
|
- const {error, code, data} = await businessApi.budget({projectId})
|
|
|
+ const { error, code, data } = await businessApi.budget({ projectId })
|
|
|
//判断状态
|
|
|
tableBudgetLoading.value = false
|
|
|
if (!error && code === 200) {
|
|
@@ -512,27 +518,27 @@ const getBudgetTableData = async (projectId) => {
|
|
|
}
|
|
|
//行程
|
|
|
const detailsObj1 = {
|
|
|
- trafficType: '', // 交通工具
|
|
|
- isSingletonType: '', // 单程往返
|
|
|
- startCity: '', // 出发城市
|
|
|
- endCity: '', //目的城市
|
|
|
- startDate: null, // 开始时间
|
|
|
- endDate: null, // 结束时间
|
|
|
- duration: null, // 时长
|
|
|
+ trafficType: '', // 交通工具
|
|
|
+ isSingletonType: '', // 单程往返
|
|
|
+ startCity: '', // 出发城市
|
|
|
+ endCity: '', //目的城市
|
|
|
+ startDate: null, // 开始时间
|
|
|
+ endDate: null, // 结束时间
|
|
|
+ duration: null, // 时长
|
|
|
//details: [detailsObj1],
|
|
|
}
|
|
|
//基础详情
|
|
|
const detailsObj = {
|
|
|
|
|
|
- tripDesc: '', // 出差事由
|
|
|
- durationAll: 0, // 出差天数
|
|
|
- fellowTravelerUserIds: '', // 同行人
|
|
|
- remarks: '', //出差备注
|
|
|
- projectId: '', // 所属项目
|
|
|
- submitStatus: null, // 审提交状态 1=暂存 2=提交审批
|
|
|
+ tripDesc: '', // 出差事由
|
|
|
+ durationAll: 0, // 出差天数
|
|
|
+ fellowTravelerUserIds: '', // 同行人
|
|
|
+ remarks: '', //出差备注
|
|
|
+ projectId: '', // 所属项目
|
|
|
+ submitStatus: null, // 审提交状态 1=暂存 2=提交审批
|
|
|
journeyList: [detailsObj1],
|
|
|
}
|
|
|
-const fellowTravelerUserIds=ref([])
|
|
|
+const fellowTravelerUserIds = ref([])
|
|
|
//处理表单数据
|
|
|
const getFormData = (submitStatus = 1) => {
|
|
|
const res = deepClone(formModel.value)
|
|
@@ -551,15 +557,15 @@ const getFormData = (submitStatus = 1) => {
|
|
|
...newDetails,
|
|
|
...item,
|
|
|
|
|
|
- submitStatus //提交状态 1=暂存 2=提交审批
|
|
|
+ submitStatus, //提交状态 1=暂存 2=提交审批
|
|
|
})
|
|
|
})
|
|
|
return newFormData
|
|
|
}
|
|
|
-const saveLoading=ref(false)
|
|
|
-const saveClick=async()=>{
|
|
|
+const saveLoading = ref(false)
|
|
|
+const saveClick = async ()=>{
|
|
|
const res = await formValidate(formRef.value)
|
|
|
- if (!res) return false;
|
|
|
+ if (!res) return false
|
|
|
//处理明细表单效验
|
|
|
saveLoading.value = true
|
|
|
const form = getFormData(2)
|
|
@@ -569,10 +575,11 @@ const saveClick=async()=>{
|
|
|
if (!res) {
|
|
|
saveLoading.value = false
|
|
|
return
|
|
|
- }else{
|
|
|
- form[0].fellowTravelerUserIds=fellowTravelerUserIds.value.join(',')
|
|
|
- console.log(form,'form');
|
|
|
- const {error, code, msg} = await businessApi.submit(form)
|
|
|
+ } else {
|
|
|
+
|
|
|
+ form[0].fellowTravelerUserIds = fellowTravelerUserIds.value.join(',')
|
|
|
+ console.log(form, 'form')
|
|
|
+ const { error, code, msg } = await businessApi.submit(form)
|
|
|
//判断状态
|
|
|
tempLoading.value = false
|
|
|
if (!error && code === 200) {
|
|
@@ -580,10 +587,9 @@ const saveClick=async()=>{
|
|
|
router.push({
|
|
|
name: 'attendance-business-trip',
|
|
|
})
|
|
|
- } else {
|
|
|
- window.$message?.error(msg)
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
+ saveLoading.value = false
|
|
|
}
|
|
|
//发起请求
|
|
|
}
|
|
@@ -593,10 +599,10 @@ const tempDraftData = async () => {
|
|
|
tempLoading.value = true
|
|
|
const form = getFormData(1)
|
|
|
form.forEach((ele)=>{
|
|
|
- ele.fellowTravelerUserIds=fellowTravelerUserIds.value.join(',')
|
|
|
+ ele.fellowTravelerUserIds = fellowTravelerUserIds.value.join(',')
|
|
|
})
|
|
|
- console.log(form,'form');
|
|
|
- const {error, code, msg} = await businessApi.submit(form)
|
|
|
+ console.log(form, 'form')
|
|
|
+ const { error, code, msg } = await businessApi.submit(form)
|
|
|
|
|
|
|
|
|
//判断状态
|
|
@@ -607,7 +613,6 @@ const tempDraftData = async () => {
|
|
|
window.$message?.error(msg)
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|