pull/781/head
zy 2025-05-15 15:32:15 +08:00
parent dd2242e2be
commit 4804d4e146
13 changed files with 92 additions and 26 deletions

View File

@ -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 {

View File

@ -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="请输入分类描述" />

View File

@ -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']"

View File

@ -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">

View File

@ -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) {

View File

@ -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">

View File

@ -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)
}

View File

@ -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>

View File

@ -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">

View File

@ -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' }],

View File

@ -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

View File

@ -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('') //

View File

@ -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>