|
|
|
@ -41,7 +41,13 @@ |
|
|
|
</a-form-item> |
|
|
|
</a-col> |
|
|
|
</a-row> |
|
|
|
|
|
|
|
<a-row :gutter="24"> |
|
|
|
<a-col :span="8"> |
|
|
|
<a-form-item label="职务" name="positionId"> |
|
|
|
<PositionSelect v-model:value="form.positionId" placeholder="请选择职务" width="100%" :disabled="readonlyMode" /> |
|
|
|
</a-form-item> |
|
|
|
</a-col> |
|
|
|
</a-row> |
|
|
|
<!-- 服务信息 --> |
|
|
|
<a-row :gutter="16"> |
|
|
|
<a-col :span="24"> |
|
|
|
@ -53,20 +59,21 @@ |
|
|
|
|
|
|
|
<!-- 服务时间信息 --> |
|
|
|
<a-row :gutter="24"> |
|
|
|
<a-col :span="8"> |
|
|
|
<a-form-item label="服务开始时间" name="serviceStart"> |
|
|
|
<a-date-picker show-time valueFormat="YYYY-MM-DD HH:mm:ss" v-model:value="form.serviceStart" style="width: 100%" placeholder="服务开始时间" /> |
|
|
|
<a-col :span="8"> |
|
|
|
<a-form-item label="服务开始时间" name="serviceStart" label-align="left"> |
|
|
|
<a-date-picker show-time format="YYYY-MM-DD HH:00:00" valueFormat="YYYY-MM-DD HH:00:00" v-model:value="form.serviceStart" style="width: 100%" placeholder="服务开始时间" :disabled="readonlyMode" /> |
|
|
|
</a-form-item> |
|
|
|
</a-col> |
|
|
|
<a-col :span="8"> |
|
|
|
<a-form-item label="服务结束时间" name="serviceEnd"> |
|
|
|
<a-date-picker show-time valueFormat="YYYY-MM-DD HH:mm:ss" v-model:value="form.serviceEnd" style="width: 100%" placeholder="服务结束时间" /> |
|
|
|
<a-form-item label="服务结束时间" name="serviceEnd" label-align="left"> |
|
|
|
<a-date-picker show-time format="YYYY-MM-DD HH:00:00" valueFormat="YYYY-MM-DD HH:00:00" v-model:value="form.serviceEnd" style="width: 100%" placeholder="服务结束时间" :disabled="readonlyMode" /> |
|
|
|
</a-form-item> |
|
|
|
</a-col> |
|
|
|
<a-col :span="8"> |
|
|
|
<a-form-item label="服务时长(小时)" name="serviceDuration"> |
|
|
|
<a-input-number style="width: 100%" v-model:value="form.serviceDuration" placeholder="服务时长(小时)" /> |
|
|
|
<a-input-number style="width: 100%" v-model:value="form.serviceDuration" placeholder="服务时长(小时)" :disabled="readonlyMode" /> |
|
|
|
</a-form-item> |
|
|
|
<div style="font-size: 12px; color: #999; margin-top: -12px; margin-bottom: 12px;">不足30分钟(不含本数)的,不计入时长,超过30分钟不足1个小时的(含本数),按照一个小时填报</div> |
|
|
|
</a-col> |
|
|
|
</a-row> |
|
|
|
|
|
|
|
@ -74,14 +81,15 @@ |
|
|
|
<a-row :gutter="16"> |
|
|
|
<a-col :span="8"> |
|
|
|
<a-form-item label="活动类型" name="activityCategoryId"> |
|
|
|
<CategoryTree |
|
|
|
v-model:value="form.activityCategoryId" |
|
|
|
:category-type="CATEGORY_TYPE_ENUM.GOODS.value" |
|
|
|
placeholder="请选择活动类型" |
|
|
|
style="width: 100%" |
|
|
|
@change="onActivityCategoryChange" |
|
|
|
/> |
|
|
|
</a-form-item> |
|
|
|
<CategoryTree |
|
|
|
v-model:value="form.activityCategoryId" |
|
|
|
:category-type="CATEGORY_TYPE_ENUM.GOODS.value" |
|
|
|
placeholder="请选择活动类型" |
|
|
|
style="width: 100%" |
|
|
|
:disabled="readonlyMode" |
|
|
|
@change="onActivityCategoryChange" |
|
|
|
/> |
|
|
|
</a-form-item> |
|
|
|
</a-col> |
|
|
|
<a-col :span="16"> |
|
|
|
<a-form-item label="活动名称" name="activityNameId"> |
|
|
|
@ -89,7 +97,7 @@ |
|
|
|
v-model:value="form.activityNameId" |
|
|
|
placeholder="请选择活动名称" |
|
|
|
style="width: 100%" |
|
|
|
:disabled="!form.activityCategoryId" |
|
|
|
:disabled="!form.activityCategoryId || readonlyMode" |
|
|
|
:options="activityList" |
|
|
|
show-search |
|
|
|
:filter-option="filterActivityOption" |
|
|
|
@ -102,12 +110,12 @@ |
|
|
|
<a-row :gutter="16"> |
|
|
|
<a-col :span="8"> |
|
|
|
<a-form-item label="受益人数" name="beneficiaryCount"> |
|
|
|
<a-input-number style="width: 100%" v-model:value="form.beneficiaryCount" placeholder="受益人数" /> |
|
|
|
<a-input-number style="width: 100%" v-model:value="form.beneficiaryCount" placeholder="受益人数" :disabled="readonlyMode" /> |
|
|
|
</a-form-item> |
|
|
|
</a-col> |
|
|
|
<a-col :span="16"> |
|
|
|
<a-form-item label="组织单位名称" name="organizerName"> |
|
|
|
<a-input style="width: 100%" v-model:value="form.organizerName" placeholder="组织单位名称" /> |
|
|
|
<a-input style="width: 100%" v-model:value="form.organizerName" placeholder="组织单位名称" :disabled="readonlyMode" /> |
|
|
|
</a-form-item> |
|
|
|
</a-col> |
|
|
|
</a-row> |
|
|
|
@ -116,30 +124,43 @@ |
|
|
|
<a-row :gutter="16"> |
|
|
|
<a-col :span="8"> |
|
|
|
<a-form-item label="负责人姓名" name="organizerContact"> |
|
|
|
<a-input style="width: 100%" v-model:value="form.organizerContact" placeholder="负责人姓名" /> |
|
|
|
<a-input style="width: 100%" v-model:value="form.organizerContact" placeholder="负责人姓名" :disabled="readonlyMode" /> |
|
|
|
</a-form-item> |
|
|
|
</a-col> |
|
|
|
<a-col :span="16"> |
|
|
|
<a-form-item label="联系方式" name="organizerPhone"> |
|
|
|
<a-input style="width: 100%" v-model:value="form.organizerPhone" placeholder="联系电话或邮箱" /> |
|
|
|
<a-input style="width: 100%" v-model:value="form.organizerPhone" placeholder="联系电话或邮箱" :disabled="readonlyMode" /> |
|
|
|
</a-form-item> |
|
|
|
</a-col> |
|
|
|
</a-row> |
|
|
|
|
|
|
|
<!-- 详细描述和证明材料 --> |
|
|
|
<a-form-item label="服务内容描述" name="serviceContent"> |
|
|
|
<SmartWangeditor ref="serviceContentRef" v-model="form.serviceContent" :height="200" /> |
|
|
|
<SmartWangeditor ref="serviceContentRef" v-model="form.serviceContent" :height="200" :readonly="readonlyMode" /> |
|
|
|
</a-form-item> |
|
|
|
<a-form-item label="证明材料" name="proofMaterials"> |
|
|
|
<a-form-item name="proofMaterials" required> |
|
|
|
<template #label> |
|
|
|
<span class="ant-form-item-required">证明材料</span> |
|
|
|
<span style="font-size: 12px; color: #999;">(请上传活动方案、活动记录、照片、新闻报道等材料)支持图片(JPG/PNG)、文档(PDF/Word/PPT)格式,单文件最大10MB,最多上传5个文件</span> |
|
|
|
</template> |
|
|
|
<template v-if="readonlyMode"> |
|
|
|
<div v-if="defaultFileList.length > 0"> |
|
|
|
<a-typography-paragraph v-for="file in defaultFileList" :key="file.uid" style="margin: 4px 0;"> |
|
|
|
<Link :href="file.url || file.fileUrl" target="_blank">{{ file.name || file.fileName }}</Link> |
|
|
|
</a-typography-paragraph> |
|
|
|
</div> |
|
|
|
<div v-else>无证明材料</div> |
|
|
|
</template> |
|
|
|
<Upload |
|
|
|
v-else |
|
|
|
:defaultFileList="defaultFileList" |
|
|
|
:maxUploadSize="10" |
|
|
|
:multiple="true" |
|
|
|
accept=".jpg,.jpeg,.png,.gif,.pdf,.doc,.docx,.ppt,.pptx,.PNG,JPG,GIF" |
|
|
|
accept=".jpg,.jpeg,.png,.gif,.pdf,.doc,.docx,.ppt,.pptx,.PNG,.JPG,.GIF" |
|
|
|
:folder="FILE_FOLDER_TYPE_ENUM.COMMON.value" |
|
|
|
buttonText="上传证明材料" |
|
|
|
listType="text" |
|
|
|
extraMsg="支持图片(JPG/PNG)、文档(PDF/Word/PPT)格式,单文件最大10MB,最多上传10个文件" |
|
|
|
extraMsg="活动方案、活动记录、照片、新闻报道等,支持图片(JPG/PNG)、文档(PDF/Word/PPT)格式,单文件最大10MB,最多上传5个文件" |
|
|
|
@change="changeAttachment" |
|
|
|
/> |
|
|
|
</a-form-item> |
|
|
|
@ -149,8 +170,8 @@ |
|
|
|
<template #footer> |
|
|
|
<a-space> |
|
|
|
<a-button @click="onClose">取消</a-button> |
|
|
|
<a-button type="primary" @click="onSave">保存</a-button> |
|
|
|
<a-button type="primary" @click="onSubmit">提交</a-button> |
|
|
|
<a-button v-if="!readonlyMode" type="primary" @click="onSave">保存</a-button> |
|
|
|
<a-button v-if="!readonlyMode" type="primary" @click="onSubmit">提交</a-button> |
|
|
|
</a-space> |
|
|
|
</template> |
|
|
|
</a-modal> |
|
|
|
@ -174,7 +195,7 @@ |
|
|
|
import CategoryTree from '/@/components/business/category-tree-select/index.vue'; |
|
|
|
import { CATEGORY_TYPE_ENUM } from '/@/constants/business/erp/category-const'; |
|
|
|
import { goodsApi } from '/@/api/business/goods/goods-api'; |
|
|
|
|
|
|
|
import PositionSelect from '/@/components/system/position-select/index.vue'; |
|
|
|
// ------------------------ 事件 ------------------------ |
|
|
|
|
|
|
|
const emits = defineEmits(['reloadList']); |
|
|
|
@ -183,6 +204,9 @@ |
|
|
|
// 是否显示 |
|
|
|
const visibleFlag = ref(false); |
|
|
|
|
|
|
|
// 只读模式(详情查看模式) |
|
|
|
const readonlyMode = ref(false); |
|
|
|
|
|
|
|
// 当前用户信息 |
|
|
|
let currentUserInfo = ref(null); |
|
|
|
|
|
|
|
@ -246,14 +270,17 @@ |
|
|
|
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0; |
|
|
|
} |
|
|
|
|
|
|
|
async function show(rowData) { |
|
|
|
async function show(rowData, isDetail = false) { |
|
|
|
Object.assign(form, formDefault); |
|
|
|
|
|
|
|
// 设置只读模式 |
|
|
|
readonlyMode.value = isDetail; |
|
|
|
|
|
|
|
// 先获取当前用户信息 |
|
|
|
const userInfo = await getCurrentUserInfo(); |
|
|
|
|
|
|
|
if (rowData && !_.isEmpty(rowData)) { |
|
|
|
// 编辑模式:合并用户信息和现有数据 |
|
|
|
// 编辑模式或详情模式:合并用户信息和现有数据 |
|
|
|
Object.assign(form, rowData); |
|
|
|
// 确保用户信息不被覆盖 |
|
|
|
if (userInfo) { |
|
|
|
@ -264,7 +291,7 @@ |
|
|
|
form.departmentName = userInfo.departmentName || form.departmentName; |
|
|
|
} |
|
|
|
|
|
|
|
// 编辑模式下,如果有attachmentIds,则获取文件列表 |
|
|
|
// 编辑模式或详情模式下,如果有attachmentIds,则获取文件列表 |
|
|
|
if (form.attachmentIds && form.attachmentIds.trim()) { |
|
|
|
await getFileListByAttachmentIds(form.attachmentIds); |
|
|
|
} |
|
|
|
@ -362,6 +389,13 @@ |
|
|
|
}).filter(id => id); // 过滤掉空值 |
|
|
|
|
|
|
|
form.attachmentIds = fileIds.join(','); |
|
|
|
|
|
|
|
// 手动触发表单验证,确保验证及时更新 |
|
|
|
nextTick(() => { |
|
|
|
if (formRef.value) { |
|
|
|
formRef.value.validateFields(['proofMaterials']); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
function onClose() { |
|
|
|
@ -370,6 +404,8 @@ |
|
|
|
defaultFileList.value = []; |
|
|
|
form.proofMaterials = []; |
|
|
|
form.attachmentIds = ''; |
|
|
|
// 重置只读模式 |
|
|
|
readonlyMode.value = false; |
|
|
|
visibleFlag.value = false; |
|
|
|
} |
|
|
|
|
|
|
|
@ -450,6 +486,17 @@ |
|
|
|
} |
|
|
|
], |
|
|
|
serviceContent: [{ required: true, message: '服务内容描述 必填' }], |
|
|
|
proofMaterials: [ |
|
|
|
{ |
|
|
|
validator: async (rule, value) => { |
|
|
|
// 检查是否有上传的文件 |
|
|
|
if (!form.proofMaterials || form.proofMaterials.length === 0) { |
|
|
|
return Promise.reject('请上传证明材料'); |
|
|
|
} |
|
|
|
return Promise.resolve(); |
|
|
|
} |
|
|
|
} |
|
|
|
], |
|
|
|
}; |
|
|
|
|
|
|
|
// 点击保存,验证表单并保存 |
|
|
|
|