You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

1612 lines
59 KiB

<script setup>
import feedback from "@/utils/feedback";
import {getToken} from "@/utils/token";
import {BASE_PATH} from "@/api/request";
import useUserStore from "@/stores/modules/user";
import {timeFormat} from "@/utils/util";
import reportFile from '@/components/reportFile/index.vue';
import useCatchStore from '@/stores/modules/catch'
import reportAudit from '@/components/reportAudit/start.vue';
import reportAuditFinish from '@/components/reportAudit/finish.vue';
import reportAuditReject from '@/components/reportAudit/reject.vue';
import {
getDetail,
saveReportProject,
getExcelContrilPrice,
upFinalizationPathFun,
deleteReportProject
} from "@/api/report/index";
import {useRoute, useRouter} from "vue-router";
import {getReportFlow} from "@/api/report/flow";
import useTabsStore from "@/stores/modules/multipleTabs";
import {listPolice} from "@/api/system/police";
import {fileDict,fileEndDict} from "@/enums/fileTableDictEnum";
import {recessedData} from "@/api/entryWindow/index";
import { getDictValue,getDepartContent } from "@/utils/util";
import {ElLoading} from "element-plus";
const {addTab, removeTab, tabList} =
useTabsStore();
const filesData = ref([])
const router = useRouter();
const preview = ref(false);
const dialog = ref(false)
const actionRow = ref({})
const userStore = useUserStore();
const catchStore = useCatchStore();
const dict = catchStore.getDicts(["procurementMethod","AuditUnitPresetting","ReviewePresetSetting"]);
let formDataRef = ref()
let formReviewRef = ref()
const loading = ref(false)
const route = useRoute();
const finishDialog = ref(false)
const rejectDialog = ref(false)
const endDialog =ref(false)
const isAudit = ref(false)
const isEndData = ref(false)
let activeName = ref("initial")
const addFileDialog = ref(false)
let formData = ref({
project: {
projectType: null,
node: 'initial'
},
files: {
initial: [],
exploration: [],
cross: []
},
review: {
isExploration:'2',
isCross:'1'
}
})
const fileTable = ref({
request: false,
type: "普通附件",
fileName: null,
fileNode: null
})
const addFileTableLoading = ref(false)
const catchSotre = useCatchStore();
const departs = catchStore.getDepartsAll();
const isDisabled = ref(false)
const isAuditButton = ref(false)
const datePicker = ref()
const serviceTime = ref([])
const editAll = ref(false)
// 删除
const delDialog = ref(false);
const delFormData = ref({});
const deleteFlag = ref(false)
// 审å‡<EFBFBD>金é¢<EFBFBD>规范
const fixPrecision = (num, precision = 2) => {
if (num === null || num === undefined || num === '') return 0
return parseFloat(Number(num).toFixed(precision))
}
const handleDel= async ()=> {
const body ={
id: route.query.id,
deleteReason: delFormData.value.deleteReason
}
await deleteReportProject(body);
closeFun();
}
const auditEdit = () => {
// 进入“全部å<EFBFBD>¯ç¼–辑模å¼<EFBFBD>â€<EFBFBD>
editAll.value = !editAll.value
// 报审信æ<EFBFBD>¯é‚£å<EFBFBD>—也解é”<EFBFBD>
isDisabled.value = !isDisabled.value
}
const shouldDisable = (val) => {
// 全局编辑模å¼<EFBFBD> & 进窗æ<EFBFBD>¢å¤<EFBFBD>:都应å…<EFBFBD>许编辑(除了 'audit' 控制区ä¸<EFBFBD>è¦<EFBFBD>放开)
if (val !== 'audit') {
if (editAll.value) return false;
if (formData.value.project.isRecessed == 1) return false;
}
// å<EFBFBD>¦åˆ™æŒ‰åŽŸå…ˆèŠ‚ç‚¹è§„åˆ™ç¦<EFBFBD>用
return isAuditEdit(val);
};
//获å<EFBFBD>–详情
const getDetailFun = async (val) => {
loading.value = true;
formData.value = await getDetail({"id": val});
if (route.query.disabledVal) {
isDisabled.value = true
}
debugger
//报审
if ((!['initial'].includes(formData.value.project.node))) {
isDisabled.value = true;
}
if (route.query.node && !['initial'].includes(route.query.node)) {
isDisabled.value = true;
}
if (route.query.isAudit) {
isAuditButton.value = true
}
if(formData.value.project.isRecessed == 1){
isDisabled.value = false;
}
//编辑
if (route.query.isAudit && userStore.user) {
//一审审计员
if (formData.value.project.node === 'first') {
formData.value.review.firstAuditor = userStore.user.nickName;
rulesDataTwo.value.firstMoney = [
{required: true, message: '请选择一审金é¢<EFBFBD>', trigger: 'blur'},
];
rulesDataTwo.value.firstReduceMoney = [
{required: true, message: '请选择一审审å‡<EFBFBD>金é¢<EFBFBD>', trigger: 'blur'},
];
rulesDataTwo.value.firstTime = [
{required: true, message: '请选择一审日期', trigger: 'blur'},
];
rulesDataTwo.value.firstAuditor = [
{required: true, message: '请输入一审审计人', trigger: 'blur'}
];
}
//二审审计员
if (formData.value.project.node === 'second') {
formData.value.review.secondAuditor = userStore.user.nickName;
rulesDataTwo.value.secondMoney = [
{required: true, message: '请选择二审金é¢<EFBFBD>', trigger: 'blur'},
];
rulesDataTwo.value.secondReduceMoney = [
{required: true, message: '请选择二审审å‡<EFBFBD>金é¢<EFBFBD>', trigger: 'blur'},
];
rulesDataTwo.value.secondTime = [
{required: true, message: '请选择二审日期', trigger: 'blur'},
];
rulesDataTwo.value.secondAuditor = [
{required: true, message: '请输入二审审计人', trigger: 'blur'}
];
if(!formData.value.review.secondMoney){
formData.value.review.secondMoney = formData.value.review.firstMoney || 0;
formData.value.review.secondReduceMoney = formData.value.review.firstReduceMoney || 0;
}
}
// 三审审计员
if (formData.value.project.node === 'third') {
formData.value.review.thirdlyAuditor = userStore.user.nickName;
rulesDataTwo.value.thirdlyMoney = [
{required: true, message: '请选择三审金é¢<EFBFBD>', trigger: 'blur'},
];
rulesDataTwo.value.thirdlyReduceMoney = [
{required: true, message: '请选择三审审å‡<EFBFBD>金é¢<EFBFBD>', trigger: 'blur'},
];
rulesDataTwo.value.thirdlyTime = [
{required: true, message: '请选择三审日期', trigger: 'blur'},
];
rulesDataTwo.value.thirdlyAuditor = [
{required: true, message: '请输入三审审计人', trigger: 'blur'}
];
if(!formData.value.review.thirdlyMoney){
formData.value.review.thirdlyMoney = formData.value.review.secondMoney || 0;
formData.value.review.thirdlyReduceMoney = formData.value.review.secondReduceMoney || 0
}
}
// 定案表审核
if (formData.value.project.node === 'original' || formData.value.project.node === 'audit') {
rulesData.value.referenceNumber = [
{required: true, message: '请输入文å<EFBFBD>·', trigger: 'blur'}
];
rulesData.value.publicationDate = [
{required: true, message: '请选择å<EFBFBD>‘文日期', trigger: 'blur'}
];
}
}
deleteFlag.value= formData.value.project.deleteFlag
query.value.applicantId =formData.value.project?.applicantId;
// query.value.departId = formData.value.project?.auditUnitId
getPoliceList();
await nextTick(() => {
if (datePicker.value) {
datePicker.value.handleClose()
}
})
loading.value = false;
}
//审查内容是å<EFBFBD>¦å…<EFBFBD>许编辑
const isAuditEdit = (val,label=null) => {
if(formData.value.project.isRecessed == 1 && label === null){
return false;
}
if (route.query.node) {
return true;
} else {
if (val instanceof Array) {
return !val.includes(formData.value.project.node)
}
return (formData.value.project.node !== val)
}
}
const isAuditShow = (val,label=null) => {
if(formData.value.project.isRecessed == 1 && label === null){
return false;
}
if (route.query.node) {
return true;
} else {
if (val instanceof Array) {
return val.includes(formData.value.project.node)
}
return (formData.value.project.node == val)
}
}
//删除附件
const delFileData = async (row,index) => {
await feedback.confirm(`确认删除附件 ?`)
if(row.request){
row.fileData =[]
}else{
formData.value.files[activeName.value].splice(index,1)
}
row.fileData=[]
}
const rulesData = ref({
reportType: [{required: true, message: '请选择报审类型', trigger: 'blur'}],
reportName: [{required: true, message: '请输入项目å<EFBFBD><EFBFBD>ç§°', trigger: 'blur'}],
projectType: [{required: true, message: '请选择项目类别', trigger: 'blur'}],
auditUnitId: [{required: true, message: '请选择审计å<EFBFBD>•ä½<EFBFBD>', trigger: 'blur'}],
projectUnitId: [{required: true, message: '请选择项目å<EFBFBD>•ä½<EFBFBD>', trigger: 'blur'}],
projectPrincipal: [{required: true, message: '请选择报审类型', trigger: 'blur'}],
projectPhone: [{required: true, message: '请选择负责人è<EFBFBD>”系方å¼<EFBFBD>', trigger: 'blur'}],
purchaseMethod: [{required: true, message: '请选择采购方å¼<EFBFBD>', trigger: 'blur'}],
reportMoney: [{required: true, message: '请选择报审金é¢<EFBFBD>', trigger: 'blur'}],
projectApprovalMoney: [{required: true, message: '请选择立项金é¢<EFBFBD>', trigger: 'blur'}],
projectApprovalLead: [{required: true, message: '请选择报审领导', trigger: 'blur'}],
applicant: [{required: true, message: '请输入报审人', trigger: 'blur'}],
applicantTime: [{required: true, message: '请输入报审日期', trigger: 'blur'}],
contractTime: [{required: true, message: '请输入å<EFBFBD>ˆå<EFBFBD>Œç­¾è®¢æ—¥æœŸ', trigger: 'blur'}],
contractMount: [{required: true, message: '请输入å<EFBFBD>ˆå<EFBFBD>Œé‡‘é¢<EFBFBD>', trigger: 'blur'}],
serviceUnit: [{required: true, message: '请输入æœ<EFBFBD>务å<EFBFBD>•ä½<EFBFBD>', trigger: 'blur'}],
serviceUnitManager: [{required: true, message: '请输入æœ<EFBFBD>务å<EFBFBD>•ä½<EFBFBD>负责人', trigger: 'blur'}],
serviceTime: [{required: true, message: '请输入报审日期', trigger: 'blur'}],
serviceUnitPhone: [{required: true, message: '请输入æœ<EFBFBD>务å<EFBFBD>•ä½<EFBFBD>è<EFBFBD>”系电è¯<EFBFBD>', trigger: 'blur'}],
projectApprovalTime: [{required: true, message: '请输入立项日期', trigger: 'blur'}],
applyGovernmentTime: [{required: true, message: '请选择申报政府采购日期', trigger: 'blur'}],
purchaseTime: [{required: true, message: '请选择采购日期', trigger: 'blur'}],
})
const rulesDataTwo = ref({
reviewStatus: [
{required: true, message: '请输入审计情况', trigger: 'blur'}
],
reviewGist: [
{required: true, message: '请输入审计ä¾<EFBFBD>æ<EFBFBD>®', trigger: 'blur'}
],
reviewContent: [
{required: true, message: '请输入主è¦<EFBFBD>内容', trigger: 'blur'}
],
isExploration: [
{required: true, message: '请选择是å<EFBFBD>¦å‹˜å¯Ÿ', trigger: 'blur'}
],
isCross: [
{required: true, message: '请选择是å<EFBFBD>¦å¯¹å®¡', trigger: 'blur'}
]
})
const files = ref([])
//关闭弹窗
const closeFile = () => {
preview.value = false;
}
//获å<EFBFBD>–æµ<EFBFBD>程
const reportFlowDialog = ref(false)
const reportFlowTable = ref([])
const reportFlowLoading = ref(false)
const getReportFlowFun = async () => {
reportFlowDialog.value = true
reportFlowLoading.value=true
const res = await getReportFlow({id:formData.value.project.id,code:'report'});
reportFlowLoading.value=false
reportFlowTable.value = res;
}
//ä¿<EFBFBD>存数æ<EFBFBD>®
const saveFun = async () => {
if (['initial', 'review'].includes(formData.value.project.node)) {
await formDataRef.value.validate();
} else if (["first", "second", "third"].includes(formData.value.project.node)) {
await formReviewRef.value.validate();
} else if (["original"].includes(formData.value.project.node)) {
await formDataRef.value.validate(); // 增加这部分校验
}
loading.value = true;
const res = await saveReportProject(formData.value);
feedback.msgSuccess("ä¿<EFBFBD>å­˜æˆ<EFBFBD>功");
formData.value = res;
await nextTick(() => {
if (datePicker.value) {
datePicker.value.handleClose()
}
})
loading.value = false;
return true;
}
const formatDateOnly = (value) => {
if (!value) return '';
if (value instanceof Date) {
return timeFormat(value, 'yyyy-mm-dd');
}
return String(value).slice(0, 10);
}
const isInitialSubmitApplicantTimeValid = () => {
if (formData.value.project.node !== 'initial') {
return true;
}
const applicantDate = formatDateOnly(formData.value.project.applicantTime);
const today = formatDateOnly(new Date());
return applicantDate === today;
}
//ä¿<EFBFBD>存并且æ<EFBFBD>¢å¤<EFBFBD>
const saveUpRecessed =async ()=>{
loading.value = true;
const res = await saveReportProject(formData.value);
formData.value = res;
await nextTick(() => {
if (datePicker.value) {
datePicker.value.handleClose()
}
})
//todoæ<EFBFBD>¢å¤<EFBFBD>入窗
await feedback.confirm("确定è¦<EFBFBD>进窗å<EFBFBD>—?");
const data = await recessedData({id:formData.value.project.id});
feedback.msgSuccess("å·²é‡<EFBFBD>新进窗")
getDetailFun(formData.value.project.id)
loading.value = false;
return true;
}
//æ<EFBFBD><EFBFBD>交数æ<EFBFBD>®
const submitFun = async () => {
if (!isInitialSubmitApplicantTimeValid()) {
feedback.msgError('请检查报审日期是å<EFBFBD>¦ä¸ºä»Šå¤©ï¼<EFBFBD>');
return;
}
await saveFun()
dialog.value = true
}
//审核通过以å<EFBFBD>Žï¼Œå±•示详情
const submitFeedback = () => {
dialog.value = false
getDetailFun(formData.value.project.id)
closeFun();
}
//获å<EFBFBD>–å<EFBFBD>•ä½<EFBFBD>为简称
// 获å<EFBFBD>–å<EFBFBD>•ä½<EFBFBD>为简称 - 性能优化:使用Map缓存查找结果
const departNameCache = new Map();
function getDepartShortName(departData, id, rowName) {
// 优先从缓存获å<EFBFBD>
const cacheKey = `${id}_${rowName}`;
if (departNameCache.has(cacheKey)) {
formData.value.project[rowName] = departNameCache.get(cacheKey);
return;
}
if (departData) {
for (let i = 0; i < departData.length; i++) {
let s = departData[i];
if (s.id === id) {
formData.value.project[rowName] = s.shortName;
departNameCache.set(cacheKey, s.shortName);
break;
}
if (s.children) {
const childResult = findDepartInChildren(s.children, id);
if (childResult) {
formData.value.project[rowName] = childResult;
departNameCache.set(cacheKey, childResult);
break;
}
}
}
}
}
// 辅助函数:递归查找å­<EFBFBD>部门
function findDepartInChildren(children, id) {
for (let i = 0; i < children.length; i++) {
let s = children[i];
if (s.id === id) {
return s.shortName;
}
if (s.children) {
const result = findDepartInChildren(s.children, id);
if (result) return result;
}
}
return null;
}
//获å<EFBFBD>–tabå<EFBFBD><EFBFBD>
const handleClick = (tab, event) => {
activeName.value = tab.props.name
filesData.value = []
}
//关闭
const closeFun = () => {
if(route.query.disabledVal){
useTabsStore().removeTab('/entryWindow', router);
router.push({path:route.query.backPath})
}
if (route.query.node) {
useTabsStore().removeTab('/report/edit/controlPrice', router);
router.push({path:route.query.backPath})
} else {
useTabsStore().removeTab('/report/edit/controlPrice', router);
router.push({path:"/work", query:{"load": true}})
}
}
//入窗审批界é<EFBFBD>¢å…³é—­
const closeAudit = () => {
dialog.value = false
finishDialog.value = false;
rejectDialog.value = false
}
//æ ¹æ<EFBFBD>®è¾“入值获å<EFBFBD>–ä¿¡æ<EFBFBD>¯
const inputGetList = (val) => {
query.value.name = val;
getPoliceList()
}
//审核人
const query = ref({
current: 1,
size:100,
departBranch: true
});
let polices = ref([])
function getPoliceList() {
// query.value.departId = formData.value.project.auditUnitId;
listPolice(query.value).then((data) => {
polices.value = data.records;
});
}
let date = ref()
//删除数æ<EFBFBD>®
const removeFun = async () => {
debugger
delDialog.value = true;
// await feedback.confirm("是å<EFBFBD>¦ç¡®è®¤åˆ é™¤æ•°æ<EFBFBD>®ï¼Ÿ");
// const res = await removeReportProject(route.query.id);
// closeFun();
}
//æ<EFBFBD><EFBFBD>交审批
const approveFun = async () => {
debugger
if (['audit'].includes(formData.value.project.node)){
if (!hasAuditAttachment()) {
feedback.msgWarning("请上传ã€<EFBFBD>审计附件】");
activeName.value = "audit";
return;
}
}
if (!['initial'].includes(formData.value.project.node)) {
const promise = await saveFun();
if (promise) {
finishDialog.value = true
isAudit.value = true
}
}
finishDialog.value = true
isAudit.value = true
}
//结æ<EFBFBD>Ÿ
const endFun =async ()=>{
debugger
if (!hasAuditAttachment()) {
feedback.msgWarning("请回退并上传ã€<EFBFBD>审计附件】");
activeName.value = "audit";
return;
}
try {
await formDataRef.value.validate()
} catch (error) {
feedback.msgWarning("请输入必填项");
return
}
endDialog.value = true
isAudit.value = true
}
//驳回
const rejectFun = () => {
isAudit.value = false
rejectDialog.value = true;
}
//一审ã€<EFBFBD>二审ã€<EFBFBD>三审是å<EFBFBD>¦æ˜¾ç¤º
const isShowFun = (list = []) => {
if (route.query.node) {
if (['Lead', 'original', 'audit','end'].includes(route.query.node)) {
return true
} else {
return list.includes(route.query.node)
}
} else {
if (['Lead', 'original', 'audit','end'].includes(formData.value.project.node)) {
return true
} else {
return list.includes(formData.value.project.node)
}
}
}
//tab是å<EFBFBD>¦æ˜¾ç¤º
function FileTabShowFun (){
let show = true;
if(!formData.value.project.node){
return false;
}
let data = formData.value.project.node;
switch (data){
case "initial":
case "review":
show=false;
break
default:
show=true;
break
}
return show;
}
function showSjbg() {
if(!formData.value.project.node){
return false;
}
const node = formData.value.project.node;
const nodes = ['original', 'audit', 'end'];
return nodes.indexOf(node) > -1
}
//打开文件上传界é<EFBFBD>¢ï¼Œè®°å½•文件上传行index
const upFileDialog =ref(false)
let fileIndex = ref(0);
// 上传界é<EFBFBD>¢çš„æ‰“å¼€
const showUpFileDialog = (index)=>{
upFileDialog.value=true;
fileIndex.value=index;
const key = activeName.value;
const list = formData.value.files[key] || (formData.value.files[key] = []);
const row = list[index];
if (row && !Array.isArray(row.fileData)) row.fileData = [];
}
let importLoading;
function beforeUpload() {
importLoading = ElLoading.service({
lock: true,
text: "æ•°æ<EFBFBD>®å¯¼å…¥ä¸­",
background: "rgba(0, 0, 0, 0.7)",
});
}
//添加附件
const addFileTable =()=>{
fileTable.value.fileNode =activeName.value
addFileDialog.value=true;
}
const addFileSubmit = ()=>{
addFileTableLoading.value=true;
if(!formData.value.files[activeName.value]){
formData.value.files[activeName.value] = []
}
formData.value.files[activeName.value].push({ fileData: [], ...fileTable.value });
addFileDialog.value=false;
addFileTableLoading.value=false;
}
const fileDialogClose = ()=>{
fileTable.value={
request: false,
type: "普通附件",
fileName: null,
fileNode: null,
fileData:[]
}
addFileDialog.value=false;
}
//添加附件按钮是å<EFBFBD>¦æ˜¾ç¤º
function addFileFun(val) {
debugger
let show = true;
console.log("adaddFileFunVal== " + val)
console.log("formData.value.project.node==" + formData.value.project.node)
switch (val) {
case "initial":
if (route.query.node) {
show = route.query.node === 'initial';
} else {
show = formData.value.project.node === "initial"
}
break
case "exploration":
case "cross":
case "audit":
show = !(['first','second','third','Lead', 'original','audit'].indexOf(formData.value.project.node) < 0);
break;
}
console.log("show" + show)
if(formData.value.project.isRecessed == 1){
return true;
}
return show;
}
/**
* 附件上传或删除
* @param node 按钮所属tab
* */
function disableFileBtn(node){
//报审附件 initial
//审核附件 audit
//勘察附件 exploration
//对审附件 cross
console.log('activeName=='+ node)
console.log('formData.value.project.node==' + formData.value.project.node)
let disable;
switch (node){
case "initial":
//å<EFBFBD>ªåœ¨ç¼–辑环境å<EFBFBD>¯ä»¥ä½¿ç”¨
disable = isDisabled.value;
break;
case "audit":
disable =(['first','second','third','Lead', 'original','audit'].indexOf(formData.value.project.node) < 0);
break;
case "exploration":
disable =(['first','second','third','Lead'].indexOf(formData.value.project.node) < 0);
break;
case "cross":
disable =(['first','second','third','Lead'].indexOf(formData.value.project.node) < 0);
break;
case "sjbg":
disable =(['original','audit'].indexOf(formData.value.project.node) < 0);
break;
default:
disable=true;
break
}
//判断数æ<EFBFBD>®æƒ…况
if(formData.value.project.isRecessed == 1){
return false;
}
return disable;
}
//定案表导出
const getExcelContrilPriceFun = async ()=>{
if(formData.value.review.finalizationPath){
window.open(`${BASE_PATH}/file/stream/${formData.value.review.finalizationPath}`);
}else{
let name =formData.value.project.reportName + formData.value.project.reportType+"定案表.xls"
const res = await getExcelContrilPrice(formData.value.project.id, name);
}
}
const isCityAudit = computed(()=>{
if( formData.value?.project?.projectApprovalMoney){
return formData.value?.project?.projectApprovalMoney >= 200000
}else{
return false;
}
})
async function handleSuccess(result, file){
importLoading.close();
if (result.code !== 200) {
feedback.msgError("上传失败");
return;
}
formData.value.review.finalizationPath = result.data.filePath;
const res = await upFinalizationPathFun(formData.value);
feedback.msgSuccess("导入完æˆ<EFBFBD>")
}
// const DepartList = ref(null)
//获å<EFBFBD>–上级å<EFBFBD>•ä½<EFBFBD>(判断超级管ç<EFBFBD>†å‘˜ã€<EFBFBD>是å<EFBFBD>¦äºŒçº§å<EFBFBD>•ä½<EFBFBD>)
const getSuperiorUnitByUnitFun = ()=>{
let {project} = formData.value;
let auditUnitId = getDictValue(dict.AuditUnitPresetting,"市局审计å<EFBFBD>•ä½<EFBFBD>");
let departId = userStore.user.departId;
//获å<EFBFBD>– 二级å<EFBFBD>•ä½<EFBFBD>列表,判断当å‰<EFBFBD>登陆人是å<EFBFBD>¦ä¸ºäºŒçº§å<EFBFBD>•ä½<EFBFBD>
let departList = catchSotre.getDepartsAll();
let departIds = departList.map(s=>s.id);
if(departIds.indexOf(departId) >= 0){
project.auditUnitId=auditUnitId;
}
// else{
// //获å<EFBFBD>–它的上层å<EFBFBD>•ä½<EFBFBD>
// const depart = getDepartContent(departs,departId);
// if(depart){
// DepartList.value =getDepartContent(departs,depart.pid)
// }
// project.auditUnitId =( depart!= null?depart.pid:auditUnitId);
// }
//
// //判断是å<EFBFBD>¦æ˜¯è¶…级管ç<EFBFBD>†å‘˜
// if(departId){
// if(auditUnitId === departId){
// DepartList.value=null;
// project.auditUnitId=auditUnitId;
// }else{
//
// }
// }else{
// project.auditUnitId=auditUnitId;
// }
getDepartShortName(departs,auditUnitId,'auditUnit');
}
// 监控是å<EFBFBD>¦ä¸ºåˆ›å»º
watch(() => route.query.id, (val) => {
if (val) {
getDetailFun(val);
} else {
//åˆ<EFBFBD>始化数æ<EFBFBD>®
if (userStore.user) {
query.value.applicantId = userStore.user.userName;
formData.value.project.projectUnitId = userStore.user?.departId;
formData.value.project.applicantId = userStore.user.userName;
formData.value.project.applicant = userStore.user.nickName;
formData.value.project.applicantTime =timeFormat(new Date(),'yyyy-mm-dd hh:MM:ss');
getSuperiorUnitByUnitFun();
}
}
}, {deep: true, immediate: true})
//报审人姓å<EFBFBD><EFBFBD>
watch(()=>formData.value.project.applicantId,(val)=>{
if(val && polices.value.length > 0 && polices.value.filter(s=>s.idCode === val) > 0){
formData.value.project.applicant =polices.value.filter(s=>s.idCode === val)[0].name;
}
},{deep:true,immediate:true})
//监测是å<EFBFBD>¦æ˜¯ç»“算项目报审
watch(() => route.query.isEnd, (val) => {
if(val){
isEndData.value = val === 'true';
if (isEndData.value) {
formData.value.project.reportType = '结算项目'
} else {
formData.value.project.reportType = '项目控制价'
}
}else{
//关闭窗å<EFBFBD>£
useTabsStore().removeTab('/report/edit/controlPrice', router);
}
}, {deep: true, immediate: true})
//附件列表
watch(() => formData.value.project.projectType, (val) => {
// 有 id 的时候,说明是编辑/详情,ä¸<EFBFBD>è¦<EFBFBD>覆盖å<EFBFBD>Žç«¯é™„ä»¶
if (route.query.id) return;
if (!(route.query.node || route.query.isAudit)) {
let fileDataList = isEndData.value ? fileEndDict : fileDict;
if (val) {
let data = fileDataList.value.filter(s => s.type.includes(val))
formData.value.files.initial = data ? data[0].fileData : fileDataList.value[0].fileData
} else {
formData.value.files.initial = fileDataList.value[0].fileData
}
}
}, {immediate: true, deep: true})
//监测å<EFBFBD>•ä½<EFBFBD>,获å<EFBFBD>–å<EFBFBD>•ä½<EFBFBD>简称
watch(() => formData.value.project.projectUnitId, (val) => {
if (val) {
getDepartShortName(departs, val, 'projectUnit')
}
}, {immediate: true, deep: true})
//监测审计å<EFBFBD>•ä½<EFBFBD>,获å<EFBFBD>–审计å<EFBFBD>•ä½<EFBFBD>简称
watch(() => formData.value.project.auditUnitId, (val) => {
if (val) {
getPoliceList();
getDepartShortName(departs, val, 'auditUnit')
}
}, {immediate: true, deep: true})
//一审审å‡<EFBFBD>金é¢<EFBFBD>
watch(()=>formData.value.review.firstMoney,(val)=>{
if( val){
const reduceMoney = Number(formData.value.project.reportMoney) - Number(val)
formData.value.review.firstReduceMoney = fixPrecision(reduceMoney)
// formData.value.review.firstReduceMoney = formData.value.project.reportMoney - formData.value.review.firstMoney
}
},{deep:true})
//二审审å‡<EFBFBD>金é¢<EFBFBD>
watch(()=>formData.value.review.secondMoney,(val)=>{
if(val){
const reduceMoney = Number(formData.value.project.reportMoney) - Number(val)
formData.value.review.secondReduceMoney = fixPrecision(reduceMoney)
// formData.value.review.secondReduceMoney = formData.value.project.reportMoney - formData.value.review.secondMoney
}
},{deep:true})
//三审审å‡<EFBFBD>金é¢<EFBFBD>
watch(()=>formData.value.review.thirdlyMoney,(val)=>{
if(val){
const reduceMoney = Number(formData.value.project.reportMoney) - Number(val)
formData.value.review.thirdlyReduceMoney = fixPrecision(reduceMoney)
// formData.value.review.thirdlyReduceMoney = formData.value.project.reportMoney - formData.value.review.thirdlyMoney
}
},{deep:true})
function hasAuditAttachment() {
const auditRows = formData.value?.files?.audit || [];
// å<EFBFBD>ªè¦<EFBFBD>ä»»æ„<EFBFBD>一行 fileData 有文件,就算通过
return auditRows.some(row => Array.isArray(row.fileData) && row.fileData.length > 0);
}
</script>
<template>
<div class="wrapper control-price-page" v-loading="loading">
<main>
<el-header>
<h2 style="text-align: center">{{ isEndData ? '结算项目报审' : '控制价项目报审' }}</h2>
</el-header>
<el-main>
<div class="flex v-center" style="height:30px;margin-bottom: 10px">
<h5>报审信æ<EFBFBD>¯</h5>
</div>
<div>
<el-form :loading="loading" :model="formData.project" ref="formDataRef" :rules="rulesData" label-width="140">
<el-row>
<el-col :span="6">
<el-form-item label="报审类型" prop="reportType">
<el-select :disabled="true" v-model="formData.project.reportType">
<el-option value="项目控制价" label="项目控制价"></el-option>
<el-option value="结算项目" label="结算项目"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="项目å<EFBFBD><EFBFBD>ç§°" prop="reportName">
<el-tooltip
effect="dark"
:content="formData.project.reportName"
placement="top"
:disabled="!formData.project.reportName"
>
<el-input
v-model="formData.project.reportName"
:disabled="isDisabled"
show-word-limit
maxlength="200"
/>
</el-tooltip>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="项目类别">
<el-select :disabled="isDisabled" v-model="formData.project.projectType">
<el-option value="æœ<EFBFBD>务类" label="æœ<EFBFBD>务类"></el-option>
<el-option value="工程类" label="工程类"></el-option>
<el-option value="货物类" label="货物类"></el-option>
<el-option value="ä¿¡æ<EFBFBD>¯åŒ–ç±»" label="ä¿¡æ<EFBFBD>¯åŒ–ç±»"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="审计å<EFBFBD>•ä½<EFBFBD>" prop="auditUnitId">
<depart-tree-select :auth="false" :disabled="isDisabled" v-model="formData.project.auditUnitId"
:size="'default'" placeholder="" clearable :disableRoot="true"
:onlySecondLevel="true"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="项目å<EFBFBD>•ä½<EFBFBD>" prop="projectUnitId">
<depart-tree-select :auth="false" :disabled="isDisabled" v-model="formData.project.projectUnitId"
:size="'default'" placeholder="" clearable :disableRoot="true"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="项目负责人" prop="projectPrincipal">
<el-input :disabled="isDisabled" v-model="formData.project.projectPrincipal"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="负责人è<EFBFBD>”系方å¼<EFBFBD>" prop="projectPhone">
<el-input :disabled="isDisabled" v-model="formData.project.projectPhone"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item v-if="isEndData" label="报审金é¢<EFBFBD>(元)" prop="reportMoney">
<el-input :disabled="isDisabled" type="number" v-model="formData.project.reportMoney"></el-input>
</el-form-item>
<el-form-item v-else label="采购方å¼<EFBFBD>" prop="purchaseMethod">
<el-select :disabled="isDisabled" v-model="formData.project.purchaseMethod">
<el-option v-for="(item,index) in dict.procurementMethod" :key="index"
:label="item.dictLabel"
:value="item.dictValue"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item v-if="isEndData" label="立项日期" prop="projectApprovalTime">
<el-date-picker
value-format="YYYY-MM-DD HH:mm:ss"
:disabled="isDisabled"
v-model="formData.project.projectApprovalTime"
style="width: 100%"
type="date"
placeholder="选择立项日期"
/>
</el-form-item>
<el-form-item v-else label="报审金é¢<EFBFBD>(元)" prop="reportMoney">
<el-input :disabled="isDisabled" type="number" v-model="formData.project.reportMoney"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="立项金é¢<EFBFBD>(元)" prop="projectApprovalMoney">
<el-input :disabled="isDisabled" type="number"
v-model="formData.project.projectApprovalMoney"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="立项审批领导" prop="projectApprovalLead">
<el-input :disabled="isDisabled" v-model="formData.project.projectApprovalLead"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="报审人" prop="applicant">
<!-- <el-input :disabled="isDisabled" v-model="formData.project.applicant"></el-input>-->
<el-select :disabled="isDisabled" remote v-model="formData.project.applicantId" :remote-method="inputGetList"
filterable>
<el-option v-for="(item,index) in polices" :key="index" :value="item.idCode"
:label="item.name"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6" v-if="isEndData && formData.project.projectApprovalMoney >= 200000 ">
<el-form-item label="申报政府采购日期" prop="applyGovernmentTime">
<el-date-picker
value-format="YYYY-MM-DD HH:mm:ss"
:disabled="isDisabled"
v-model="formData.project.applyGovernmentTime"
style="width: 100%"
type="date"
placeholder="选择申报政府采购日期"
/>
</el-form-item>
</el-col>
<el-col :span="6" v-if="isEndData">
<el-form-item label="采购方å¼<EFBFBD>" prop="purchaseMethod">
<el-select :disabled="isDisabled" v-model="formData.project.purchaseMethod">
<el-option v-for="(item,index) in dict.procurementMethod" :key="index"
:label="item.dictLabel"
:value="item.dictValue"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6" v-if="isEndData">
<el-form-item label="采购日期" prop="purchaseTime">
<el-date-picker
value-format="YYYY-MM-DD HH:mm:ss"
:disabled="isDisabled"
v-model="formData.project.purchaseTime"
style="width: 100%"
type="date"
placeholder="选择采购日期"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="报审日期" prop="applicantTime">
<el-date-picker
value-format="YYYY-MM-DD HH:mm:ss"
:disabled="isDisabled"
v-model="formData.project.applicantTime"
style="width: 100%"
type="date"
placeholder="选择报审日期"
/>
</el-form-item>
</el-col>
<el-col v-if="!isEndData && (!isAuditEdit(['original','audit'], 'æ–‡å<EFBFBD>·') || formData.project.node === 'end')" :span="6">
<el-form-item label="æ–‡å<EFBFBD>·" prop="referenceNumber">
<el-input :disabled="shouldDisable(['original','audit'])" v-model="formData.project.referenceNumber" />
</el-form-item>
</el-col>
<el-col v-if="!isEndData && (!isAuditEdit(['original','audit'],'å<EFBFBD>‘文日期')) || formData.project.node === 'end'" :span="6">
<el-form-item label="å<EFBFBD>‘文日期" prop="publicationDate">
<el-date-picker
value-format="YYYY-MM-DD HH:mm:ss"
:disabled="shouldDisable(['original','audit'])"
v-model="formData.project.publicationDate"
style="width: 100%"
type="date"
placeholder="选择å<EFBFBD>‘文日期"
/>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="isEndData">
<el-col :span="6">
<el-form-item label="å<EFBFBD>ˆå<EFBFBD>Œç­¾è®¢æ—¥æœŸ" prop="contractTime">
<el-date-picker
value-format="YYYY-MM-DD HH:mm:ss"
:disabled="isDisabled"
v-model="formData.project.contractTime"
style="width: 100%"
type="date"
placeholder="选择报å<EFBFBD>ˆå<EFBFBD>Œç­¾è®¢æ—¥æœŸ"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="å<EFBFBD>ˆå<EFBFBD>Œé‡‘é¢<EFBFBD>" prop="contractMount">
<el-input :disabled="isDisabled" type="number" v-model="formData.project.contractMount"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="æœ<EFBFBD>务å<EFBFBD>•ä½<EFBFBD>" prop="serviceUnit">
<el-input :disabled="isDisabled" v-model="formData.project.serviceUnit"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="æœ<EFBFBD>务å<EFBFBD>•ä½<EFBFBD>负责人" prop="serviceUnitManager">
<el-input :disabled="isDisabled" v-model="formData.project.serviceUnitManager"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="isEndData">
<el-col :span="6">
<el-form-item label="æœ<EFBFBD>务日期" prop="serviceTime">
<el-date-picker
value-format="YYYY-MM-DD HH:mm:ss"
ref="datePicker"
:disabled="isDisabled"
v-model="formData.project.serviceTime"
type="daterange"
range-separator="-"
start-placeholder="开始æœ<EFBFBD>务日期"
end-placeholder="结æ<EFBFBD>Ÿæœ<EFBFBD>务日期"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="æœ<EFBFBD>务å<EFBFBD>•ä½<EFBFBD>è<EFBFBD>”系电è¯<EFBFBD>" prop="serviceUnitPhone">
<el-input :disabled="isDisabled" v-model="formData.project.serviceUnitPhone"></el-input>
</el-form-item>
</el-col>
<el-col :span="6" v-if="!isAuditEdit(['original','audit']) || formData.project.node === 'end'">
<el-form-item label="æ–‡å<EFBFBD>·" prop="referenceNumber">
<el-input :disabled="isAuditEdit(['original','audit'])" v-model="formData.project.referenceNumber" />
</el-form-item>
</el-col>
<el-col :span="6" v-if="!isAuditEdit(['original','audit']) || formData.project.node === 'end'">
<el-form-item label="å<EFBFBD>‘文日期" prop="publicationDate">
<el-date-picker
value-format="YYYY-MM-DD HH:mm:ss"
:disabled="isAuditEdit(['original','audit'])"
v-model="formData.project.publicationDate"
style="width: 100%"
type="date"
placeholder="选择å<EFBFBD>‘文日期"
/>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="deleteFlag">
<el-col :span="15">
<el-form-item label="删除原因" >
<el-input type="textarea" :rows="5" :disabled="true"
v-model="formData.project.deleteReason"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<hr style="border-color: rgba(232,232,232,0.67);opacity: 0.2">
<div class="flex v-center" style="height:30px;margin-bottom: 10px">
<h5>审计信æ<EFBFBD>¯</h5>
</div>
<el-form
v-if="!(['initial','review'].includes(formData.project.node) || ['initial','review'].includes(route.query.node))"
:model="formData.review" ref="formReviewRef" :rules="rulesDataTwo" label-width="160">
<!-- 一审 -->
<el-row :gutter="20" v-if="isShowFun(['first','second','third']) ">
<el-col :span="6">
<el-form-item label="一审金é¢<EFBFBD>(å…ƒ)" prop="firstMoney">
<el-input :disabled="shouldDisable('first')" type="number" v-model="formData.review.firstMoney"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="一审审å‡<EFBFBD>金é¢<EFBFBD>(å…ƒ)" prop="firstReduceMoney">
<el-input :disabled="shouldDisable('first')" type="number"
v-model="formData.review.firstReduceMoney"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="一审日期" prop="firstTime">
<el-date-picker
value-format="YYYY-MM-DD HH:mm:ss"
:disabled="shouldDisable('first')"
v-model="formData.review.firstTime"
style="width: 100%"
type="date"
placeholder="选择一审日期"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="一审审计员" prop="firstAuditor">
<el-input :disabled="shouldDisable('first')" v-model="formData.review.firstAuditor"></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 二审-->
<el-row :gutter="20" v-if="isShowFun(['second','third'])">
<el-col :span="6 ">
<el-form-item label="二审金é¢<EFBFBD>(å…ƒ)" prop="secondMoney">
<el-input :disabled="shouldDisable('second')" type="number"
v-model="formData.review.secondMoney"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="二审审å‡<EFBFBD>金é¢<EFBFBD>(å…ƒ)" prop="secondReduceMoney">
<el-input :disabled="shouldDisable('second')" type="number"
v-model="formData.review.secondReduceMoney"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="二审日期" prop="secondTime">
<el-date-picker
value-format="YYYY-MM-DD HH:mm:ss"
:disabled="shouldDisable('second')"
v-model="formData.review.secondTime"
style="width: 100%"
type="date"
placeholder="选择二审日期"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="二审审计员" prop="secondAuditor">
<el-input :disabled="shouldDisable('second')" v-model="formData.review.secondAuditor"></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 三审-->
<el-row :gutter="20" v-if="isShowFun(['third'])">
<el-col :span="6">
<el-form-item label="三审金é¢<EFBFBD>(å…ƒ)" prop="thirdlyMoney">
<el-input :disabled="shouldDisable('third')" type="number"
v-model="formData.review.thirdlyMoney"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="三审审å‡<EFBFBD>金é¢<EFBFBD>(å…ƒ)" prop="thirdlyReduceMoney">
<el-input :disabled="shouldDisable('third')" type="number"
v-model="formData.review.thirdlyReduceMoney"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="三审日期" prop="thirdlyTime">
<el-date-picker
value-format="YYYY-MM-DD HH:mm:ss"
:disabled="shouldDisable('third')"
v-model="formData.review.thirdlyTime"
style="width: 100%"
type="date"
placeholder="选择三审日期"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="三审审计员" prop="thirdlyAuditor">
<el-input :disabled="shouldDisable('third')" v-model="formData.review.thirdlyAuditor"></el-input>
</el-form-item>
</el-col>
</el-row>
<!--审查ä¾<EFBFBD>æ<EFBFBD>®-->
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="审计情况" prop="reviewStatus">
<el-input :disabled="shouldDisable(['first','third','second'])" type="textarea" :rows="5"
v-model="formData.review.reviewStatus"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审计ä¾<EFBFBD>æ<EFBFBD>®" prop="reviewGist">
<el-input :disabled="shouldDisable(['first','third','second'])" type="textarea" :rows="5"
v-model="formData.review.reviewGist"></el-input>
</el-form-item>
</el-col>
</el-row>
<!--审查内容-->
<el-row :gutter="20">
<el-col>
<el-form-item label="主è¦<EFBFBD>内容" prop="reviewContent">
<el-input :disabled="shouldDisable(['first','third','second'])" type="textarea" :rows="5"
v-model="formData.review.reviewContent"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="勘察情况" prop="isExploration">
<el-radio-group :disabled="shouldDisable(['first','third','second'])"
v-model="formData.review.isExploration">
<el-radio value="1">已勘察</el-radio>
<el-radio value="2">未勘察</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="对审情况" prop="isCross">
<el-radio-group :disabled="shouldDisable(['first','third','second'])" v-model="formData.review.isCross">
<el-radio value="1">已对审</el-radio>
<el-radio value="2">未对审</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="定案表" v-if="isAuditShow(['original','audit','end']) ">
<div class="flex between">
<div >
<el-button type="primary" link @click="getExcelContrilPriceFun">导出定案表</el-button>
</div>
<div v-if="!isAuditEdit(['original']) ">
<el-upload
:multiple="false"
:show-file-list="false"
:action="`${BASE_PATH}/file/upload`"
:headers="{ Authorization: getToken() }"
:before-upload="beforeUpload"
@success="handleSuccess"
>
<el-button type="primary" link>
导入定案表
</el-button>
</el-upload>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="table-container">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="报审附件" name="initial"></el-tab-pane>
<el-tab-pane v-if="FileTabShowFun()" label="审计附件" name="audit"></el-tab-pane>
<el-tab-pane v-if="formData.review?.isExploration === '1'" label="勘察附件" name="exploration"></el-tab-pane>
<el-tab-pane v-if="formData.review?.isCross === '1'" label="对审附件" name="cross"></el-tab-pane>
<el-tab-pane v-if="showSjbg()" label="审计报告" name="sjbg"></el-tab-pane>
</el-tabs>
<!-- 新增的æ<EFBFBD><EFBFBD>示信æ<EFBFBD>¯ -->
<div class="table-tips" style="margin-bottom: 10px; ">
<el-alert
title='点击åº<EFBFBD>å<EFBFBD>·å·¦ä¾§"å°<EFBFBD>三角"å<EFBFBD>¯ä»¥å±•开查看附件详情'
type="warning"
:closable="false"
show-icon
style="padding: 8px 16px; "
/>
</div>
<el-table :data="formData.files[activeName]" preserve-expanded-content style="z-index:9">
<el-table-column type="expand">
<template #default="props">
<div v-if="props.row?.fileData">
<file-list v-model:files="props.row.fileData" :removeEnable="false" ></file-list>
</div>
<div v-else>
<p style="color: darkgray;text-align: center">无附件</p>
</div>
</template>
</el-table-column>
<el-table-column width="100" type="index" label="åº<EFBFBD>å<EFBFBD>·" :index="(index)=> index+1"></el-table-column>
<el-table-column label="附件类型" prop="type" width="150"></el-table-column>
<el-table-column label="上传" width="200">
<template #default="{$index,row}">
<el-button type="primary" :disabled="disableFileBtn(activeName)" @click="showUpFileDialog($index)"
>上传
<template #icon>
<icon name="el-icon-upload-filled"/>
</template>
</el-button>
</template>
</el-table-column>
<el-table-column label="删除" width="200">
<template #default="{row,$index}">
<el-button type="default" :disabled="disableFileBtn(activeName)" @click="delFileData(row,$index)">删除
</el-button>
</template>
</el-table-column>
<el-table-column label="资料å<EFBFBD><EFBFBD>ç§°" prop="fileName" ></el-table-column>
<el-table-column label="文件上传情况" prop="name" show-overflow-tooltip>
<template #default="{row}" >
<el-tag v-if="row.fileData && row.fileData.length > 0" type="success">已上传</el-tag>
<el-tag v-else>未上传</el-tag>
</template>
</el-table-column>
<el-table-column label="上传人" prop="crtUser"></el-table-column>
<el-table-column label="上传时间" prop="crtTime"></el-table-column>
</el-table>
<div v-if="addFileFun(activeName)"
class="mb-10"
style="display: flex;justify-content: center;align-items: center;width: 100%">
<el-button type="primary" style="width: 80vw;height: 30px;margin-top: 20px" @click="addFileTable()">新增附件</el-button>
</div>
</div>
<div class="flex end mt-20" v-if="formData.project && formData.project.isRecessed == 1">
<el-button type="primary" :loading="loading" @click="saveFun">ä¿<EFBFBD>å­˜</el-button>
<el-button type="primary" :loading="loading" @click="saveUpRecessed">é‡<EFBFBD>新进窗</el-button>
</div>
<div v-else-if="isAuditButton" class="flex end mt-20">
<el-button @click="closeFun">关闭</el-button>
<el-button type="primary" @click="getReportFlowFun">审批记录</el-button>
<el-button type="primary" @click="auditEdit">编辑</el-button>
<el-button type="danger" @click="removeFun">删除</el-button>
<el-button v-if="!isAuditEdit('audit')" type="primary" @click="endFun" >结æ<EFBFBD>Ÿ</el-button>
<el-button v-else type="primary" @click="approveFun">æ<EFBFBD><EFBFBD>交</el-button>
<el-button type="danger" @click="rejectFun">驳回</el-button>
</div>
<div v-else-if="route.query.disabledVal" class="flex end mt-20">
<el-button type="primary" @click="getReportFlowFun">审批记录</el-button>
<el-button type="danger" @click="removeFun">删除</el-button>
<el-button @click="closeFun">关闭</el-button>
</div>
<div v-else-if="route.query.disabledVal && deleteFlag" class="flex end mt-20">
<el-button @click="closeFun">关闭</el-button>
</div>
<div class="flex end mt-20" v-else >
<el-button v-if="!isDisabled && !editAll" type="primary" @click="submitFun">æ<EFBFBD><EFBFBD>交</el-button>
<el-button v-if="!isDisabled && !editAll" type="primary" @click="saveFun">ä¿<EFBFBD>å­˜</el-button>
<el-button v-if="!isAuditButton && !isDisabled" @click="closeFun">å<EFBFBD>–消</el-button>
<el-button type="danger" @click="removeFun">删除</el-button>
<el-button v-if="!isAuditButton && !isDisabled" type="primary" @click="getReportFlowFun">审批记录</el-button>
</div>
</el-main>
</main>
</div>
<el-dialog v-model="addFileDialog" title="上传附件" width="60vw" @close="fileDialogClose">
<el-form label-width="120">
<el-row>
<el-col :span="24">
<el-form-item label="资料å<EFBFBD><EFBFBD>ç§°">
<el-input v-model="fileTable.fileName"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<file-upload v-model:files="fileTable.fileData" :uploadDrag="true" ></file-upload>
</el-col>
</el-row>
<footer class="flex end">
<el-button size="default" :loading="addFileTableLoading" type="primary" @click="addFileSubmit">确认</el-button>
<el-button @click="addFileDialog = false" >关闭</el-button>
</footer>
</el-form>
</el-dialog>
<el-dialog v-model="reportFlowDialog" title="审批记录" width="80vw">
<div class="table-container">
<el-table :data="reportFlowTable" v-loading="reportFlowLoading">
<el-table-column width="50" type="index" label="åº<EFBFBD>å<EFBFBD>·" :index="(index)=> index+1"></el-table-column>
<el-table-column label="æ“<EFBFBD>作" prop="reportCode"></el-table-column>
<el-table-column label="办ç<EFBFBD>†äºº" prop="approver"></el-table-column>
<el-table-column label="æ“<EFBFBD>作时间" prop="approverTime">
<template #default="{row}">
{{ row.approverTime ? timeFormat(row.approverTime,'yyyy-mm-dd hh:MM:ss') : '/' }}
</template>
</el-table-column>
<el-table-column label="办ç<EFBFBD>†ç»“æžœ" prop="approverState">
<template #default="{row}">
<el-tag type="primary" v-if="row.approverState === '开始'">开始</el-tag>
<el-tag type="success" v-if="row.approverState === '结æ<EFBFBD>Ÿ'">完æˆ<EFBFBD></el-tag>
<el-tag type="danger" v-if="row.approverState === '驳回'">驳回</el-tag>
</template>
</el-table-column>
<el-table-column label="办ç<EFBFBD>†æ„<EFBFBD>è§<EFBFBD>" prop="approverMessage" show-overflow-tooltip></el-table-column>
<el-table-column label="办ç<EFBFBD>†çжæ€<EFBFBD>" prop="approverState"></el-table-column>
</el-table>
</div>
</el-dialog>
<el-dialog v-model="upFileDialog" title="æ<EFBFBD><EFBFBD>料上传" destroy-on-close>
<file-upload v-model:files="formData.files[activeName][fileIndex].fileData" :uploadDrag="true" ></file-upload>
<footer class="flex end">
<el-button type="primary" @click="upFileDialog = false" size="large">确认</el-button>
<el-button @click="upFileDialog = false" size="large">关闭</el-button>
</footer>
</el-dialog>
<report-file :preview="preview" :activeFile="actionRow" @closeFile="closeFile"/>
<report-audit @submitFeedback="submitFeedback" @closeFun="closeAudit" :reportId="formData.project.id" :isCityAudit="isCityAudit"
:dialog="dialog" :currentNode="formData.project.node" :auditUnitId="formData.project.auditUnitId"/>
<report-audit-finish @submitFeedback="submitFeedback" @closeFun="closeAudit" :node="formData.project.node"
:reportId="formData.project.id" :dialog="finishDialog" :isAudit="true"></report-audit-finish>
<report-audit-reject @submitFeedback="submitFeedback" @closeFun="closeAudit" :node="formData.project.node"
:reportId="formData.project.id" :dialog="rejectDialog" :isAudit="false"></report-audit-reject>
<report-audit-end @submitFeedback="submitFeedback" @closeFun="closeAudit" :node="formData.project.node"
:reportId="formData.project.id" v-model="endDialog" :isAudit="true"
></report-audit-end>
<el-dialog title="删除项目" v-model="delDialog" width="700">
<el-form :label-width="120" :model="delFormData" ref="delFormRef">
<el-form-item
label="删除原因"
prop="delReason"
:rules="{
required: true,
message: '请输入删除原因',
}"
>
<el-input
v-model="delFormData.deleteReason"
type="textarea"
placeholder="请输入删除原因"
clearable
:autosize="{ minRows: 3 }"
/>
</el-form-item>
</el-form>
<footer class="flex end">
<el-button @click="delDialog = false">å<EFBFBD>–消</el-button>
<el-button type="primary" @click="handleDel">确定</el-button>
</footer>
</el-dialog>
</template>
<style lang="scss">
.el-table .el-table__cell{
position: initial !important;
}
/* å<EFBFBD>ªä½œç¨äºŽæœ¬é¡µé<EFBFBD>¢ */
.control-price-page {
/* åˆå¨å±æŠŠå½å<EFBFBD>页é<EFBFBD>¢çšç¦<EFBFBD>ç¨æ ·å¼<EFBFBD>å<EFBFBD>˜é<EFBFBD>æ¹æŽ */
--el-disabled-bg-color: #ffffff;
--el-disabled-text-color: #000000;
--el-border-color-disabled: #dcdfe6;
/* 1) el-input ç¦<EFBFBD>ç¨ï¼šç½åºé»å­ */
.el-input.is-disabled .el-input__wrapper {
background-color: #ffffff !important;
box-shadow: 0 0 0 1px var(--el-border-color) inset;
}
.el-input.is-disabled .el-input__inner {
color: #000000 !important;
-webkit-text-fill-color: #000000 !important;
}
/* 2) el-select ç¦<EFBFBD>ç¨ï¼šç½åºé»å­ ââ æ°çšæ­£ç¡®åæ³ï¼ˆæ¿æ<EFBFBD>¢ä½ æ§çšï¼ */
.el-select.is-disabled .el-select__wrapper,
.el-select .el-select__wrapper.is-disabled {
background-color: #ffffff !important;
border-color: #dcdfe6 !important;
color: #000000 !important;
cursor: default !important;
}
.el-select.is-disabled .el-select__selected-item,
.el-select.is-disabled .el-input__inner {
color: #000000 !important;
-webkit-text-fill-color: #000000 !important;
}
/* 3) el-date-picker ç¦<EFBFBD>ç¨ï¼šç½åºé»å­ */
.el-date-editor.is-disabled .el-input__wrapper {
background-color: #ffffff !important;
}
.el-date-editor.is-disabled .el-input__inner {
color: #000000 !important;
-webkit-text-fill-color: #000000 !important;
}
/* 4) el-textarea ç¦<EFBFBD>ç¨ï¼šç½åºé»å­ */
.el-textarea.is-disabled .el-textarea__inner {
background-color: #ffffff !important;
color: #000000 !important;
}
/* 5) el-radio ç¦<EFBFBD>ç¨æå­ï¼šé»è² */
.el-radio.is-disabled .el-radio__label {
color: #000000 !important;
}
/* 6) ç¦<EFBFBD>ç¨é¼ æ æ ·å¼<EFBFBD>修正 */
.el-select.is-disabled,
.el-select.is-disabled * {
cursor: default !important;
}
.el-input.is-disabled,
.el-input.is-disabled * {
cursor: default !important;
}
.el-textarea.is-disabled,
.el-textarea.is-disabled * {
cursor: default !important;
}
.el-date-editor.is-disabled,
.el-date-editor.is-disabled * {
cursor: default !important;
}
.el-radio.is-disabled,
.el-radio.is-disabled * {
cursor: default !important;
}
}
</style>