pull/781/head
parent
dd2242e2be
commit
4804d4e146
|
|
@ -59,7 +59,14 @@
|
|||
<div v-for="(file, index) in fileList" :key="index" class="flex items-center file-list-item">
|
||||
<span>{{ file.name }}</span>
|
||||
<div class="ml-10px">
|
||||
<el-link :href="file.url" :underline="false" download target="_blank" type="primary">
|
||||
<el-link
|
||||
@click="previewFile(file.url)"
|
||||
:underline="false"
|
||||
type="primary"
|
||||
>
|
||||
预览
|
||||
</el-link>
|
||||
<el-link class="ml-10px" :href="file.url" :underline="false" download target="_blank" type="primary">
|
||||
下载
|
||||
</el-link>
|
||||
</div>
|
||||
|
|
@ -195,6 +202,25 @@ const emitUpdateModelValue = () => {
|
|||
}
|
||||
emit('update:modelValue', result)
|
||||
}
|
||||
//预览
|
||||
const router = useRouter() // 路
|
||||
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
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.upload-file-uploader {
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
<el-input v-model="formData.name" placeholder="请输入分类名" />
|
||||
</el-form-item>
|
||||
<el-form-item label="分类标志" prop="code">
|
||||
<el-input v-model="formData.code" placeholder="请输入分类标志" />
|
||||
<el-input v-model="formData.code" :disabled="formType == 'update'" placeholder="请输入分类标志" />
|
||||
</el-form-item>
|
||||
<el-form-item label="分类描述" prop="description">
|
||||
<el-input v-model="formData.description" type="textarea" placeholder="请输入分类描述" />
|
||||
|
|
|
|||
|
|
@ -212,7 +212,7 @@
|
|||
width="180px"
|
||||
/>
|
||||
<el-table-column align="center" label="创建人" prop="creatorName" width="100px" />
|
||||
<el-table-column align="center" fixed="right" label="操作" min-width="150">
|
||||
<el-table-column align="center" fixed="right" label="操作" min-width="150" v-if="activeName != 2">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-hasPermi="['crm:customer:update']"
|
||||
|
|
|
|||
|
|
@ -47,10 +47,10 @@
|
|||
选择任务
|
||||
</ContentWrap>
|
||||
<TaskForm ref="taskFormRef" :type="1" :dataList="formData.tasks" />
|
||||
<ContentWrap style="border: none;font-weight: 700" >
|
||||
<!-- <ContentWrap style="border: none;font-weight: 700" >
|
||||
日报信息
|
||||
</ContentWrap>
|
||||
<DayReportForm :reportType="2" :type="1" ref="dayReportFormRef" :time="time" />
|
||||
<DayReportForm :reportType="2" :type="1" ref="dayReportFormRef" :time="time" /> -->
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="本月完成工作" prop="workComplate">
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@
|
|||
<ContentWrap style="border: none;font-weight: 700" v-if="formData.selectCustomer">
|
||||
选择客户
|
||||
</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>
|
||||
|
|
@ -133,10 +133,12 @@ const submitForm = async () => {
|
|||
formLoading.value = true
|
||||
try {
|
||||
const data = formData.value as unknown as BriefWorkVO
|
||||
let customerData = customerFormRef.value.getData()
|
||||
if(customerFormRef.value) {
|
||||
let customerData = customerFormRef.value.getData()
|
||||
data.customerIds = customerData.map( v=> v.id)
|
||||
}
|
||||
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) {
|
||||
|
|
|
|||
|
|
@ -47,10 +47,10 @@
|
|||
选择任务
|
||||
</ContentWrap>
|
||||
<TaskForm ref="taskFormRef" :type="1" :dataList="formData.tasks" />
|
||||
<ContentWrap style="border: none;font-weight: 700" >
|
||||
<!-- <ContentWrap style="border: none;font-weight: 700" >
|
||||
日报信息
|
||||
</ContentWrap>
|
||||
<DayReportForm :reportType="1" :type="1" ref="dayReportFormRef" :time="time" />
|
||||
<DayReportForm :reportType="1" :type="1" ref="dayReportFormRef" :time="time" /> -->
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="本周完成工作" prop="workComplate">
|
||||
|
|
|
|||
|
|
@ -134,7 +134,8 @@ const submitForm = async () => {
|
|||
formLoading.value = true
|
||||
try {
|
||||
const data = formData.value as unknown as BriefWorkVO
|
||||
if(customerFormRef.value.getData()) {
|
||||
console.log('%csrc/views/project/briefWeekWork/BriefWorkWeekForm.vue:137 customerFormRef.value.getData()', 'color: #007acc;', customerFormRef.value);
|
||||
if(customerFormRef.value) {
|
||||
let customerData = customerFormRef.value.getData()
|
||||
data.customerIds = customerData.map( v=> v.id)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -61,6 +61,7 @@ import { ProjectBonusApi, ProjectBonusVO } from '@/api/task/bonus'
|
|||
import CustomerForm from '@/components/customer/index.vue'
|
||||
import { propTypes } from '@/utils/propTypes'
|
||||
import { DICT_TYPE } from '@/utils/dict'
|
||||
import * as UserApi from '@/api/system/user'
|
||||
|
||||
/** 项目奖金 列表 */
|
||||
defineOptions({ name: 'ProjectBonus' })
|
||||
|
|
@ -71,8 +72,8 @@ const props = defineProps({
|
|||
id: propTypes.number.def(undefined),
|
||||
type: propTypes.number.def(undefined),
|
||||
dataList: propTypes.object.def([]),
|
||||
userOptions: propTypes.object.def([]),
|
||||
})
|
||||
const userOptions = ref<UserApi.UserVO[]>([]) // 用户列表
|
||||
const loading = ref(false) // 列表的加载中
|
||||
const list = ref<ProjectBonusVO[]>([]) // 列表的数据
|
||||
const total = ref(0) // 列表的总页数
|
||||
|
|
@ -102,13 +103,13 @@ watch(
|
|||
/** 查询列表 */
|
||||
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
||||
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--) {
|
||||
let obj = val[i]
|
||||
if(list.value.some(v => v.id === obj.id)) val.splice(i, 1)
|
||||
}
|
||||
val.forEach(item => {
|
||||
if(!list.value.some(v => v.id === item.id)) {
|
||||
console.log('%csrc/views/project/briefWeekWork/components/selectCustomer.vue:95 val', 'color: #007acc;', val);
|
||||
val.forEach(item => {
|
||||
list.value.push({
|
||||
"name": item.name,
|
||||
|
|
@ -119,6 +120,7 @@ const getList = (val: []) => {
|
|||
"id": item.id,
|
||||
})
|
||||
})
|
||||
console.log('%csrc/views/project/briefWeekWork/components/selectCustomer.vue:122 list.value', 'color: #007acc;', list.value);
|
||||
}
|
||||
})
|
||||
|
||||
|
|
@ -173,7 +175,7 @@ const handleExport = async () => {
|
|||
}
|
||||
|
||||
const getName = (opt, val) => {
|
||||
console.log('%csrc/views/project/briefWeekWork/components/selectCustomer.vue:176 opt,val', 'color: #007acc;', opt,val);
|
||||
console.log('%csrc/views/project/briefWeekWork/components/selectCustomer.vue:176 opt,val', 'color: #007acc;', props.userOptions,val);
|
||||
const arr = opt.filter(v => v.id == val)
|
||||
return arr.length ? arr[0]['nickname'] : ''
|
||||
}
|
||||
|
|
@ -184,7 +186,9 @@ const getData = (data) => {
|
|||
defineExpose({ getData })
|
||||
|
||||
/** 初始化 **/
|
||||
onMounted(() => {
|
||||
onMounted(async() => {
|
||||
// getList()
|
||||
// 获得用户列表
|
||||
userOptions.value = await UserApi.getSimpleUserList()
|
||||
})
|
||||
</script>
|
||||
|
|
@ -10,8 +10,8 @@
|
|||
>
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="产品名称" prop="projectName">
|
||||
<el-input v-model="formData.projectName" disabled placeholder="请输入产品名称" />
|
||||
<el-form-item label="名称" prop="projectName">
|
||||
<el-input v-model="formData.projectName" disabled placeholder="请输入名称" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
|
|
|
|||
|
|
@ -10,8 +10,8 @@
|
|||
>
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="产品名称" prop="projectName">
|
||||
<el-input v-model="formData.projectName" placeholder="请输入产品名称" />
|
||||
<el-form-item label="名称" prop="projectName">
|
||||
<el-input v-model="formData.projectName" placeholder="请输入名称" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
|
|
@ -168,7 +168,7 @@ const formData = ref({
|
|||
auditStatus: undefined
|
||||
})
|
||||
const formRules = reactive({
|
||||
projectName: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }],
|
||||
projectName: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
|
||||
projectType: [{ required: true, message: '项目类型不能为空', trigger: 'change' }],
|
||||
deptId: [{ required: true, message: '申请部门不能为空', trigger: 'blur' }],
|
||||
userId: [{ required: true, message: '申请人不能为空', trigger: 'blur' }],
|
||||
|
|
|
|||
|
|
@ -67,6 +67,7 @@
|
|||
v-model="formData.startDate"
|
||||
style="width: 100%"
|
||||
type="date"
|
||||
:disabled-date="disabledStartDate"
|
||||
value-format="YYYY-MM-DD"
|
||||
placeholder="选择项目开始日期"
|
||||
/>
|
||||
|
|
@ -79,6 +80,7 @@
|
|||
v-model="formData.endDate"
|
||||
style="width: 100%"
|
||||
type="date"
|
||||
:disabled-date="disabledEndDate"
|
||||
value-format="YYYY-MM-DD"
|
||||
placeholder="选择项目结束日期"
|
||||
/>
|
||||
|
|
@ -102,6 +104,7 @@
|
|||
<el-radio-group v-model="formData.bonusEvaluation">
|
||||
<el-switch
|
||||
v-model="formData.bonusEvaluation"
|
||||
@change="formData.bonusAmount = ''"
|
||||
class="ml-2"
|
||||
/>
|
||||
</el-radio-group>
|
||||
|
|
@ -112,7 +115,7 @@
|
|||
<el-input v-model="formData.bonusAmount" oninput="value=value.match(/^\d+(?:\.\d{0,2})?/)" placeholder="请输入奖金评估描述" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8" v-if="formData.bonusEvaluation">
|
||||
<el-col :span="8" v-if="formData.bonusEvaluation && formType">
|
||||
<el-form-item label="项目进度(%)" prop="progress">
|
||||
<el-input v-model="formData.progress" oninput = "value=value.replace(/[^\d]/g,'')" placeholder="请输入奖金评估描述" />
|
||||
</el-form-item>
|
||||
|
|
@ -178,7 +181,7 @@
|
|||
<ContentWrap style="border: none;font-weight: 700" v-if="formData.auditStatus == 2">
|
||||
团队成员
|
||||
</ContentWrap>
|
||||
<Bonus ref="formRef" v-if="formData.auditStatus == 2" :userOptions="userOptions" :id="formData.id" @success="getData" />
|
||||
<Bonus v-if="formData.auditStatus == 2" :userOptions="userOptions" :id="formData.id" @success="getData" />
|
||||
|
||||
<ContentWrap style="border: none;font-weight: 700" v-if="formData.auditStatus == 2">
|
||||
任务信息
|
||||
|
|
@ -214,6 +217,13 @@ const props = defineProps({
|
|||
id: propTypes.number.def(undefined),
|
||||
type: propTypes.number.def(undefined),
|
||||
})
|
||||
const pickerOptions = ref({
|
||||
start: {
|
||||
disabledDate(time) {
|
||||
return time.getTime() < Date.now() - 86400000; // 禁用过去的时间(可选)
|
||||
}
|
||||
}
|
||||
})
|
||||
const userOptions = ref<UserApi.UserVO[]>([]) // 用户列表
|
||||
const message = useMessage() // 消息弹窗
|
||||
const deptTree = ref() // 部门树形结构
|
||||
|
|
@ -226,6 +236,11 @@ const formLoading = ref(false) // 表单的加载中:1)修改时的数据加
|
|||
const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
||||
const validateProgress = (_: any, __: any, callback: any) => {
|
||||
const num = Number(formData.value.progress)
|
||||
|
||||
if(!num) {
|
||||
callback()
|
||||
|
||||
}
|
||||
|
||||
if (num <= 0 || num >100) {
|
||||
callback(new Error('请输入正确的项目进度'))
|
||||
|
|
@ -234,6 +249,17 @@ const validateProgress = (_: any, __: any, callback: any) => {
|
|||
|
||||
callback()
|
||||
}
|
||||
const disabledStartDate = computed(() => {
|
||||
return (time) => {
|
||||
return formData.value.endDate ? time.getTime() > new Date(formData.value.endDate).getTime() - 60 * 60 * 24 * 1000 : false;
|
||||
};
|
||||
})
|
||||
//结束时间限制
|
||||
const disabledEndDate = computed(() => {
|
||||
return (time) => {
|
||||
return formData.value.startDate ? time.getTime() < new Date(formData.value.startDate).getTime() : false; // 开始时间存在时禁用之前及同一天的日期。
|
||||
};
|
||||
})
|
||||
const formData = ref({
|
||||
id: undefined,
|
||||
projectCode: undefined,
|
||||
|
|
@ -265,6 +291,7 @@ const formRules = reactive({
|
|||
background: [{ required: true, message: '项目背景不能为空', trigger: 'blur' }],
|
||||
introduction: [{ required: true, message: '项目简介不能为空', trigger: 'blur' }],
|
||||
progress: [{ validator: validateProgress, trigger: 'blur' }],
|
||||
bonusAmount:[{ required: true, message: '立项奖金金额不能为空', trigger: 'blur' }],
|
||||
})
|
||||
const formRef = ref() // 表单 Ref
|
||||
|
||||
|
|
|
|||
|
|
@ -19,8 +19,8 @@
|
|||
<el-option
|
||||
v-for="dict in userOptions"
|
||||
:key="dict.id"
|
||||
:label="dict.nickname"
|
||||
:value="dict.id"
|
||||
:label="dict.name"
|
||||
:value="dict.userId"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
|
@ -34,7 +34,7 @@
|
|||
<el-form-item label="任务负责人" prop="userId">
|
||||
<el-select v-model="formData.userId" placeholder="请选择成员姓名">
|
||||
<el-option
|
||||
v-for="dict in userOptions"
|
||||
v-for="dict in TaskOptions"
|
||||
:key="dict.id"
|
||||
:label="dict.nickname"
|
||||
:value="dict.id"
|
||||
|
|
@ -111,6 +111,7 @@ const { t } = useI18n() // 国际化
|
|||
const message = useMessage() // 消息弹窗
|
||||
const props = defineProps({
|
||||
userOptions: propTypes.object.def([]),
|
||||
TaskOptions: propTypes.object.def([]),
|
||||
})
|
||||
const dialogVisible = ref(false) // 弹窗的是否展示
|
||||
const dialogTitle = ref('') // 弹窗的标题
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@
|
|||
</ContentWrap>
|
||||
|
||||
<!-- 表单弹窗:添加/修改 -->
|
||||
<ProjectTaskForm ref="formRef" @success="getList" :userOptions="userOptions" />
|
||||
<ProjectTaskForm ref="formRef" @success="getList" :userOptions="userOptions" :TaskOptions="TaskOptions" />
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
|
|
@ -88,11 +88,14 @@ import { dateFormatter } from '@/utils/formatTime'
|
|||
import download from '@/utils/download'
|
||||
import { ProjectTaskApi, ProjectTaskVO } from '@/api/task/task'
|
||||
import ProjectTaskForm from './ProjectTaskForm.vue'
|
||||
import { ProjectBonusApi, ProjectBonusVO } from '@/api/task/bonus'
|
||||
import * as UserApi from '@/api/system/user'
|
||||
|
||||
/** 任务 列表 */
|
||||
defineOptions({ name: 'ProjectTask' })
|
||||
import { propTypes } from '@/utils/propTypes'
|
||||
|
||||
const TaskOptions = ref<UserApi.UserVO[]>([]) // 用户列表
|
||||
const message = useMessage() // 消息弹窗
|
||||
const { t } = useI18n() // 国际化
|
||||
const props = defineProps({
|
||||
|
|
@ -202,6 +205,8 @@ const getName = (opt, val) => {
|
|||
|
||||
/** 初始化 **/
|
||||
onMounted(async() => {
|
||||
const data = await ProjectBonusApi.getProjectBonusPage(queryParams)
|
||||
TaskOptions.value = data.list
|
||||
getList()
|
||||
})
|
||||
</script>
|
||||
Loading…
Reference in New Issue