|
|
|
@ -126,6 +126,7 @@
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
v-model="formData.referenceTechnology"
|
|
|
|
|
placeholder="请输入可引用的原有技术"
|
|
|
|
|
:class="{'alter-class': fieldHasAlter('referenceTechnology')}"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
@ -141,6 +142,7 @@
|
|
|
|
|
placeholder="请输入检验要求"
|
|
|
|
|
show-word-limit
|
|
|
|
|
maxlength="200"
|
|
|
|
|
:class="{'alter-class': fieldHasAlter('referenceTechnology')}"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
@ -197,6 +199,7 @@
|
|
|
|
|
<el-form-item label="项目结束日期" prop="projectEndTime">
|
|
|
|
|
<el-date-picker
|
|
|
|
|
class="!w-250px"
|
|
|
|
|
:class="{'alter-class': fieldHasAlter('projectEndTime')}"
|
|
|
|
|
v-model="formData.projectEndTime"
|
|
|
|
|
type="date"
|
|
|
|
|
value-format="x"
|
|
|
|
@ -256,7 +259,9 @@
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="是否有价格" prop="hasPrice">
|
|
|
|
|
<el-radio-group v-model="formData.hasPrice" :disabled="detailDisabled">
|
|
|
|
|
<el-radio-group v-model="formData.hasPrice" :disabled="detailDisabled"
|
|
|
|
|
:class="{'alter-class': fieldHasAlter('hasPrice')}"
|
|
|
|
|
>
|
|
|
|
|
<el-radio
|
|
|
|
|
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
@ -271,7 +276,9 @@
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="是否紧急" prop="isUrgency">
|
|
|
|
|
<el-radio-group v-model="formData.isUrgency" :disabled="detailDisabled">
|
|
|
|
|
<el-radio-group v-model="formData.isUrgency" :disabled="detailDisabled"
|
|
|
|
|
:class="{'alter-class': fieldHasAlter('isUrgency')}"
|
|
|
|
|
>
|
|
|
|
|
<el-radio
|
|
|
|
|
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
@ -308,6 +315,7 @@
|
|
|
|
|
v-model="formData.remark"
|
|
|
|
|
show-word-limit
|
|
|
|
|
maxlength="200"
|
|
|
|
|
:class="{'alter-class': fieldHasAlter('remark')}"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
@ -357,12 +365,14 @@
|
|
|
|
|
:min="0"
|
|
|
|
|
:precision="6"
|
|
|
|
|
style="width: 150px"
|
|
|
|
|
:class="{'alter-class': fieldHasAlter('price')}"
|
|
|
|
|
/>
|
|
|
|
|
<el-select
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
v-model="formData.currency"
|
|
|
|
|
placeholder="请选择币种"
|
|
|
|
|
style="width: 100px"
|
|
|
|
|
:class="{'alter-class': fieldHasAlter('currency')}"
|
|
|
|
|
>
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_CURRENCY)"
|
|
|
|
@ -380,6 +390,7 @@
|
|
|
|
|
<el-form-item label="性质" prop="property">
|
|
|
|
|
<el-select
|
|
|
|
|
class="!w-250px"
|
|
|
|
|
:class="{'alter-class': fieldHasAlter('property')}"
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
v-model="formData.property"
|
|
|
|
|
placeholder="请选择性质"
|
|
|
|
@ -405,7 +416,9 @@
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="6">
|
|
|
|
|
<el-form-item label="有无合同" prop="hasContract">
|
|
|
|
|
<el-radio-group :disabled="detailDisabled" v-model="formData.hasContract">
|
|
|
|
|
<el-radio-group :disabled="detailDisabled" v-model="formData.hasContract"
|
|
|
|
|
:class="{'alter-class': fieldHasAlter('hasContract')}"
|
|
|
|
|
>
|
|
|
|
|
<el-radio
|
|
|
|
|
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
@ -418,7 +431,9 @@
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="6">
|
|
|
|
|
<el-form-item label="有无技术协议" prop="hasTechnologyProtocol">
|
|
|
|
|
<el-radio-group :disabled="detailDisabled" v-model="formData.hasTechnologyProtocol">
|
|
|
|
|
<el-radio-group :disabled="detailDisabled" v-model="formData.hasTechnologyProtocol"
|
|
|
|
|
:class="{'alter-class': fieldHasAlter('hasTechnologyProtocol')}"
|
|
|
|
|
>
|
|
|
|
|
<el-radio
|
|
|
|
|
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
@ -431,7 +446,9 @@
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="6">
|
|
|
|
|
<el-form-item label="有无图纸/数模" prop="hasBlueprint">
|
|
|
|
|
<el-radio-group :disabled="detailDisabled" v-model="formData.hasBlueprint">
|
|
|
|
|
<el-radio-group :disabled="detailDisabled" v-model="formData.hasBlueprint"
|
|
|
|
|
:class="{'alter-class': fieldHasAlter('hasBlueprint')}"
|
|
|
|
|
>
|
|
|
|
|
<el-radio
|
|
|
|
|
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
@ -450,6 +467,7 @@
|
|
|
|
|
:disabled="
|
|
|
|
|
detailDisabled || (formData.hasBlueprint == 0 && (formData.blueprintRemark = ''))
|
|
|
|
|
"
|
|
|
|
|
:class="{'alter-class': fieldHasAlter('blueprintRemark')}"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
@ -484,7 +502,7 @@
|
|
|
|
|
class="mb-0px!"
|
|
|
|
|
>
|
|
|
|
|
<el-input
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
:disabled="detailDisabled || row.id"
|
|
|
|
|
v-model="row.name"
|
|
|
|
|
placeholder="请输入子项目名称"
|
|
|
|
|
/>
|
|
|
|
@ -499,7 +517,7 @@
|
|
|
|
|
class="mb-0px!"
|
|
|
|
|
>
|
|
|
|
|
<el-input
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
:disabled="detailDisabled || (alterDisabled && row.id)"
|
|
|
|
|
v-model="row.deviceModel"
|
|
|
|
|
placeholder="请输入设备型号"
|
|
|
|
|
/>
|
|
|
|
@ -519,6 +537,7 @@
|
|
|
|
|
placeholder="请输入数量"
|
|
|
|
|
:min="0"
|
|
|
|
|
:precision="0"
|
|
|
|
|
:class="{'alter-class': fieldHasAlterInRow('amount', row)}"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</template>
|
|
|
|
@ -534,6 +553,7 @@
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
v-model="row.unit"
|
|
|
|
|
placeholder="请选择单位"
|
|
|
|
|
:class="{'alter-class': fieldHasAlterInRow('unit', row)}"
|
|
|
|
|
>
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_PROJECT_ORDER_SUB_UNIT)"
|
|
|
|
@ -563,6 +583,7 @@
|
|
|
|
|
filterable
|
|
|
|
|
:loading="compositionSelectLoading"
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
:class="{'alter-class': fieldHasAlterInRow('compositionId', row)}"
|
|
|
|
|
>
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="item in compositionSelectList"
|
|
|
|
@ -585,6 +606,7 @@
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
v-model="row.remark"
|
|
|
|
|
placeholder="请输入备注"
|
|
|
|
|
:class="{'alter-class': fieldHasAlterInRow('remark', row)}"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</template>
|
|
|
|
@ -610,11 +632,15 @@
|
|
|
|
|
</el-card>
|
|
|
|
|
<el-card class="hl-card-info">
|
|
|
|
|
<template #header>
|
|
|
|
|
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">附件信息</span>
|
|
|
|
|
<div class="hl-card-info-icona"></div><span class="hl-card-info-text"
|
|
|
|
|
|
|
|
|
|
>附件信息</span>
|
|
|
|
|
</template>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col>
|
|
|
|
|
<el-card class="hl-incard">
|
|
|
|
|
<el-card class="hl-incard"
|
|
|
|
|
:class="{'alter-class': fieldHasAlter('attachments')}"
|
|
|
|
|
>
|
|
|
|
|
<el-col v-if="'update,create,alter'.indexOf(query.active) > -1">
|
|
|
|
|
<el-upload
|
|
|
|
|
ref="contractUploadRef"
|
|
|
|
@ -714,7 +740,7 @@
|
|
|
|
|
label="操作时间"
|
|
|
|
|
align="center"
|
|
|
|
|
prop="startTime"
|
|
|
|
|
width="180"
|
|
|
|
|
width="220"
|
|
|
|
|
:formatter="dateFormatter"
|
|
|
|
|
/>
|
|
|
|
|
<el-table-column prop="content" label="操作意见" align="center" />
|
|
|
|
@ -813,7 +839,7 @@ import * as CustomerApi from '@/api/heli/customer/index'
|
|
|
|
|
import * as CompositionApi from '@/api/heli/composition/index'
|
|
|
|
|
import { getAccessToken, getTenantId } from '@/utils/auth'
|
|
|
|
|
import { UploadUserFile } from 'element-plus'
|
|
|
|
|
import { deleteFile, downloadFile, getFilePage } from '@/api/infra/file'
|
|
|
|
|
import { deleteFileLogic, downloadFile, getFilePage } from '@/api/infra/file'
|
|
|
|
|
import { propTypes } from '@/utils/propTypes'
|
|
|
|
|
import download from '@/utils/download'
|
|
|
|
|
import { useUserStore } from '@/store/modules/user'
|
|
|
|
@ -869,7 +895,8 @@ const formData = ref({
|
|
|
|
|
snapshotId: undefined,
|
|
|
|
|
snapshotCode: undefined,
|
|
|
|
|
orderTime: new Date(),
|
|
|
|
|
snapshotOrderTime: undefined
|
|
|
|
|
snapshotOrderTime: undefined,
|
|
|
|
|
alterFieldNames: []
|
|
|
|
|
})
|
|
|
|
|
const formRules = reactive({
|
|
|
|
|
businessDeptId: [{ required: true, message: '提出部门不能为空', trigger: 'blur' }],
|
|
|
|
@ -898,6 +925,14 @@ const subFormRules = reactive({
|
|
|
|
|
status: [{ required: true, message: '状态,1表示正常,2表示禁用不能为空', trigger: 'blur' }]
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const fieldHasAlter = (fieldName) => {
|
|
|
|
|
return formData.value.alterFieldNames && formData.value.alterFieldNames.indexOf(fieldName) > -1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const fieldHasAlterInRow = (fieldName, row) => {
|
|
|
|
|
return row.alterFieldNames && row.alterFieldNames.indexOf(fieldName) > -1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const deptList = ref<Tree[]>([]) // 树形结构
|
|
|
|
|
const userList = ref<UserApi.UserVO[]>([]) // 用户列表
|
|
|
|
|
const userSelectList = ref<UserApi.UserVO[]>([])
|
|
|
|
@ -970,28 +1005,29 @@ const queryData = async (type: string, id?: number) => {
|
|
|
|
|
if (id) {
|
|
|
|
|
formData.value = await ProjectOrderApi.getProjectOrder(id)
|
|
|
|
|
// 子项列表
|
|
|
|
|
formData.value.projectOrderSubs =
|
|
|
|
|
await ProjectOrderApi.getProjectOrderSubListByProjectOrderId(id)
|
|
|
|
|
formData.value.projectOrderSubs = await ProjectOrderApi.getProjectOrderSubListByProjectOrderId(id)
|
|
|
|
|
|
|
|
|
|
// 如为归档日志
|
|
|
|
|
// 如为归档
|
|
|
|
|
let businessType = 'PROJECT_ORDER';
|
|
|
|
|
if(type == 'detailArchive'){
|
|
|
|
|
id = formData.value.snapshotId
|
|
|
|
|
}
|
|
|
|
|
// 操作日志
|
|
|
|
|
let logParams = {
|
|
|
|
|
pageNo: 1,
|
|
|
|
|
pageSize: 99,
|
|
|
|
|
businessId: id,
|
|
|
|
|
businessType: 'PROJECT_ORDER'
|
|
|
|
|
businessType = 'PROJECT_ORDER_SNAPSHOT'
|
|
|
|
|
}else{
|
|
|
|
|
// 操作日志
|
|
|
|
|
let logParams = {
|
|
|
|
|
pageNo: 1,
|
|
|
|
|
pageSize: 99,
|
|
|
|
|
businessId: id,
|
|
|
|
|
businessType: businessType
|
|
|
|
|
}
|
|
|
|
|
formData.value.operateLogs = (await getOperateLogPage(logParams)).list
|
|
|
|
|
}
|
|
|
|
|
formData.value.operateLogs = (await getOperateLogPage(logParams)).list
|
|
|
|
|
|
|
|
|
|
// 附件信息
|
|
|
|
|
let attParams = {
|
|
|
|
|
pageNo: 1,
|
|
|
|
|
pageSize: 99,
|
|
|
|
|
businessId: id,
|
|
|
|
|
businessType: 'PROJECT_ORDER'
|
|
|
|
|
businessType: businessType
|
|
|
|
|
}
|
|
|
|
|
formData.value.attachments = (await getFilePage(attParams)).list
|
|
|
|
|
}
|
|
|
|
@ -1152,7 +1188,8 @@ const onAddItem = () => {
|
|
|
|
|
compositionId: undefined,
|
|
|
|
|
unit: undefined,
|
|
|
|
|
remark: undefined,
|
|
|
|
|
status: 1
|
|
|
|
|
status: 1,
|
|
|
|
|
alterFieldNames: []
|
|
|
|
|
}
|
|
|
|
|
row.projectOrderId = formData.value.id
|
|
|
|
|
formData.value.projectOrderSubs.push(row)
|
|
|
|
@ -1189,7 +1226,7 @@ const protocolUploadChange = (file, files) => {
|
|
|
|
|
}
|
|
|
|
|
const refreshAttachments = (files, type) => {
|
|
|
|
|
formData.value.attachments = formData.value.attachments.filter((value, index, array) => {
|
|
|
|
|
return value.businessFileType != type
|
|
|
|
|
return value.businessFileType != type || value.id
|
|
|
|
|
})
|
|
|
|
|
for (let i = 0; i < files.length; i++) {
|
|
|
|
|
let file = files[i]
|
|
|
|
@ -1199,7 +1236,7 @@ const refreshAttachments = (files, type) => {
|
|
|
|
|
}
|
|
|
|
|
// 排序
|
|
|
|
|
formData.value.attachments.sort((v1, v2) => {
|
|
|
|
|
return v1.createTime - v2.createTime < 0
|
|
|
|
|
return (v1.createTime - v2.createTime) > 0
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1210,7 +1247,7 @@ const handleDeleteAttachment = async (index, type) => {
|
|
|
|
|
const attachment = deletedAttachments[i]
|
|
|
|
|
if (attachment.id) {
|
|
|
|
|
// 清理已上传文件
|
|
|
|
|
await deleteFile(attachment.id)
|
|
|
|
|
await deleteFileLogic(attachment.id)
|
|
|
|
|
}
|
|
|
|
|
// 清理待上传文件
|
|
|
|
|
contractUploadFiles.value = contractUploadFiles.value.filter((file1) => {
|
|
|
|
@ -1271,6 +1308,7 @@ const resetForm = () => {
|
|
|
|
|
snapshotCode: undefined,
|
|
|
|
|
orderTime: new Date(),
|
|
|
|
|
snapshotOrderTime: undefined,
|
|
|
|
|
alterFieldNames: []
|
|
|
|
|
}
|
|
|
|
|
formRef.value?.resetFields()
|
|
|
|
|
}
|
|
|
|
@ -1302,4 +1340,10 @@ a {
|
|
|
|
|
display: inline-block;
|
|
|
|
|
margin-right: 20px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.hl-card .alter-class {
|
|
|
|
|
position: relative;
|
|
|
|
|
border: solid 1px orange;
|
|
|
|
|
outline: solid 1px orange;
|
|
|
|
|
}
|
|
|
|
|
</style>
|
|
|
|
|