pull/781/head
zy 2025-05-14 22:10:07 +08:00
parent 7049674d1e
commit 060ec1f1b3
33 changed files with 1107 additions and 176 deletions

10
package-lock.json generated
View File

@ -43,6 +43,7 @@
"markmap-view": "^0.16.0", "markmap-view": "^0.16.0",
"min-dash": "^4.1.1", "min-dash": "^4.1.1",
"mitt": "^3.0.1", "mitt": "^3.0.1",
"moment": "^2.30.1",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"pinia-plugin-persistedstate": "^3.2.1", "pinia-plugin-persistedstate": "^3.2.1",
@ -13064,6 +13065,15 @@
"saxen": "^8.1.2" "saxen": "^8.1.2"
} }
}, },
"node_modules/moment": {
"version": "2.30.1",
"resolved": "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz",
"integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
"license": "MIT",
"engines": {
"node": "*"
}
},
"node_modules/mpd-parser": { "node_modules/mpd-parser": {
"version": "0.22.1", "version": "0.22.1",
"resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-0.22.1.tgz", "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-0.22.1.tgz",

View File

@ -59,6 +59,7 @@
"markmap-view": "^0.16.0", "markmap-view": "^0.16.0",
"min-dash": "^4.1.1", "min-dash": "^4.1.1",
"mitt": "^3.0.1", "mitt": "^3.0.1",
"moment": "^2.30.1",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"pinia-plugin-persistedstate": "^3.2.1", "pinia-plugin-persistedstate": "^3.2.1",

View File

@ -24,6 +24,11 @@ export const BriefWorkApi = {
return await request.get({ url: `/tts/brief-work/page`, params }) return await request.get({ url: `/tts/brief-work/page`, params })
}, },
// 查询工作简报分页-根据周报查询
getBriefWorkTimePage: async (params: any) => {
return await request.get({ url: `/tts/brief-work/page`, params })
},
// 查询工作简报详情 // 查询工作简报详情
getBriefWork: async (params: any) => { getBriefWork: async (params: any) => {
return await request.get({ url: `/tts/brief-work/get`, params}) return await request.get({ url: `/tts/brief-work/get`, params})

View File

@ -133,7 +133,8 @@ const handleFileSuccess: UploadProps['onSuccess'] = (res: any): void => {
// //
const index = fileList.value.findIndex((item) => item.response?.data === res.data) const index = fileList.value.findIndex((item) => item.response?.data === res.data)
fileList.value.splice(index, 1) fileList.value.splice(index, 1)
uploadList.value.push({ name: res.data, url: res.data }) console.log('%csrc/components/UploadFile/src/UploadFile.vue:136 res', 'color: #007acc;', res);
uploadList.value.push({ url: res.data })
if (uploadList.value.length == uploadNumber.value) { if (uploadList.value.length == uploadNumber.value) {
fileList.value.push(...uploadList.value) fileList.value.push(...uploadList.value)
uploadList.value = [] uploadList.value = []

View File

@ -94,10 +94,10 @@ const queryParams = reactive({
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) // const exportLoading = ref(false) //
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (data: [], id) => { const open = async (data: []) => {
dialogVisible.value = true dialogVisible.value = true
multipleSelection.value = data multipleSelection.value = data
queryParams.customerId = id // queryParams.customerId = id
await getList() await getList()
await setSelections() await setSelections()

View File

@ -803,7 +803,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
hidden: true, hidden: true,
activeMenu: '/project/project' activeMenu: '/project/project'
}, },
component: () => import('@/views/task/project/ProjectForm.vue') component: () => import('@/views/project/project/ProjectForm.vue')
}, },
{ {
path: 'project/ProjectFormEdit', path: 'project/ProjectFormEdit',
@ -814,7 +814,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
hidden: true, hidden: true,
activeMenu: '/project/project' activeMenu: '/project/project'
}, },
component: () => import('@/views/task/project/ProjectForm.vue') component: () => import('@/views/project/project/ProjectForm.vue')
}, },
{ {
path: 'project/ProjectDetail', path: 'project/ProjectDetail',
@ -825,7 +825,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
hidden: true, hidden: true,
activeMenu: '/project/project' activeMenu: '/project/project'
}, },
component: () => import('@/views/task/project/ProjectDetail.vue') component: () => import('@/views/project/project/ProjectDetail.vue')
}, },
{ {
path: 'components/TaskDetail', path: 'components/TaskDetail',
@ -836,7 +836,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
hidden: true, hidden: true,
activeMenu: '/project/project' activeMenu: '/project/project'
}, },
component: () => import('@/views/task/project/components/TaskDetail.vue') component: () => import('@/views/project/project/components/TaskDetail.vue')
}, },
{ {
path: 'components/ProjectTaskForm', path: 'components/ProjectTaskForm',
@ -847,7 +847,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
hidden: true, hidden: true,
activeMenu: '/project/project' activeMenu: '/project/project'
}, },
component: () => import('@/views/task/project/components/ProjectTaskForm.vue') component: () => import('@/views/project/project/components/ProjectTaskForm.vue')
}, },
{ {
path: 'online/OnlineApplicationForm', path: 'online/OnlineApplicationForm',
@ -858,7 +858,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
hidden: true, hidden: true,
activeMenu: '/project/online' activeMenu: '/project/online'
}, },
component: () => import('@/views/task/online/OnlineApplicationForm.vue') component: () => import('@/views/project/online/OnlineApplicationForm.vue')
}, },
{ {
path: 'online/OnlineApplicationEdit', path: 'online/OnlineApplicationEdit',
@ -869,7 +869,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
hidden: true, hidden: true,
activeMenu: '/project/online' activeMenu: '/project/online'
}, },
component: () => import('@/views/task/online/OnlineApplicationForm.vue') component: () => import('@/views/project/online/OnlineApplicationForm.vue')
}, },
{ {
path: 'online/OnlineApplicationDetail', path: 'online/OnlineApplicationDetail',
@ -880,7 +880,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
hidden: true, hidden: true,
activeMenu: '/project/online' activeMenu: '/project/online'
}, },
component: () => import('@/views/task/online/OnlineApplicationDetail.vue') component: () => import('@/views/project/online/OnlineApplicationDetail.vue')
}, },
{ {
path: 'briefWork/BriefWorkDetail', path: 'briefWork/BriefWorkDetail',
@ -891,7 +891,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
hidden: true, hidden: true,
activeMenu: '/project/briefWork' activeMenu: '/project/briefWork'
}, },
component: () => import('@/views/task/briefWork/BriefWorkDetail.vue') component: () => import('@/views/project/briefWork/BriefWorkDetail.vue')
}, },
{ {
path: 'briefWork/BriefWorkForm', path: 'briefWork/BriefWorkForm',
@ -902,7 +902,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
hidden: true, hidden: true,
activeMenu: '/project/briefWork' activeMenu: '/project/briefWork'
}, },
component: () => import('@/views/task/briefWork/BriefWorkForm.vue') component: () => import('@/views/project/briefWork/BriefWorkForm.vue')
}, },
{ {
path: 'briefWeekWork/BriefworkWeekDetail', path: 'briefWeekWork/BriefworkWeekDetail',
@ -913,7 +913,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
hidden: true, hidden: true,
activeMenu: '/project/bridfWeekWork' activeMenu: '/project/bridfWeekWork'
}, },
component: () => import('@/views/task/briefWeekWork/BriefWorkWeekDetail.vue') component: () => import('@/views/project/briefWeekWork/BriefWorkWeekDetail.vue')
}, },
{ {
path: 'briefWeekWork/BriefWorkWeekForm', path: 'briefWeekWork/BriefWorkWeekForm',
@ -924,7 +924,29 @@ const remainingRouter: AppRouteRecordRaw[] = [
hidden: true, hidden: true,
activeMenu: '/project/bridfWeekWork' activeMenu: '/project/bridfWeekWork'
}, },
component: () => import('@/views/task/briefWeekWork/BriefWorkWeekForm.vue') component: () => import('@/views/project/briefWeekWork/BriefWorkWeekForm.vue')
},
{
path: 'briefMonthWork/BriefWorkMonthDetail',
name: 'MonthReportDetail',
meta: {
title: '月报详情',
noCache: true,
hidden: true,
activeMenu: '/project/bridfWeekWork'
},
component: () => import('@/views/project/briefMonthWork/BriefMonthWorkDetail.vue')
},
{
path: 'briefMonthWork/BriefWorkMonthForm',
name: 'MonthReportAdd',
meta: {
title: '月报新增',
noCache: true,
hidden: true,
activeMenu: '/project/bridfWeekWork'
},
component: () => import('@/views/project/briefMonthWork/BriefWorkMonthForm.vue')
}, },
] ]
}, },

