Browse Source

提交修改

master
zhouhaibin 7 months ago
parent
commit
16520badd0
  1. 100
      src/views/ProcessApprovalSubPage/initiatesProjectsApproval/childProjectsApproval.vue
  2. 218
      src/views/ProcessApprovalSubPage/initiatesProjectsApproval/index.vue
  3. 214
      src/views/ProcessApprovalSubPage/projectPlanApproval/index.vue
  4. 87
      src/views/ProcessApprovalSubPage/uploadfileApproval/index.vue
  5. 10
      src/views/myWork/completed/index.vue
  6. 7
      src/views/myWork/inComplete/inComplete.api.ts
  7. 9
      src/views/myWork/inComplete/index.vue
  8. 192
      src/views/projectLib/initiatesProjects/initiatesProjects.data.ts
  9. 21
      src/views/projectLib/initiatesProjects/initiatesProjects.vue
  10. 73
      src/views/projectLib/planinfoHistory/index.vue
  11. 25
      src/views/projectLib/planinfoHistory/planinfoHistory.api.ts
  12. 61
      src/views/projectLib/planinfoHistory/planinfoHistory.data.ts
  13. 76
      src/views/projectLib/planinfoHistory/planinfoHistoryDetaillist.vue
  14. 41
      src/views/projectLib/planinfoHistory/planinfoHistoryDetailpage.vue
  15. 48
      src/views/projectLib/projectInfo/Detailpage.vue
  16. 113
      src/views/projectLib/projectInfo/batchImportProjects.vue
  17. 48
      src/views/projectLib/projectInfo/index.vue
  18. 20
      src/views/projectLib/projectInfo/projectInfo.api.ts
  19. 326
      src/views/projectLib/projectInfo/projectInfo.data.ts
  20. 239
      src/views/projectLib/projectInfo/uploadFile.vue
  21. 74
      src/views/projectLib/projectInfoHistory/Detaillist.vue
  22. 111
      src/views/projectLib/projectInfoHistory/Detailpage.vue
  23. 73
      src/views/projectLib/projectInfoHistory/index.vue
  24. 25
      src/views/projectLib/projectInfoHistory/projectInfoHistory.api.ts
  25. 808
      src/views/projectLib/projectInfoHistory/projectInfoHistory.data.ts
  26. 217
      src/views/projectLib/projectPlan/addPlan.vue
  27. 134
      src/views/projectLib/projectPlan/addPlanFile.vue
  28. 29
      src/views/projectLib/projectPlan/elstepchild.vue
  29. 186
      src/views/projectLib/projectPlan/index.vue
  30. 116
      src/views/projectLib/projectPlan/planinfoFileDetail.vue
  31. 23
      src/views/projectLib/projectPlan/projectPlan.api.ts
  32. 78
      src/views/projectLib/projectPlan/projectPlan.data.ts
  33. 279
      src/views/projectLib/projectPlan/viewPlanDetail.vue
  34. 121
      src/views/projectLib/projectPlanModule/addModuleDetailPage.vue
  35. 83
      src/views/projectLib/projectPlanModule/addModulePage.vue
  36. 131
      src/views/projectLib/projectPlanModule/index.vue
  37. 23
      src/views/projectLib/projectPlanModule/projectPlanModule.api.ts
  38. 173
      src/views/projectLib/projectPlanModule/projectPlanModule.data.ts

100
src/views/ProcessApprovalSubPage/initiatesProjectsApproval/childProjectsApproval.vue

@ -0,0 +1,100 @@
<template>
<!-- 自定义表单 -->
<el-divider content-position="left">项目入库详情</el-divider>
<BasicForm @register="registerProjectForm" @submit="handleSubmit" />
<!-- <el-divider content-position="left">项目审批详情</el-divider>
<BasicTable @register="registerTable" />
<el-divider content-position="left" v-if="showApprovalForm">项目审批</el-divider>
<div v-if="showApprovalForm">
<BasicForm @register="registerApprovalForm" @submit="handleSubmit" />
</div> -->
</template>
<script lang="ts" name="initiatesProjectsApproval" setup>
import { onMounted, reactive, onUpdated } from 'vue'
import { useForm, BasicForm } from '/@/components/Form';
import { formSchemas } from '../../projectLib/projectInfo/projectInfo.data';
import { queryProjectInfoById } from '../../projectLib/projectInfo/projectInfo.api'
import { submitTask, modifyProjectInfo } from '../../myWork/inComplete/inComplete.api';
import { getUserInfoByid } from '../../projectLib/initiatesProjects/initiatesProjects.api'
let dataTo = defineProps(["projectid","IsEdit"])
const emit = defineEmits(['close']);
console.log("结果ddddd是", dataTo)
onMounted(async () => {
let param: any = {
projectid: dataTo.projectid
}
let res = await queryProjectInfoById(param)
console.log("结果是", res,dataTo)
setFieldsValue(res)
})
onUpdated(async () => {
console.log("我更新了")
let proform = getFieldsValueProjectForm()
for (let key in proform) {
if (key.indexOf("Contactor") != -1) {
let userid = proform[key]
let res = await getUserInfoByid({ id: userid })
console.log(key, res.realname)
updateProjectSchema({
field: key,
componentProps: {
options: [{
value: userid,
label: res.realname
}
],
}
})
}
}
}
)
/**
* BasicForm绑定注册;src\views\ProcessApprovalSubPage\initiatesProjectsApproval\initiatesProjectsApproval.vue
* useForm 是整个框架的核心用于表单渲染里边封装了很多公共方法;
* 支持schemas: 渲染表单列autoSubmitOnEnter回车提交,submitButtonOptions自定义按钮文本和图标等方法
* 平台通过此封装简化了代码支持自定义扩展;
*/
const [registerProjectForm, { validate: validateProjectForm, setFieldsValue, getFieldsValue: getFieldsValueProjectForm, updateSchema: updateProjectSchema }] = useForm({
//
schemas: formSchemas,
showActionButtonGroup: dataTo.IsEdit,
//
// autoSubmitOnEnter: true,
// //
// showResetButton: false,
//
submitButtonOptions: { text: '提交', preIcon: '' },
resetButtonOptions: { text: '取消', preIcon: '' },
// 24 0-24
resetFunc: customResetFunc,
actionColOptions: { span: 14 },
labelCol: { style: { width: '120px' } },
wrapperCol: { style: { width: 'auto' } },
disabled:dataTo.IsEdit==true?false:true,
});
async function handleSubmit() {
let projectform = await getFieldsValueProjectForm();
let param = {
projectInfo: projectform
}
// let outrs = Object.assign({},param,projectform)
console.log("param", param, "projectform", projectform)
if (await validateProjectForm()) {
modifyProjectInfo(projectform)
emit("close")
}
}
async function customResetFunc() {
emit("close")
}
</script>
<style></style>

218
src/views/ProcessApprovalSubPage/initiatesProjectsApproval/index.vue

