日报-周报

pull/781/head
zy 2025-05-14 14:36:18 +08:00
parent 0805d1b9d7
commit 6808e58381
24 changed files with 2183 additions and 22 deletions

View File

@ -45,8 +45,9 @@ export const QuotationApi = {
return await request.get({ url: `/crm/quotation/simple-all-list` })
},
// 获得 CRM 方案营收分析
getRevenueList : async () => {
return await request.get({ url: `/crm/quotation/get-revenue-analysis` })
getRevenueList : async (data: any) => {
return await request.post({ url: `/crm/quotation/get-revenue-analysis`,
data })
},
// 获得 CRM 方案列表(精简)

View File

@ -0,0 +1,51 @@
import request from '@/config/axios'
// 工作简报 VO
export interface BriefWorkVO {
id: number // 唯一主键
briefType: number // 简报类型1-日报2-周报3-月报
briefCount: number // 周报为周数/月报为月数
briefStartDate: Date // 简报开始日期
briefEndDate: Date // 简报结束日期
selectCustomer: boolean // 是否选择客户
workComplate: string // 本周期完成工作
workPlan: string // 下周期工作计划
workAssistance: string // 工作困难及协助
workExperience: string // 工作心得分享
attachment: string // 附件
processInstanceId: string // 工作流编号
auditStatus: number // 审批状态
}
// 工作简报 API
export const BriefWorkApi = {
// 查询工作简报分页
getBriefWorkPage: async (params: any) => {
return await request.get({ url: `/tts/brief-work/page`, params })
},
// 查询工作简报详情
getBriefWork: async (params: any) => {
return await request.get({ url: `/tts/brief-work/get`, params})
},
// 新增工作简报
createBriefWork: async (data: BriefWorkVO) => {
return await request.post({ url: `/tts/brief-work/create`, data })
},
// 修改工作简报
updateBriefWork: async (data: BriefWorkVO) => {
return await request.put({ url: `/tts/brief-work/update`, data })
},
// 删除工作简报
deleteBriefWork: async (id: number) => {
return await request.delete({ url: `/tts/brief-work/delete?id=` + id })
},
// 导出工作简报 Excel
exportBriefWork: async (params) => {
return await request.download({ url: `/tts/brief-work/export-excel`, params })
}
}

View File

@ -0,0 +1,40 @@
import request from '@/config/axios'
// 工作简报客户 VO
export interface BriefWorkCustomerVO {
briefId: number // 简报ID
customerId: number // 客户Id
}
// 工作简报客户 API
export const BriefWorkCustomerApi = {
// 查询工作简报客户分页
getBriefWorkCustomerPage: async (params: any) => {
return await request.get({ url: `/tts/brief-work-customer/page`, params })
},
// 查询工作简报客户详情
getBriefWorkCustomer: async (id: number) => {
return await request.get({ url: `/tts/brief-work-customer/get?id=` + id })
},
// 新增工作简报客户
createBriefWorkCustomer: async (data: BriefWorkCustomerVO) => {
return await request.post({ url: `/tts/brief-work-customer/create`, data })
},
// 修改工作简报客户
updateBriefWorkCustomer: async (data: BriefWorkCustomerVO) => {
return await request.put({ url: `/tts/brief-work-customer/update`, data })
},
// 删除工作简报客户
deleteBriefWorkCustomer: async (id: number) => {
return await request.delete({ url: `/tts/brief-work-customer/delete?id=` + id })
},
// 导出工作简报客户 Excel
exportBriefWorkCustomer: async (params) => {
return await request.download({ url: `/tts/brief-work-customer/export-excel`, params })
}
}

View File

@ -0,0 +1,176 @@
<template>
<Dialog title="添加客户" v-model="dialogVisible" width="50%">
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="100px"
>
<el-form-item label="任务标题" prop="taskName">
<el-input
v-model="queryParams.taskName"
class="!w-240px"
clearable
placeholder="请输入任务标题"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
<Icon class="mr-5px" icon="ep:search" />
搜索
</el-button>
<el-button @click="resetQuery">
<Icon class="mr-5px" icon="ep:refresh" />
重置
</el-button>
<!-- <el-button v-hasPermi="['crm:customer:create']" type="primary" @click="openForm('create')">
<Icon class="mr-5px" icon="ep:plus" />
新增联系人
</el-button> -->
</el-form-item>
</el-form>
<!-- 列表 -->
<ContentWrap>
<el-table ref="multipleTableRef" v-loading="loading" :data="list" @selection-change="handleSelectionChange" :row-key="getRowKey" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="序号" align="center" type="selection" :reserve-selection="true" />
<el-table-column label="任务标题" align="center" prop="taskName" />
<el-table-column label="任务编号" align="center" prop="taskNo" width="150" />
<!-- <el-table-column align="center" label="电话" prop="telephone" width="130" />
<el-table-column align="center" label="职位" prop="post" width="120" /> -->
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
<!-- 表单弹窗添加/修改 -->
<CustomerForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import * as ContactApi from '@/api/crm/contact'
import { dateFormatter } from '@/utils/formatTime'
import CustomerForm from '@/views/crm/customer/CustomerForm.vue'
import download from '@/utils/download'
import { BillTemplateApi, BillTemplateVO } from '@/api/crm/billtemplate'
import { ProjectTaskApi, ProjectTaskVO } from '@/api/task/task'
import { propTypes } from '@/utils/propTypes'
import { useUserStore } from '@/store/modules/user'
/** 票据模版 列表 */
defineOptions({ name: 'BillTemplate' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<BillTemplateVO[]>([]) //
const total = ref(0) //
const multipleSelection = ref([])
const dialogVisible = ref(false) //
const multipleTableRef = ref()
const selectedRowKeys = ref<number[]>([]);
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
userId: undefined,
taskName: undefined,
taskState: 2,
customerId: undefined
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 打开弹窗 */
const open = async (data: [], id) => {
dialogVisible.value = true
multipleSelection.value = data
queryParams.customerId = id
await getList()
await setSelections()
}
defineExpose({ open }) // open
// id
const getRowKey = (row) => {
return row.id
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type,id, queryParams.customerId)
}
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
queryParams.userId = useUserStore().getUser.id
const data = await ProjectTaskApi.getProjectTaskPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
const handleSelectionChange = (val: []) => {
multipleSelection.value = val
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
multipleTableRef.value.clearSelection()
handleQuery()
}
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
dialogVisible.value = false
//
emit('success', multipleSelection.value)
}
const setSelections = async () => {
const selections = multipleSelection.value.map(item => {
return {
id: item.id
}
})
if (selections && selections.length > 0) {
list.value.forEach((row: any) => {
if (selections.some(item => item.id === row.id)) {
multipleTableRef.value.toggleRowSelection(row, true); //
}
});
} else {
multipleTableRef.value.clearSelection(); //
}
}
</script>

View File

@ -0,0 +1,171 @@
<template>
<Dialog title="添加客户" v-model="dialogVisible" width="50%">
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="100px"
>
<el-form-item label="客户名称" prop="name">
<el-input
v-model="queryParams.name"
class="!w-240px"
clearable
placeholder="请输入客户名称"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
<Icon class="mr-5px" icon="ep:search" />
搜索
</el-button>
<el-button @click="resetQuery">
<Icon class="mr-5px" icon="ep:refresh" />
重置
</el-button>
<!-- <el-button v-hasPermi="['crm:customer:create']" type="primary" @click="openForm('create')">
<Icon class="mr-5px" icon="ep:plus" />
新增联系人
</el-button> -->
</el-form-item>
</el-form>
<!-- 列表 -->
<ContentWrap>
<el-table ref="multipleTableRef" v-loading="loading" :data="list" @selection-change="handleSelectionChange" :row-key="getRowKey" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="序号" align="center" type="selection" :reserve-selection="true" />
<el-table-column label="客户姓名" align="center" prop="name" />
<!-- <el-table-column align="center" label="电话" prop="telephone" width="130" />
<el-table-column align="center" label="职位" prop="post" width="120" /> -->
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
<!-- 表单弹窗添加/修改 -->
<CustomerForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import * as ContactApi from '@/api/crm/contact'
import { dateFormatter } from '@/utils/formatTime'
import CustomerForm from '@/views/crm/customer/CustomerForm.vue'
import download from '@/utils/download'
import { BillTemplateApi, BillTemplateVO } from '@/api/crm/billtemplate'
import * as CustomerApi from '@/api/crm/customer';
/** 票据模版 列表 */
defineOptions({ name: 'BillTemplate' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<BillTemplateVO[]>([]) //
const total = ref(0) //
const multipleSelection = ref([])
const dialogVisible = ref(false) //
const multipleTableRef = ref()
const selectedRowKeys = ref<number[]>([]);
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
sceneType: '1', // activeName
name: undefined,
customerId: undefined
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 打开弹窗 */
const open = async (data: [], id) => {
dialogVisible.value = true
multipleSelection.value = data
queryParams.customerId = id
await getList()
await setSelections()
}
defineExpose({ open }) // open
// id
const getRowKey = (row) => {
return row.id
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type,id, queryParams.customerId)
}
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await CustomerApi.getCustomerPage(queryParams);
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
const handleSelectionChange = (val: []) => {
multipleSelection.value = val
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
multipleTableRef.value.clearSelection()
handleQuery()
}
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
dialogVisible.value = false
//
emit('success', multipleSelection.value)
}
const setSelections = async () => {
const selections = multipleSelection.value.map(item => {
return {
id: item.id
}
})
if (selections && selections.length > 0) {
list.value.forEach((row: any) => {
if (selections.some(item => item.id === row.id)) {
multipleTableRef.value.toggleRowSelection(row, true); //
}
});
} else {
multipleTableRef.value.clearSelection(); //
}
}
</script>

View File

@ -882,6 +882,50 @@ const remainingRouter: AppRouteRecordRaw[] = [
},
component: () => import('@/views/task/online/OnlineApplicationDetail.vue')
},
{
path: 'briefWork/BriefWorkDetail',
name: 'DayReportDetail',
meta: {
title: '日报详情',
noCache: true,
hidden: true,
activeMenu: '/project/briefWork'
},
component: () => import('@/views/task/briefWork/BriefWorkDetail.vue')
},
{
path: 'briefWork/BriefWorkForm',
name: 'DayReportAdd',
meta: {
title: '日报新增',
noCache: true,
hidden: true,
activeMenu: '/project/briefWork'
},
component: () => import('@/views/task/briefWork/BriefWorkForm.vue')
},
{
path: 'briefWeekWork/BriefworkWeekDetail',
name: 'WeekReportDetail',
meta: {
title: '周报详情',
noCache: true,
hidden: true,
activeMenu: '/project/bridfWeekWork'
},
component: () => import('@/views/task/briefWeekWork/BriefWorkWeekDetail.vue')
},
{
path: 'briefWeekWork/BriefWorkWeekForm',
name: 'WeekReportAdd',
meta: {
title: '周报新增',
noCache: true,
hidden: true,
activeMenu: '/project/bridfWeekWork'
},
component: () => import('@/views/task/briefWeekWork/BriefWorkWeekForm.vue')
},
]
},
{

View File

@ -46,11 +46,11 @@
<!-- 列表 -->
<ContentWrap>
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<!-- <el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="我负责的" name="1" />
<el-tab-pane label="我参与的" name="2" />
<el-tab-pane label="下属负责的" name="3" />
</el-tabs>
</el-tabs> -->
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
<el-table-column align="center" fixed="left" label="商机名称" prop="name" width="200">
<template #default="scope">

View File

@ -106,7 +106,7 @@
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="我负责的" name="1" />
<el-tab-pane label="我参与的" name="2" />
<el-tab-pane label="下属负责的" name="3" />
<!-- <el-tab-pane label="下属负责的" name="3" /> -->
</el-tabs>
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
<el-table-column align="center" fixed="left" label="联系人姓名" prop="name" width="160">

View File

@ -73,11 +73,11 @@
<!-- 列表 -->
<ContentWrap>
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<!-- <el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="我负责的" name="1" />
<el-tab-pane label="我参与的" name="2" />
<el-tab-pane label="下属负责的" name="3" />
</el-tabs>
</el-tabs> -->
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
<el-table-column align="center" fixed="left" label="合同名称" prop="name" width="160">
<template #default="scope">

View File

@ -110,7 +110,7 @@
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="我负责的" name="1" />
<el-tab-pane label="我参与的" name="2" />
<el-tab-pane label="下属负责的" name="3" />
<!-- <el-tab-pane label="下属负责的" name="3" /> -->
</el-tabs>
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
<el-table-column align="center" fixed="left" label="客户名称" prop="name" width="250">

View File

@ -536,8 +536,30 @@ const setSuccess = (val) => {
}
//
const RevenueAnalysisFormRef = ref('')
const newProducts = ref([])
const handleClick = (val) => {
newProducts.value = []
console.log('%csrc/views/crm/quotation/QuotationForm.vue:540 val', 'color: #007acc;', subTabsName.value);
formData.value.products.forEach( item => {
newProducts.value.push({
id: item.productId,
onlinePrice: item.onlinePrice,
offlinePrice: item.offlinePrice,
productUnit: item.productUnit,
productName: item.productName,
category: item.category
})
})
let data = {
businessId: formData.value.businessId,
creditMethod: formData.value.creditMethod,
paymentTerm: formData.value.paymentTerm,
quotationProducts: newProducts.value
}
console.log('%csrc/views/crm/quotation/QuotationForm.vue:551 newProducts.value', 'color: #007acc;', newProducts.value);
RevenueAnalysisFormRef.value.getData(data)
}

View File

@ -13,37 +13,37 @@
</el-table-column>
<el-table-column label="销售额" align="center" min-width="150">
<template #default="{ row }">
<dict-tag :type="DICT_TYPE.CRM_PRODUCT_UNIT" :value="row.productUnit" />
{{row.revenueAnalysisVO.salesVolume}}
</template>
</el-table-column>
<el-table-column label="订单量" align="center" min-width="150">
<template #default="{ row }">
{{row.onlinePrice}}
{{row.revenueAnalysisVO.totalOrderVolume}}
</template>
</el-table-column>
<el-table-column label="营业收入" align="center" min-width="150">
<template #default="{ row }">
{{row.offlinePrice}}
{{row.revenueAnalysisVO.totalIncome}}
</template>
</el-table-column>
<el-table-column label="收入利率" align="center" min-width="130">
<template #default="{ row }">
{{row.downlinePrice}}
{{(row.revenueAnalysisVO.incomeInterestRate * 100).toFixed(2) + '%'}}
</template>
</el-table-column>
<el-table-column label="应扣成本" align="center" min-width="150">
<template #default="{ row }">
{{row.totalPrice}}
{{row.revenueAnalysisVO.deductibleCost}}
</template>
</el-table-column>
<el-table-column label="利润" align="center" min-width="150">
<template #default="{ row }">
<dict-tag :type="DICT_TYPE.CRM_PRODUCT_INVOICE" :value="row.productInvoice" />
{{row.revenueAnalysisVO.profit}}
</template>
</el-table-column>
<el-table-column label="利润率" align="center" min-width="250">
<template #default="{ row }">
<dict-tag :type="DICT_TYPE.CRM_PRODUCT_INVOICE_ITEMS" :value="row.productInvoiceItem" />
{{(row.revenueAnalysisVO.profitRate * 100).toFixed(2) + '%'}}
</template>
</el-table-column>
<el-table-column label="您的分润比例" align="center" min-width="150">
@ -74,7 +74,9 @@ const formData = ref([])
/** 表单值 */
const getData = async (data) => {
formData.value = await QuotationApi.getQuotation(data)
let list = await QuotationApi.getRevenueList(data)
console.log('%csrc/views/crm/quotation/components/RevenueAnalysis.vue:79 list.totalRevenueAnalysis', 'color: #007acc;', list.totalRevenueAnalysis);
formData.value = list.quotationProducts
}
const getName = (opt, val) => {
const arr = opt.filter(v => v.value == val)

View File

@ -99,11 +99,11 @@
<!-- 列表 -->
<ContentWrap>
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<!-- <el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="我负责的" name="1" />
<el-tab-pane label="我参与的" name="2" />
<el-tab-pane label="下属负责的" name="3" />
</el-tabs>
</el-tabs> -->
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="报价单编号" align="center" prop="no" width="200" >
<template #default="scope">

View File

@ -0,0 +1,134 @@
<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>

View File

@ -0,0 +1,214 @@
<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 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 './components/selectCustomer.vue'
import TaskForm from './components/selectTask.vue'
import DayReportForm from './components/selectDayReport.vue'
/** 工作简报 表单 */
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: 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 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 () => {
//
const now = new Date();
const dayOfWeek = now.getDay();
let monday = new Date(now);
if (dayOfWeek !== 0) {
monday.setDate(now.getDate() - dayOfWeek + 1);
} else {
monday.setDate(now.getDate() - 6);
}
let sunday = new Date(now);
const daysUntilSunday = (7 - dayOfWeek) % 7; //
sunday.setDate(now.getDate() + daysUntilSunday);
formData.value.briefStartDate = monday.toISOString().slice(0, 10); // YYYY-MM-DD
formData.value.briefEndDate = sunday.toISOString().slice(0, 10); // YYYY-MM-DD
time.value = [formData.value.briefStartDate + ' 00:00:00', formData.value.briefEndDate + ' 23:59:59']
// formType.value = props.id || route.query.id
// if (formType.value) await open(formType.value)
// if (!formType.value) {
// formData.value.userId = useUserStore().getUser.id
// }
})
</script>

View File

@ -0,0 +1,169 @@
<template>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<!-- <el-table-column label="唯一主键" align="center" prop="id" /> -->
<!-- <el-table-column label="项目ID" align="center" prop="projectId" /> -->
<el-table-column label="单位名称" align="center" prop="name" />
<el-table-column label="跟进方式" align="center" prop="followUpStatus" />
<el-table-column label="跟进内容" align="center" prop="contactLastContent" />
<el-table-column label="跟进时间" align="center" prop="contactLastTime" />
<el-table-column label="跟进人" align="center" prop="creatorName" />
<el-table-column label="操作" align="center" min-width="120px" v-if="!type">
<template #default="scope">
<el-button
link
type="danger"
@click="handleDelete(scope.$index)"
v-hasPermi="['task:selectCustomer:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-row justify="center" class="mt-3" v-if="!type">
<el-button @click="openForm" round>+ 添加</el-button>
</el-row>
<!-- <el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['task:project-bonus:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button> -->
<!-- 分页 -->
<!-- <Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/> -->
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<CustomerForm ref="formRef" @success="getList" :id="id" />
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { ProjectBonusApi, ProjectBonusVO } from '@/api/task/bonus'
import CustomerForm from '@/components/customer/index.vue'
import { propTypes } from '@/utils/propTypes'
/** 项目奖金 列表 */
defineOptions({ name: 'ProjectBonus' })
const message = useMessage() //
const { t } = useI18n() //
const props = defineProps({
id: propTypes.number.def(undefined),
type: propTypes.number.def(undefined),
userOptions: propTypes.object.def([]),
})
const loading = ref(false) //
const list = ref<ProjectBonusVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 999,
projectId: undefined,
userId: undefined,
bonusPercentage: undefined,
bonusAmount: undefined,
bonusIssueDate: [],
bonusState: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const emit = defineEmits(['success']) // success
const getList = (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)) {
val.forEach(item => {
list.value.push({
"name": item.name,
"followUpStatus": item.followUpStatus,
"contactLastTime": item.contactLastTime,
"contactLastContent": item.contactLastContent,
"creatorName": item.creatorName,
"id": item.id,
})
})
}
})
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
// getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = () => {
formRef.value.open(list.value)
}
/** 删除按钮操作 */
const handleDelete = async (i: number) => {
try {
//
await message.delConfirm()
//
console.log('%csrc/views/task/briefWeekWork/components/selectCustomer.vue:132 i', 'color: #007acc;', i);
list.value.splice(i, 1)
message.success(t('common.delSuccess'))
//
// await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await ProjectBonusApi.exportProjectBonus(queryParams)
download.excel(data, '项目奖金.xls')
} catch {
} finally {
exportLoading.value = false
}
}
const getName = (opt, val) => {
const arr = opt.filter(v => v.id == val)
return arr.length ? arr[0]['nickname'] : ''
}
const getData = (data) => {
return list.value
}
defineExpose({ getData })
/** 初始化 **/
onMounted(() => {
// getList()
})
</script>

