You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
536 lines
17 KiB
536 lines
17 KiB
<template>
|
|
<!-- 自定义表单 -->
|
|
<BasicModal v-bind="$attrs" @register="registerModal" title="项目合同信息详情" width="1500px" :showOkBtn="false"
|
|
:showCancelBtn="false">
|
|
<el-divider content-position="left">项目信息</el-divider>
|
|
<BasicForm @register="registerMoneyForm" />
|
|
<el-divider content-position="left">合同信息</el-divider>
|
|
<BasicForm @register="registerContractForm" />
|
|
<el-button type="primary" @click="addFrom">
|
|
<template #icon>
|
|
<PlusCircleOutlined />
|
|
</template>
|
|
</el-button>
|
|
<el-button type="primary" @click="minusFrom">
|
|
<template #icon>
|
|
<MinusCircleOutlined />
|
|
</template>
|
|
</el-button>
|
|
<el-divider content-position="left">上传合同文件</el-divider>
|
|
<el-form ref="importFormRef">
|
|
|
|
<el-form-item label="上传文件:">
|
|
<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">文件大小且不超过10M</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>
|
|
</BasicModal>
|
|
</template>
|
|
<script lang="ts" name="addAndModify" setup>
|
|
import { ref, reactive, onMounted } from 'vue'
|
|
import { useForm, BasicForm } from '@/components/Form';
|
|
import { contractformSchemas, MoneyFormSchemas } from './projectContract.data';
|
|
import { modifyContractinfo, addContractinfo, getContractinfoByProjectId } from './projectContract.api';
|
|
import { queryProjectInfoNewDataById } from '@/views/projectLib/projectInfo/projectInfo.api'
|
|
import { ElMessage } from 'element-plus'
|
|
import { useModalInner, BasicModal } from '@/components/Modal';
|
|
import { FormSchema } from '@/components/Form';
|
|
import { message } from 'ant-design-vue';
|
|
import { PlusCircleOutlined, MinusCircleOutlined } from '@ant-design/icons-vue';
|
|
import { cloneDeep } from 'lodash-es';
|
|
|
|
const aaa = ({ values }) => {
|
|
// console.log('values:', values);//表单所有值
|
|
//需要return
|
|
return [
|
|
{
|
|
//默认开启表单检验
|
|
required: true,
|
|
// value 当前手机号输入的值
|
|
validator: (formSchemas, value) => {
|
|
console.log("______", formSchemas, value);
|
|
//需要return 一个Promise对象
|
|
return new Promise((resolve, reject) => {
|
|
if (formSchemas.field.indexOf("centralMoney") != -1) {
|
|
let fieldnum = formSchemas.field.replace("centralMoney", "")
|
|
Object.keys(values).forEach(key => {
|
|
if (values["taskName" + fieldnum] == null) {
|
|
reject("请填写本次支付的属性值")
|
|
}
|
|
if (values["taskName" + fieldnum] != null && values["taskName" + fieldnum]?.indexOf("首付") != -1) {
|
|
if (fieldnum.length == 0) {
|
|
console.log("首付的中央资金不能超过总中央资金的30%11", value, Number(values["centralMoney"]), Number(resMoney.value.centralMoney), Number(values["centralMoney"]) / Number(resMoney.value.centralMoney))
|
|
if (Number(value) / Number(resMoney.value.centralMoney) > 0.3) {
|
|
reject("首付的中央资金不能超过总中央资金的30%")
|
|
}
|
|
} else {
|
|
let total = Number(values["centralMoney"])
|
|
if (Number(fieldnum) == 2) {
|
|
total += value
|
|
} else {
|
|
for (let i = 2; i < Number(fieldnum); i++) {
|
|
total += Number(values[`centralMoney${i}`])
|
|
}
|
|
total += value
|
|
}
|
|
|
|
if (total / Number(resMoney.value.centralMoney) > 0.3) {
|
|
reject("首付的中央资金不能超过总中央资金的30%")
|
|
}
|
|
}
|
|
}
|
|
if (values["taskName" + fieldnum] != null && values["taskName" + fieldnum]?.indexOf("初验") != -1) {
|
|
if (fieldnum.length == 0) {
|
|
if (Number(value) / Number(resMoney.value.centralMoney) > 0.6) {
|
|
reject("初验的中央资金不能超过总中央资金的60%")
|
|
}
|
|
} else {
|
|
//首付之前有其他阶段,求和
|
|
let total = Number(values["centralMoney"])
|
|
if (Number(fieldnum) == 2) {
|
|
total += value
|
|
} else {
|
|
for (let i = 2; i < Number(fieldnum); i++) {
|
|
total += Number(values[`centralMoney${i}`])
|
|
}
|
|
total += value
|
|
}
|
|
if (total / Number(resMoney.value.centralMoney) > 0.6) {
|
|
reject("初验的中央资金不能超过总中央资金的60%")
|
|
}
|
|
}
|
|
}
|
|
resolve("1")
|
|
})
|
|
}
|
|
resolve("1")
|
|
});
|
|
},
|
|
},
|
|
];
|
|
}
|
|
|
|
const bbb = ({ schema,formModel, formActionType }) => {
|
|
console.log("formModel", schema)
|
|
if(schema==undefined||schema.field==undefined){
|
|
console.log("formModel111111",schema )
|
|
return {
|
|
//数值精度
|
|
precision: 2,
|
|
//步数
|
|
step: 1,
|
|
}
|
|
}
|
|
return {
|
|
//数值精度
|
|
precision: 2,
|
|
//步数
|
|
step: 1,
|
|
min: 0,
|
|
max:resMoney.value[schema.field.replace(/\d/g, '')],
|
|
style: { width: '90%' },
|
|
onChange: async (value, option) => {
|
|
// formModel.manageContactor = undefined; // reset city value
|
|
const { updateSchema ,setFieldsValue,getFieldsValue} = formActionType;
|
|
let percentage =value/resMoney.value[schema.field.replace(/\d/g, '')]*100
|
|
console.log("percentage",percentage.toFixed(0))
|
|
schema.suffix=percentage.toFixed(0)+"%"
|
|
updateSchema(schema)
|
|
},
|
|
};
|
|
}
|
|
const [registerModal, { closeModal }] = useModalInner(init);
|
|
|
|
|
|
let fileList = reactive<Array<any>>([]);
|
|
let isModify = ref()
|
|
let projectid = ref()
|
|
let payNum = ref(1)
|
|
let resMoney = ref()
|
|
let tempSchemas = cloneDeep(contractformSchemas) as Array<FormSchema>
|
|
tempSchemas.forEach(item => {
|
|
if (item.field.indexOf("Money") != -1) {
|
|
item.dynamicRules = aaa
|
|
item.componentProps=bbb
|
|
}
|
|
})
|
|
const emit = defineEmits(['close']);
|
|
|
|
async function init(data) {
|
|
|
|
payNum.value = 1
|
|
tempSchemas = cloneDeep(contractformSchemas) as Array<FormSchema>
|
|
tempSchemas.forEach(item => {
|
|
if (item.field.indexOf("Money") != -1) {
|
|
item.dynamicRules = aaa
|
|
item.componentProps=bbb
|
|
|
|
}
|
|
})
|
|
console.log("datadatadata", data, tempSchemas)
|
|
projectid.value = data.projectid
|
|
let parammoney: any = {
|
|
projectid: data.projectid
|
|
}
|
|
resMoney.value = await queryProjectInfoNewDataById(parammoney)
|
|
setFieldsValueMoneyForm(resMoney.value)
|
|
fileList.pop()
|
|
if (data.isModify != null) {
|
|
isModify.value = data.isModify
|
|
let param: any = {
|
|
projectid: data.projectid
|
|
}
|
|
let res = await getContractinfoByProjectId(param) as Array<any>
|
|
let obj = new Object()
|
|
//记录一共有几次支付
|
|
let num = res.length
|
|
//把数组变成对象
|
|
for (let i = 1; i <= num; i++) {
|
|
|
|
if (i == 1) {
|
|
obj = res[i - 1]
|
|
} else {
|
|
Object.keys(res[i - 1]).forEach(key => {
|
|
obj[key + i] = res[i - 1][key]
|
|
})
|
|
}
|
|
}
|
|
if (num > 1) {
|
|
payNum.value = num
|
|
for (let i = 2; i <= num; i++) {
|
|
contractformSchemas.forEach(item => {
|
|
let tempitem = cloneDeep(item)
|
|
if (tempitem.field.indexOf("Money") != -1) {
|
|
tempitem.dynamicRules = aaa
|
|
item.componentProps=bbb
|
|
|
|
}
|
|
if (tempitem.field == "payDate") {
|
|
tempitem.label = "第" + i + "次支付"
|
|
}
|
|
if (tempitem.field == "totalMoney") {
|
|
tempitem.label = "第" + i + "支付总金额"
|
|
}
|
|
tempitem.field = tempitem.field + i
|
|
tempSchemas.push(tempitem)
|
|
})
|
|
}
|
|
resetSchema(tempSchemas)
|
|
} else {
|
|
resetSchema(tempSchemas)
|
|
}
|
|
console.log("结果是", res, obj)
|
|
obj["id"] = data.projectid
|
|
setFieldsValue(obj)
|
|
} else {
|
|
//需要项目id 组件需要这个id去查询属性名称是否正确
|
|
setFieldsValue({ id: data.projectid })
|
|
}
|
|
}
|
|
onMounted(async () => {
|
|
|
|
})
|
|
|
|
//项目金额相关信息
|
|
const [registerMoneyForm, { setFieldsValue: setFieldsValueMoneyForm }] = useForm({
|
|
//注册表单列
|
|
schemas: MoneyFormSchemas,
|
|
showActionButtonGroup: false,
|
|
//回车提交
|
|
// autoSubmitOnEnter: true,
|
|
// //不显示重置按钮
|
|
// showResetButton: false,
|
|
//自定义提交按钮文本和图标
|
|
// submitButtonOptions: { text: '提交', preIcon: '' },
|
|
//查询列占比 24代表一行 取值范围 0-24
|
|
// actionColOptions: { span: 17 },
|
|
disabled: true,
|
|
size: "small",
|
|
// labelCol: { style: { width: '120px' } },
|
|
wrapperCol: { style: { width: 'auto' } },
|
|
});
|
|
|
|
|
|
|
|
//项目入库详情
|
|
const [registerContractForm, { setFieldsValue: setFieldsValue, getFieldsValue, validate, resetSchema, removeSchemaByField }] = useForm({
|
|
//注册表单列
|
|
schemas: contractformSchemas,
|
|
showActionButtonGroup: false,
|
|
//回车提交
|
|
// autoSubmitOnEnter: true,
|
|
// //不显示重置按钮
|
|
// showResetButton: false,
|
|
//自定义提交按钮文本和图标
|
|
// submitButtonOptions: { text: '提交', preIcon: '' },
|
|
//查询列占比 24代表一行 取值范围 0-24
|
|
// actionColOptions: { span: 17 },
|
|
size: 'small',
|
|
// labelCol: { style: { width: '120px' } },
|
|
wrapperCol: { style: { width: 'auto' } },
|
|
});
|
|
|
|
async function addFrom() {
|
|
let a = await validate()
|
|
if (a) {
|
|
payNum.value += 1
|
|
contractformSchemas.forEach(item => {
|
|
let tempitem = cloneDeep(item)
|
|
if (tempitem.field.indexOf("Money") != -1) {
|
|
tempitem.dynamicRules = aaa
|
|
item.componentProps=bbb
|
|
|
|
}
|
|
if (tempitem.field == "payDate") {
|
|
tempitem.label = "第" + payNum.value + "次支付"
|
|
}
|
|
if (tempitem.field == "totalMoney") {
|
|
tempitem.label = "第" + payNum.value + "支付总金额"
|
|
}
|
|
tempitem.field = tempitem.field + payNum.value
|
|
tempSchemas.push(tempitem)
|
|
})
|
|
// console.log("temp222222",tempSchemas,tempSchemas.length)
|
|
resetSchema(tempSchemas)
|
|
}
|
|
}
|
|
function minusFrom() {
|
|
if (payNum.value == 1) {
|
|
message.warning("至少保留一个支付项");
|
|
return
|
|
}
|
|
let last = cloneDeep(tempSchemas)
|
|
last = last.slice(payNum.value * 9 - 9)
|
|
last.forEach(element => {
|
|
removeSchemaByField(element.field)
|
|
});
|
|
tempSchemas = tempSchemas.slice(0, payNum.value * 9 - 9)
|
|
payNum.value -= 1
|
|
resetSchema(tempSchemas)
|
|
}
|
|
// 覆盖默认的上传行为,可以自定义上传的实现,将上传的文件依次添加到fileList数组中,支持多个文件
|
|
function httpRequest(option) {
|
|
fileList.push(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) {
|
|
let fileSize = file.size
|
|
const FIVE_M = 10 * 1024 * 1024;
|
|
//大于5M,不允许上传
|
|
if (fileSize > FIVE_M) {
|
|
ElMessage.error("最大上传10M")
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
// 文件数量过多时提醒
|
|
function handleExceed() {
|
|
ElMessage.warning("最多只能上传一个文件")
|
|
}
|
|
//导入Excel病种信息数据
|
|
async function submitImportForm() {
|
|
let res = []
|
|
let data = await getFieldsValue()
|
|
for (let i = 1; i <= payNum.value; i++) {
|
|
let obj = new Object()
|
|
contractformSchemas.forEach(item => {
|
|
if (i == 1) {
|
|
obj[item.field] = data[item.field]
|
|
} else {
|
|
obj[item.field] = data[item.field + i]
|
|
}
|
|
obj["projectId"] = projectid.value
|
|
delete obj.id;
|
|
})
|
|
res.push(obj)
|
|
}
|
|
console.log("data", data, res)
|
|
// if(checkForm()){
|
|
// ElMessage.success("新增成功")
|
|
// }
|
|
if (await validate() && checkForm()) {
|
|
const params = new FormData()
|
|
console.log("data", data)
|
|
// 使用form表单的数据格式
|
|
if (isModify.value != null) {
|
|
if (fileList.length > 0) {
|
|
params.append("file", fileList[0].file)
|
|
}
|
|
//说明是修改
|
|
params.append("contractinfoList", JSON.stringify(res))
|
|
await modifyContractinfo(params)
|
|
} else {
|
|
if (fileList.length == 0) {
|
|
ElMessage.warning("请上传文件")
|
|
return;
|
|
}
|
|
params.append("file", fileList[0].file)
|
|
params.append("contractinfoList", JSON.stringify(res))
|
|
await addContractinfo(params)
|
|
}
|
|
dialogVisible()
|
|
}
|
|
|
|
}
|
|
function dialogVisible() {
|
|
closeModal()
|
|
emit("close")
|
|
}
|
|
|
|
function checkForm() { //校验表单
|
|
let data = getFieldsValue()
|
|
let totalCentralMoney = 0
|
|
let totalCountyMoney = 0
|
|
let totalCityMoney = 0
|
|
let totalProvincialMoney = 0
|
|
let totalSelfMoney = 0
|
|
let totalMoney = 0
|
|
let showshoufu = false
|
|
let showchuyan = false
|
|
let showzhongyan = false
|
|
let returnRes = true
|
|
//校验首付和初验比例
|
|
Object.keys(data).forEach(key => {
|
|
if (key.indexOf("taskName") != -1 && data[key].indexOf("首付") != -1) {
|
|
showshoufu = true
|
|
// if (key == "taskName") {
|
|
// if (Number(data["centralMoney"]) / Number(centralMoney) > 0.3) {
|
|
// ElMessage.error("首付的中央资金不能超过总中央资金的30%")
|
|
// returnRes = false
|
|
|
|
// return
|
|
// }
|
|
// } else {
|
|
// //首付之前有其他阶段,求和
|
|
// let num = key.replace("taskName", "")
|
|
// let total = Number(data["centralMoney"])
|
|
// for (let i = 2; i <= Number(num); i++) {
|
|
// total += Number(data[`centralMoney${i}`])
|
|
// }
|
|
// if (total / Number(centralMoney) > 0.3) {
|
|
// ElMessage.error("首付的中央资金不能超过总中央资金的30%")
|
|
// returnRes = false
|
|
|
|
// return
|
|
// }
|
|
// }
|
|
}
|
|
if (key.indexOf("taskName") != -1 && data[key].indexOf("初验") != -1) {
|
|
showchuyan = true
|
|
// if (key == "taskName") {
|
|
// if (Number(data["centralMoney"]) / Number(centralMoney) > 0.6) {
|
|
// ElMessage.error("初验的中央资金不能超过总中央资金的60%")
|
|
// returnRes = false
|
|
|
|
// return
|
|
// }
|
|
// } else {
|
|
// //首付之前有其他阶段,求和
|
|
// let num = key.replace("taskName", "")
|
|
// let total = Number(data["centralMoney"])
|
|
// for (let i = 2; i <= Number(num); i++) {
|
|
// total += Number(data[`centralMoney${i}`])
|
|
// }
|
|
// if (total / Number(centralMoney) > 0.6) {
|
|
// ElMessage.error("初验的中央资金不能超过总中央资金的60%")
|
|
// returnRes = false
|
|
|
|
// return
|
|
// }
|
|
// }
|
|
}
|
|
if (key.indexOf("taskName") != -1 && data[key].indexOf("终验") != -1) {
|
|
showzhongyan = true
|
|
}
|
|
//校验各项金额比例
|
|
if (key.includes("centralMoney")) {
|
|
totalCentralMoney += Number(data[key])
|
|
}
|
|
if (key.includes("countyMoney")) {
|
|
totalCountyMoney += Number(data[key])
|
|
}
|
|
if (key.includes("cityMoney")) {
|
|
totalCityMoney += Number(data[key])
|
|
}
|
|
if (key.includes("provincialMoney")) {
|
|
totalProvincialMoney += Number(data[key])
|
|
}
|
|
if (key.includes("selfMoney")) {
|
|
totalSelfMoney += Number(data[key])
|
|
}
|
|
if (key.includes("totalMoney")) {
|
|
totalMoney += Number(data[key])
|
|
}
|
|
})
|
|
if (!returnRes) {
|
|
return false
|
|
}
|
|
if (totalCentralMoney != Number(resMoney.value.centralMoney)) {
|
|
ElMessage.error("中央资金总额不匹配")
|
|
return false
|
|
}
|
|
if (totalCountyMoney != Number(resMoney.value.countyMoney)) {
|
|
ElMessage.error("县级资金总额不匹配")
|
|
return false
|
|
}
|
|
if (totalCityMoney != Number(resMoney.value.cityMoney)) {
|
|
ElMessage.error("市级资金总额不匹配")
|
|
return false
|
|
}
|
|
if (totalProvincialMoney != Number(resMoney.value.provincialMoney)) {
|
|
ElMessage.error("省级资金总额不匹配")
|
|
return false
|
|
}
|
|
if (totalSelfMoney != Number(resMoney.value.selfMoney)) {
|
|
ElMessage.error("自筹资金总额不匹配")
|
|
return false
|
|
}
|
|
if (totalMoney != Number(resMoney.value.totalMoney)) {
|
|
ElMessage.error("总资金总额不匹配")
|
|
return false
|
|
}
|
|
if (!showshoufu) {
|
|
ElMessage.error("请添加首付任务")
|
|
return false
|
|
}
|
|
if (!showchuyan) {
|
|
ElMessage.error("请添加初验任务")
|
|
return false
|
|
}
|
|
if (!showzhongyan) {
|
|
ElMessage.error("请添加终验任务")
|
|
return false
|
|
}
|
|
console.log("data", data)
|
|
return true
|
|
}
|
|
|
|
|
|
</script>
|
|
<style scoped>
|
|
.suffix{
|
|
font-size: 12px;
|
|
color: #999;
|
|
margin-left: 5px;
|
|
}
|
|
|
|
|
|
</style>
|
|
|