View File

@ -0,0 +1,176 @@
<template>
<ContentWrap>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="120px"
v-loading="formLoading"
>
<el-row>
<el-col :span="8">
<el-form-item label="简报开始日期" prop="briefStartDate">
<el-date-picker
v-model="formData.briefStartDate"
type="date"
disabled
value-format="YYYY-MM-DD"
placeholder="选择简报开始日期"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="简报结束日期" prop="briefEndDate">
<el-date-picker
disabled
v-model="formData.briefEndDate"
type="date"
value-format="YYYY-MM-DD"
placeholder="选择简报结束日期"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否选择客户" prop="selectCustomer">
<el-radio-group v-model="formData.selectCustomer" disabled>
<el-radio :label="true"></el-radio>
<el-radio :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24">
<ContentWrap style="border: none;font-weight: 700" v-if="formData.selectCustomer">
选择客户
</ContentWrap>
<CustomerForm ref="customerFormRef" :userOptions="userOptions" :type="1" :dataList="formData.followUpRecords" v-if="formData.selectCustomer" />
<ContentWrap style="border: none;font-weight: 700" >
选择任务
</ContentWrap>
<TaskForm ref="taskFormRef" :type="1" :dataList="formData.tasks" />
<ContentWrap style="border: none;font-weight: 700" >
日报信息
</ContentWrap>
<DayReportForm :reportType="2" :type="1" ref="dayReportFormRef" :time="time" />
</el-col>
<el-col :span="24">
<el-form-item label="本月完成工作" prop="workComplate">
<el-input type="textarea" disabled :rows="5" v-model="formData.workComplate" placeholder="请输入本日完成工作" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="下月工作计划" prop="workPlan">
<el-input type="textarea" disabled :rows="5" v-model="formData.workPlan" placeholder="请输入明日工作计划" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="工作困难及协助" prop="workAssistance">
<el-input type="textarea" disabled :rows="5" v-model="formData.workAssistance" placeholder="请输入工作困难及协助" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="attachment">
<UploadFile v-model="formData.attachment" :disabled="true" :limit="1" :fileType="['doc','docx']"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</ContentWrap>
</template>
<script setup lang="ts">
import { getIntDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { BriefWorkApi, BriefWorkVO } from '@/api/task/briefWork'
import { useUserStore } from '@/store/modules/user'
import CustomerForm from '../briefWeekWork/components/selectCustomer.vue'
import TaskForm from '../briefWeekWork/components/selectTask.vue'
import DayReportForm from '../briefWeekWork/components/selectDayReport.vue'
import { propTypes } from '@/utils/propTypes'
import * as UserApi from '@/api/system/user'
/** 工作简报 表单 */
defineOptions({ name: 'BriefWorkForm' })
const { proxy }: any = getCurrentInstance();
const props = defineProps({
id: propTypes.number.def(undefined)
})
const userOptions = ref<UserApi.UserVO[]>([]) //
const { t } = useI18n() //
const message = useMessage() //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const time = ref([]) //
const formData = ref({
id: undefined,
briefType: 3,
selectCustomer: true,
briefCount: undefined,
briefStartDate: undefined,
briefEndDate: undefined,
workComplate: undefined,
workPlan: undefined,
workAssistance: undefined,
workExperience: undefined,
attachment: undefined,
processInstanceId: undefined,
auditStatus: undefined
})
const formRules = reactive({
briefStartDate: [{ required: true, message: '简报日期不能为空', trigger: 'blur' }],
workComplate: [{ required: true, message: '本月期完成工作不能为空', trigger: 'blur' }],
workPlan: [{ required: true, message: '下月工作计划不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
const customerFormRef = ref() // Ref
const taskFormRef = ref() // Ref
const dayReportFormRef = ref() // Ref
const goBack = ()=> {
proxy.$router.go(-1)
}
const open = async (id?: number) => {
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await BriefWorkApi.getBriefWork({id: id, briefType: 3})
time.value = [formData.value.briefStartDate + ' 00:00:00', formData.value.briefEndDate + ' 23:59:59']
} finally {
formLoading.value = false
}
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
briefType: 1,
briefCount: undefined,
briefStartDate: undefined,
briefEndDate: undefined,
selectCustomer: true,
workComplate: undefined,
workPlan: undefined,
workAssistance: undefined,
workExperience: undefined,
attachment: undefined,
processInstanceId: undefined,
auditStatus: undefined
}
formRef.value?.resetFields()
}
const route = useRoute();
onMounted(async () => {
formType.value = props.id || route.query.id
if (formType.value) await open(formType.value)
//
userOptions.value = await UserApi.getSimpleUserList()
})
</script>

View File

@ -0,0 +1,223 @@
<template>
<ContentWrap>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="120px"
v-loading="formLoading"
>
<el-row>
<el-col :span="8">
<el-form-item label="简报开始日期" prop="briefStartDate">
<el-date-picker
v-model="formData.briefStartDate"
type="date"
disabled
value-format="YYYY-MM-DD"
placeholder="选择简报开始日期"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="简报结束日期" prop="briefEndDate">
<el-date-picker
disabled
v-model="formData.briefEndDate"
type="date"
value-format="YYYY-MM-DD"
placeholder="选择简报结束日期"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否选择客户" prop="selectCustomer">
<el-radio-group v-model="formData.selectCustomer">
<el-radio :label="true"></el-radio>
<el-radio :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24">
<ContentWrap style="border: none;font-weight: 700" v-if="formData.selectCustomer">
选择客户
</ContentWrap>
<CustomerForm ref="customerFormRef" v-if="formData.selectCustomer" />
<ContentWrap style="border: none;font-weight: 700" >
选择任务
</ContentWrap>
<TaskForm ref="taskFormRef" />
<ContentWrap style="border: none;font-weight: 700" >
日报信息
</ContentWrap>
<DayReportForm :reportType="2" ref="dayReportFormRef" :time="time" />
</el-col>
<el-col :span="24">
<el-form-item label="本月完成工作" prop="workComplate">
<el-input type="textarea" :rows="5" v-model="formData.workComplate" placeholder="请输入本日完成工作" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="下月工作计划" prop="workPlan">
<el-input type="textarea" :rows="5" v-model="formData.workPlan" placeholder="请输入明日工作计划" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="工作困难及协助" prop="workAssistance">
<el-input type="textarea" :rows="5" v-model="formData.workAssistance" placeholder="请输入工作困难及协助" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="attachment">
<UploadFile v-model="formData.attachment" :disabled="!!formType" :limit="1" :fileType="['doc','docx']"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div style="text-align: right">
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="goBack = false"> </el-button>
</div>
</ContentWrap>
</template>
<script setup lang="ts">
import { getIntDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { BriefWorkApi, BriefWorkVO } from '@/api/task/briefWork'
import { useUserStore } from '@/store/modules/user'
import CustomerForm from '../briefWeekWork/components/selectCustomer.vue'
import TaskForm from '../briefWeekWork/components/selectTask.vue'
import DayReportForm from '../briefWeekWork/components/selectDayReport.vue'
import moment from 'moment';
/** 工作简报 表单 */
defineOptions({ name: 'BriefWorkForm' })
const { proxy }: any = getCurrentInstance();
const { t } = useI18n() //
const message = useMessage() //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const time = ref([]) //
const formData = ref({
id: undefined,
briefType: 3,
selectCustomer: true,
briefCount: undefined,
briefStartDate: undefined,
briefEndDate: undefined,
workComplate: undefined,
workPlan: undefined,
workAssistance: undefined,
workExperience: undefined,
attachment: undefined,
processInstanceId: undefined,
auditStatus: undefined
})
const formRules = reactive({
briefStartDate: [{ required: true, message: '简报日期不能为空', trigger: 'blur' }],
workComplate: [{ required: true, message: '本周期完成工作不能为空', trigger: 'blur' }],
workPlan: [{ required: true, message: '下周工作计划不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
const customerFormRef = ref() // Ref
const taskFormRef = ref() // Ref
const dayReportFormRef = ref() // Ref
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as BriefWorkVO
let customerData = customerFormRef.value.getData()
let taskData = taskFormRef.value.getData()
let dayReportData = dayReportFormRef.value.getData()
data.customerIds = customerData.map( v=> v.id)
data.taskIds = taskData.map( v=> v.id)
// data.taskIds = dayReportData.map( v=> v.id)
if (!formType.value) {
await BriefWorkApi.createBriefWork(data)
message.success(t('common.createSuccess'))
} else {
await BriefWorkApi.updateBriefWork(data)
message.success(t('common.updateSuccess'))
}
//
emit('success')
goBack()
} finally {
formLoading.value = false
}
}
const goBack = ()=> {
proxy.$router.go(-1)
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
briefType: 3,
briefCount: undefined,
briefStartDate: undefined,
briefEndDate: undefined,
selectCustomer: true,
workComplate: undefined,
workPlan: undefined,
workAssistance: undefined,
workExperience: undefined,
attachment: undefined,
processInstanceId: undefined,
auditStatus: undefined
}
formRef.value?.resetFields()
}
const getFirstAndLastDayOfMonth = () => {
let today = new Date(); //
let firstDayOfMonth;
let lastDayOfMonth;
//
firstDayOfMonth = new Date(today.getFullYear(), today.getMonth(), 1); // 1
firstDayOfMonth.setHours(0, 0, 0, 0); // 00:00:00
//
lastDayOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0); // 1
lastDayOfMonth.setHours(23, 59, 59); // 23:59:59
return {
firstDayOfMonth,
lastDayOfMonth
};
}
const route = useRoute();
onMounted(async () => {
//
const { firstDayOfMonth, lastDayOfMonth } = getFirstAndLastDayOfMonth();
formData.value.briefStartDate = moment(firstDayOfMonth).format('YYYY-MM-DD'); // YYYY-MM-DD
formData.value.briefEndDate = moment(lastDayOfMonth).format('YYYY-MM-DD'); // YYYY-MM-DD
// formType.value = props.id || route.query.id
// if (formType.value) await open(formType.value)
time.value = [formData.value.briefStartDate, formData.value.briefEndDate]
// if (!formType.value) {
// formData.value.userId = useUserStore().getUser.id
// }
})
</script>

View File

@ -0,0 +1,281 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<!-- <el-form-item label="审批状态" prop="auditStatus">
<el-select
v-model="queryParams.auditStatus"
placeholder="请选择审批状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item> -->
<el-form-item label="填报人员" prop="creator">
<el-select v-model="queryParams.creator" placeholder="请选择申请人" class="!w-240px">
<el-option
v-for="dict in userOptions"
:key="dict.id"
:label="dict.nickname"
:value="dict.id"
/>
</el-select>
</el-form-item>
<el-form-item label="简报日期" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openFormAdd('create')"
v-hasPermi="['tts:brief-month-work:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['tts:brief-work:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column
label="简报日期"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="填报人员" align="center" prop="creator">
<template #default="scope">
{{getName(userOptions, scope.row.creator, 'id', 'nickname')}}
</template>
</el-table-column>
<el-table-column label="本月完成工作" align="center" prop="workComplate" />
<el-table-column label="下月工作计划" align="center" prop="workPlan" />
<el-table-column label="工作困难及协助" align="center" prop="workAssistance" />
<el-table-column label="上传附件" align="center" prop="workAssistance">
<template #default="scope">
<el-link
v-if="scope.row.attachment"
:underline="false"
type="primary"
@click="previewFile(scope.row.attachment)"
>
预览
</el-link>
<span v-else></span>
</template>
</el-table-column>
<el-table-column label="审批状态" align="center" prop="auditStatus" width="110">
<template #default="scope">
<dict-tag :type="DICT_TYPE.TTS_APPLY_STATUS" :value="scope.row.auditStatus" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
v-if="scope.row.auditStatus !== 0"
link
type="primary"
@click="handleProcessDetail(scope.row)"
>
进度
</el-button>
<el-button
link
type="primary"
@click="openFormDetail(scope.row)"
>
详情
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<!-- <BriefWorkForm ref="formRef" @success="getList" /> -->
</template>
<script setup lang="ts">
import { getIntDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { BriefWorkApi, BriefWorkVO } from '@/api/task/briefWork'
// import BriefWorkForm from './BriefWorkForm.vue'
import * as UserApi from '@/api/system/user'
/** 工作简报 列表 */
defineOptions({ name: 'BriefWork' })
const message = useMessage() //
const { t } = useI18n() //
const userOptions = ref<UserApi.UserVO[]>([]) //
const loading = ref(true) //
const list = ref<BriefWorkVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
briefType: 3,
briefCount: undefined,
briefStartDate: [],
briefEndDate: [],
selectCustomer: undefined,
workComplate: undefined,
workPlan: undefined,
workAssistance: undefined,
workExperience: undefined,
attachment: undefined,
processInstanceId: undefined,
auditStatus: undefined,
creator: undefined,
createTime: [],
updater: undefined,
updateTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await BriefWorkApi.getBriefWorkPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const { push } = useRouter()
const router = useRouter() //
//
const openFormAdd = () => {
push({ name: 'MonthReportAdd' })
}
//
const openFormDetail = (row: Object) => {
router.push({ name: 'MonthReportDetail', query: { id: row.id} })
}
/** 查看审批 */
const handleProcessDetail = (row) => {
router.push({ name: 'BpmProcessInstanceDetail', query: { id: row.processInstanceId } })
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await BriefWorkApi.deleteBriefWork(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await BriefWorkApi.exportBriefWork(queryParams)
download.excel(data, '月工作简报.xls')
} catch {
} finally {
exportLoading.value = false
}
}
//
const previewFile = (fileUrls) => {
// // fileUrls URL
if (!fileUrls) {
message.error('没有附件');
return;
}
//
const fileExtension = fileUrls.split('.').pop().toLowerCase();
router.push({
name: 'FileTemplatePreview',
query: {
src: encodeURIComponent(fileUrls),
type: fileExtension
}
})
}
const getName = (opt, val, id, name) => {
const arr = opt.filter(v => v[id] == val)
return arr.length ? arr[0][name] : ''
}
/** 初始化 **/
onMounted(async() => {
//
userOptions.value = await UserApi.getSimpleUserList()
getList()
})
onActivated(()=>{
getList()
})
</script>

View File

@ -0,0 +1,208 @@
<template>
<ContentWrap>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="120px"
v-loading="formLoading"
>
<el-row>
<el-col :span="8">
<el-form-item label="简报开始日期" prop="briefStartDate">
<el-date-picker
v-model="formData.briefStartDate"
type="date"
disabled
value-format="YYYY-MM-DD"
placeholder="选择简报开始日期"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="简报结束日期" prop="briefEndDate">
<el-date-picker
disabled
v-model="formData.briefEndDate"
type="date"
value-format="YYYY-MM-DD"
placeholder="选择简报结束日期"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否选择客户" prop="selectCustomer">
<el-radio-group v-model="formData.selectCustomer" disabled>
<el-radio :label="true"></el-radio>
<el-radio :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24">
<ContentWrap style="border: none;font-weight: 700" v-if="formData.selectCustomer">
选择客户
</ContentWrap>
<CustomerForm ref="customerFormRef" :userOptions="userOptions" :type="1" :dataList="formData.followUpRecords" v-if="formData.selectCustomer" />
<ContentWrap style="border: none;font-weight: 700" >
选择任务
</ContentWrap>
<TaskForm ref="taskFormRef" :type="1" :dataList="formData.tasks" />
<ContentWrap style="border: none;font-weight: 700" >
日报信息
</ContentWrap>
<DayReportForm :reportType="1" :type="1" ref="dayReportFormRef" :time="time" />
</el-col>
<el-col :span="24">
<el-form-item label="本周完成工作" prop="workComplate">
<el-input type="textarea" disabled :rows="5" v-model="formData.workComplate" placeholder="请输入本日完成工作" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="下周工作计划" prop="workPlan">
<el-input type="textarea" disabled :rows="5" v-model="formData.workPlan" placeholder="请输入明日工作计划" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="工作困难及协助" prop="workAssistance">
<el-input type="textarea" disabled :rows="5" v-model="formData.workAssistance" placeholder="请输入工作困难及协助" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="attachment">
<UploadFile v-model="formData.attachment" :disabled="!!formType" :limit="1" :fileType="['doc','docx']"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</ContentWrap>
</template>
<script setup lang="ts">
import { getIntDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { BriefWorkApi, BriefWorkVO } from '@/api/task/briefWork'
import { useUserStore } from '@/store/modules/user'
import CustomerForm from './components/selectCustomer.vue'
import TaskForm from './components/selectTask.vue'
import DayReportForm from './components/selectDayReport.vue'
import { propTypes } from '@/utils/propTypes'
import * as UserApi from '@/api/system/user'
/** 工作简报 表单 */
defineOptions({ name: 'BriefWorkForm' })
const { proxy }: any = getCurrentInstance();
const props = defineProps({
id: propTypes.number.def(undefined)
})
const userOptions = ref<UserApi.UserVO[]>([]) //
const { t } = useI18n() //
const message = useMessage() //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const time = ref([]) //
const formData = ref({
id: undefined,
briefType: 2,
selectCustomer: true,
briefCount: undefined,
briefStartDate: undefined,
briefEndDate: undefined,
workComplate: undefined,
workPlan: undefined,
workAssistance: undefined,
workExperience: undefined,
attachment: undefined,
processInstanceId: undefined,
auditStatus: undefined
})
const formRules = reactive({
briefStartDate: [{ required: true, message: '简报日期不能为空', trigger: 'blur' }],
workComplate: [{ required: true, message: '本周期完成工作不能为空', trigger: 'blur' }],
workPlan: [{ required: true, message: '下周工作计划不能为空', trigger: 'blur' }]
})
const open = async (id?: number) => {
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await BriefWorkApi.getBriefWork({id: id, briefType: 2})
time.value = [formData.value.briefStartDate + ' 00:00:00', formData.value.briefEndDate + ' 23:59:59']
} finally {
formLoading.value = false
}
}
}
const formRef = ref() // Ref
const customerFormRef = ref() // Ref
const taskFormRef = ref() // Ref
const dayReportFormRef = ref() // Ref
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as BriefWorkVO
let customerData = customerFormRef.value.getData()
console.log('%csrc/views/task/briefWeekWork/BriefWorkWeekForm.vue:136 customerData', 'color: #007acc;', customerData);
let taskData = taskFormRef.value.getData()
let dayReportData = dayReportFormRef.value.getData()
data.customerIds = customerData.map( v=> v.id)
console.log('%csrc/views/task/briefWeekWork/BriefWorkWeekForm.vue:139 data', 'color: #007acc;', data.customerIds);
data.taskIds = taskData.map( v=> v.id)
// data.taskIds = dayReportData.map( v=> v.id)
if (!formType.value) {
await BriefWorkApi.createBriefWork(data)
message.success(t('common.createSuccess'))
} else {
await BriefWorkApi.updateBriefWork(data)
message.success(t('common.updateSuccess'))
}
//
emit('success')
goBack()
} finally {
formLoading.value = false
}
}
const goBack = ()=> {
proxy.$router.go(-1)
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
briefType: 1,
briefCount: undefined,
briefStartDate: undefined,
briefEndDate: undefined,
selectCustomer: true,
workComplate: undefined,
workPlan: undefined,
workAssistance: undefined,
workExperience: undefined,
attachment: undefined,
processInstanceId: undefined,
auditStatus: undefined
}
formRef.value?.resetFields()
}
const route = useRoute();
onMounted(async () => {
formType.value = props.id || route.query.id
if (formType.value) await open(formType.value)
//
userOptions.value = await UserApi.getSimpleUserList()
})
</script>

View File

@ -42,15 +42,15 @@
<ContentWrap style="border: none;font-weight: 700" v-if="formData.selectCustomer"> <ContentWrap style="border: none;font-weight: 700" v-if="formData.selectCustomer">
选择客户 选择客户
</ContentWrap> </ContentWrap>
<CustomerForm ref="customerFormRef" v-if="formData.selectCustomer" /> <CustomerForm ref="customerFormRef" :userOptions="userOptions" v-if="formData.selectCustomer" />
<ContentWrap style="border: none;font-weight: 700" > <ContentWrap style="border: none;font-weight: 700" >
选择任务 选择任务
</ContentWrap> </ContentWrap>
<TaskForm ref="taskFormRef" /> <TaskForm ref="taskFormRef" :dataList="formData.tasks" />
<ContentWrap style="border: none;font-weight: 700" > <ContentWrap style="border: none;font-weight: 700" >
日报信息 日报信息
</ContentWrap> </ContentWrap>
<DayReportForm ref="dayReportFormRef" :time="time" /> <DayReportForm :reportType="1" ref="dayReportFormRef" :time="time" />
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="本周完成工作" prop="workComplate"> <el-form-item label="本周完成工作" prop="workComplate">
@ -87,6 +87,7 @@ import { useUserStore } from '@/store/modules/user'
import CustomerForm from './components/selectCustomer.vue' import CustomerForm from './components/selectCustomer.vue'
import TaskForm from './components/selectTask.vue' import TaskForm from './components/selectTask.vue'
import DayReportForm from './components/selectDayReport.vue' import DayReportForm from './components/selectDayReport.vue'
import * as UserApi from '@/api/system/user'
/** 工作简报 表单 */ /** 工作简报 表单 */
defineOptions({ name: 'BriefWorkForm' }) defineOptions({ name: 'BriefWorkForm' })
@ -115,10 +116,11 @@ const formData = ref({
}) })
const formRules = reactive({ const formRules = reactive({
briefStartDate: [{ required: true, message: '简报日期不能为空', trigger: 'blur' }], briefStartDate: [{ required: true, message: '简报日期不能为空', trigger: 'blur' }],
workComplate: [{ required: true, message: '本期完成工作不能为空', trigger: 'blur' }], workComplate: [{ required: true, message: '本期完成工作不能为空', trigger: 'blur' }],
workPlan: [{ required: true, message: '明日工作计划不能为空', trigger: 'blur' }] workPlan: [{ required: true, message: '下周工作计划不能为空', trigger: 'blur' }]
}) })
const userOptions = ref<UserApi.UserVO[]>([]) //
const formRef = ref() // Ref const formRef = ref() // Ref
const customerFormRef = ref() // Ref const customerFormRef = ref() // Ref
const taskFormRef = ref() // Ref const taskFormRef = ref() // Ref
@ -132,12 +134,12 @@ const submitForm = async () => {
formLoading.value = true formLoading.value = true
try { try {
const data = formData.value as unknown as BriefWorkVO const data = formData.value as unknown as BriefWorkVO
let customerData = customerFormRef.value.getData() if(customerFormRef.value.getData()) {
console.log('%csrc/views/task/briefWeekWork/BriefWorkWeekForm.vue:136 customerData', 'color: #007acc;', customerData); let customerData = customerFormRef.value.getData()
data.customerIds = customerData.map( v=> v.id)
}
let taskData = taskFormRef.value.getData() let taskData = taskFormRef.value.getData()
let dayReportData = dayReportFormRef.value.getData() let dayReportData = dayReportFormRef.value.getData()
data.customerIds = customerData.map( v=> v.id)
console.log('%csrc/views/task/briefWeekWork/BriefWorkWeekForm.vue:139 data', 'color: #007acc;', data.customerIds);
data.taskIds = taskData.map( v=> v.id) data.taskIds = taskData.map( v=> v.id)
// data.taskIds = dayReportData.map( v=> v.id) // data.taskIds = dayReportData.map( v=> v.id)
if (!formType.value) { if (!formType.value) {
@ -199,7 +201,10 @@ onMounted(async () => {
formData.value.briefStartDate = monday.toISOString().slice(0, 10); // YYYY-MM-DD formData.value.briefStartDate = monday.toISOString().slice(0, 10); // YYYY-MM-DD
formData.value.briefEndDate = sunday.toISOString().slice(0, 10); // YYYY-MM-DD formData.value.briefEndDate = sunday.toISOString().slice(0, 10); // YYYY-MM-DD
console.log('%csrc/views/project/briefWeekWork/BriefWorkWeekForm.vue:202 formData.value.briefStartDate ', 'color: #007acc;', formData.value.briefStartDate );
time.value = [formData.value.briefStartDate + ' 00:00:00', formData.value.briefEndDate + ' 23:59:59'] time.value = [formData.value.briefStartDate + ' 00:00:00', formData.value.briefEndDate + ' 23:59:59']
//
userOptions.value = await UserApi.getSimpleUserList()
// formType.value = props.id || route.query.id // formType.value = props.id || route.query.id

View File

@ -5,10 +5,18 @@
<!-- <el-table-column label="唯一主键" align="center" prop="id" /> --> <!-- <el-table-column label="唯一主键" align="center" prop="id" /> -->
<!-- <el-table-column label="项目ID" align="center" prop="projectId" /> --> <!-- <el-table-column label="项目ID" align="center" prop="projectId" /> -->
<el-table-column label="单位名称" align="center" prop="name" /> <el-table-column label="单位名称" align="center" prop="name" />
<el-table-column label="跟进方式" align="center" prop="followUpStatus" /> <el-table-column label="跟进类型" align="center" prop="followUpStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CRM_FOLLOW_UP_TYPE" :value="scope.row.followUpType" />
</template>
</el-table-column>
<el-table-column label="跟进内容" align="center" prop="contactLastContent" /> <el-table-column label="跟进内容" align="center" prop="contactLastContent" />
<el-table-column label="跟进时间" align="center" prop="contactLastTime" /> <el-table-column label="跟进时间" align="center" prop="contactLastTime" :formatter="dateFormatter" />
<el-table-column label="跟进人" align="center" prop="creatorName" /> <el-table-column label="跟进人" align="center" prop="followUpUserId">
<template #default="scope">
{{getName(userOptions, scope.row.followUpUserId)}}
</template>
</el-table-column>
<el-table-column label="操作" align="center" min-width="120px" v-if="!type"> <el-table-column label="操作" align="center" min-width="120px" v-if="!type">
<template #default="scope"> <template #default="scope">
<el-button <el-button
@ -52,6 +60,7 @@ import download from '@/utils/download'
import { ProjectBonusApi, ProjectBonusVO } from '@/api/task/bonus' import { ProjectBonusApi, ProjectBonusVO } from '@/api/task/bonus'
import CustomerForm from '@/components/customer/index.vue' import CustomerForm from '@/components/customer/index.vue'
import { propTypes } from '@/utils/propTypes' import { propTypes } from '@/utils/propTypes'
import { DICT_TYPE } from '@/utils/dict'
/** 项目奖金 列表 */ /** 项目奖金 列表 */
defineOptions({ name: 'ProjectBonus' }) defineOptions({ name: 'ProjectBonus' })
@ -61,6 +70,7 @@ const { t } = useI18n() // 国际化
const props = defineProps({ const props = defineProps({
id: propTypes.number.def(undefined), id: propTypes.number.def(undefined),
type: propTypes.number.def(undefined), type: propTypes.number.def(undefined),
dataList: propTypes.object.def([]),
userOptions: propTypes.object.def([]), userOptions: propTypes.object.def([]),
}) })
const loading = ref(false) // const loading = ref(false) //
@ -80,9 +90,19 @@ const queryParams = reactive({
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) // const exportLoading = ref(false) //
/** 初始化设置产品项 */
watch(
() => props.dataList,
async (val) => {
list.value = val || []
},
{ immediate: true }
)
/** 查询列表 */ /** 查询列表 */
const emit = defineEmits(['success']) // success const emit = defineEmits(['success']) // success
const getList = (val: []) => { const getList = (val: []) => {
console.log('%csrc/views/project/briefWeekWork/components/selectCustomer.vue:95 val', 'color: #007acc;', val);
for(let i = val.length - 1; i >= 0; i--) { for(let i = val.length - 1; i >= 0; i--) {
let obj = val[i] let obj = val[i]
if(list.value.some(v => v.id === obj.id)) val.splice(i, 1) if(list.value.some(v => v.id === obj.id)) val.splice(i, 1)
@ -92,10 +112,10 @@ const getList = (val: []) => {
val.forEach(item => { val.forEach(item => {
list.value.push({ list.value.push({
"name": item.name, "name": item.name,
"followUpStatus": item.followUpStatus, "followUpType": item.followUpType,
"contactLastTime": item.contactLastTime, "contactLastTime": item.contactLastTime,
"contactLastContent": item.contactLastContent, "contactLastContent": item.contactLastContent,
"creatorName": item.creatorName, "followUpUserId": item.creator,
"id": item.id, "id": item.id,
}) })
}) })
@ -153,6 +173,7 @@ const handleExport = async () => {
} }
const getName = (opt, val) => { const getName = (opt, val) => {
console.log('%csrc/views/project/briefWeekWork/components/selectCustomer.vue:176 opt,val', 'color: #007acc;', opt,val);
const arr = opt.filter(v => v.id == val) const arr = opt.filter(v => v.id == val)
return arr.length ? arr[0]['nickname'] : '' return arr.length ? arr[0]['nickname'] : ''
} }

View File

@ -9,9 +9,42 @@
:formatter="dateFormatter" :formatter="dateFormatter"
width="180px" width="180px"
/> />
<el-table-column label="今日完成工作" align="center" prop="workComplate" /> <el-table-column :label="reportType == 1 ? '今日完成工作' : '本周完成工作'" align="center" prop="workComplate">
<el-table-column label="明日工作计划" align="center" prop="workPlan" /> <template #default="scope">
<el-table-column label="工作困难及协助" align="center" prop="workAssistance" /> <div style="display: flex;justify-content: center;">
<span>
{{scope.row.workComplate}}
</span>
<el-button
v-if="!type && scope.row.workComplate"
link
type="primary"
@click="handleSelect(scope.row.workComplate)"
>
复制
</el-button>
</div>
</template>
</el-table-column>
<el-table-column :label="reportType == 1 ? '明日工作计划' : '下周工作计划'" align="center" prop="workPlan" />
<el-table-column label="工作困难及协助" align="center" prop="workAssistance">
<template #default="scope">
<div style="display: flex;justify-content: center;">
<span>
{{scope.row.workAssistance}}
</span>
<el-button
v-if="!type && scope.row.workAssistance"
link
type="primary"
@click="handleSelect(scope.row.workAssistance)"
>
复制
</el-button>
</div>
</template>
</el-table-column>
</el-table> </el-table>
</ContentWrap> </ContentWrap>
@ -32,6 +65,8 @@ import { propTypes } from '@/utils/propTypes'
defineOptions({ name: 'BriefWork' }) defineOptions({ name: 'BriefWork' })
const props = defineProps({ const props = defineProps({
time: [], time: [],
reportType: propTypes.number.def(undefined),
type: propTypes.number.def(undefined),
}) })
const message = useMessage() // const message = useMessage() //
const { t } = useI18n() // const { t } = useI18n() //
@ -43,7 +78,7 @@ const total = ref(0) // 列表的总页数
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
briefType: 1, briefType: props.reportType,
briefCount: undefined, briefCount: undefined,
briefStartDate: [], briefStartDate: [],
briefEndDate: [], briefEndDate: [],
@ -67,8 +102,9 @@ const exportLoading = ref(false) // 导出的加载中
const getList = async () => { const getList = async () => {
loading.value = true loading.value = true
try { try {
queryParams.createTime = props.time queryParams.startDate = props.time[0]
const data = await BriefWorkApi.getBriefWorkPage(queryParams) queryParams.endDate = props.time[1]
const data = await BriefWorkApi.getBriefWorkTimePage(queryParams)
list.value = data.list list.value = data.list
total.value = data.total total.value = data.total
} finally { } finally {
@ -107,6 +143,10 @@ const handleProcessDetail = (row) => {
router.push({ name: 'BpmProcessInstanceDetail', query: { id: row.processInstanceId } }) router.push({ name: 'BpmProcessInstanceDetail', query: { id: row.processInstanceId } })
} }
const handleSelect = (val) => {
navigator.clipboard.writeText(val)
}
/** 删除按钮操作 */ /** 删除按钮操作 */
const handleDelete = async (id: number) => { const handleDelete = async (id: number) => {
try { try {

View File

@ -58,6 +58,7 @@ const { t } = useI18n() // 国际化
const props = defineProps({ const props = defineProps({
id: propTypes.number.def(undefined), id: propTypes.number.def(undefined),
type: propTypes.number.def(undefined), type: propTypes.number.def(undefined),
dataList: propTypes.object.def([]),
}) })
const loading = ref(false) // const loading = ref(false) //
const list = ref<ProjectBonusVO[]>([]) // const list = ref<ProjectBonusVO[]>([]) //
@ -76,6 +77,15 @@ const queryParams = reactive({
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) // const exportLoading = ref(false) //
/** 初始化设置产品项 */
watch(
() => props.dataList,
async (val) => {
list.value = val || []
},
{ immediate: true }
)
/** 查询列表 */ /** 查询列表 */
const emit = defineEmits(['success']) // success const emit = defineEmits(['success']) // success
const getList = (val: []) => { const getList = (val: []) => {

View File

@ -78,10 +78,22 @@
{{getName(userOptions, scope.row.creator, 'id', 'nickname')}} {{getName(userOptions, scope.row.creator, 'id', 'nickname')}}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="今日完成工作" align="center" prop="workComplate" /> <el-table-column label="本周完成工作" align="center" prop="workComplate" />
<el-table-column label="明日工作计划" align="center" prop="workPlan" /> <el-table-column label="下周工作计划" align="center" prop="workPlan" />
<el-table-column label="工作困难及协助" align="center" prop="workAssistance" /> <el-table-column label="工作困难及协助" align="center" prop="workAssistance" />
<el-table-column label="上传附件" align="center" prop="workAssistance" /> <el-table-column label="上传附件" align="center" prop="attachment">
<template #default="scope">
<el-link
v-if="scope.row.attachment"
:underline="false"
type="primary"
@click="previewFile(scope.row.attachment)"
>
预览
</el-link>
<span v-else></span>
</template>
</el-table-column>
<el-table-column label="审批状态" align="center" prop="auditStatus" width="110"> <el-table-column label="审批状态" align="center" prop="auditStatus" width="110">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.TTS_APPLY_STATUS" :value="scope.row.auditStatus" /> <dict-tag :type="DICT_TYPE.TTS_APPLY_STATUS" :value="scope.row.auditStatus" />
@ -129,6 +141,7 @@ import { BriefWorkApi, BriefWorkVO } from '@/api/task/briefWork'
// import BriefWorkForm from './BriefWorkForm.vue' // import BriefWorkForm from './BriefWorkForm.vue'
import * as UserApi from '@/api/system/user' import * as UserApi from '@/api/system/user'
/** 工作简报 列表 */ /** 工作简报 列表 */
defineOptions({ name: 'BriefWork' }) defineOptions({ name: 'BriefWork' })
@ -233,13 +246,32 @@ const handleExport = async () => {
} }
} }
//
const previewFile = (fileUrls) => {
// // fileUrls URL
if (!fileUrls) {
message.error('没有附件');
return;
}
//
const fileExtension = fileUrls.split('.').pop().toLowerCase();
router.push({
name: 'FileTemplatePreview',
query: {
src: encodeURIComponent(fileUrls),
type: fileExtension
}
})
}
const getName = (opt, val, id, name) => { const getName = (opt, val, id, name) => {
const arr = opt.filter(v => v[id] == val) const arr = opt.filter(v => v[id] == val)
return arr.length ? arr[0][name] : '' return arr.length ? arr[0][name] : ''
} }
/** 初始化 **/ const route = useRoute();
onMounted(async() => { onMounted(async () => {
// //
userOptions.value = await UserApi.getSimpleUserList() userOptions.value = await UserApi.getSimpleUserList()
getList() getList()

View File

@ -81,7 +81,19 @@
<el-table-column label="今日完成工作" align="center" prop="workComplate" /> <el-table-column label="今日完成工作" align="center" prop="workComplate" />
<el-table-column label="明日工作计划" align="center" prop="workPlan" /> <el-table-column label="明日工作计划" align="center" prop="workPlan" />
<el-table-column label="工作困难及协助" align="center" prop="workAssistance" /> <el-table-column label="工作困难及协助" align="center" prop="workAssistance" />
<el-table-column label="上传附件" align="center" prop="workAssistance" /> <el-table-column label="上传附件" align="center" prop="attachment" >
<template #default="scope">
<el-link
v-if="scope.row.attachment"
:underline="false"
type="primary"
@click="previewFile(scope.row.attachment)"
>
预览
</el-link>
<span v-else></span>
</template>
</el-table-column>
<el-table-column label="审批状态" align="center" prop="auditStatus" width="110"> <el-table-column label="审批状态" align="center" prop="auditStatus" width="110">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.TTS_APPLY_STATUS" :value="scope.row.auditStatus" /> <dict-tag :type="DICT_TYPE.TTS_APPLY_STATUS" :value="scope.row.auditStatus" />
@ -233,6 +245,25 @@ const handleExport = async () => {
} }
} }
//
const previewFile = (fileUrls) => {
// // fileUrls URL
if (!fileUrls) {
message.error('没有附件');
return;
}
//
const fileExtension = fileUrls.split('.').pop().toLowerCase();
router.push({
name: 'FileTemplatePreview',
query: {
src: encodeURIComponent(fileUrls),
type: fileExtension
}
})
};
const getName = (opt, val, id, name) => { const getName = (opt, val, id, name) => {
const arr = opt.filter(v => v[id] == val) const arr = opt.filter(v => v[id] == val)
return arr.length ? arr[0][name] : '' return arr.length ? arr[0][name] : ''

View File

@ -204,7 +204,6 @@ const validate = () => {
} }
const getData = (data) => { const getData = (data) => {
console.log('%csrc/views/task/online/components/index.vue:175 list.value', 'color: #007acc;', list.value);
return list.value return list.value
} }
defineExpose({ validate, getData }) defineExpose({ validate, getData })

View File

@ -1,134 +0,0 @@
<template>
<ContentWrap>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-row>
<el-col :span="8">
<el-form-item label="简报日期" prop="briefStartDate">
<el-date-picker
v-model="formData.briefStartDate"
type="date"
value-format="x"
placeholder="选择简报开始日期"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="本日完成工作" prop="workComplate">
<el-input v-model="formData.workComplate" placeholder="请输入本周期完成工作" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="明日工作计划" prop="workPlan">
<el-input v-model="formData.workPlan" placeholder="请输入下周期工作计划" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="工作困难及协助" prop="workAssistance">
<el-input v-model="formData.workAssistance" placeholder="请输入工作困难及协助" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="attachment">
<UploadFile v-model="formData.attachment" :disabled="!!formType" :limit="1" :fileType="['doc','docx']"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="goBack = false"> </el-button>
</template>
</ContentWrap>
</template>
<script setup lang="ts">
import { getIntDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { BriefWorkApi, BriefWorkVO } from '@/api/task/briefWork'
/** 工作简报 表单 */
defineOptions({ name: 'BriefWorkForm' })
const { proxy }: any = getCurrentInstance();
const { t } = useI18n() //
const message = useMessage() //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
briefType: 1,
briefCount: undefined,
briefStartDate: undefined,
briefEndDate: undefined,
selectCustomer: undefined,
workComplate: undefined,
workPlan: undefined,
workAssistance: undefined,
workExperience: undefined,
attachment: undefined,
processInstanceId: undefined,
auditStatus: undefined
})
const formRules = reactive({
briefStartDate: [{ required: true, message: '简报日期不能为空', trigger: 'blur' }],
workComplate: [{ required: true, message: '本日期完成工作不能为空', trigger: 'blur' }],
workPlan: [{ required: true, message: '明日工作计划不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as BriefWorkVO
if (formType.value === 'create') {
await BriefWorkApi.createBriefWork(data)
message.success(t('common.createSuccess'))
} else {
await BriefWorkApi.updateBriefWork(data)
message.success(t('common.updateSuccess'))
}
//
emit('success')
goBack()
} finally {
formLoading.value = false
}
}
const goBack = ()=> {
proxy.$router.go(-1)
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
briefType: 1,
briefCount: undefined,
briefStartDate: undefined,
briefEndDate: undefined,
selectCustomer: undefined,
workComplate: undefined,
workPlan: undefined,
workAssistance: undefined,
workExperience: undefined,
attachment: undefined,
processInstanceId: undefined,
auditStatus: undefined
}
formRef.value?.resetFields()
}
</script>