View File

@ -0,0 +1,157 @@
<template>
<!-- 列表 -->
<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="workComplate" />
<el-table-column label="明日工作计划" align="center" prop="workPlan" />
<el-table-column label="工作困难及协助" align="center" prop="workAssistance" />
</el-table>
</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'
import { propTypes } from '@/utils/propTypes'
/** 工作简报 列表 */
defineOptions({ name: 'BriefWork' })
const props = defineProps({
time: [],
})
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: 1,
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 {
queryParams.createTime = props.time
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: 'DayReportAdd' })
}
//
const openFormDetail = (row: Object) => {
router.push({ name: 'DayReportDetail', 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 getName = (opt, val, id, name) => {
const arr = opt.filter(v => v[id] == val)
return arr.length ? arr[0][name] : ''
}
const getData = (data) => {
return list.value
}
defineExpose({ getData })
/** 初始化 **/
onMounted(async() => {
//
userOptions.value = await UserApi.getSimpleUserList()
getList()
})
onActivated(()=>{
getList()
})
</script>

View File

@ -0,0 +1,164 @@
<template>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<!-- <el-table-column label="唯一主键" align="center" prop="id" /> -->
<!-- <el-table-column label="项目ID" align="center" prop="projectId" /> -->
<el-table-column label="任务标题" align="center" prop="taskName" />
<el-table-column label="任务优先级" align="center" prop="taskLevel">
<template #default="scope">
<dict-tag :type="DICT_TYPE.TTS_TASK_LEVEL" :value="scope.row.taskLevel" />
</template>
</el-table-column>
<el-table-column label="任务负责人" align="center" prop="userId">
<template #default="scope">
{{getName(userOptions, scope.row.userId)}}
</template>
</el-table-column>
<el-table-column label="任务描述" align="center" prop="taskDescribe" />
<el-table-column label="操作" align="center" min-width="120px" v-if="!type">
<template #default="scope">
<el-button
link
type="danger"
@click="handleDelete(scope.$index)"
v-hasPermi="['task:selectTask:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-row justify="center" class="mt-3" v-if="!type">
<el-button @click="openForm" round>+ 添加</el-button>
</el-row>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<TaskForm ref="formRef" @success="getList" :id="id" :userOptions="userOptions" />
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { ProjectBonusApi, ProjectBonusVO } from '@/api/task/bonus'
import TaskForm from '@/components/Task/index.vue'
import { propTypes } from '@/utils/propTypes'
import { DICT_TYPE } from '@/utils/dict'
import * as UserApi from '@/api/system/user'
import { useUserStore } from '@/store/modules/user'
/** 项目奖金 列表 */
defineOptions({ name: 'ProjectBonus' })
const message = useMessage() //
const userOptions = ref<UserApi.UserVO[]>([]) //
const { t } = useI18n() //
const props = defineProps({
id: propTypes.number.def(undefined),
type: propTypes.number.def(undefined),
})
const loading = ref(false) //
const list = ref<ProjectBonusVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 999,
projectId: undefined,
userId: useUserStore().getUser.id,
bonusPercentage: undefined,
bonusAmount: undefined,
bonusIssueDate: [],
bonusState: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const emit = defineEmits(['success']) // success
const getList = (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)) {
val.forEach(item => {
list.value.push({
"taskName": item.taskName,
"userId": item.userId,
"taskLevel": item.taskLevel,
"taskDescribe": item.taskDescribe,
"id": item.id,
})
})
}
})
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
// getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = () => {
formRef.value.open(list.value)
}
/** 删除按钮操作 */
const handleDelete = async (i: number) => {
try {
//
await message.delConfirm()
//
list.value.splice(i, 1)
message.success(t('common.delSuccess'))
//
// await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await ProjectBonusApi.exportProjectBonus(queryParams)
download.excel(data, '项目奖金.xls')
} catch {
} finally {
exportLoading.value = false
}
}
const getName = (opt, val) => {
const arr = opt.filter(v => v.id == val)
return arr.length ? arr[0]['nickname'] : ''
}
const getData = (data) => {
return list.value
}
defineExpose({ getData })
/** 初始化 **/
onMounted(async() => {
// getList() //
userOptions.value = await UserApi.getSimpleUserList()
})
</script>