@ -1,47 +1,77 @@
<template>
<!-- 自定义表单 -->
<el-divider content-position="left">项目入库详情</el-divider>
<BasicForm @register="registerProjectForm" />
<div v-if="!IsbatchImportProjects">
<el-divider content-position="left">项目入库详情</el-divider>
<BasicForm @register="registerProjectForm" />
</div>
<div v-if="IsbatchImportProjects">
<el-divider content-position="left">批量导入项目入库详情</el-divider>
<BasicTable @register="registerbatchImportTable">
<template #action="{ record }">
<!-- <TableAction :actions="getTableAction(record)" /> -->
<TableAction :actions="getTableAction(record)" />
</template>
</BasicTable>
</div>
<el-divider content-position="left">项目审批详情</el-divider>
<BasicTable @register="registerTable" />
<el-divider content-position="left" v-if="showApprovalForm">项目审批</el-divider>
<div v-if="showApprovalForm">
<BasicForm @register="registerApprovalForm" @submit="handleSubmit" />
</div>
<BasicModal @register="registeProjectrModal" title="项目信息详情" width="1200px" :showOkBtn="false">
<childProjectsApproval :projectid="proid" :IsEdit="proIsEdit" @close="closeProjectrModal" />
</BasicModal>
</template>
<script lang="ts" name="initiatesProjectsApproval" setup>
import { ref, onMounted, reactive, onUpdated } from 'vue'
import { useForm, BasicForm } from '/@/components/Form';
import { formSchemas, approveStartProcessColumns } from '../../projectLib/projectInfo/projectInfo.data';
import { formSchemas, approveStartProcessColumns, columns } from '../../projectLib/projectInfo/projectInfo.data';
import { approvalformSchemas } from '../../myWork/inComplete/inComplete.data'
import { queryProjectInfoById, queryProcessInfo } from '../../projectLib/projectInfo/projectInfo.api'
import { BasicTable } from '/@/components/Table';
import { queryProjectInfoById, queryProcessInfo, getIsbatchImportProjects, batchImportProjectPageListByInstid } from '../../projectLib/projectInfo/projectInfo.api'
import { ActionItem, BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { submitTask, getActionParam } from '../../myWork/inComplete/inComplete.api';
import { getUserInfoByid } from '../../projectLib/initiatesProjects/initiatesProjects.api'
import { BasicModal, useModal } from '/@/components/Modal';
import { useRouter, useRoute } from 'vue-router'
import childProjectsApproval from './childProjectsApproval.vue'
const route = useRoute();
const router = useRouter()
console.log("routerouterouteroute", route.query)
let projectid = route.query.projectid
let taskid = route.query.taskId
const emit = defineEmits(['close']);
let processInstanceId = route.query.processInstanceId
let IsbatchImportProjects = ref<Boolean>(false);
let proIsEdit = ref<Boolean>(false);
let showApprovalForm = ref()
let resButton = reactive({
showApprovalForm: false,
IsEdit: false,
buttons: []
})
let proid = ref()
let proform = ref()
onMounted(async () => {
let param: any = {
projectid: projectid
//id
IsbatchImportProjects.value = await getIsbatchImportProjects({ processInstanceId: processInstanceId })
if (IsbatchImportProjects.value) {
//
reloadBatchImportTable()
} else {
let param: any = {
projectid: projectid
}
let res = await queryProjectInfoById(param)
proform= res
console.log("结果是", res)
setFieldsValue(res)
}
let res = await queryProjectInfoById(param)
console.log("结果是", res)
setFieldsValue(res)
reload()
resButton = await getActionParam({ projectid: projectid, status: "1", taskId: taskid, procesType: route.query.procesType })
resButton = await getActionParam({ projectid: projectid, stage: "1", taskId: taskid, procesType: route.query.procesType })
console.log("resButton", resButton)
if (resButton.IsEdit) {
setProps({ disabled: false })
@ -56,32 +86,33 @@ onUpdated(async () => {
options: resButton.buttons,
}
})
let proform = getFieldsValueProjectForm()
for (let key in proform) {
if (key.indexOf("Contactor") != -1) {
let userid = proform[key]
let res = await getUserInfoByid({ id: userid })
console.log(key,res.realname)
updateProjectSchema({
field: key,
componentProps: {
options: [{
value: userid,
label: res.realname
if (!IsbatchImportProjects.value) {
console.log("proform",proform)
for (let key in proform) {
if (key.indexOf("Contactor") != -1&&proform[key]!=null) {
let userid = proform[key]
let res = await getUserInfoByid({ id: userid })
console.log(key, res.realname)
updateProjectSchema({
field: key,
componentProps: {
options: [{
value: userid,
label: res.realname
}
],
}
],
}
})
})
}
}
}
}
)
/**
* BasicForm绑定注册;src\views\ProcessApprovalSubPage\initiatesProjectsApproval\initiatesProjectsApproval.vue
* useForm 是整个框架的核心用于表单渲染里边封装了很多公共方法;
* 支持schemas: 渲染表单列autoSubmitOnEnter回车提交,submitButtonOptions自定义按钮文本和图标等方法
* 平台通过此封装简化了代码支持自定义扩展;
* 项目详情展示表单
*/
const [registerProjectForm, { validate: validateProjectForm, setFieldsValue, getFieldsValue: getFieldsValueProjectForm, setProps, updateSchema: updateProjectSchema }] = useForm({
//
@ -99,6 +130,9 @@ const [registerProjectForm, { validate: validateProjectForm, setFieldsValue, get
wrapperCol: { style: { width: 'auto' } },
disabled: !resButton.IsEdit
});
/**
* 审批表单
*/
const [registerApprovalForm, { validate: validateApprovalForm, getFieldsValue: getFieldsValueApprovalForm, updateSchema }] = useForm({
//
schemas: approvalformSchemas,
@ -124,7 +158,9 @@ const [registerApprovalForm, { validate: validateApprovalForm, getFieldsValue: g
// disabled:true
})
/**
* 流程审批情况表格配置
*/
const { tableContext } = useListPage({
tableProps: {
size: 'small',//
@ -134,42 +170,114 @@ const { tableContext } = useListPage({
showActionColumn: false,
useSearchForm: false,
beforeFetch(params) {
params.status = "1",
params.stage = "1",
params.projectid = projectid
},
},
});
// BasicTable
//
const [registerTable, { reload }] = tableContext;
/**
* 批量导入表格
*/
const { tableContext: tableContextBatchImportTable } = useListPage({
tableProps: {
size: 'small',//
title: '入库项目',
api: batchImportProjectPageListByInstid,
columns: columns,
showActionColumn: true,
useSearchForm: false,
beforeFetch(params) {
params.processInstanceId = processInstanceId
},
},
});
//
const [registerbatchImportTable, { reload: reloadBatchImportTable,getDataSource }] = tableContextBatchImportTable;
function getTableAction(record): ActionItem[] {
return [
{
label: '详情',
onClick: handleDetailpage.bind(null, record),
},
{
label: '修改',
onClick: handleModifyDetailpage.bind(null, record),
ifShow: () => {
return resButton.IsEdit
}
},
];
}
const [registeProjectrModal, { openModal: openModalProjectr, closeModal: closeModalProjectr }] = useModal();//
function handleDetailpage(record) {
proIsEdit.value=false
proid.value = record.id
openModalProjectr()
}
function handleModifyDetailpage(record) {
proIsEdit.value=resButton.IsEdit==true?true:false
proid.value = record.id
openModalProjectr()
}
function closeProjectrModal() {
closeModalProjectr()
console.log("qqqqqqqqqqq")
reloadBatchImportTable()
}
/**
* 提交
*/
async function handleSubmit() {
let approvalform = await getFieldsValueApprovalForm();
let projectform = await getFieldsValueProjectForm();
let param = {
flag: approvalform.flag,
projectid: projectid,
comment: approvalform.comment,
taskId: taskid,
status: route.query.status,
projectInfo: projectform,
isEdit: resButton.IsEdit == true ? "1" : "0"
}
// let outrs = Object.assign({},param,projectform)
console.log("param", param, "approvalform", approvalform, "projectform", projectform)
if (await validateApprovalForm() && await validateProjectForm()) {
console.log("提交成功!")
let res = await submitTask(param)
console.log("提交成功!", res)
router.go(-1)
if (!IsbatchImportProjects.value) {
let projectform = await getFieldsValueProjectForm();
let param = {
flag: approvalform.flag,
projectid: projectid,
comment: approvalform.comment,
taskId: taskid,
stage: route.query.stage,
projectInfo: projectform,
isEdit: resButton.IsEdit == true ? "1" : "0"
}
if (await validateApprovalForm() && await validateProjectForm()) {
console.log("提交成功!1")
let res = await submitTask(param)
console.log("提交成功!2", res)
router.go(-1)
}
} else {
if (await validateApprovalForm()) {
console.log("提交成功!3")
let projectArr = await getDataSource()
let param = {
flag: approvalform.flag,
projectid: projectid,
comment: approvalform.comment,
taskId: taskid,
stage: route.query.stage,
isEdit: resButton.IsEdit == true ? "1" : "0",
projectArr:projectArr
}
let res = await submitTask(param)
console.log("提交成功!", res)
router.go(-1)
}
}
}
async function customResetFunc() {
// let index = router.currentRoute.value
// console.log("index",index)
// router.close(index)
router.go(-1)
}

214
src/views/ProcessApprovalSubPage/projectPlanApproval/index.vue

@ -0,0 +1,214 @@
<template>
<!-- 自定义表单 -->
<el-divider content-position="left">项目计划阶段详情</el-divider>
<BasicTable @register="registerPlanTable">
</BasicTable>
<el-divider content-position="left" v-if="resButton.IsEdit">重新上传项目计划</el-divider>
<div v-if="resButton.IsEdit" style="display: flex; justify-content: center; align-items: center; height: 100px;">
<el-upload class="upload-demo" ref="upload" action :http-request="httpRequest" :before-upload="beforeUpload"
:on-exceed="handleExceed" :limit="1" :on-remove="removeFile">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<div slot="tip" class="el-upload__tip">文件大小且不超过5M</div>
</el-upload>
</div>
<el-divider content-position="left">项目审批详情</el-divider>
<BasicTable @register="registerTable" />
<el-divider content-position="left" v-if="showApprovalForm">项目审批</el-divider>
<div v-if="showApprovalForm">
<BasicForm @register="registerApprovalForm" @submit="handleSubmit" />
</div>
</template>
<script lang="ts" name="viewPlanDetail" setup>
import { ref, onMounted, reactive, onUpdated } from 'vue'
import { useForm, BasicForm } from '/@/components/Form';
import { formSchemas, approveStartProcessColumns, columns } from '../../projectLib/projectInfo/projectInfo.data';
import { approvalformSchemas } from '../../myWork/inComplete/inComplete.data'
import { BasicModal } from '/@/components/Modal';
import { PlaninfoColumn } from '../../projectLib/projectPlan/projectPlan.data';
import { queryPlaninfoFilePageByid, queryPlanInfoMainTimeline } from '../../projectLib/projectPlan/projectPlan.api'
import { queryProjectInfoById, queryProcessInfo } from '../../projectLib/projectInfo/projectInfo.api'
import { ActionItem, BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { getActionParam } from '../../myWork/inComplete/inComplete.api';
import { approvePlaninfo } from '../../projectLib/projectPlan/projectPlan.api'
import { useRouter, useRoute } from 'vue-router'
import { ElMessage } from 'element-plus'
const route = useRoute();
const router = useRouter()
let projectid = route.query.projectid
let taskid = route.query.taskId
let showApprovalForm = ref()
let resButton = reactive({
showApprovalForm: false,
IsEdit: false,
buttons: []
})
let fileList = reactive<Array<any>>([]);
onMounted(async () => {
resButton = await getActionParam({ projectid: projectid, stage: "3", taskId: taskid, procesType: route.query.procesType })
showApprovalForm.value = resButton.showApprovalForm
})
onUpdated(async () => {
console.log("我更新了:")
updateSchema({
field: 'flag',
componentProps: {
options: resButton.buttons,
}
})
})
// table
const { tableContext: tableContextPlan } = useListPage({
tableProps: {
size: 'small',//
title: '项目计划阶段详情',
api: queryPlanInfoMainTimeline,
columns: PlaninfoColumn,
showActionColumn: false,
useSearchForm: false,
beforeFetch(params) {
params.projectid = projectid;
},
},
});
// BasicTable
const [registerPlanTable] = tableContextPlan;
// table
const { tableContext } = useListPage({
tableProps: {
size: 'small',//
title: '流程审批情况',
api: queryProcessInfo,
columns: approveStartProcessColumns,
showActionColumn: false,
useSearchForm: false,
beforeFetch(params) {
params.stage = "3",
params.projectid = projectid
},
},
});
//
const [registerTable, { reload }] = tableContext;
const [registerApprovalForm, { validate: validateApprovalForm, getFieldsValue: getFieldsValueApprovalForm, updateSchema }] = useForm({
//
schemas: approvalformSchemas,
//
// submitButtonOptions: { text: '', preIcon: '' },
//
resetButtonOptions: { text: '取消', preIcon: '' },
// showActionButtonGroup: false,
//
// autoSubmitOnEnter: true,
// //
// showResetButton: false,
//
submitButtonOptions: { text: '提交', preIcon: '' },
// 24 0-24
actionColOptions: { span: 14 },
//
// submitFunc: customSubmitFunc,
//
resetFunc: customResetFunc,
labelCol: { style: { width: '120px' } },
wrapperCol: { style: { width: 'auto' } },
// disabled:true
})
async function handleSubmit() {
let approvalform = await getFieldsValueApprovalForm();
if (await validateApprovalForm()) {
const params = new FormData()
params.append("flag", approvalform.flag)
params.append("projectid", projectid)
params.append("comment", approvalform.comment)
params.append("taskId", taskid)
params.append("stage", route.query.stage)
if(fileList.length>0){
params.append("file", fileList[0].file)
}
let res = await approvePlaninfo(params)
console.log("提交成功!", res)
router.go(-1)
}
}
async function customResetFunc() {
router.go(-1)
}
function removeFile(option) {
for (let i = 0; i < fileList.length; i++) {
if (fileList[i].file.name == option.name) {
fileList.splice(i, 1)
}
}
}
function httpRequest(option) {
fileList.push(option)
}
//
function beforeUpload(file) {
let fileSize = file.size
const FIVE_M = 5 * 1024 * 1024;
const fileSuffix = file.name.substring(file.name.lastIndexOf(".") + 1);
let whiteList = ["xls", "xlsx"];
if (whiteList.indexOf(fileSuffix) === -1) {
ElMessage.error('上传文件只能是xls、xlsx格式');
return false;
}
//5M
if (fileSize > FIVE_M) {
ElMessage.error("最大上传5M")
return false
}
return true
}
//
function handleExceed() {
ElMessage.warning("最多只能上传一个文件")
}
</script>
<style scoped>
.timeline {
display: flex;
width: 100%;
margin-bottom: 100px;
.lineitem {
transform: translateX(50%);
width: 25%;
}
}
:deep(.el-timeline-item__tail) {
border-left: none;
border-top: 2px solid #e4e7ed;
width: 100%;
position: absolute;
top: 9px;
}
:deep(.el-timeline-item__wrapper) {
padding-left: 0;
position: absolute;
top: 20px;
transform: translateX(-50%);
text-align: center;
}
:deep(.el-timeline-item__timestamp) {
font-size: 14px;
}
</style>

87
src/views/ProcessApprovalSubPage/uploadfileApproval/index.vue

@ -11,13 +11,33 @@
<el-divider content-position="left" v-if="resButton.IsEdit">重新上传项目资料</el-divider>
<div v-if="resButton.IsEdit" style="display: flex; justify-content: center; align-items: center; height: 100px;">
<el-upload class="upload-demo" ref="upload" action :http-request="httpRequest" :before-upload="beforeUpload"
:on-exceed="handleExceed" :limit="5">
:on-exceed="handleExceed" :limit="5" :on-remove="removeFile">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<div slot="tip" class="el-upload__tip">文件大小且不超过5M</div>
</el-upload>
</div>
<div >
<el-divider content-position="left">意见文件</el-divider>
<BasicTable @register="registerAdviceResourceTable">
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" />
</template>
</BasicTable>
</div>
<el-divider content-position="left">项目审批详情</el-divider>
<BasicTable @register="registerTable" />
<!-- -->
<div v-if="procesType == '0' && !resButton.IsEdit">
<el-divider content-position="left">上传意见文件</el-divider>
<div style="display: flex; justify-content: center; align-items: center; height: 100px;">
<el-upload class="upload-demo" ref="upload" action :http-request="httpRequestadvice"
:before-upload="beforeUpload" :on-exceed="handleExceed" :limit="5" :on-remove="removeFile">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<div slot="tip" class="el-upload__tip">文件大小且不超过5M</div>
</el-upload>
</div>
</div>
<el-divider content-position="left" v-if="showApprovalForm">项目审批</el-divider>
<div v-if="showApprovalForm">
<BasicForm @register="registerApprovalForm" @submit="handleSubmit" />
@ -33,7 +53,7 @@ import { BasicTable, ActionItem, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { approveUploadFile, getActionParam } from '../../myWork/inComplete/inComplete.api';
import { resourcetableColumns } from '../../projectLib/projectInfo/projectInfo.data';
import { queryResourceInfo } from '../../projectLib/projectInfo/projectInfo.api'
import { uploacFilePageList } from '../../projectLib/projectInfo/projectInfo.api'
import { useRouter, useRoute } from 'vue-router'
import { downloadFile } from "../../../api/common/api"
import { ElMessage } from 'element-plus'
@ -43,6 +63,7 @@ const router = useRouter()
console.log("routerouterouteroute", route.query)
let projectid = route.query.projectid
let taskid = route.query.taskId
let procesType = route.query.procesType
const emit = defineEmits(['close']);
let showApprovalForm = ref()
let resButton = reactive({
@ -51,7 +72,7 @@ let resButton = reactive({
buttons: []
})
let fileList = reactive<Array<any>>([]);
let fileAdviceList = reactive<Array<any>>([]);
onMounted(async () => {
let param: any = {
projectid: projectid
@ -60,7 +81,7 @@ onMounted(async () => {
console.log("结果是", res)
setFieldsValue(res)
reload()
resButton = await getActionParam({ projectid: projectid, status: "2", taskId: taskid, procesType: route.query.procesType })
resButton = await getActionParam({ projectid: projectid, stage: "2", taskId: taskid, procesType: route.query.procesType })
showApprovalForm.value = resButton.showApprovalForm
})
@ -130,7 +151,7 @@ const { tableContext } = useListPage({
showActionColumn: false,
useSearchForm: false,
beforeFetch(params) {
params.status = "2",
params.stage = "2",
params.projectid = projectid
},
},
@ -144,7 +165,7 @@ const { tableContext: resourceTableContext } = useListPage({
tableProps: {
size: 'small',//
title: '项目入库资料详情',
api: queryResourceInfo,
api: uploacFilePageList,
columns: resourcetableColumns,
useSearchForm: false,
actionColumn: {
@ -152,12 +173,30 @@ const { tableContext: resourceTableContext } = useListPage({
fixed: "right",
},
beforeFetch(params) {
params.status = "2",
params.stage = "1",
params.projectid = projectid
},
},
});
const [registerResourceTable] = resourceTableContext;
const { tableContext: resourceAdviceTableContext } = useListPage({
tableProps: {
size: 'small',//
title: '意见文件',
api: uploacFilePageList,
columns: resourcetableColumns,
useSearchForm: false,
actionColumn: {
width: 120,
fixed: "right",
},
beforeFetch(params) {
params.stage = "2",
params.projectid = projectid
},
},
});
const [registerAdviceResourceTable] = resourceAdviceTableContext;
function getTableAction(record): ActionItem[] {
return [
{
@ -176,12 +215,27 @@ function handleDetailpage(record) {
//
console.log("我这一行的数据是", param)
downloadFile("/huzhouProject/downloadfile", record.documentName, param)
downloadFile("/huzhouUploadfileinfo/downloadfile", record.documentName, param)
}
function removeFile(option) {
for (let i = 0; i < fileList.length; i++) {
if (fileList[i].file.name == option.name) {
fileList.splice(i, 1)
}
}
for (let i = 0; i < fileAdviceList.length; i++) {
if (fileAdviceList[i].file.name == option.name) {
fileAdviceList.splice(i, 1)
}
}
}
function httpRequest(option) {
fileList.push(option)
}
function httpRequestadvice(option) {
fileAdviceList.push(option)
}
//
function beforeUpload(file) {
let fileSize = file.size
@ -191,13 +245,7 @@ function beforeUpload(file) {
ElMessage.error("最大上传5M")
return false
}
//xlsx
// let fileName = file.name
// let reg = /^.+(\.xlsx)$/
// if(!reg.test(fileName)){
// ElMessage.error("xlsx!")
// return false
// }
return true
}
//
@ -215,13 +263,17 @@ async function handleSubmit() {
params.append("projectid", projectid)
params.append("comment", approvalform.comment)
params.append("taskId", taskid)
params.append("status", route.query.status)
params.append("stage", route.query.stage)
if (fileList.length > 0) {
fileList.forEach((x) => {
console.log("xxxxxxxxxx", x)
params.append("file", x.file)
});
}
if (fileAdviceList.length > 0) {
fileAdviceList.forEach((x) => {
params.append("adviceFile", x.file)
});
}
console.log("param", params, "approvalform", approvalform)
if (await validate()) {
@ -231,7 +283,6 @@ async function handleSubmit() {
}
}
async function customResetFunc() {
router.go(-1)

10
src/views/myWork/completed/index.vue

@ -71,18 +71,24 @@ function handleEdit(record) {
// openModal();
// proid.value =record.projectid
// record.procesType="1" // 1 0
if (record.status == 1) {
if (record.stage == 1) {
router.push({ // push
path: '/ProcessApprovalSubPage/initiatesProjectsApproval', //name inComplectedDetail
query: record
})
}
else if (record.status == 2) {
else if (record.stage == 2) {
router.push({ // push
path: '/ProcessApprovalSubPage/uploadfileApproval', //name inComplectedDetail
query: record
})
}
else if(record.stage ==3){
router.push({ // push
path: '/ProcessApprovalSubPage/projectPlanApproval', //name inComplectedDetail
query: record
})
}
// console.log(selectedRows.value);
// console.log(selectedRowKeys.value);
}

7
src/views/myWork/inComplete/inComplete.api.ts

@ -6,7 +6,9 @@ export enum Api {
submitTask = "/huzhouProject/approveProjectInfo",
myCompleteTask = '/workflow/myCompleteTask',
getActionParam = '/workflow/getActionParam',
approveUploadFile = "/huzhouProject/approveUploadFile",
approveUploadFile = "/huzhouUploadfileinfo/approveUploadFile",
modifyProjectInfo='/huzhouProject/modifyProjectInfo'
}
/**
*
@ -15,4 +17,5 @@ export const myTaskList = (params) => defHttp.get({ url: Api.myTaskList, params
export const submitTask = (params) => defHttp.post({ url: Api.submitTask, params })
export const myCompleteTask = (params) => defHttp.get({ url: Api.myCompleteTask, params })
export const getActionParam = (params) => defHttp.get({ url: Api.getActionParam, params })
export const approveUploadFile = (params) => defHttp.post({ url: Api.approveUploadFile, headers: { "Content-Type": "multipart/form-data" }, params })
export const approveUploadFile = (params) => defHttp.post({ url: Api.approveUploadFile, headers: { "Content-Type": "multipart/form-data" }, params })
export const modifyProjectInfo = (params) => defHttp.post({ url: Api.modifyProjectInfo, params })

9
src/views/myWork/inComplete/index.vue

@ -64,17 +64,22 @@ function getTableAction(record): ActionItem[] {
}
function handleEdit(record) {
record.procesType="0" //流程类型, 已办是1 代办是0Object.assign({}, xiaoming, {test1:'demo1', test2:'demo2'}); // 第一个参数是 目标对象后面的全是源对象执行完之后返回目标对象
if (record.status == 1) {
if (record.stage == 1) {
router.push({ // push
path: '/ProcessApprovalSubPage/initiatesProjectsApproval', //name inComplectedDetail
query: record
})
}
else if (record.status == 2) {
else if (record.stage == 2) {
router.push({ // push
path: '/ProcessApprovalSubPage/uploadfileApproval', //name inComplectedDetail
query: record
})
}else if(record.stage ==3){
router.push({ // push
path: '/ProcessApprovalSubPage/projectPlanApproval', //name inComplectedDetail
query: record
})
}
// console.log(selectedRows.value);
// console.log(selectedRowKeys.value);

192
src/views/projectLib/initiatesProjects/initiatesProjects.data.ts

@ -12,11 +12,19 @@ let ownerDict = await getWorkPlaceTypeDict({ workPlaceType: "3" })
let controlerDict = await getWorkPlaceTypeDict({ workPlaceType: "6" })
let consultDict = await getWorkPlaceTypeDict({ workPlaceType: "5" })
function projectTypeDict() {
for (let i = 0; i < projectTypeDicts.length; i++) {
projectTypeDicts[i].label = projectTypeDicts[i].text;
const reformTasksDicts: Array<Object> = getDictItemsByCode("reformTasks")
function reformTasksDict() {
for (let i = 0; i < reformTasksDicts.length; i++) {
reformTasksDicts[i].label = reformTasksDicts[i].text;
}
return projectTypeDicts
return reformTasksDicts
}
const roomDicts: Array<Object> = getDictItemsByCode("room")
function roomDict() {
for (let i = 0; i < roomDicts.length; i++) {
roomDicts[i].label = roomDicts[i].text;
}
return roomDicts
}
export const formSchemas: FormSchema[] = [
{
@ -35,17 +43,25 @@ export const formSchemas: FormSchema[] = [
required: true,
},
{
label: '项目类型',
field: 'projectType',
component: 'Select',
label: '行政区划',
field: 'adminDivision',
//子标题名称(在主标题后面)
component: 'Input',
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
//填写组件Select的属性
componentProps: {
options: projectTypeDict()
},
required: true,
},
// {
// label: '项目类型',
// field: 'projectType',
// component: 'Select',
// colProps: { span: 12 },
// //填写组件Select的属性
// componentProps: {
// options: projectTypeDict()
// },
// },
{
label: '主要任务',
field: 'description',
@ -55,6 +71,7 @@ export const formSchemas: FormSchema[] = [
colProps: { span: 24 },
required: true,
},
{
//标题名称
label: '责任单位',
@ -69,7 +86,19 @@ export const formSchemas: FormSchema[] = [
},
{
//标题名称
label: '建设年限',
label: '单位属性',
//字段
field: 'workplaceProperties',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '建设周期(月)',
//字段
field: 'constructionPeriod',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
@ -80,14 +109,32 @@ export const formSchemas: FormSchema[] = [
//步数
step: 0.1
},
suffix: "年",
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '中央资金',
label: '总投资(元)',
//字段
field: 'totalMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '中央资金(元)',
//字段
field: 'centralMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
@ -100,14 +147,13 @@ export const formSchemas: FormSchema[] = [
//步数
step: 1
},
suffix: "元",
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '省级资金',
label: '省级资金(元)',
//字段
field: 'provincialMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
@ -120,14 +166,13 @@ export const formSchemas: FormSchema[] = [
//步数
step: 1
},
suffix: "元",
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '市级资金',
label: '市级资金(元)',
//字段
field: 'cityMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
@ -141,14 +186,13 @@ export const formSchemas: FormSchema[] = [
//步数
step: 1
},
suffix: "元",
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '区县级资金',
label: '区县级资金(元)',
//字段
field: 'countyMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
@ -162,7 +206,85 @@ export const formSchemas: FormSchema[] = [
//步数
step: 1
},
suffix: "元",
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '自筹资金(元)',
//字段
field: 'selfMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '2023年支付(元)',
//字段
field: 'payamount2023Money',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '2024年支付(元)',
//字段
field: 'payamount2024Money',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
}, {
//标题名称
label: '2025年支付(元)',
//字段
field: 'payamount2025Money',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
@ -174,11 +296,14 @@ export const formSchemas: FormSchema[] = [
//字段
field: 'reformName',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
component: 'Select',
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
componentProps:{
options:reformTasksDict()
}
},
{
//标题名称
@ -186,11 +311,14 @@ export const formSchemas: FormSchema[] = [
//字段
field: 'superLeader',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
component: 'Select',
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
componentProps:{
options:roomDict()
}
},
{
//标题名称
@ -214,7 +342,12 @@ export const formSchemas: FormSchema[] = [
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
dynamicRules: () => {
return [
{ required: true, message: '请填写手机号' },
{ pattern: /^1[3456789]\d{9}$/, message: '手机号码格式有误' },
];
},
},
{
//标题名称
@ -245,7 +378,6 @@ export const formSchemas: FormSchema[] = [
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
@ -260,7 +392,6 @@ export const formSchemas: FormSchema[] = [
}, //一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
@ -291,11 +422,10 @@ export const formSchemas: FormSchema[] = [
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '监管单位负责人',
label: '监管单位联系人',
//字段
field: 'supervisorContactor',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
@ -306,9 +436,7 @@ export const formSchemas: FormSchema[] = [
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '承建单位',
@ -338,7 +466,6 @@ export const formSchemas: FormSchema[] = [
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
@ -353,7 +480,6 @@ export const formSchemas: FormSchema[] = [
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称

21
src/views/projectLib/initiatesProjects/index.vue → src/views/projectLib/initiatesProjects/initiatesProjects.vue

@ -7,12 +7,13 @@
<BasicForm @register="registerForm" @submit="handleSubmit" />
</div>
</template>
<script lang="ts" name="addModulePage" setup>
<script lang="ts" name="initiatesProjects" setup>
import { } from 'vue'
import { useForm, BasicForm } from '/@/components/Form';
import { formSchemas } from './initiatesProjects.data';
import { submitProjectInfo, getWorkPlaceTypeDict } from './initiatesProjects.api'
import { Modal } from 'ant-design-vue';
let emit = defineEmits(["close"])
let res = getWorkPlaceTypeDict({ workPlaceType: "2" })
console.log("getWorkPlaceTypeDictgetWorkPlaceTypeDictgetWorkPlaceTypeDictgetWorkPlaceTypeDictgetWorkPlaceTypeDictgetWorkPlaceTypeDict", res)
@ -28,7 +29,6 @@ const [registerForm, { validate, setFieldsValue, getFieldsValue }] = useForm({
//
// autoSubmitOnEnter: true,
// //
showResetButton: false,
//
resetButtonOptions: { text: '取消', preIcon: '' },
@ -53,10 +53,10 @@ function handleDetailpage(record) {
//
console.log("我这一行的数据是", param)
downloadFile("/huzhouProject/downloadfile", record.documentName, param)
downloadFile("/huzhouUploadfileinfo/downloadfile", record.documentName, param)
}
async function customResetFunc() {
emit("close")
}
async function handleSubmit() {
if (await validate()) {
@ -65,12 +65,15 @@ async function handleSubmit() {
content: '是否提交入库申请表?',
okText: '确认',
cancelText: '取消',
onOk: async() => {
onOk: async () => {
let datas = await getFieldsValue()
console.log("datas",datas)
await submitProjectInfo(datas)
let datasnull = clearObjectValues(datas)
setFieldsValue(datasnull)
console.log("datas", datas)
submitProjectInfo(datas).then(()=>{
let datasnull = clearObjectValues(datas)
setFieldsValue(datasnull)
emit("close")
})
},
});
console.log("我提交了")

73
src/views/projectLib/planinfoHistory/index.vue

@ -0,0 +1,73 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable">
<!--插槽:table标题-->
<!--操作栏-->
<template #action="{ record }">
<!-- <TableAction :actions="getTableAction(record)" /> -->
<TableAction :actions="getTableAction(record)" />
</template>
</BasicTable>
</div>
<BasicModal @register="registeProjectrModal" title="项目信息详情" width="1200px" :showOkBtn="false">
<Detaillist :projectid="proid" />
</BasicModal>
</template>
<script lang="ts" name="system-user" setup>
//ts
import { ref } from 'vue';
import { ActionItem, BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { BasicModal,useModal } from '/@/components/Modal';
import { searchFormSchema } from '../projectInfo/projectInfo.data';
import {columns} from './planinfoHistory.data'
// import { list } from './address.api';
import Detaillist from './Detaillist.vue';
import { planInfoHistoryPageList } from './planinfoHistory.api';
import { useUserStore } from '/@/store/modules/user';
const userStore = useUserStore();
let proid = ref();
const [registeProjectrModal, { openModal: openModalProjectr }] = useModal();//
const { tableContext } = useListPage({
designScope: 'basic-table-demo-ajax',
tableProps: {
title: '项目信息',
api: planInfoHistoryPageList,
columns: columns,
actionColumn: {
width: 120,
fixed: "right",
},
//
formConfig: {
schemas: searchFormSchema,
}
},
});
//BasicTable
const [registerTable, { reload }] = tableContext;
function getTableAction(record): ActionItem[] {
return [
{
label: '详情',
onClick: handleDetailpage.bind(null, record),
},
];
}
function handleDetailpage(record) {
proid.value = record.id
openModalProjectr()
}
</script>
<style scoped></style>./projectInfoHistory.data

25
src/views/projectLib/planinfoHistory/planinfoHistory.api.ts

@ -0,0 +1,25 @@
import { update } from 'lodash-es';
import { defHttp } from '/@/utils/http/axios';
export enum Api {
planInfoHistoryPageList = '/huzhouPlaninfoHistory/planInfoHistoryPageList',
singlePlanInfoHistoryPageList = '/huzhouPlaninfoHistory/singlePlanInfoHistoryPageList',
queryPlanInfoHistoryGroupList='huzhouPlaninfoHistory/queryPlanInfoHistoryGroupList'
}
/**
* list
*/
export const planInfoHistoryPageList = (params?) =>defHttp.get({ url: Api.planInfoHistoryPageList, params });
export const singlePlanInfoHistoryPageList = (params?) =>defHttp.get({ url: Api.singlePlanInfoHistoryPageList, params });
export const queryPlanInfoHistoryGroupList = (params?) =>defHttp.get({ url: Api.queryPlanInfoHistoryGroupList, params });

61
src/views/projectLib/planinfoHistory/planinfoHistory.data.ts

@ -0,0 +1,61 @@
import { BasicColumn } from '/@/components/Table';
// function approvalRsesult(){
// for(let i = 0;i<approvalRsesults.length;i++){
// approvalRsesults[i].label=approvalRsesults[i].text;
// }
// return approvalRsesults
// }
export const columns: BasicColumn[] = [
{
title: '项目编号',
width: 150,
dataIndex: 'id',
},
{
title: '项目名称',
dataIndex: 'projectName',
width: 150,
},
{
title: '主要任务及标志性成果',
dataIndex: 'description',
width: 150,
},
{
title: '责任单位',
dataIndex: 'dutyWorkplace',
width: 100,
},
{
title: '联系电话',
width: 150,
dataIndex: 'phone',
},
];
export const columnschild: BasicColumn[] = [
{
title: 'id',
width: 150,
dataIndex: 'id',
},
{
title: '项目编号',
width: 150,
dataIndex: 'projectId',
},
{
title: '创建时间',
dataIndex: 'createtime',
width: 150,
},
{
title: 'groupId',
dataIndex: 'groupId',
width: 150,
},
];

76
src/views/projectLib/planinfoHistory/planinfoHistoryDetaillist.vue

@ -0,0 +1,76 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable">
<!--插槽:table标题-->
<!--操作栏-->
<template #action="{ record }">
<!-- <TableAction :actions="getTableAction(record)" /> -->
<TableAction :actions="getTableAction(record)" />
</template>
</BasicTable>
</div>
<BasicModal @register="registeProjectrModal" title="项目信息详情" width="1200px" :showOkBtn="false">
<planinfoHistoryDetailpage :projectid="proid" :groupid="groupid" />
</BasicModal>
</template>
<script lang="ts" name="system-user" setup>
//ts
import { ref } from 'vue';
import { ActionItem, BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { BasicModal,useModal } from '/@/components/Modal';
import {columnschild} from './planinfoHistory.data'
// import { list } from './address.api';
import planinfoHistoryDetailpage from './planinfoHistoryDetailpage.vue';
import { singlePlanInfoHistoryPageList } from './planinfoHistory.api';
import { useUserStore } from '/@/store/modules/user';
let dataTo = defineProps(["projectid"])
const userStore = useUserStore();
let proid = ref();
let groupid = ref();
const [registeProjectrModal, { openModal: openModalProjectr }] = useModal();//
const { tableContext } = useListPage({
designScope: 'basic-table-demo-ajax',
tableProps: {
title: '项目计划信息',
api: singlePlanInfoHistoryPageList,
columns: columnschild,
actionColumn: {
width: 120,
fixed: "right",
},
useSearchForm: false,
beforeFetch(params) {
params.projectId = dataTo.projectid
},
},
});
//BasicTable
const [registerTable, { reload }] = tableContext;
function getTableAction(record): ActionItem[] {
return [
{
label: '详情',
onClick: handleDetailpage.bind(null, record),
},
];
}
function handleDetailpage(record) {
proid.value = record.projectId
groupid.value =record.groupId
openModalProjectr()
}
</script>
<style scoped></style>./projectInfoHistory.data

41
src/views/projectLib/planinfoHistory/planinfoHistoryDetailpage.vue

@ -0,0 +1,41 @@
<template>
<el-divider content-position="left">项目计划阶段详情</el-divider>
<BasicTable @register="registerPlanTable">
</BasicTable>
</template>
<script lang="ts" name="planinfoHistoryDetailpage" setup>
import { ref, defineProps, onMounted,onUpdated } from 'vue'
import { useForm, BasicForm } from '/@/components/Form';
import { PlaninfoColumn } from '../../projectLib/projectPlan/projectPlan.data';
import { queryPlanInfoHistoryGroupList } from './planinfoHistory.api';
import { ActionItem, BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { getUserInfoByid } from '../initiatesProjects/initiatesProjects.api'
let dataTo = defineProps(["projectid","groupid"])
let projectstage = ref()
// table
const { tableContext: tableContextPlan } = useListPage({
tableProps: {
size: 'small',//
title: '项目计划阶段详情',
api: queryPlanInfoHistoryGroupList,
columns: PlaninfoColumn,
showActionColumn: false,
useSearchForm: false,
beforeFetch(params) {
params.projectId = dataTo.projectid;
params.groupId = dataTo.groupid;
},
},
});
// BasicTable
const [registerPlanTable] = tableContextPlan;
</script>
<style></style>
./projectInfoHistory.data

48
src/views/projectLib/projectInfo/Detailpage.vue

@ -4,7 +4,7 @@
<BasicForm @register="registerProjectForm" />
<div v-if="projectStatus >= 3">
<div v-if="projectstage >= 3">
<el-divider content-position="left">项目资料详情</el-divider>
<BasicTable @register="registerResourceTable">
<template #action="{ record }">
@ -16,27 +16,49 @@
<BasicTable @register="registerApproveStartTable" />
</template>
<script lang="ts" name="Detailpage" setup>
import { ref, defineProps, onMounted } from 'vue'
import { ref, defineProps, onMounted,onUpdated } from 'vue'
import { useForm, BasicForm } from '/@/components/Form';
import { formSchemas, approveStartProcessColumns, resourcetableColumns } from './projectInfo.data';
import { queryProjectInfoById, queryProcessInfo, queryResourceInfo } from './projectInfo.api'
import { queryProjectInfoById, queryProcessInfo, uploacFilePageList } from './projectInfo.api'
import { ActionItem, BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { downloadFile } from "../../../api/common/api"
let dataTo = defineProps(["projectid"])
let projectStatus = ref()
import { getUserInfoByid } from '../initiatesProjects/initiatesProjects.api'
let dataTo = defineProps(["projectid"])
let projectstage = ref()
let proform =ref()
onMounted(async () => {
console.log("projectid", dataTo.projectid)
let param: any = {
projectid: dataTo.projectid
}
let resProject = await queryProjectInfoById(param)
proform =resProject
setFieldsValue(resProject)
projectStatus.value = resProject.status
console.log("projectid", dataTo.projectid, projectStatus.value)
projectstage.value = resProject.stage
console.log("projectid", dataTo.projectid, projectstage.value)
})
onUpdated(async()=>{
console.log("getFieldsValueProjectForm",proform)
for (let key in proform) {
if (key.indexOf("Contactor") != -1&&proform[key]!=null) {
let userid = proform[key]
let res = await getUserInfoByid({ id: userid })
console.log("Contactor",key, res)
updateProjectSchema({
field: key,
componentProps: {
options: [{
value: userid,
label: res.realname
}
],
}
})
}
}
})
function getTableAction(record): ActionItem[] {
return [
{
@ -52,7 +74,7 @@ function getTableAction(record): ActionItem[] {
* 支持schemas: 渲染表单列autoSubmitOnEnter回车提交,submitButtonOptions自定义按钮文本和图标等方法
* 平台通过此封装简化了代码支持自定义扩展;
*/
const [registerProjectForm, { setFieldsValue }] = useForm({
const [registerProjectForm, { setFieldsValue,getFieldsValue: getFieldsValueProjectForm, setProps, updateSchema: updateProjectSchema }] = useForm({
//
schemas: formSchemas,
showActionButtonGroup: false,
@ -79,7 +101,7 @@ const { tableContext: approveStarttableContext } = useListPage({
showActionColumn: false,
useSearchForm: false,
beforeFetch(params) {
params.status = projectStatus.value>=3?"2":"1",
params.stage = projectstage.value>=3?"2":"1",
params.projectid = dataTo.projectid
},
},
@ -92,7 +114,7 @@ const { tableContext } = useListPage({
tableProps: {
size: 'small',//
title: '项目入库资料详情',
api: queryResourceInfo,
api: uploacFilePageList,
columns: resourcetableColumns,
useSearchForm: false,
actionColumn: {
@ -100,7 +122,7 @@ const { tableContext } = useListPage({
fixed: "right",
},
beforeFetch(params) {
params.status = "2",
params.stage = "1",
params.projectid = dataTo.projectid
},
},
@ -117,7 +139,7 @@ function handleDetailpage(record) {
//
console.log("我这一行的数据是", param)
downloadFile("/huzhouProject/downloadfile", record.documentName, param)
downloadFile("/huzhouUploadfileinfo/downloadfile", record.documentName, param)
}
</script>
<style></style>

113
src/views/projectLib/projectInfo/batchImportProjects.vue

@ -0,0 +1,113 @@
<template>
<!-- 自定义表单 -->
<el-divider content-position="left">模板表格文件下载</el-divider>
<div style="padding-left: 40px;">
<el-button slot="trigger" type="primary" @click="downexcel">下载模板</el-button>
</div>
<el-divider content-position="left">上传表格文件</el-divider>
<el-form ref="importFormRef" label-width="130px">
<el-form-item label="上传文件:">
<el-upload class="upload-demo" ref="upload" action :http-request="httpRequest" :before-upload="beforeUpload"
:on-exceed="handleExceed" :limit="1" accept=".xls, .xlsx">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<div slot="tip" class="el-upload__tip">只能上传excel文件且不超过5M</div>
</el-upload>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitImportForm">开始导入</el-button>
<el-button type="info" @click="dialogVisible">关闭窗口</el-button>
</el-form-item>
</el-form>
</template>
<script lang="ts" name="uploadFile" setup>
import { ref, reactive, defineProps, watchEffect } from 'vue'
import { useForm } from '/@/components/Form';
import { formSchemas } from './projectInfo.data';
import { batchImportProjects } from './projectInfo.api';
import { ElMessage } from 'element-plus'
import { downloadFile } from "../../../api/common/api"
let fileList = reactive<Array<any>>([]);
let dataTo = defineProps(["projectid"])
const emit = defineEmits(['close']);
//
watchEffect(async () => {
console.log("dataTo", dataTo, dataTo.projectid)
})
function downexcel(){
let param = {
path: "Resources/项目入库模板.xlsx",
fileName: "项目入库模板.xlsx"
}
downloadFile("/huzhouUploadfileinfo/downloadfile", "项目入库模板.xlsx", param)
}
function httpRequest(option) {
fileList.pop()
fileList.push(option)
}
//
function beforeUpload(file) {
let fileSize = file.size
const FIVE_M = 5 * 1024 * 1024;
//5M
if (fileSize > FIVE_M) {
ElMessage.error("最大上传5M")
return false
}
//xlsx
const fileSuffix = file.name.substring(file.name.lastIndexOf(".") + 1);
let whiteList = ["xls", "xlsx"];
if (whiteList.indexOf(fileSuffix) === -1) {
ElMessage.error('上传文件只能是xls、xlsx格式');
return false;
}
// let fileName = file.name
// let reg = /^.+(\.xlsx)$/
// if(!reg.test(fileName)){
// ElMessage.error("xlsx!")
// return false
// }
return true
}
//
function handleExceed() {
ElMessage.warning("最多只能上传一个文件")
}
//Excel
async function submitImportForm() {
// console.log("datadatadatadatadatadata", data)
// if (data.stage != 2) {
// ElMessage({
// message: "",
// type: "error"
// })
// return
// }
// // 使form
const params = new FormData()
// paramsData
// fileList.forEach((x) => {
// console.log("xxxxxxxxxx", x, x.file)
// });
params.append('file', fileList[0].file)
//axios
batchImportProjects(params).then(() => {
emit("close")
})
}
function dialogVisible() {
emit("close")
}
</script>
<style></style>

48
src/views/projectLib/projectInfo/index.vue

@ -8,15 +8,26 @@
<!-- <TableAction :actions="getTableAction(record)" /> -->
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />
</template>
<template #tableTitle>
<a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleCreate"> 新增入库项目</a-button>
<a-button type="primary" preIcon="ant-design:upload-outlined" @click="handleBatchImport"> 批量导入入库项目</a-button>
</template>
</BasicTable>
</div>
<BasicModal @register="registeProjectrModal" title="项目信息详情" width="1200px" :showOkBtn="false">
<Detailpage :projectid="proid" />
</BasicModal>
<BasicModal @register="registeinitiatesModal" title="发起项目入库申请" width="1200px" :showOkBtn="false">
<initiatesProjects @close="closeinitiatesModal()"/>
</BasicModal>
<BasicModal @register="registerModalUploadFiles" title="申报项目资料" width="1200px" :showOkBtn="false"
:showCancelBtn="false">
<uploadFile :projectid="proid" @close="closeUploadFilesModal()" />
</BasicModal>
<BasicModal @register="registerModalBatchImport" title="批量导入入库项目" width="1200px" :showOkBtn="false"
:showCancelBtn="false">
<batchImportProjects :projectid="proid" @close="closeBatchImportModal()" />
</BasicModal>
</template>
<script lang="ts" name="system-user" setup>
@ -25,22 +36,23 @@ import { ref } from 'vue';
import { ActionItem, BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { useModal } from '/@/components/Modal';
import { BasicModal } from '/@/components/Modal';
import { BasicModal,useModal } from '/@/components/Modal';
import { columns, searchFormSchema } from './projectInfo.data';
// import { list } from './address.api';
import Detailpage from './Detailpage.vue';
import uploadFile from './uploadFile.vue';
import initiatesProjects from '../initiatesProjects/initiatesProjects.vue'
import batchImportProjects from './batchImportProjects.vue'
import { projectInfoPageList } from './projectInfo.api';
import { useUserStore } from '/@/store/modules/user';
import { useRouter, useRoute } from 'vue-router'
const router = useRouter();
const userStore = useUserStore();
let proid = ref();
const [registeProjectrModal, { openModal: openModalProjectr }] = useModal();
const [registerModalUploadFiles, { openModal: openUploadFiles, closeModal: closeUploadFiles }] = useModal();//
const [registeProjectrModal, { openModal: openModalProjectr }] = useModal();//
const [registerModalUploadFiles, { openModal: openUploadFiles, closeModal: closeUploadFiles }] = useModal();//
const [registeinitiatesModal, { openModal: openinitiate, closeModal: closeinitiates }] = useModal();//
const [registerModalBatchImport, { openModal: openBatchImport, closeModal: closeBatchImport }] = useModal();//
const { tableContext } = useListPage({
designScope: 'basic-table-demo-ajax',
@ -75,9 +87,9 @@ function getTableAction(record): ActionItem[] {
function getDropDownAction(record): ActionItem[] {
return [
{
label: '上传项目资料',
label: '上传管理(监理)资料',
ifShow: () => {
return record.status == 2 && record.creator==userStore.getUserInfo.id
return record.stage == 2 && record.creator == userStore.getUserInfo.id
},
onClick: handleuploadFile.bind(null, record)
},
@ -97,13 +109,27 @@ function handleuploadFile(record) {
proid.value = record.id
openUploadFiles()
// console.log(selectedRows.value);
// console.log(selectedRowKeys.value);
}
function closeUploadFilesModal() {
closeUploadFiles()
reload()
}
function handleCreate() {
openinitiate()
}
function closeinitiatesModal(){
closeinitiates()
reload()
}
function handleBatchImport(){
openBatchImport()
}
function closeBatchImportModal(){
closeBatchImport()
reload()
}
</script>
<style scoped></style>

20
src/views/projectLib/projectInfo/projectInfo.api.ts

@ -5,10 +5,12 @@ export enum Api {
list = '/sys/user/queryByOrgCodeForAddressList',
queryProcessInfo = '/workflow/getprocessInfo',
queryProjectInfoById = '/huzhouProject/queryProjectInfoById',
queryprocessinfoById="/huzhouProject/queryprocessinfoById",
projectInfoPageList="/huzhouProject/projectInfoPageList",
uploadFileUrl = '/huzhouProject/uploadFile',
queryResourceInfo = '/huzhouProject/queryResourceInfo'
submitUploadFile = '/huzhouUploadfileinfo/submitUploadFile',
uploacFilePageList = '/huzhouUploadfileinfo/uploacFilePageList',
batchImportProjects="/huzhouProject/batchImportProjects",
getIsbatchImportProjects = '/huzhouProject/getIsbatchImportProjects',
batchImportProjectPageListByInstid = '/huzhouProject/batchImportProjectPageListByInstid',
}
/**
*
@ -22,8 +24,14 @@ export const projectInfoPageList = (params?) => defHttp.get({ url: Api.projectIn
* list
*/
export const queryProcessInfo = (params?) => defHttp.get({ url: Api.queryProcessInfo, params });
export const uploadFile = (params?) =>defHttp.post({ url: Api.uploadFileUrl,headers:{ "Content-Type": "multipart/form-data" }, params })
export const queryResourceInfo =(params?) => defHttp.get({ url: Api.queryResourceInfo, params });
export const queryprocessinfoById = (params?) => defHttp.get({ url: Api.queryprocessinfoById, params });
export const submitUploadFile = (params?) =>defHttp.post({ url: Api.submitUploadFile,headers:{ "Content-Type": "multipart/form-data" }, params })
export const uploacFilePageList =(params?) => defHttp.get({ url: Api.uploacFilePageList, params });
export const batchImportProjects = (params?) =>defHttp.post({ url: Api.batchImportProjects,headers:{ "Content-Type": "multipart/form-data" }, params })
export const getIsbatchImportProjects = (params?) =>defHttp.get({ url: Api.getIsbatchImportProjects, params });
export const batchImportProjectPageListByInstid = (params?) =>defHttp.get({ url: Api.batchImportProjectPageListByInstid, params });

326
src/views/projectLib/projectInfo/projectInfo.data.ts

@ -5,9 +5,9 @@ import { UploadTypeEnum } from '/@/components/Form/src/jeecg/components/JUpload'
import { size } from 'lodash-es';
import { el } from 'element-plus/es/locale';
const projectTypeDicts:Array<Object> = getDictItemsByCode("projectType")
const approvalRsesults:Array<Object> = getDictItemsByCode("approvalResult")
import { getWorkPlaceTypeDict, getContactorDict,getUserInfoByid } from '../initiatesProjects/initiatesProjects.api'
const projectTypeDicts: Array<Object> = getDictItemsByCode("projectType")
const approvalRsesults: Array<Object> = getDictItemsByCode("approvalResult")
import { getWorkPlaceTypeDict, getContactorDict, getUserInfoByid } from '../initiatesProjects/initiatesProjects.api'
let manageOrgDict = await getWorkPlaceTypeDict({ workPlaceType: "1" })
let supervisorDict = await getWorkPlaceTypeDict({ workPlaceType: "2" })
@ -15,13 +15,20 @@ let contructorDict = await getWorkPlaceTypeDict({ workPlaceType: "4" })
let ownerDict = await getWorkPlaceTypeDict({ workPlaceType: "3" })
let controlerDict = await getWorkPlaceTypeDict({ workPlaceType: "6" })
let consultDict = await getWorkPlaceTypeDict({ workPlaceType: "5" })
function projectTypeDict(){
for(let i = 0;i<projectTypeDicts.length;i++){
projectTypeDicts[i].label=projectTypeDicts[i].text;
function projectTypeDict() {
for (let i = 0; i < projectTypeDicts.length; i++) {
projectTypeDicts[i].label = projectTypeDicts[i].text;
}
return projectTypeDicts
}
const projectStageDicts: Array<Object> = getDictItemsByCode("projectStage")
function projectStageDict() {
for (let i = 0; i < projectStageDicts.length; i++) {
projectStageDicts[i].label = projectStageDicts[i].text;
}
return projectStageDicts
}
// function approvalRsesult(){
// for(let i = 0;i<approvalRsesults.length;i++){
// approvalRsesults[i].label=approvalRsesults[i].text;
@ -55,18 +62,43 @@ export const columns: BasicColumn[] = [
width: 150,
dataIndex: 'phone',
},
{
title: '项目状态',
width: 150,
dataIndex: 'stage',
customRender: ({ record }) => {
for (let i = 0; i < projectStageDicts.length; i++) {
if (record.stage == projectStageDicts[i].value) {
return projectStageDicts[i].text
}
}
},
},
];
const reformTasksDicts: Array<Object> = getDictItemsByCode("reformTasks")
function reformTasksDict() {
for (let i = 0; i < reformTasksDicts.length; i++) {
reformTasksDicts[i].label = reformTasksDicts[i].text;
}
return reformTasksDicts
}
const roomDicts: Array<Object> = getDictItemsByCode("room")
function roomDict() {
for (let i = 0; i < roomDicts.length; i++) {
roomDicts[i].label = roomDicts[i].text;
}
return roomDicts
}
export const searchFormSchema: FormSchema[] = [
{
label: '项目名称',
field: 'projectName',
component: 'Input',
//colProps: { span: 6 },
//colProps: { span: 6 },
},
{
label: '项目编号',
field: 'projectId',
field: 'id',
component: 'Input',
//colProps: { span: 6 },
}
@ -106,7 +138,7 @@ export const formSchemas: FormSchema[] = [
// labelLength: 3,
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
ifShow:false
ifShow: false
},
{
//标题名称
@ -124,20 +156,29 @@ export const formSchemas: FormSchema[] = [
required: true,
},
{
label: '项目类型',
field: 'projectType',
component: 'Select',
label: '行政区划',
field: 'adminDivision',
//子标题名称(在主标题后面)
component: 'Input',
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
//填写组件Select的属性
componentProps: {
options:projectTypeDict()
},
//默认值
defaultValue: 1,
required: true,
},
// {
// label: '项目类型',
// field: 'projectType',
// component: 'Select',
// colProps: { span: 12 },
// //填写组件Select的属性
// componentProps: {
// options:projectTypeDict()
// },
// //默认值
// defaultValue: 1,
// required: true,
// },
{
label: '主要任务',
field: 'description',
@ -147,9 +188,10 @@ export const formSchemas: FormSchema[] = [
colProps: { span: 24 },
required: true,
},
{
//标题名称
label: '责任单位',
label: '责任单位',
//字段
field: 'dutyWorkplace',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
@ -161,9 +203,9 @@ export const formSchemas: FormSchema[] = [
},
{
//标题名称
label: '建设年限',
label: '单位属性',
//字段
field: 'constructionPeriod',
field: 'workplaceProperties',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
@ -173,80 +215,231 @@ export const formSchemas: FormSchema[] = [
},
{
//标题名称
label: '中央资金',
label: '建设周期(月)',
//字段
field: 'constructionPeriod',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//数值精度
precision: 0,
//步数
step: 0.1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '总投资(元)',
//字段
field: 'totalMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '中央资金(元)',
//字段
field: 'centralMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '省级资金',
label: '省级资金(元)',
//字段
field: 'provincialMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '市级资金',
label: '市级资金(元)',
//字段
field: 'cityMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '区县级资金',
label: '区县级资金(元)',
//字段
field: 'countyMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '自筹资金(元)',
//字段
field: 'selfMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '改革所属项目',
label: '2023年支付(元)',
//字段
field: 'payamount2023Money',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '2024年支付(元)',
//字段
field: 'payamount2024Money',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
}, {
//标题名称
label: '2025年支付(元)',
//字段
field: 'payamount2025Money',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '改革所属项目',
//字段
field: 'reformName',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
component: 'Select',
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
componentProps:{
options:reformTasksDict()
}
},
{
//标题名称
label: '上级指导室',
label: '上级指导室',
//字段
field: 'superLeader',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
component: 'Select',
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
componentProps:{
options:roomDict()
}
},
{
//标题名称
label: '项目联系人',
label: '项目联系人',
//字段
field: 'projectContacts',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
@ -258,7 +451,7 @@ export const formSchemas: FormSchema[] = [
},
{
//标题名称
label: '联系电话',
label: '联系电话',
//字段
field: 'phone',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
@ -297,7 +490,6 @@ export const formSchemas: FormSchema[] = [
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
@ -307,17 +499,16 @@ export const formSchemas: FormSchema[] = [
field: 'manageContactor',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Select',
componentProps:(({formModel})=>{
console.log("formModel.manageContactor",formModel,formModel.manageContactor)
componentProps: (({ formModel }) => {
console.log("formModel.manageContactor", formModel, formModel.manageContactor)
return {
options:[]
options: []
}
}),
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
@ -348,7 +539,6 @@ export const formSchemas: FormSchema[] = [
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
@ -363,7 +553,6 @@ export const formSchemas: FormSchema[] = [
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
@ -395,7 +584,6 @@ export const formSchemas: FormSchema[] = [
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
@ -410,7 +598,6 @@ export const formSchemas: FormSchema[] = [
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
@ -548,15 +735,15 @@ export const formSchemas: FormSchema[] = [
},
{
//标题名称
label: '项目状态',
label: '项目状态',
//字段
field: 'status',
field: 'stage',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
ifShow:false
ifShow: false
}
];
@ -581,9 +768,9 @@ export const approveStartProcessColumns: BasicColumn[] = [
dataIndex: 'approvalStatue',
width: 100,
customRender: ({ record }) => {
for(let i =0;i<approvalRsesults.length;i++){
if(record.approvalStatue==approvalRsesults[i].value){
return approvalRsesults[i].text
for (let i = 0; i < approvalRsesults.length; i++) {
if (record.approvalStatue == approvalRsesults[i].value) {
return approvalRsesults[i].text
}
}
},
@ -594,7 +781,7 @@ export const approveStartProcessColumns: BasicColumn[] = [
width: 100,
}
];
export const resourcetableColumns:BasicColumn[]=[
export const resourcetableColumns: BasicColumn[] = [
{
title: '文件名称',
dataIndex: 'documentName',
@ -604,18 +791,29 @@ export const resourcetableColumns:BasicColumn[]=[
dataIndex: 'size',
width: 100,
customRender: ({ record }) => {
let kbNum:number=record.size/1024
if(kbNum<1024){
return kbNum.toFixed(2).toString()+"KB"
}else{
let mbNum:number = kbNum/1024
return mbNum.toFixed(2).toString()+"MB"
let kbNum: number = record.size / 1024
if (kbNum < 1024) {
return kbNum.toFixed(2).toString() + "KB"
} else {
let mbNum: number = kbNum / 1024
return mbNum.toFixed(2).toString() + "MB"
}
},
},
{
title: '上传时间',
dataIndex: 'createtime',
},
{
title: '文件状态',
dataIndex: 'status',
customRender: ({ record }) => {
if (record.status == 1) {
return "有效"
} else {
return "历史文件"
}
},
}
]

239
src/views/projectLib/projectInfo/uploadFile.vue

@ -1,97 +1,68 @@
<template>
<!-- 自定义表单 -->
<el-divider content-position="left">项目入库详情</el-divider>
<BasicForm @register="registerProjectForm" />
<el-divider content-position="left">上传项目资料</el-divider>
<el-form ref="importFormRef" label-width="130px">
<!-- <el-form-item label="病种kgCode:" prop="kgCode" >
<el-input v-model="importForm.kgCode" ></el-input>
</el-form-item>
<el-form-item label="目标数据库URL:" prop="targetUrl" >
<el-input v-model="importForm.targetUrl"></el-input>
</el-form-item>
<el-form-item label="目标数据库账号:" prop="targetUsername" >
<el-input v-model="importForm.targetUsername"></el-input>
</el-form-item>
<el-form-item label="目标数据库密码: " prop="targetPassword" >
<el-input v-model="importForm.targetPassword"></el-input>
</el-form-item> -->
<el-form-item label="上传文件:" >
<el-upload
class="upload-demo"
ref="upload"
action
:http-request="httpRequest"
:before-upload="beforeUpload"
:on-exceed="handleExceed"
:limit="5">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<div slot="tip" class="el-upload__tip">文件大小且不超过5M</div>
</el-upload>
</el-form-item>
<!-- <el-form-item label="上传word文件:" prop="excel">
<el-upload
class="upload-demo"
ref="upload"
action
:http-request="httpRequest"
:before-upload="beforeUpload"
:on-exceed="handleExceed"
:limit="1">
<el-button slot="trigger" size="small" type="primary">选取excel文件</el-button>
<div slot="tip" class="el-upload__tip">只能上传.xlsx文件且不超过5M</div>
</el-upload>
</el-form-item> -->
<el-form-item>
<el-button type="primary" @click="submitImportForm">开始导入</el-button>
<el-button type="info" @click="dialogVisible">关闭窗口</el-button>
</el-form-item>
</el-form>
<!-- 自定义表单 -->
<el-divider content-position="left">上传项目资料</el-divider>
<el-form ref="importFormRef" label-width="130px">
<el-form-item label="上传文件:">
<el-upload class="upload-demo" ref="upload" action :http-request="httpRequest" :before-upload="beforeUpload"
:on-exceed="handleExceed" :limit="5">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<div slot="tip" class="el-upload__tip">文件大小且不超过5M</div>
</el-upload>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitImportForm">开始导入</el-button>
<el-button type="info" @click="dialogVisible">关闭窗口</el-button>
</el-form-item>
</el-form>
<el-divider content-position="left">项目入库详情</el-divider>
<BasicForm @register="registerProjectForm" />
</template>
<script lang="ts" name="uploadFile" setup>
import { ref,reactive,defineProps,watchEffect} from 'vue'
<script lang="ts" name="submitUploadFile" setup>
import { ref, reactive, defineProps, watchEffect } from 'vue'
import { useForm, BasicForm } from '/@/components/Form';
import { formSchemas,uploadFileformSchemas} from './projectInfo.data';
import{queryProjectInfoById,uploadFile} from './projectInfo.api';
import { formSchemas, uploadFileformSchemas } from './projectInfo.data';
import { queryProjectInfoById, submitUploadFile } from './projectInfo.api';
import { ElMessage } from 'element-plus'
import { defHttp } from '/@/utils/http/axios';
import { string } from 'vue-types';
let fileList=reactive<Array<any>>([]);
let fileList = reactive<Array<any>>([]);
let dataTo = defineProps(["projectid"])
const emit = defineEmits(['close']);
let projecyStatus =ref()
let projecystage = ref()
//
watchEffect(async ()=>{
console.log("dataTo",dataTo,dataTo.projectid)
let param:any = {
projectid:dataTo.projectid
watchEffect(async () => {
console.log("dataTo", dataTo, dataTo.projectid)
let param: any = {
projectid: dataTo.projectid
}
let res =await queryProjectInfoById(param)
console.log("结果是",res)
let res = await queryProjectInfoById(param)
console.log("结果是", res)
setProjectFieldsValue(res)
projecyStatus.value=res.status
projecystage.value = res.stage
})
//
const [registerProjectForm,{setFieldsValue:setProjectFieldsValue,getFieldsValue}] = useForm({
//
schemas: formSchemas,
showActionButtonGroup: false,
//
// autoSubmitOnEnter: true,
// //
// showResetButton: false,
//
// submitButtonOptions: { text: '', preIcon: '' },
// 24 0-24
// actionColOptions: { span: 17 },
labelCol: { style: { width: '120px' } },
wrapperCol:{ style: { width: 'auto' } },
disabled:true
});
//
const [registerProjectForm, { setFieldsValue: setProjectFieldsValue, getFieldsValue }] = useForm({
//
schemas: formSchemas,
showActionButtonGroup: false,
//
// autoSubmitOnEnter: true,
// //
// showResetButton: false,
//
// submitButtonOptions: { text: '', preIcon: '' },
// 24 0-24
// actionColOptions: { span: 17 },
labelCol: { style: { width: '120px' } },
wrapperCol: { style: { width: 'auto' } },
disabled: true
});
// const [registerFormUploadFile] = useForm({
// //
@ -113,66 +84,66 @@ watchEffect(async ()=>{
// function handleSubmit(){
// }
// fileList,
function httpRequest(option) {
fileList.push(option)
}
//
function beforeUpload(file) {
let fileSize = file.size
const FIVE_M= 5*1024*1024;
//5M
if(fileSize>FIVE_M){
ElMessage.error("最大上传5M")
return false
}
//xlsx
// let fileName = file.name
// let reg = /^.+(\.xlsx)$/
// if(!reg.test(fileName)){
// ElMessage.error("xlsx!")
// return false
// }
return true
// fileList,
function httpRequest(option) {
fileList.push(option)
}
//
function beforeUpload(file) {
let fileSize = file.size
const FIVE_M = 5 * 1024 * 1024;
//5M
if (fileSize > FIVE_M) {
ElMessage.error("最大上传5M")
return false
}
//
function handleExceed() {
ElMessage.warning("最多只能上传五个文件")
}
//Excel
async function submitImportForm() {
let data = await getFieldsValue()
console.log("datadatadatadatadatadata",data)
if(data.status!=2){
//xlsx
// let fileName = file.name
// let reg = /^.+(\.xlsx)$/
// if(!reg.test(fileName)){
// ElMessage.error("xlsx!")
// return false
// }
return true
}
//
function handleExceed() {
ElMessage.warning("最多只能上传五个文件")
}
//Excel
async function submitImportForm() {
let data = await getFieldsValue()
console.log("datadatadatadatadatadata", data)
if (data.stage != 2) {
ElMessage({
message: "当前阶段无法上传文件",
type: "error"
})
return
}
// 使form
const params = new FormData()
// paramsData
fileList.forEach((x) => {
console.log("xxxxxxxxxx",x,x.file)
params.append('file', x.file)
});
params.append("projectid",dataTo.projectid)
params.append("status","2")//
//axios
uploadFile(params).then(res=> {
console.log("导入结果",res)
if (res.indexOf) {
ElMessage({
message: "导入成功",
type: "success"
})
emit("close")
}
message: "当前阶段无法上传文件",
type: "error"
})
return
}
function dialogVisible(){
// 使form
const params = new FormData()
// paramsData
fileList.forEach((x) => {
console.log("xxxxxxxxxx", x, x.file)
params.append('file', x.file)
});
params.append("projectid", dataTo.projectid)
// params.append("status", "1")//
//axios
submitUploadFile(params).then(res => {
console.log("导入结果", res)
if (res.indexOf) {
ElMessage({
message: "导入成功",
type: "success"
})
emit("close")
}
}
})
}
function dialogVisible() {
emit("close")
}
</script>
<style></style>

74
src/views/projectLib/projectInfoHistory/Detaillist.vue

@ -0,0 +1,74 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable">
<!--插槽:table标题-->
<!--操作栏-->
<template #action="{ record }">
<!-- <TableAction :actions="getTableAction(record)" /> -->
<TableAction :actions="getTableAction(record)" />
</template>
</BasicTable>
</div>
<BasicModal @register="registeProjectrModal" title="项目信息详情" width="1200px" :showOkBtn="false">
<Detailpage :projectid="proid" />
</BasicModal>
</template>
<script lang="ts" name="system-user" setup>
//ts
import { ref } from 'vue';
import { ActionItem, BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { BasicModal,useModal } from '/@/components/Modal';
import {columns} from './projectInfoHistory.data'
// import { list } from './address.api';
import Detailpage from './Detailpage.vue';
import { singleProjectInfoHistoryPageList } from './projectInfoHistory.api';
import { useUserStore } from '/@/store/modules/user';
let dataTo = defineProps(["projectid"])
const userStore = useUserStore();
let proid = ref();
const [registeProjectrModal, { openModal: openModalProjectr }] = useModal();//
const { tableContext } = useListPage({
designScope: 'basic-table-demo-ajax',
tableProps: {
title: '项目信息',
api: singleProjectInfoHistoryPageList,
columns: columns,
actionColumn: {
width: 120,
fixed: "right",
},
useSearchForm: false,
beforeFetch(params) {
params.projectId = dataTo.projectid
},
},
});
//BasicTable
const [registerTable, { reload }] = tableContext;
function getTableAction(record): ActionItem[] {
return [
{
label: '详情',
onClick: handleDetailpage.bind(null, record),
},
];
}
function handleDetailpage(record) {
proid.value = record.id
openModalProjectr()
}
</script>
<style scoped></style>./projectInfoHistory.data

111
src/views/projectLib/projectInfoHistory/Detailpage.vue

@ -0,0 +1,111 @@
<template>
<!-- 自定义表单 -->
<el-divider content-position="left">项目入库详情</el-divider>
<BasicForm @register="registerProjectForm" />
</template>
<script lang="ts" name="Detailpage" setup>
import { ref, defineProps, onMounted,onUpdated } from 'vue'
import { useForm, BasicForm } from '/@/components/Form';
import { formSchemas, } from '../projectInfo/projectInfo.data';
import { queryProjectInfoHistoryById } from './projectInfoHistory.api';
import { ActionItem, BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { getUserInfoByid } from '../initiatesProjects/initiatesProjects.api'
let dataTo = defineProps(["projectid"])
let projectstage = ref()
onMounted(async () => {
console.log("projectid", dataTo.projectid)
let param: any = {
id: dataTo.projectid
}
let resProject = await queryProjectInfoHistoryById(param)
setFieldsValue(resProject)
projectstage.value = resProject.stage
console.log("projectid", dataTo.projectid, projectstage.value)
})
onUpdated(async()=>{
let proform = getFieldsValueProjectForm()
for (let key in proform) {
if (key.indexOf("Contactor") != -1&&proform[key]!=null) {
let userid = proform[key]
let res = await getUserInfoByid({ id: userid })
console.log("Contactor",key, res)
updateProjectSchema({
field: key,
componentProps: {
options: [{
value: userid,
label: res.realname
}
],
}
})
}
}
})
/**
* BasicForm绑定注册;
* useForm 是整个框架的核心用于表单渲染里边封装了很多公共方法;
* 支持schemas: 渲染表单列autoSubmitOnEnter回车提交,submitButtonOptions自定义按钮文本和图标等方法
* 平台通过此封装简化了代码支持自定义扩展;
*/
const [registerProjectForm, { setFieldsValue,getFieldsValue: getFieldsValueProjectForm, setProps, updateSchema: updateProjectSchema }] = useForm({
//
schemas: formSchemas,
showActionButtonGroup: false,
//
// autoSubmitOnEnter: true,
// //
// showResetButton: false,
//
// submitButtonOptions: { text: '', preIcon: '' },
// 24 0-24
// actionColOptions: { span: 17 },
labelCol: { style: { width: '120px' } },
wrapperCol: { style: { width: 'auto' } },
disabled: true
});
//table
// const { tableContext: approveStarttableContext } = useListPage({
// tableProps: {
// size: 'small',//
// title: '',
// api: queryProcessInfo,
// columns: approveStartProcessColumns,
// showActionColumn: false,
// useSearchForm: false,
// beforeFetch(params) {
// params.stage = projectstage.value>=3?"2":"1",
// params.projectid = dataTo.projectid
// },
// },
// });
// BasicTable
// const [registerApproveStartTable] = approveStarttableContext;
// //table
// const { tableContext } = useListPage({
// tableProps: {
// size: 'small',//
// title: '',
// api: queryResourceInfo,
// columns: resourcetableColumns,
// useSearchForm: false,
// actionColumn: {
// width: 120,
// fixed: "right",
// },
// beforeFetch(params) {
// params.stage = "1",
// params.projectid = dataTo.projectid
// },
// },
// });
// const [registerResourceTable] = tableContext;
</script>
<style></style>
./projectInfoHistory.data

73
src/views/projectLib/projectInfoHistory/index.vue

@ -0,0 +1,73 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable">
<!--插槽:table标题-->
<!--操作栏-->
<template #action="{ record }">
<!-- <TableAction :actions="getTableAction(record)" /> -->
<TableAction :actions="getTableAction(record)" />
</template>
</BasicTable>
</div>
<BasicModal @register="registeProjectrModal" title="项目信息详情" width="1200px" :showOkBtn="false">
<Detaillist :projectid="proid" />
</BasicModal>
</template>
<script lang="ts" name="system-user" setup>
//ts
import { ref } from 'vue';
import { ActionItem, BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { BasicModal,useModal } from '/@/components/Modal';
import { searchFormSchema } from '../projectInfo/projectInfo.data';
import {columns} from './projectInfoHistory.data'
// import { list } from './address.api';
import Detaillist from './Detaillist.vue';
import { projectInfoHistoryPageList } from './projectInfoHistory.api';
import { useUserStore } from '/@/store/modules/user';
const userStore = useUserStore();
let proid = ref();
const [registeProjectrModal, { openModal: openModalProjectr }] = useModal();//
const { tableContext } = useListPage({
designScope: 'basic-table-demo-ajax',
tableProps: {
title: '项目信息',
api: projectInfoHistoryPageList,
columns: columns,
actionColumn: {
width: 120,
fixed: "right",
},
//
formConfig: {
schemas: searchFormSchema,
}
},
});
//BasicTable
const [registerTable, { reload }] = tableContext;
function getTableAction(record): ActionItem[] {
return [
{
label: '详情',
onClick: handleDetailpage.bind(null, record),
},
];
}
function handleDetailpage(record) {
proid.value = record.id
openModalProjectr()
}
</script>
<style scoped></style>./projectInfoHistory.data

25
src/views/projectLib/projectInfoHistory/projectInfoHistory.api.ts

@ -0,0 +1,25 @@
import { update } from 'lodash-es';
import { defHttp } from '/@/utils/http/axios';
export enum Api {
projectInfoHistoryPageList = '/huzhouProjectinfoHistory/projectInfoHistoryPageList',
singleProjectInfoHistoryPageList = '/huzhouProjectinfoHistory/singleProjectInfoHistoryPageList',
queryProjectInfoHistoryById='huzhouProjectinfoHistory/queryProjectInfoHistoryById'
}
/**
* list
*/
export const projectInfoHistoryPageList = (params?) =>defHttp.get({ url: Api.projectInfoHistoryPageList, params });
export const singleProjectInfoHistoryPageList = (params?) =>defHttp.get({ url: Api.singleProjectInfoHistoryPageList, params });
export const queryProjectInfoHistoryById = (params?) =>defHttp.get({ url: Api.queryProjectInfoHistoryById, params });

808
src/views/projectLib/projectInfoHistory/projectInfoHistory.data.ts

@ -0,0 +1,808 @@
import { FormSchema } from '/@/components/Form';
import { BasicColumn } from '/@/components/Table';
import { getDictItemsByCode } from '/@/utils/dict/index';
import { UploadTypeEnum } from '/@/components/Form/src/jeecg/components/JUpload';
import { size } from 'lodash-es';
import { el } from 'element-plus/es/locale';
const projectTypeDicts: Array<Object> = getDictItemsByCode("projectType")
const approvalRsesults: Array<Object> = getDictItemsByCode("approvalResult")
import { getWorkPlaceTypeDict, getContactorDict, getUserInfoByid } from '../initiatesProjects/initiatesProjects.api'
let manageOrgDict = await getWorkPlaceTypeDict({ workPlaceType: "1" })
let supervisorDict = await getWorkPlaceTypeDict({ workPlaceType: "2" })
let contructorDict = await getWorkPlaceTypeDict({ workPlaceType: "4" })
let ownerDict = await getWorkPlaceTypeDict({ workPlaceType: "3" })
let controlerDict = await getWorkPlaceTypeDict({ workPlaceType: "6" })
let consultDict = await getWorkPlaceTypeDict({ workPlaceType: "5" })
function projectTypeDict() {
for (let i = 0; i < projectTypeDicts.length; i++) {
projectTypeDicts[i].label = projectTypeDicts[i].text;
}
return projectTypeDicts
}
const projectStageDicts: Array<Object> = getDictItemsByCode("projectStage")
function projectStageDict() {
for (let i = 0; i < projectStageDicts.length; i++) {
projectStageDicts[i].label = projectStageDicts[i].text;
}
return projectStageDicts
}
// function approvalRsesult(){
// for(let i = 0;i<approvalRsesults.length;i++){
// approvalRsesults[i].label=approvalRsesults[i].text;
// }
// return approvalRsesults
// }
export const columns: BasicColumn[] = [
{
title: '项目编号',
width: 150,
dataIndex: 'id',
},
{
title: '项目名称',
dataIndex: 'projectName',
width: 150,
},
{
title: '主要任务及标志性成果',
dataIndex: 'description',
width: 150,
},
{
title: '责任单位',
dataIndex: 'dutyWorkplace',
width: 100,
},
{
title: '联系电话',
width: 150,
dataIndex: 'phone',
},
];
const reformTasksDicts: Array<Object> = getDictItemsByCode("reformTasks")
function reformTasksDict() {
for (let i = 0; i < reformTasksDicts.length; i++) {
reformTasksDicts[i].label = reformTasksDicts[i].text;
}
return reformTasksDicts
}
const roomDicts: Array<Object> = getDictItemsByCode("room")
function roomDict() {
for (let i = 0; i < roomDicts.length; i++) {
roomDicts[i].label = roomDicts[i].text;
}
return roomDicts
}
export const searchFormSchema: FormSchema[] = [
{
label: '项目名称',
field: 'projectName',
component: 'Input',
//colProps: { span: 6 },
},
{
label: '项目编号',
field: 'projectId',
component: 'Input',
//colProps: { span: 6 },
}
];
export const uploadFileformSchemas: FormSchema[] = [
{
field: 'uploadFile',
component: 'JUpload',
helpMessage: '最多上传3个文件',
label: '上传文件',
componentProps: { maxCount: 3 },
},
{
field: 'uploadImage',
component: 'JUpload',
label: '上传图片',
helpMessage: '无限制上传',
componentProps: {
fileType: UploadTypeEnum.image,
},
},
]
export const formSchemas: FormSchema[] = [
{
//标题名称
label: '项目id',
//字段
field: 'id',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
//标题宽度,支持数字和字符串
// labelWidth: 150,
// //标题长度,超过位数隐藏
// labelLength: 3,
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
ifShow: false
},
{
//标题名称
label: '项目名称',
//字段
field: 'projectName',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
//标题宽度,支持数字和字符串
// labelWidth: 150,
// //标题长度,超过位数隐藏
// labelLength: 3,
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
label: '行政区划',
field: 'adminDivision',
//子标题名称(在主标题后面)
component: 'Input',
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
// {
// label: '项目类型',
// field: 'projectType',
// component: 'Select',
// colProps: { span: 12 },
// //填写组件Select的属性
// componentProps: {
// options:projectTypeDict()
// },
// //默认值
// defaultValue: 1,
// required: true,
// },
{
label: '主要任务',
field: 'description',
//子标题名称(在主标题后面)
component: 'InputTextArea',
//一列占比总共24,比如一行显示2列
colProps: { span: 24 },
required: true,
},
{
//标题名称
label: '责任单位',
//字段
field: 'dutyWorkplace',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '单位属性',
//字段
field: 'workplaceProperties',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '建设周期(月)',
//字段
field: 'constructionPeriod',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//数值精度
precision: 0,
//步数
step: 0.1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '总投资(元)',
//字段
field: 'totalMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '中央资金(元)',
//字段
field: 'centralMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '省级资金(元)',
//字段
field: 'provincialMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '市级资金(元)',
//字段
field: 'cityMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '区县级资金(元)',
//字段
field: 'countyMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '自筹资金(元)',
//字段
field: 'selfMoney',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '2023年支付(元)',
//字段
field: 'payamount2023Money',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '2024年支付(元)',
//字段
field: 'payamount2024Money',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
}, {
//标题名称
label: '2025年支付(元)',
//字段
field: 'payamount2025Money',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'InputNumber',
componentProps: {
//带标签的 input,设置后置标签
addonBefore: '保留两位小数',
//数值精度
precision: 2,
//步数
step: 1
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '改革所属项目',
//字段
field: 'reformName',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Select',
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
componentProps:{
options:reformTasksDict()
}
},
{
//标题名称
label: '上级指导室',
//字段
field: 'superLeader',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Select',
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
componentProps:{
options:roomDict()
}
},
{
//标题名称
label: '项目联系人',
//字段
field: 'projectContacts',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '联系电话',
//字段
field: 'phone',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '管理单位',
//字段
field: 'manageOrg',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Select',
componentProps: ({ formModel, formActionType }) => {
console.log("formModel", formModel, "formActionType", formActionType)
return {
//
options: manageOrgDict,
onChange: async (value) => {
// console.log(e)
let manageContactorDict = await getContactorDict({ workPlace: value, workPlaceType: "1" })
// formModel.manageContactor = undefined; // reset city value
const { updateSchema, setFieldsValue } = formActionType;
updateSchema({
field: 'manageContactor',
componentProps: {
options: manageContactorDict,
},
});
setFieldsValue({ manageContactor: "" })
},
};
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
},
{
//标题名称
label: '管理单位负责人',
//字段
field: 'manageContactor',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Select',
componentProps: (({ formModel }) => {
console.log("formModel.manageContactor", formModel, formModel.manageContactor)
return {
options: []
}
}),
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
},
{
//标题名称
label: '监管单位',
//字段
field: 'supervisor',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Select',
componentProps: ({ formModel, formActionType }) => {
console.log("formModel", formModel, "formActionType", formActionType)
return {
//
options: supervisorDict,
onChange: async (value) => {
// console.log(e)
let supervisorContactorDict = await getContactorDict({ workPlace: value, workPlaceType: "2" })
// formModel.manageContactor = undefined; // reset city value
const { updateSchema, setFieldsValue } = formActionType;
updateSchema({
field: 'supervisorContactor',
componentProps: {
options: supervisorContactorDict,
},
});
setFieldsValue({ supervisorContactor: "" })
},
};
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
},
{
//标题名称
label: '监管单位负责人',
//字段
field: 'supervisorContactor',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Select',
componentProps: {
options: [],
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
},
{
//标题名称
label: '承建单位',
//字段
field: 'contructor',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Select',
componentProps: ({ formModel, formActionType }) => {
console.log("formModel", formModel, "formActionType", formActionType)
return {
//
options: contructorDict,
onChange: async (value) => {
// console.log(e)
let contructorContactorDict = await getContactorDict({ workPlace: value, workPlaceType: "4" })
// formModel.manageContactor = undefined; // reset city value
const { updateSchema, setFieldsValue } = formActionType;
updateSchema({
field: 'contructorContactor',
componentProps: {
options: contructorContactorDict,
},
});
setFieldsValue({ contructorContactor: "" })
},
};
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
},
{
//标题名称
label: '承建单位负责人',
//字段
field: 'contructorContactor',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Select',
componentProps: {
options: [],
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
},
{
//标题名称
label: '建设单位',
//字段
field: 'owner',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Select',
componentProps: ({ formModel, formActionType }) => {
console.log("formModel", formModel, "formActionType", formActionType)
return {
//
options: ownerDict,
onChange: async (value) => {
// console.log(e)
let ownerContactorDict = await getContactorDict({ workPlace: value, workPlaceType: "3" })
// formModel.manageContactor = undefined; // reset city value
const { updateSchema, setFieldsValue } = formActionType;
updateSchema({
field: 'ownerContactor',
componentProps: {
options: ownerContactorDict,
}
});
setFieldsValue({ ownerContactor: "" })
},
};
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '建设单位负责人',
//字段
field: 'ownerContactor',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Select',
componentProps: {
options: [],
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
required: true,
},
{
//标题名称
label: '监理单位',
//字段
field: 'controler',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Select',
componentProps: ({ formModel, formActionType }) => {
console.log("formModel", formModel, "formActionType", formActionType)
return {
//
options: controlerDict,
onChange: async (value) => {
// console.log(e)
let controlerContactorDict = await getContactorDict({ workPlace: value, workPlaceType: "6" })
// formModel.manageContactor = undefined; // reset city value
const { updateSchema, setFieldsValue } = formActionType;
updateSchema({
field: 'controlerContactor',
componentProps: {
options: controlerContactorDict,
}
});
setFieldsValue({ controlerContactor: "" })
},
};
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
},
{
//标题名称
label: '监理单位负责人',
//字段
field: 'controlerContactor',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Select',
componentProps: {
options: [],
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
},
{
//标题名称
label: '咨询单位',
//字段
field: 'consult',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Select',
componentProps: ({ formModel, formActionType }) => {
console.log("formModel", formModel, "formActionType", formActionType)
return {
//
options: consultDict,
onChange: async (value) => {
// console.log(e)
let consultContactoDict = await getContactorDict({ workPlace: value, workPlaceType: "5" })
// formModel.manageContactor = undefined; // reset city value
const { updateSchema, setFieldsValue } = formActionType;
updateSchema({
field: 'consultContactor',
componentProps: {
options: consultContactoDict,
}
});
setFieldsValue({ consultContactor: "" })
},
};
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
},
{
//标题名称
label: '咨询单位负责人',
//字段
field: 'consultContactor',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Select',
componentProps: {
options: [],
},
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
},
{
//标题名称
label: '项目状态',
//字段
field: 'stage',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
//一列占比总共24,比如一行显示2列
colProps: { span: 12 },
ifShow: false
}
];
export const approveStartProcessColumns: BasicColumn[] = [
{
title: '节点名称',
dataIndex: 'taskName',
},
{
title: '处理人',
dataIndex: 'operator',
width: 150,
},
{
title: '处理时间',
dataIndex: 'operateDate',
width: 150,
},
{
title: '审批状态',
dataIndex: 'approvalStatue',
width: 100,
customRender: ({ record }) => {
for (let i = 0; i < approvalRsesults.length; i++) {
if (record.approvalStatue == approvalRsesults[i].value) {
return approvalRsesults[i].text
}
}
},
},
{
title: '审批意见',
dataIndex: 'comment',
width: 100,
}
];
export const resourcetableColumns: BasicColumn[] = [
{
title: '文件名称',
dataIndex: 'documentName',
},
{
title: '文件大小',
dataIndex: 'size',
width: 100,
customRender: ({ record }) => {
let kbNum: number = record.size / 1024
if (kbNum < 1024) {
return kbNum.toFixed(2).toString() + "KB"
} else {
let mbNum: number = kbNum / 1024
return mbNum.toFixed(2).toString() + "MB"
}
},
},
{
title: '上传时间',
dataIndex: 'createtime',
},
{
title: '文件状态',
dataIndex: 'status',
customRender: ({ record }) => {
if (record.status == 1) {
return "有效"
} else {
return "历史文件"
}
},
}
]

217
src/views/projectLib/projectPlan/addPlan.vue

@ -1,132 +1,125 @@
<template>
<BasicTable @register="registerTable">
<!-- <template #action="{ record }">
<TableAction :actions="getTableAction(record)" />
</template>
<template #tableTitle>
<a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleCreate"> 新增计划</a-button>
</template> -->
</BasicTable>
<div style="display: flex; justify-content: center; align-items: center; height: 100px;">
<el-button type="primary" @click="onSubmit">修改</el-button>
<el-button @click="handlecancle">取消</el-button>
<!-- <el-button>取消</el-button> -->
<!-- 自定义表单 -->
<el-divider content-position="left" >模板表格文件下载</el-divider>
<div style="padding-left: 40px;">
<el-button slot="trigger" type="primary" @click="downexcel">下载模板</el-button>
</div>
<el-divider content-position="left">上传表格文件</el-divider>
<el-form ref="importFormRef" label-width="130px">
<el-form-item label="上传文件:">
<el-upload class="upload-demo" ref="upload" action :http-request="httpRequest" :before-upload="beforeUpload"
:on-exceed="handleExceed" :limit="1" accept=".xls, .xlsx">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<div slot="tip" class="el-upload__tip">只能上传excel文件且不超过5M</div>
</el-upload>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitImportForm">开始导入</el-button>
<el-button type="info" @click="dialogVisible">关闭窗口</el-button>
</el-form-item>
</el-form>
</template>
<script lang="ts" name="addPlan" setup>
import { ref, defineProps, onMounted } from 'vue'
import { planDetailColumns } from './projectPlan.data'
import { queryPlanModuleDetailPage, queryPlanModuleone,saveProjectPlan} from './projectPlan.api'
import { ActionItem, BasicTable } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
<script lang="ts" name="uploadFile" setup>
import { ref, reactive, defineProps, watchEffect } from 'vue'
import { useForm } from '/@/components/Form';
import { } from './projectPlan.data';
import { submitplaninfoUploadFile, modifyPlaninfo } from './projectPlan.api';
import { ElMessage } from 'element-plus'
import { downloadFile } from "../../../api/common/api"
import { ElMessage, dayjs } from 'element-plus'
let dataTo = defineProps(["projectType", "projectId"])
let emit = defineEmits(["close"])
let projectType = ref<string>()
let projectId = ref<string>()
let moduleId = ref()
onMounted(async () => {
setShowPagination(false)//
projectType.value = dataTo.projectType
projectId.value = dataTo.projectId
console.log("projectType", projectType)
let res = await queryPlanModuleone({ projectType: projectType.value })
moduleId.value = res.id
reload()//
// if (dataTo.projectType) {
// } else {
// let tableData = await getDataSource();
// }
})
function getTableAction(record): ActionItem[] {
return [
{
label: '删除',
ifShow: true,
onClick: handleRemoveDetail.bind(null, record),
}
];
}
let fileList = reactive<Array<any>>([]);
let dataTo = defineProps(["projectid", "type"])
const emit = defineEmits(['close']);
//
watchEffect(async () => {
console.log("dataTo", dataTo, dataTo.projectid)
})
//table
const { tableContext } = useListPage({
tableProps: {
size: 'small',//
title: '项目计划模板详情',
api: queryPlanModuleDetailPage,
columns: planDetailColumns,
useSearchForm: false,
showActionColumn: false,
actionColumn: {
width: 120,
fixed: "right",
},
beforeFetch(params) {
params.moduleId = moduleId.value
},
},
});
const [registerTable, { getDataSource, setTableData, setShowPagination,reload }] = tableContext;
function handleDetailpage(record) {
console.log("我这一行的数据是", record)
function downexcel() {
let param = {
path: record.documentPath,
fileName: record.documentName
path: "Resources/项目计划模板.xlsx",
fileName: "项目计划模板.xlsx"
}
//
console.log("我这一行的数据是", param)
downloadFile("/huzhouUploadfileinfo/downloadfile", "项目计划模板.xlsx", param)
downloadFile("/huzhouProject/downloadfile", record.documentName, param)
}
async function handleCreate() {
//await setShowPagination(false);
let tableData = await getDataSource();
tableData.push({ taskName: "aaa" })
setTableData(tableData)
}
// function onEditChange({ column, value, record }) {
// //
// if (column.dataIndex === 'scheduledEndTime') {
// record.editValueRefs.name4.value = `${value}`;
// }
// console.log(column, value, record);
// }
function handlecancle() {
emit("close")
function httpRequest(option) {
fileList.pop()
fileList.push(option)
}
//
function beforeUpload(file) {
let fileSize = file.size
const FIVE_M = 5 * 1024 * 1024;
//5M
if (fileSize > FIVE_M) {
ElMessage.error("最大上传5M")
return false
}
//xlsx
const fileSuffix = file.name.substring(file.name.lastIndexOf(".") + 1);
let whiteList = ["xls", "xlsx"];
async function onSubmit() {
let tableData = await getDataSource();
for (let i = 0; i < tableData.length; i++) {
//
if (tableData[i].scheduledStartTime && tableData[i].scheduledEndTime) {
tableData[i].projectId = projectId
} else {
ElMessage({
message: "请填写第" + (i + 1) + "行的数据",
type: "error"
})
return;
}
if (whiteList.indexOf(fileSuffix) === -1) {
ElMessage.error('上传文件只能是xls、xlsx格式');
return false;
}
await saveProjectPlan(tableData)
emit("close")
// let fileName = file.name
// let reg = /^.+(\.xlsx)$/
// if(!reg.test(fileName)){
// ElMessage.error("xlsx!")
// return false
// }
return true
}
//
function handleExceed() {
ElMessage.warning("最多只能上传一个文件")
}
async function handleRemoveDetail(record) {
let tableData = await getDataSource();
//Excel
async function submitImportForm() {
// console.log("datadatadatadatadatadata", data)
// if (data.stage != 2) {
// ElMessage({
// message: "",
// type: "error"
// })
// return
// }
// // 使form
const params = new FormData()
// paramsData
// fileList.forEach((x) => {
// console.log("xxxxxxxxxx", x, x.file)
// });
params.append('file', fileList[0].file)
params.append("projectid", dataTo.projectid)
//12
if (dataTo.type == "1") {
//axios
submitplaninfoUploadFile(params).then(() => {
emit("close")
})
} else {
modifyPlaninfo(params).then(() => {
emit("close")
})
}
}
function dialogVisible() {
emit("close")
}
</script>
<style></style>

134
src/views/projectLib/projectPlan/addPlanFile.vue

@ -0,0 +1,134 @@
<template>
<!-- 自定义表单 -->
<!-- <el-divider content-position="left">模板表格文件下载</el-divider>
<div style="padding-left: 40px;">
<el-button slot="trigger" type="primary">下载模板</el-button>
</div> -->
<el-divider content-position="left">上传表格文件</el-divider>
<el-form ref="importFormRef" label-width="130px">
<el-form-item v-for=" (item, index) in dataTo.files" :key="index" :label="item">
<el-upload class="upload-demo" ref="upload" action :http-request="httpRequest"
:before-upload="(file) => { return beforeUpload(file, item) }" :on-exceed="handleExceed" :limit="1"
:on-remove="removeFile">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<div slot="tip" class="el-upload__tip">只能上传[{{ item }}]且不超过5M</div>
</el-upload>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitImportForm">开始导入</el-button>
<el-button type="info" @click="dialogVisible">关闭窗口</el-button>
</el-form-item>
</el-form>
</template>
<script lang="ts" name="uploadFile" setup>
import { ref, reactive, defineProps, onMounted } from 'vue'
import { useForm } from '/@/components/Form';
import { } from './projectPlan.data';
import { planUploadFile, planUploadModifyFile } from './projectPlan.api';
import { ElMessage } from 'element-plus'
let fileList = reactive<Array<any>>([]);
let dataTo = defineProps(["type", "files", "planinfoid"])
const emit = defineEmits(['close']);
//
onMounted(async () => {
console.log("dataTo", dataTo)
})
function httpRequest(option) {
fileList.push(option)
console.log(fileList, option)
}
function removeFile(option) {
for (let i = 0; i < fileList.length; i++) {
if (fileList[i].file.name == option.name) {
fileList.splice(i, 1)
}
}
console.log(fileList, option)
}
//
function beforeUpload(file, item) {
console.log("file,item", file, item)
let fileSize = file.size
const FIVE_M = 5 * 1024 * 1024;
//5M
if (fileSize > FIVE_M) {
ElMessage.error("最大上传5M")
return false
}
if (item != file.name) {
ElMessage.error('请上传文件:' + item);
return false;
}
//xlsx
// const fileSuffix = file.name.substring(file.name.lastIndexOf(".") + 1);
// let whiteList = ["xls", "xlsx"];
// if (whiteList.indexOf(fileSuffix) === -1) {
// ElMessage.error('xlsxlsx');
// return false;
// }
// let fileName = file.name
// let reg = /^.+(\.xlsx)$/
// if(!reg.test(fileName)){
// ElMessage.error("xlsx!")
// return false
// }
return true
}
//
function handleExceed() {
ElMessage.warning("最多只能上传一个文件")
}
//Excel
async function submitImportForm() {
if (fileList.length == 0) {
ElMessage({
message: "未选择任何文件,无法上传!",
type: "error"
})
return
}
// type ==0type ==1
if (fileList.length != dataTo.files.length && dataTo.type == 0) {
ElMessage({
message: "上传的文件不符合要求请检查",
type: "error"
})
return
}
// // 使form
const params = new FormData()
// paramsData
fileList.forEach((x) => {
console.log("xxxxxxxxxx", x, x.file)
params.append('file', x.file)
});
params.append("planinfoid", dataTo.planinfoid)
if (dataTo.type == 0) {
planUploadFile(params).then(() => {
emit("close")
})
} else {
planUploadModifyFile(params).then(() => {
emit("close")
})
}
}
function dialogVisible() {
emit("close")
}
</script>
<style></style>

29
src/views/projectLib/projectPlan/elstepchild.vue

@ -0,0 +1,29 @@
<template>
<el-steps direction="vertical" finish-status="success">
<el-step v-for="(item, index) in dataTo.child" :key="index" :status="item.isfinish==1?'success':'wait'">
<template #title>
<div>
{{ item.taskName }}
</div>
<div>
{{ item.scheduledStartTime }}
</div>
<div>
{{ item.scheduledEndTime }}
</div>
</template>
<template #description>
<elstepchild v-if="item.children!=null" :child="item.children"></elstepchild>
</template>
</el-step>
</el-steps>
</template>
<script lang="ts" name="viewPlanDetail" setup>
import { ref, onMounted } from 'vue'
import elstepchild from './elstepchild.vue'
let dataTo = defineProps(["child"])
let active = ref(2)
</script>
<style scoped></style>

186
src/views/projectLib/projectPlan/index.vue

@ -1,26 +1,41 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable">
<BasicTable @register="registerTable" @expand="tableExpand">
<!--插槽:table标题-->
<!--操作栏-->
<!-- <template #expandedRowRender="{ record }" class="your-custom-expanded-row">
<el-timeline class="timeline">
<el-timeline-item
class="lineitem"
v-for="(item,index) in activities"
@click.native="handleChangeVideo(activities)"
:key="index"
:timestamp="item.scheduledStartTime+'--'+item.scheduledEndTime"
:color="item.actualEndTime!=null?'green':''"
style="border-top: #0048d8!important;"
>
{{ item.taskName }}
</el-timeline-item>
</el-timeline>
</template> -->
<template #action="{ record }">
<!-- <TableAction :actions="getTableAction(record)" /> -->
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />
<TableAction :actions="getTableAction(record)" />
</template>
</BasicTable>
</div>
<BasicModal @register="registeViewPlanDetail" title="项目信息详情" width="1200px" :showOkBtn="false">
<viewPlanDetail :projectId="projectId"/>
<viewPlanDetail :projectId="projectId" :projectStage="projectStage"/>
</BasicModal>
<BasicModal @register="registerProjectPlan" title="发起项目计划审批" width="1200px" :showOkBtn="false" :showCancelBtn="false">
<addPlan :projectType="projectType" :projectId="projectId" @close="closeProjectPlanModal()" />
<addPlan :type="type" :projectid="projectId" @close="closeProjectPlanModal()" />
</BasicModal>
</template>
<script lang="ts" name="system-user" setup>
//ts
import { ref } from 'vue';
import { ref,reactive,defineAsyncComponent } from 'vue';
import { ActionItem, BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
@ -28,20 +43,26 @@ import { useModal } from '/@/components/Modal';
import { BasicModal } from '/@/components/Modal';
import addPlan from './addPlan.vue'
import viewPlanDetail from "./viewPlanDetail.vue";
// const viewPlanDetail = defineAsyncComponent(() =>
// import('./viewPlanDetail.vue')
// )
import { columns, searchFormSchema } from '../projectInfo/projectInfo.data';
import { queryProjectApprovedPage } from './projectPlan.api';
import { projectApprovedPageList,queryPlanInfoMainTimeline } from './projectPlan.api';
let projectId = ref();
let projectType = ref();
const [registeViewPlanDetail, { openModal:openViewPlanDetail }] = useModal();//
let type = ref();
let activities = ref([])
let projectStage = ref();
const [registeViewPlanDetail, { openModal: openViewPlanDetail }] = useModal();//
const [registerProjectPlan, { openModal: openProjectPlan, closeModal: closeProjectPlan }] = useModal();//
const { tableContext } = useListPage({
designScope: 'basic-table-demo-ajax',
tableProps: {
title: '项目信息',
api: queryProjectApprovedPage,
api: projectApprovedPageList,
columns: columns,
actionColumn: {
width: 120,
@ -55,39 +76,37 @@ const { tableContext } = useListPage({
});
//BasicTable
const [registerTable, { reload }] = tableContext;
function getTableAction(record): ActionItem[] {
return [
{
label: '详情',
ifShow: () => {
return record.stage >= 4
},
onClick: handleDetailpage.bind(null, record),
},
];
}
/**
* 下拉操作栏
*/
function getDropDownAction(record): ActionItem[] {
return [
{
label: '设计项目计划',
ifShow: () => {
return record.status == 4
return record.stage == 3
},
onClick: handlePlan.bind(null, record)
},
{
label: '查看项目计划',
label: '修改项目计划',
ifShow: () => {
return record.status == 5
return record.stage == 5
},
onClick: handleViewPlan.bind(null, record)
onClick: handlePlan.bind(null, record)
},
];
}
function handleDetailpage(record) {
projectId.value = record.id
projectStage.value=record.stage
openViewPlanDetail()
@ -95,22 +114,133 @@ function handleDetailpage(record) {
// console.log(selectedRowKeys.value);
}
function handlePlan(record) {
projectType.value = record.projectType
type.value =record.stage==5?"2":"1"
projectId.value = record.id
openProjectPlan()
// console.log(selectedRows.value);
// console.log(selectedRowKeys.value);
}
function handleViewPlan(record) {
projectId.value = record.id
projectType.value =undefined
openViewPlanDetail()
}
function closeProjectPlanModal() {
closeProjectPlan()
reload()
}
async function tableExpand(expanded, record) {
console.log("wwwwwwwwwwww", expanded, record)
if(expanded){
activities.value = await queryPlanInfoMainTimeline({
projectid:record.id
})
console.log("22222222222222",activities)
}
//API
}
function handleChangeVideo(record) {
console.log("qqqqqqqqqqqqqqq", record)
}
</script>
<style scoped></style>
<style scoped>
.timeline {
display: flex;
width: 100%;
margin-bottom: 100px;
.lineitem {
transform: translateX(50%);
width: 25%;
}
}
::v-deep .el-timeline-item__tail {
border-left: none;
width: 100%;
border-top: 2px solid #e4e7ed;
position: absolute;
top: 6px;
}
::v-deep .el-timeline-item__wrapper {
padding-left: 0;
position: absolute;
top: 20px;
transform: translateX(-50%);
text-align: center;
}
::v-deep .el-timeline-item__timestamp {
font-size: 14px;
}
.nested-timeline {
margin-left: 20px;
border-left: 1px dashed #ccc;
padding-left: 20px;
}
.nested-timeline-item {
margin-bottom: 10px;
}
::v-deep .ant-table-expanded-row {
height: auto !important;
/* 其他样式 */
}
/* .processBox {
background-color: #fff;
height: 210px;
.title {
font-size: 16px;
font-weight: 600;
padding-left: 32px;
padding-top: 16px;
}
.timelineProcessBox {
.timeline {
display: flex;
width: 95%;
margin: 40px auto;
.lineitem {
transform: translateX(50%);
width: 25%;
}
}
}
}
:deep(.el-timeline-item__tail) {
border-left: none;
border-top: 2px solid #e4e7ed;
width: 100%;
position: absolute;
top: 6px;
}
:deep(.el-timeline-item__wrapper) {
padding-left: 0;
position: absolute;
top: 20px;
transform: translateX(-50%);
text-align: center;
}
:deep(.el-timeline-item__timestamp) {
font-size: 14px;
}
.active {
:deep(.el-timeline-item__node) {
background-color: $login_word;
}
:deep(.el-timeline-item__tail) {
border-color: $login_word;
}
}
.active + li {
:deep(.el-timeline-item__node) {
background-color: $login_word;
}
} */
</style>

116
src/views/projectLib/projectPlan/planinfoFileDetail.vue

@ -0,0 +1,116 @@
<template>
<!-- 自定义表单 -->
<!-- <el-divider content-position="left">项目入库详情</el-divider>
<BasicForm @register="registerProjectForm" /> -->
<el-divider content-position="left">{{dataTo.taskName}}</el-divider>
<div >
<el-divider content-position="left">项目资料详情</el-divider>
<BasicTable @register="registerResourceTable">
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" />
</template>
</BasicTable>
</div>
<!-- <el-divider content-position="left">审批详情</el-divider>
<BasicTable @register="registerApproveStartTable" /> -->
</template>
<script lang="ts" name="Detailpage" setup>
import { ref, defineProps, onMounted } from 'vue'
import { useForm, BasicForm } from '/@/components/Form';
import { PlaninfoFiletableColumns } from './projectPlan.data';
import { queryPlaninfoFilePageByid } from './projectPlan.api'
import { ActionItem, BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { downloadFile } from "../../../api/common/api"
let dataTo = defineProps(["planinfoid","taskName"])
let projectstage = ref()
onMounted(async () => {
})
function getTableAction(record): ActionItem[] {
return [
{
label: '下载',
ifShow: true,
onClick: handleDetailpage.bind(null, record),
}
];
}
/**
* BasicForm绑定注册;
* useForm 是整个框架的核心用于表单渲染里边封装了很多公共方法;
* 支持schemas: 渲染表单列autoSubmitOnEnter回车提交,submitButtonOptions自定义按钮文本和图标等方法
* 平台通过此封装简化了代码支持自定义扩展;
*/
// const [registerProjectForm, { setFieldsValue }] = useForm({
// //
// schemas: formSchemas,
// showActionButtonGroup: false,
// //
// // autoSubmitOnEnter: true,
// // //
// // showResetButton: false,
// //
// // submitButtonOptions: { text: '', preIcon: '' },
// // 24 0-24
// // actionColOptions: { span: 17 },
// labelCol: { style: { width: '120px' } },
// wrapperCol: { style: { width: 'auto' } },
// disabled: true
// });
// //table
// const { tableContext: approveStarttableContext } = useListPage({
// tableProps: {
// size: 'small',//
// title: '',
// api: queryProcessInfo,
// columns: approveStartProcessColumns,
// showActionColumn: false,
// useSearchForm: false,
// beforeFetch(params) {
// params.stage = projectstage.value>=3?"2":"1",
// params.projectid = dataTo.projectid
// },
// },
// });
// // BasicTable
// const [registerApproveStartTable] = approveStarttableContext;
//table
const { tableContext } = useListPage({
tableProps: {
size: 'small',//
title: '项目入库资料详情',
api: queryPlaninfoFilePageByid,
columns: PlaninfoFiletableColumns,
useSearchForm: false,
actionColumn: {
width: 120,
fixed: "right",
},
beforeFetch(params) {
params.planinfoid = dataTo.planinfoid
},
},
});
const [registerResourceTable] = tableContext;
function handleDetailpage(record) {
console.log("我这一行的数据是", record)
let param = {
path: record.documentPath,
fileName: record.documentName
}
//
console.log("我这一行的数据是", param)
downloadFile("/huzhouUploadfileinfo/downloadfile", record.documentName, param)
}
</script>
<style></style>

23
src/views/projectLib/projectPlan/projectPlan.api.ts

@ -2,19 +2,36 @@ import { defHttp } from '/@/utils/http/axios';
export enum Api {
saveprojectInfo = "",
queryProjectApprovedPage = '/huzhouProject/queryProjectApprovedPage',
projectApprovedPageList = '/huzhouProject/projectApprovedPageList',
queryPlanModuleDetailPage = "/huzhouPlan/queryPlanModuleDetailPage",
queryPlanModuleone = '/huzhouPlan/queryPlanModuleone',
saveProjectPlan = '/huzhouPlan/saveProjectPlan',
queryProjectPlan="/huzhouPlan/queryProjectPlan"
queryProjectPlan="/huzhouPlan/queryProjectPlan",
submitplaninfoUploadFile="/huzhouPlan/submitplaninfoUploadFile",
queryPlanInfoMainTimeline="/huzhouPlan/queryPlanInfoMainTimeline",
planUploadFile="/huzhouPlan/planUploadFile",
queryPlaninfoFilePageByid="/huzhouPlan/queryPlaninfoFilePageByid",
planUploadModifyFile="/huzhouPlan/planUploadModifyFile",
modifyPlaninfo="/huzhouPlan/modifyPlaninfo",
approvePlaninfo='huzhouPlan/approvePlaninfo'
}
/**
*
*/
export const queryProjectApprovedPage = (params) => defHttp.get({ url: Api.queryProjectApprovedPage, params })
export const projectApprovedPageList = (params) => defHttp.get({ url: Api.projectApprovedPageList, params })
export const queryPlanModuleDetailPage = (params) => defHttp.get({ url: Api.queryPlanModuleDetailPage, params })
export const queryPlanModuleone = (params) => defHttp.get({ url: Api.queryPlanModuleone, params })
export const saveProjectPlan = (params) => defHttp.post({ url: Api.saveProjectPlan, params })
export const queryProjectPlan = (params) => defHttp.get({ url: Api.queryProjectPlan, params })
export const submitplaninfoUploadFile = (params?) =>defHttp.post({ url: Api.submitplaninfoUploadFile,headers:{ "Content-Type": "multipart/form-data" }, params })
export const queryPlanInfoMainTimeline = (params) => defHttp.get({ url: Api.queryPlanInfoMainTimeline, params })
export const planUploadFile = (params?) =>defHttp.post({ url: Api.planUploadFile,headers:{ "Content-Type": "multipart/form-data" }, params })
export const queryPlaninfoFilePageByid = (params) => defHttp.get({ url: Api.queryPlaninfoFilePageByid, params })
export const planUploadModifyFile = (params?) =>defHttp.post({ url: Api.planUploadModifyFile,headers:{ "Content-Type": "multipart/form-data" }, params })
export const modifyPlaninfo = (params?) =>defHttp.post({ url: Api.modifyPlaninfo,headers:{ "Content-Type": "multipart/form-data" }, params })
export const approvePlaninfo = (params?) =>defHttp.post({ url: Api.approvePlaninfo,headers:{ "Content-Type": "multipart/form-data" }, params })

78
src/views/projectLib/projectPlan/projectPlan.data.ts

@ -91,7 +91,7 @@ export const planDetailColumns: BasicColumn[] = [
let days = dayjs(record.scheduledEndTime).diff(text, "day")
console.log("我这一行的数据是daysdaysdays", days)
if ( days > record.maxDays) {
if (days > record.maxDays) {
return '计划时常超过预定期限';
}
}
@ -276,4 +276,78 @@ export const ProcessColumns: BasicColumn[] = [
dataIndex: 'workplace',
width: 100,
}
];
];
export const PlaninfoColumn: BasicColumn[] = [
{
title: '任务名称',
dataIndex: 'taskName',
},
{
title: '计划开始时间',
dataIndex: 'scheduledStartTime',
width: 150,
},
{
title: '计划结束时间',
dataIndex: 'scheduledEndTime',
width: 150,
},
{
title: '所需文件',
dataIndex: 'taskFile',
width: 100,
},
{
title: '是否已完成',
dataIndex: 'isfinish',
width: 100,
customRender: ({ record }) => {
if (record.isfinish == 1) {
return "已完成"
} else {
return "未完成"
}
},
}
];
export const PlaninfoFiletableColumns: BasicColumn[] = [
{
title: '文件名称',
dataIndex: 'documentName',
},
{
title: '文件大小',
dataIndex: 'size',
width: 100,
customRender: ({ record }) => {
let kbNum: number = record.size / 1024
if (kbNum < 1024) {
return kbNum.toFixed(2).toString() + "KB"
} else {
let mbNum: number = kbNum / 1024
return mbNum.toFixed(2).toString() + "MB"
}
},
},
{
title: '上传时间',
dataIndex: 'createtime',
},
{
title: '文件状态',
dataIndex: 'status',
customRender: ({ record }) => {
if (record.status == 1) {
return "审批中"
} else if(record.status == 2) {
return "有效"
}
else {
return "历史文件" //0
}
},
}
]

279
src/views/projectLib/projectPlan/viewPlanDetail.vue

@ -1,75 +1,222 @@
<template>
<!-- 自定义表单 -->
<el-divider content-position="left">项目计划详情</el-divider>
<BasicTable @register="registerPlanDetail" />
<el-divider content-position="left">项目计划审批详情</el-divider>
<BasicTable @register="registerApproveTable" />
</template>
<script lang="ts" name="viewPlanDetail" setup>
import { ref, defineProps, onMounted } from 'vue'
import { viewPlanDetailColumns } from './projectPlan.data';
import {queryProjectPlan } from './projectPlan.api'
import { approveStartProcessColumns } from '../projectInfo/projectInfo.data';
import {queryProcessInfo } from '../projectInfo/projectInfo.api'
import { ActionItem, BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { downloadFile } from "../../../api/common/api"
let dataTo = defineProps(["projectId"])
let projectId = ref()
onMounted(async () => {
projectId.value=dataTo.projectId
console.log("projectid", dataTo.projectId)
<!-- 自定义表单 -->
<el-divider content-position="left">项目计划进程</el-divider>
<!-- <BasicTable @register="registerPlanDetail" /> -->
<el-row>
<!-- <el-timeline class="timeline">
<el-timeline-item class="lineitem" v-for="(item, index) in activities" @click.native="handleChangeVideo(activities)"
:key="index" :timestamp="item.scheduledStartTime + '--' + item.scheduledEndTime"
:color="item.actualEndTime != null ? 'green' : ''">
{{ item.taskName }}
<template #dot>
<CheckCircleOutlined v-if="item.actualEndTime != null" style="background-color: #e4e7ed;border-radius: 50%;color: rgb(33, 255, 12);font-size: 20px;"/>
<ClockCircleOutlined v-if="item.actualEndTime == null" style="background-color: #e4e7ed;border-radius: 50%;font-size: 20px;"/>
</template>
</el-timeline-item>
</el-timeline> -->
</el-row>
<el-steps finish-status="success" :active="activities.status">
<el-step v-for="(item, index) in activities" :key="index">
<template #title>
<div>
{{ item.taskName }}
</div>
<div>
{{ item.scheduledStartTime + "--" + item.scheduledEndTime }}
</div>
</template>
<template #description>
<elstepchild v-if="item.children != null" :child="item.children"></elstepchild>
</template>
<template #icon>
<Progress type="circle" :percent="item.percent" :size="40" :status="item.progressStatus"></Progress>
</template>
</el-step>
</el-steps>
<el-divider content-position="left">项目计划阶段详情</el-divider>
<BasicTable @register="registerTable">
<template #action="{ record }">
<!-- <TableAction :actions="getTableAction(record)" /> -->
<TableAction :actions="getTableAction(record)" />
</template>
</BasicTable>
<div v-if="dataTo.projectStage==4">
<el-divider content-position="left">审批详情</el-divider>
<BasicTable @register="registerApproveStartTable" />
</div>
<BasicModal @register="registeruploadFile" title="上传文件" width="1200px" :showOkBtn="false" :showCancelBtn="false">
<addPlanFile :type="type" :planinfoid="planinfoid" :files="fileArr" @close="closePlanFileModal()" />
</BasicModal>
<BasicModal @register="registerFileInfo" title="文件详情" width="1200px" :showOkBtn="false" :showCancelBtn="false">
<planinfoFileDetail :planinfoid="planinfoid" :taskName="taskName" @close="closePlanFileInfoModal()" />
</BasicModal>
</template>
<script lang="ts" name="viewPlanDetail" setup>
import { ref, onMounted } from 'vue'
import elstepchild from './elstepchild.vue'
import addPlanFile from './addPlanFile.vue'
import planinfoFileDetail from './planinfoFileDetail.vue'
import { Progress } from 'ant-design-vue';
import { BasicModal } from '/@/components/Modal';
import { PlaninfoColumn } from './projectPlan.data';
import { queryPlanInfoMainTimeline } from './projectPlan.api'
import { queryProcessInfo } from '../projectInfo/projectInfo.api'
import { ActionItem, BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { useModal } from '/@/components/Modal';
import { approveStartProcessColumns } from '../projectInfo/projectInfo.data';
let dataTo = defineProps(["projectId","projectStage"])
let projectId = ref(dataTo.projectId)
let activities = ref([])
let type = ref(1)
let fileArr = ref([])
let planinfoid = ref()
let taskName = ref()
const [registeruploadFile, { openModal: openPlanFile, closeModal: closePlanFile }] = useModal();//
const [registerFileInfo, { openModal: openFileInfo, closeModal: closeFileInfo }] = useModal();//
onMounted(() => {
queryPlanInfoMainTimeline({
projectid: dataTo.projectId
}).then(res => {
activities.value = res
console.log("activities", activities)
})
//table
const { tableContext: approveTableContext } = useListPage({
tableProps: {
size: 'small',//
title: '项目计划审批详情',
api: queryProcessInfo,
columns: approveStartProcessColumns,
showActionColumn: false,
useSearchForm: false,
beforeFetch(params) {
params.status = "3",
params.projectid = projectId.value;
console.log("projectid1111111111", activities, dataTo.projectId)
})
// table
const { tableContext } = useListPage({
tableProps: {
size: 'small',//
title: '项目计划阶段详情',
api: queryPlanInfoMainTimeline,
columns: PlaninfoColumn,
showActionColumn: true,
useSearchForm: false,
beforeFetch(params) {
params.projectid = projectId.value;
},
},
});
// BasicTable
const [registerTable, { reload }] = tableContext;
function getTableAction(record): ActionItem[] {
if(dataTo.projectStage==4){
return []
}
return [
{
label: '详情',
ifShow: () => {
if (record.isfinish == 1) {
return true
}
return false
},
onClick: handleDetail.bind(null, record),
},
});
// BasicTable
const [registerApproveTable] = approveTableContext;
//table
const { tableContext } = useListPage({
tableProps: {
size: 'small',//
title: '项目计划详情',
api: queryProjectPlan,
columns: viewPlanDetailColumns,
useSearchForm: false,
showActionColumn: false,
beforeFetch(params) {
params.projectid = projectId.value
{
label: '上传资料',
ifShow: () => {
if (record.isfinish != 1) {
return true
}
return false
},
onClick: handleuploadfile.bind(null, record)
},
});
const [registerPlanDetail] = tableContext;
function handleDetailpage(record) {
console.log("我这一行的数据是", record)
let param = {
path: record.documentPath,
fileName: record.documentName
}
//
console.log("我这一行的数据是", param)
downloadFile("/huzhouProject/downloadfile", record.documentName, param)
{
label: '修改资料',
ifShow: () => {
if (record.isfinish == 1) {
return true
}
return false
},
onClick: handleuploadfile.bind(null, record)
},
];
}
const { tableContext: approveStarttableContext } = useListPage({
tableProps: {
size: 'small',//
title: '审批详情',
api: queryProcessInfo,
columns: approveStartProcessColumns,
showActionColumn: false,
useSearchForm: false,
beforeFetch(params) {
params.stage = "3",
params.projectid =projectId.value
},
},
});
// BasicTable
const [registerApproveStartTable] = approveStarttableContext;
function handleDetail(record) {
planinfoid.value = record.id
taskName = record.taskName
openFileInfo()
}
function handleuploadfile(record) {
type.value = record.isfinish
fileArr = record.taskFile.split(",")
planinfoid.value = record.id
openPlanFile()
}
function closePlanFileModal() {
closePlanFile()
reload()
queryPlanInfoMainTimeline({
projectid: dataTo.projectId
}).then(res => {
activities.value = res
console.log("activities", activities)
})
}
function closePlanFileInfoModal() {
closeFileInfo()
}
</script>
<style scoped>
.timeline {
display: flex;
width: 100%;
margin-bottom: 100px;
.lineitem {
transform: translateX(50%);
width: 25%;
}
</script>
<style></style>
}
:deep(.el-timeline-item__tail) {
border-left: none;
border-top: 2px solid #e4e7ed;
width: 100%;
position: absolute;
top: 9px;
}
:deep(.el-timeline-item__wrapper) {
padding-left: 0;
position: absolute;
top: 20px;
transform: translateX(-50%);
text-align: center;
}
:deep(.el-timeline-item__timestamp) {
font-size: 14px;
}
</style>

121
src/views/projectLib/projectPlanModule/addModuleDetailPage.vue

@ -1,121 +0,0 @@
<template>
<BasicTable @register="registerTable" @edit-change="onEditChange">
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" />
</template>
<template #tableTitle>
<a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleCreate"> 新增计划</a-button>
</template>
</BasicTable>
<div style="display: flex; justify-content: center; align-items: center; height: 100px;">
<el-button type="primary" @click="onSubmit">修改</el-button>
<el-button @click="handlecancle">取消</el-button>
<!-- <el-button>取消</el-button> -->
</div>
</template>
<script lang="ts" name="addPage" setup>
import { ref, defineProps, onMounted } from 'vue'
import { moduleDetailColumns } from './projectPlanModule.data';
import { queryPlanModuleDetailPage, savePlanModuleDatail } from './projectPlanModule.api'
import { ActionItem, BasicTable, TableAction, EditRecordRow } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { downloadFile } from "../../../api/common/api"
let dataTo = defineProps(["moduleId"])
let emit = defineEmits(["close"])
onMounted(async () => {
setShowPagination(false)//
console.log("moduleId.value=record.moduleId", dataTo.moduleId)
if (dataTo.moduleId) {
let param: any = {
projectid: dataTo.moduleId
}
// let res = await queryProjectInfoById(param)
//
} else {
let tableData = await getDataSource();
}
console.log("dataTo.moduleId", dataTo.moduleId)
})
function getTableAction(record): ActionItem[] {
return [
{
label: '删除',
ifShow: true,
onClick: handleRemoveDetail.bind(null, record),
}
];
}
//table
const { tableContext } = useListPage({
tableProps: {
size: 'small',//
title: '项目计划模板详情',
api: queryPlanModuleDetailPage,
columns: moduleDetailColumns,
useSearchForm: false,
showTableSetting: true,
actionColumn: {
width: 120,
fixed: "right",
},
beforeFetch(params) {
params.moduleId = dataTo.moduleId
},
},
});
const [registerTable, { getDataSource, setTableData, setShowPagination }] = tableContext;
function handleDetailpage(record) {
console.log("我这一行的数据是", record)
let param = {
path: record.documentPath,
fileName: record.documentName
}
//
console.log("我这一行的数据是", param)
downloadFile("/huzhouProject/downloadfile", record.documentName, param)
}
async function handleCreate() {
//await setShowPagination(false);
let tableData = await getDataSource();
tableData.push({ taskName: "aaa" })
setTableData(tableData)
}
function onEditChange({ column, value, record }) {
//
if (column.dataIndex === 'id') {
record.editValueRefs.name4.value = `${value}`;
}
console.log(column, value, record);
}
function handlecancle() {
emit("close")
}
async function onSubmit() {
let tableData = await getDataSource();
console.log("dddddddddddd", tableData)
let param = {
moduleId: dataTo.moduleId,
tableData: tableData,
}
tableData.forEach(item => {
item.moduleId = dataTo.moduleId
})
await savePlanModuleDatail(tableData)
emit("close")
}
async function handleRemoveDetail(record){
let tableData = await getDataSource();
}
</script>
<style></style>

83
src/views/projectLib/projectPlanModule/addModulePage.vue

@ -1,83 +0,0 @@
<template>
<!-- 自定义表单 -->
<BasicForm @register="registerForm" @submit="handleSubmit" />
</template>
<script lang="ts" name="addModulePage" setup>
import { ref, defineProps, onMounted, defineEmits } from 'vue'
import { useForm, BasicForm } from '/@/components/Form';
import { planModuleFormSchemas } from './projectPlanModule.data';
import { savePlanModule, queryPlanModuleone, modifyPlanModule } from './projectPlanModule.api'
import { downloadFile } from "../../../api/common/api"
let dataTo = defineProps(["moduleId", "projectType"])
let emit = defineEmits(["close"])
onMounted(async () => {
let param = {
id: dataTo.moduleId,
projectType: dataTo.projectType
}
let res = await queryPlanModuleone(param)
setFieldsValue(res)
})
/**
* BasicForm绑定注册;
* useForm 是整个框架的核心用于表单渲染里边封装了很多公共方法;
* 支持schemas: 渲染表单列autoSubmitOnEnter回车提交,submitButtonOptions自定义按钮文本和图标等方法
* 平台通过此封装简化了代码支持自定义扩展;
*/
const [registerForm, { validate, setFieldsValue, getFieldsValue }] = useForm({
//
schemas: planModuleFormSchemas,
//
// autoSubmitOnEnter: true,
// //
// showResetButton: false,
//
resetButtonOptions: { text: '取消', preIcon: '' },
submitButtonOptions: { text: '提交', preIcon: '' },
// 24 0-24
resetFunc: customResetFunc,
actionColOptions: { span: 14 },
labelCol: { style: { width: '120px' } },
wrapperCol: { style: { width: 'auto' } },
});
//table
function handleDetailpage(record) {
console.log("我这一行的数据是", record)
let param = {
path: record.documentPath,
fileName: record.documentName
}
//
console.log("我这一行的数据是", param)
downloadFile("/huzhouProject/downloadfile", record.documentName, param)
}
async function customResetFunc() {
emit("close")
}
async function handleSubmit() {
if (await validate()) {
let param = getFieldsValue()
if (dataTo.projectType) {
await modifyPlanModule(param)
} else {
await savePlanModule(param)
}
console.log("我提交了")
emit("close")
} else {
console.log("未完成")
}
}
</script>
<style></style>

131
src/views/projectLib/projectPlanModule/index.vue

@ -1,131 +0,0 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable">
<!--插槽:table标题-->
<!--操作栏-->
<template #action="{ record }">
<!-- <TableAction :actions="getTableAction(record)" /> -->
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />
</template>
<template #tableTitle>
<a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleCreate"> 新增模板</a-button>
</template>
</BasicTable>
</div>
<BasicModal @register="registePalanModuleModal" title="项目计划模板" width="1200px" :showOkBtn="false">
<addModulePage :moduleId="moduleId" :projectType="projectType" @close="closePalanModulePage"/>
</BasicModal>
<BasicModal @register="registePalanModuleDetailModal" title="项目计划模板详情" width="1200px" :showOkBtn="false" >
<addModuleDetailPage :moduleId="moduleId" @close="closePalanModuleDetailPage"/>
</BasicModal>
<!-- <BasicModal @register="registerModalUploadFiles" title="申报项目资料" width="1200px" :showOkBtn="false" :showCancelBtn="false">
<uploadFile :projectid="proid" @close="closeUploadFilesModal()"/>
</BasicModal> -->
</template>
<script lang="ts" name="system-user" setup>
//ts
import { ref } from 'vue';
import { ActionItem, BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { useModal } from '/@/components/Modal';
import { BasicModal } from '/@/components/Modal';
import { hommPageColumns, searchFormSchema } from './projectPlanModule.data';
// import { list } from './address.api';
import addModulePage from './addModulePage.vue'
import addModuleDetailPage from './addModuleDetailPage.vue'
import { queryPlanModulePage,deletePlanModule } from './projectPlanModule.api';
import { Modal } from 'ant-design-vue';
let moduleId = ref();
let projectType =ref();
const [registePalanModuleModal, { openModal: openPalanModule,closeModal: closePalanModule}] = useModal();
const [registePalanModuleDetailModal, { openModal: openPalanModuleDetail,closeModal: closePalanModuleDetail }] = useModal();
const { tableContext } = useListPage({
tableProps: {
title: '项目信息',
api: queryPlanModulePage,
columns: hommPageColumns,
actionColumn: {
width: 120,
fixed: "right",
},
//
formConfig: {
schemas: searchFormSchema,
}
},
});
//BasicTable
const [registerTable, { reload }] = tableContext;
function getTableAction(record): ActionItem[] {
return [
{
label: '编辑详情',
onClick: handleEditDetailpage.bind(null, record),
},
];
}
/**
* 下拉操作栏
*/
function getDropDownAction(record): ActionItem[] {
return [
{
label: '修改模板',
ifShow: true,
onClick: handleModifyModule.bind(null, record)
},
{
label: '删除模板',
ifShow: true,
onClick: handleDeleteModule.bind(null, record)
},
];
}
function handleCreate() {
openPalanModule()
}
function handleModifyModule(record) {
moduleId.value = record.id
projectType.value = record.projectType
openPalanModule()
}
function closePalanModulePage(){
closePalanModule()
reload()
}
function handleEditDetailpage(record){
moduleId.value = record.id
console.log("record",record)
openPalanModuleDetail()
}
function closePalanModuleDetailPage(record){
console.log("record",record)
closePalanModuleDetail()
reload()
}
function handleDeleteModule(record){
Modal.confirm({
title: '提示窗口',
content: '是否删除此项目模板?',
okText: '确认',
cancelText: '取消',
onOk:async() => {
await deletePlanModule({ id: record.id })
reload()
},
});
}
</script>
<style scoped></style>

23
src/views/projectLib/projectPlanModule/projectPlanModule.api.ts

@ -1,23 +0,0 @@
import { defHttp } from '/@/utils/http/axios';
export enum Api {
saveprojectInfo = "",
queryPlanModulePage = '/huzhouPlan/queryPlanModulePage',
queryPlanModuleDetailPage = "/huzhouPlan/queryPlanModuleDetailPage",
queryPlanModuleone = '/huzhouPlan/queryPlanModuleone',
savePlanModule = '/huzhouPlan/savePlanModule',
savePlanModuleDatail = '/huzhouPlan/savePlanModuleDatail',
modifyPlanModule = '/huzhouPlan/modifyPlanModule',
deletePlanModule='/huzhouPlan/deletePlanModule',
}
/**
*
*/
export const queryPlanModulePage = (params) => defHttp.get({ url: Api.queryPlanModulePage, params })
export const queryPlanModuleDetailPage = (params) => defHttp.get({ url: Api.queryPlanModuleDetailPage, params })
export const queryPlanModuleone = (params) => defHttp.get({ url: Api.queryPlanModuleone, params })
export const savePlanModule = (params) => defHttp.post({ url: Api.savePlanModule, params })
export const savePlanModuleDatail = (params) => defHttp.post({ url: Api.savePlanModuleDatail, params })
export const modifyPlanModule = (params) => defHttp.post({ url: Api.modifyPlanModule, params })
export const deletePlanModule = (params) => defHttp.delete({ url: Api.deletePlanModule, params},{ joinParamsToUrl: true })

173
src/views/projectLib/projectPlanModule/projectPlanModule.data.ts

@ -1,173 +0,0 @@
import { FormSchema } from '/@/components/Form';
import { BasicColumn } from '/@/components/Table';
import { getDictItemsByCode } from '/@/utils/dict/index';
import { useUserStore } from '/@/store/modules/user';
const userStore = useUserStore();
const projectTypeDicts: Array<Object> = getDictItemsByCode("projectType")
function projectTypeDict() {
for (let i = 0; i < projectTypeDicts.length; i++) {
projectTypeDicts[i].label = projectTypeDicts[i].text;
}
return projectTypeDicts
}
const approvalRsesults:Array<Object> = getDictItemsByCode("approvalResult")
function approvalRsesult(){
for(let i = 0;i<approvalRsesults.length;i++){
approvalRsesults[i].label=approvalRsesults[i].text;
}
return approvalRsesults
}
export const hommPageColumns: BasicColumn[] = [
{
title: '模板ID',
width: 150,
dataIndex: 'id',
},
{
title: '项目类型',
dataIndex: 'projectType',
width: 150,
customRender: ({ record }) => {
for(let i =0;i<projectTypeDicts.length;i++){
if(record.projectType==projectTypeDicts[i].value){
return projectTypeDicts[i].text
}
}
},
},
{
title: '模板名称',
dataIndex: 'moduleName',
width: 150,
},
{
title: '创建时间',
dataIndex: 'createtime',
width: 100,
},
];
export const moduleDetailColumns: BasicColumn[] = [
{
title: '模板id',
width: 150,
dataIndex: 'moduleId',
},
{
title: '计划名称',
dataIndex: 'taskName',
width: 150,
edit: true,
},
{
title: '计划序号',
dataIndex: 'orderNumber',
width: 150,
edit: true,
editComponent: 'InputNumber',
},
{
title: '最大天数',
dataIndex: 'maxDays',
width: 100,
edit: true,
},
];
export const searchFormSchema: FormSchema[] = [
{
label: '项目类型',
field: 'projectType',
component: 'Select',
componentProps:{
options:projectTypeDict()
},
//colProps: { span: 6 },
},
{
label: '模板名称',
field: 'moduleName',
component: 'Input',
//colProps: { span: 6 },
},
];
export const planModuleFormSchemas: FormSchema[] = [
// {
// label: '项目类型',
// field: 'user',
// component: 'Select',
// required: true,
// dynamicDisabled: true,
// componentProps: {
// options: [
// { value: userStore.getUserInfo.id, label: userStore.getUserInfo.username }
// ],
// },
// defaultValue: userStore.getUserInfo.id,
// colProps: { span: 12 },
// },
{
label: '模板id',
field: 'id',
component: 'Input',
dynamicDisabled: true,
colProps: { span: 12 },
},
{
label: '项目类型',
field: 'projectType',
component: 'Select',
required: true,
componentProps: {
options: projectTypeDict()
},
colProps: { span: 12 },
},
{
label: '模板名称',
field: 'moduleName',
component: 'Input',
required: true,
colProps: { span: 12 },
},
];
export const ProcessColumns: BasicColumn[] = [
{
title: '节点名称',
dataIndex: 'taskName',
},
{
title: '处理人',
dataIndex: 'operator',
width: 150,
},
{
title: '处理时间',
dataIndex: 'operateDate',
width: 150,
},
{
title: '审批状态',
dataIndex: 'approvalStatue',
width: 100,
},
{
title: '审批意见',
dataIndex: 'workplace',
width: 100,
}
];
Loading…
Cancel
Save