View File

@ -0,0 +1,250 @@
<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-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" />
<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: 2,
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: 'WeekReportAdd' })
}
//
const openFormDetail = (row: Object) => {
router.push({ name: 'WeekReportDetail', 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 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,164 @@
<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
disabled
v-model="formData.briefStartDate"
type="date"
value-format="YYYY-MM-DD"
placeholder="选择简报日期"
/>
</el-form-item>
</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 { propTypes } from '@/utils/propTypes'
/** 工作简报 表单 */
defineOptions({ name: 'BriefWorkForm' })
const { proxy }: any = getCurrentInstance();
const { t } = useI18n() //
const message = useMessage() //
const props = defineProps({
id: propTypes.number.def(undefined),
})
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
briefType: 1,
selectCustomer: false,
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 open = async (id?: number) => {
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await BriefWorkApi.getBriefWork({id: id, briefType: 1})
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
formData.value.briefEndDate = formData.value.briefStartDate
try {
const data = formData.value as unknown as BriefWorkVO
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: false,
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)
if (!formType.value) {
formData.value.userId = useUserStore().getUser.id
}
})
</script>

View File

@ -0,0 +1,154 @@
<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"
value-format="YYYY-MM-DD"
placeholder="选择简报日期"
/>
</el-form-item>
</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 { propTypes } from '@/utils/propTypes'
/** 工作简报 表单 */
defineOptions({ name: 'BriefWorkForm' })
const { proxy }: any = getCurrentInstance();
const props = defineProps({
id: propTypes.number.def(undefined),
type: propTypes.number.def(undefined),
})
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,
selectCustomer: false,
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 emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
formData.value.briefEndDate = formData.value.briefStartDate
try {
const data = formData.value as unknown as BriefWorkVO
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: false,
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)
if (!formType.value) {
formData.value.userId = useUserStore().getUser.id
}
})
</script>

View File

@ -0,0 +1,250 @@
<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-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" />
<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: 1,
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: 'DayReportAdd' })
}
//
const openFormDetail = (row: Object) => {
router.push({ name: 'DayReportDetail', 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 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

@ -231,9 +231,7 @@ const resetQuery = () => {
const { push } = useRouter()
const router = useRouter() //
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
//
const openFormAdd = () => {

View File

@ -227,7 +227,7 @@
<el-dropdown-menu>
<el-dropdown-item
command="openFormEdit"
v-if="checkPermi(['task:project:update']) && scope.row.auditStatus === 2"
v-if="checkPermi(['tts:project:update']) && scope.row.auditStatus === 2"
>
编辑
</el-dropdown-item>