|
|
|
@ -1,7 +1,7 @@
|
|
|
|
|
<template>
|
|
|
|
|
<el-card class="hl-card">
|
|
|
|
|
<template #header>
|
|
|
|
|
<span>编辑页</span>
|
|
|
|
|
<span><span v-html="dialogTitle"></span>页</span>
|
|
|
|
|
</template>
|
|
|
|
|
<el-form
|
|
|
|
|
ref="formRef"
|
|
|
|
@ -142,7 +142,7 @@
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="客户名称" prop="customerId">
|
|
|
|
|
<el-select v-model="formData.customerId"
|
|
|
|
|
placeholder="请输入负责人"
|
|
|
|
|
placeholder="请输入客户名称"
|
|
|
|
|
:remote-method="remoteCustomerSearch"
|
|
|
|
|
remote-show-suffix
|
|
|
|
|
remote
|
|
|
|
@ -208,8 +208,8 @@
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="备注" prop="description">
|
|
|
|
|
<el-input type="textarea" v-model="formData.description" show-word-limit maxlength="200"/>
|
|
|
|
|
<el-form-item label="备注" prop="remark">
|
|
|
|
|
<el-input type="textarea" v-model="formData.remark" show-word-limit maxlength="200"/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
@ -240,11 +240,15 @@
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="价格(元)" prop="price">
|
|
|
|
|
<el-input v-model="formData.price" placeholder="请输入价格(元)" >
|
|
|
|
|
<template #append>
|
|
|
|
|
{{getDictLabel(DICT_TYPE.HELI_CURRENCY, formData.currency)}}
|
|
|
|
|
</template>
|
|
|
|
|
</el-input>
|
|
|
|
|
<el-input-number v-model="formData.price" :disabled="formData.hasPrice == 0 && (formData.price = '')" placeholder="请输入价格(元)" :controls="false" :min="0" :precision="6" />
|
|
|
|
|
<el-select v-model="formData.currency" placeholder="请选择币种">
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_CURRENCY)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
|
:label="dict.label"
|
|
|
|
|
:value="dict.value"
|
|
|
|
|
/>
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
@ -311,7 +315,7 @@
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="6">
|
|
|
|
|
<el-form-item label="" label-width="0" prop="blueprintRemark">
|
|
|
|
|
<el-input v-model="formData.blueprintRemark" />
|
|
|
|
|
<el-input v-model="formData.blueprintRemark" placeholder="请输入图纸/数模说明" :disabled="formData.hasBlueprint == 0 && (formData.blueprintRemark = '')"/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
@ -352,7 +356,7 @@
|
|
|
|
|
<el-table-column label="数量" min-width="150">
|
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
|
<el-form-item :prop="`${$index}.amount`" :rules="subFormRules.amount" class="mb-0px!">
|
|
|
|
|
<el-input v-model="row.amount" placeholder="请输入数量" />
|
|
|
|
|
<el-input-number v-model="row.amount" placeholder="请输入数量" :min="0" :precision="0"/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
@ -436,7 +440,7 @@
|
|
|
|
|
name="files"
|
|
|
|
|
:show-file-list="false"
|
|
|
|
|
:auto-upload="false"
|
|
|
|
|
:data="{'businessType': 'PROJECT_ORDER', 'businessId': formData.id, 'businessFileType': 'CONTRACT'}"
|
|
|
|
|
:data="contractUploadData"
|
|
|
|
|
:on-change="contractUploadChange"
|
|
|
|
|
class="upload-file-uploader"
|
|
|
|
|
>
|
|
|
|
@ -451,7 +455,7 @@
|
|
|
|
|
name="files"
|
|
|
|
|
:show-file-list="false"
|
|
|
|
|
:auto-upload="false"
|
|
|
|
|
:data="{'businessType': 'PROJECT_ORDER', 'businessId': formData.id, 'businessFileType': 'TECHNOLOGY_PROTOCOL'}"
|
|
|
|
|
:data="protocolUploadData"
|
|
|
|
|
:on-change="protocolUploadChange"
|
|
|
|
|
class="upload-file-uploader"
|
|
|
|
|
>
|
|
|
|
@ -480,31 +484,59 @@
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
</el-card>
|
|
|
|
|
<el-card class="hl-card-info">
|
|
|
|
|
<template #header>
|
|
|
|
|
<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-table :data="formData.operateLogs" class="hl-table">
|
|
|
|
|
<el-table-column prop="type" label="操作" align="center" >
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
{{getDictLabel(DICT_TYPE.SYSTEM_OPERATE_TYPE, scope.row.type)}}
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column prop="userNickname" label="操作人" align="center" />
|
|
|
|
|
<el-table-column
|
|
|
|
|
label="操作时间"
|
|
|
|
|
align="center"
|
|
|
|
|
prop="startTime"
|
|
|
|
|
width="180"
|
|
|
|
|
:formatter="dateFormatter"
|
|
|
|
|
/>
|
|
|
|
|
<el-table-column prop="content" label="操作意见" align="center" />
|
|
|
|
|
</el-table>
|
|
|
|
|
</el-card>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
</el-card>
|
|
|
|
|
</el-form>
|
|
|
|
|
<div class="text-center hl-footer">
|
|
|
|
|
<el-button @click="() => router.back()" size="large">取 消</el-button>
|
|
|
|
|
<el-button @click="formData.active='SAVE' && submitForm" type="success" :disabled="formLoading" size="large"
|
|
|
|
|
<el-button @click="submitForm('SAVE')" type="success" size="large"
|
|
|
|
|
>保 存</el-button
|
|
|
|
|
>
|
|
|
|
|
<el-button @click="formData.active='SUBMIT_AUDIT' && submitForm" type="primary" :disabled="formLoading" size="large"
|
|
|
|
|
<el-button @click="submitForm('SUBMIT_AUDIT')" type="primary" size="large"
|
|
|
|
|
>送 审</el-button
|
|
|
|
|
>
|
|
|
|
|
<el-button @click="formData.active='AUDIT' && submitForm" type="primary" :disabled="formLoading" size="large"
|
|
|
|
|
<el-button @click="submitForm('AUDIT')" type="primary" size="large"
|
|
|
|
|
>审 核</el-button
|
|
|
|
|
>
|
|
|
|
|
<el-button @click="formData.active='APPROVE' && submitForm" type="primary" :disabled="formLoading" size="large"
|
|
|
|
|
<el-button @click="submitForm('APPROVE')" type="primary" size="large"
|
|
|
|
|
>批 准</el-button
|
|
|
|
|
>
|
|
|
|
|
<el-button @click="formData.active='REPULSE' && submitForm" type="danger" :disabled="formLoading" size="large"
|
|
|
|
|
<el-button @click="submitForm('REPULSE')" type="danger" size="large"
|
|
|
|
|
>打 回</el-button
|
|
|
|
|
>
|
|
|
|
|
<el-button @click="formData.active='TERMINATE' && submitForm" type="danger" :disabled="formLoading" size="large"
|
|
|
|
|
<el-button @click="submitForm('TERMINATE')" type="danger" size="large"
|
|
|
|
|
>直接终止</el-button
|
|
|
|
|
>
|
|
|
|
|
</div>
|
|
|
|
|
</el-card>
|
|
|
|
|
</template>
|
|
|
|
|
<script setup lang="ts">
|
|
|
|
|
import {inject} from 'vue'
|
|
|
|
|
import {getIntDictOptions, getStrDictOptions, DICT_TYPE, getDictLabel} from '@/utils/dict'
|
|
|
|
|
import * as ProjectOrderApi from '@/api/heli/projectorder'
|
|
|
|
|
import {dateFormatter, formatDate} from "@/utils/formatTime";
|
|
|
|
@ -515,25 +547,26 @@ 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} from "@/api/infra/file";
|
|
|
|
|
import {deleteFile, downloadFile, getFilePage} from "@/api/infra/file";
|
|
|
|
|
import {propTypes} from "@/utils/propTypes";
|
|
|
|
|
import download from "@/utils/download";
|
|
|
|
|
import {useUserStore} from "@/store/modules/user";
|
|
|
|
|
import {getUserProfile} from "@/api/system/user/profile";
|
|
|
|
|
import {getOperateLogPage} from "@/api/system/operatelog";
|
|
|
|
|
|
|
|
|
|
const { t } = useI18n() // 国际化
|
|
|
|
|
const message = useMessage() // 消息弹窗
|
|
|
|
|
const { query } = useRoute()
|
|
|
|
|
const router = useRouter();
|
|
|
|
|
const reload = inject('reload')
|
|
|
|
|
|
|
|
|
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
|
|
|
|
const dialogTitle = ref('') // 弹窗的标题
|
|
|
|
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
|
|
|
|
const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
|
|
|
|
const formData = ref({
|
|
|
|
|
id: undefined,
|
|
|
|
|
code: undefined,
|
|
|
|
|
orderStatus: undefined,
|
|
|
|
|
orderStatus: 4,
|
|
|
|
|
deliveryStatus: 1,
|
|
|
|
|
businessDeptId: undefined,
|
|
|
|
|
customerId: undefined,
|
|
|
|
@ -556,13 +589,15 @@ const formData = ref({
|
|
|
|
|
hasTechnologyProtocol: 0,
|
|
|
|
|
hasBlueprint: 0,
|
|
|
|
|
blueprintRemark: undefined,
|
|
|
|
|
status: undefined,
|
|
|
|
|
status: 1,
|
|
|
|
|
businessMan: undefined,
|
|
|
|
|
createTime: new Date(),
|
|
|
|
|
projectOrderSubs: [],
|
|
|
|
|
attachments: [],
|
|
|
|
|
operateLogs: [],
|
|
|
|
|
contractNo: undefined,
|
|
|
|
|
active: ''
|
|
|
|
|
active: '',
|
|
|
|
|
activeOpinion: ''
|
|
|
|
|
})
|
|
|
|
|
const formRules = reactive({
|
|
|
|
|
businessDeptId: [{ required: true, message: '提出部门不能为空', trigger: 'blur' }],
|
|
|
|
@ -651,7 +686,6 @@ const projectOrderSubFormRef = ref()
|
|
|
|
|
|
|
|
|
|
/** 打开弹窗 */
|
|
|
|
|
const queryData = async (type: string, id?: number) => {
|
|
|
|
|
dialogVisible.value = true
|
|
|
|
|
dialogTitle.value = t('action.' + type)
|
|
|
|
|
formType.value = type
|
|
|
|
|
resetForm()
|
|
|
|
@ -660,6 +694,26 @@ const queryData = async (type: string, id?: number) => {
|
|
|
|
|
try {
|
|
|
|
|
if (id) {
|
|
|
|
|
formData.value = await ProjectOrderApi.getProjectOrder(id)
|
|
|
|
|
// 子项列表
|
|
|
|
|
formData.value.projectOrderSubs = await ProjectOrderApi.getProjectOrderSubListByProjectOrderId(id);
|
|
|
|
|
|
|
|
|
|
// 操作日志
|
|
|
|
|
let logParams = {
|
|
|
|
|
pageNo: 1,
|
|
|
|
|
pageSize: 99,
|
|
|
|
|
businessId: id,
|
|
|
|
|
businessType: 'PROJECT_ORDER'
|
|
|
|
|
}
|
|
|
|
|
formData.value.operateLogs = (await getOperateLogPage(logParams)).list;
|
|
|
|
|
|
|
|
|
|
// 附件信息
|
|
|
|
|
let attParams = {
|
|
|
|
|
pageNo: 1,
|
|
|
|
|
pageSize: 99,
|
|
|
|
|
businessId: id,
|
|
|
|
|
businessType: 'PROJECT_ORDER'
|
|
|
|
|
}
|
|
|
|
|
formData.value.attachments = (await getFilePage(attParams)).list;
|
|
|
|
|
}
|
|
|
|
|
// 加载部门树
|
|
|
|
|
deptList.value = handleTree(await DeptApi.getSimpleDeptList())
|
|
|
|
@ -697,7 +751,6 @@ const queryData = async (type: string, id?: number) => {
|
|
|
|
|
// 绑定默认部门与业务员
|
|
|
|
|
formData.value.businessMan = useUserStore().getUser.id // 当前登录的编码
|
|
|
|
|
const userProfile = await getUserProfile(formData.value.businessMan);
|
|
|
|
|
console.log(userProfile)
|
|
|
|
|
if(userProfile.dept){
|
|
|
|
|
formData.value.businessDeptId = userProfile.dept.id;
|
|
|
|
|
}
|
|
|
|
@ -706,8 +759,9 @@ const queryData = async (type: string, id?: number) => {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const submitForm = async () => {
|
|
|
|
|
const submitForm = async (active) => {
|
|
|
|
|
// 校验表单
|
|
|
|
|
formData.value.active = active;
|
|
|
|
|
await formRef.value.validate()
|
|
|
|
|
// 校验子表单
|
|
|
|
|
try {
|
|
|
|
@ -719,17 +773,21 @@ const submitForm = async () => {
|
|
|
|
|
formLoading.value = true
|
|
|
|
|
try {
|
|
|
|
|
const data = formData.value as unknown as ProjectOrderApi.ProjectOrderVO
|
|
|
|
|
// 拼接子表的数据
|
|
|
|
|
data.projectOrderSubs = projectOrderSubFormRef.value.getData()
|
|
|
|
|
if (formType.value === 'create') {
|
|
|
|
|
await ProjectOrderApi.createProjectOrder(data)
|
|
|
|
|
message.success(t('common.createSuccess'))
|
|
|
|
|
} else {
|
|
|
|
|
await ProjectOrderApi.updateProjectOrder(data)
|
|
|
|
|
message.success(t('common.updateSuccess'))
|
|
|
|
|
const orderId = await ProjectOrderApi.operateProjectOrder(data)
|
|
|
|
|
message.success(t('common.operationSuccess'))
|
|
|
|
|
// 上传附件
|
|
|
|
|
if(contractUploadFiles.value.length > 0){
|
|
|
|
|
contractUploadData.value = {'businessType': 'PROJECT_ORDER', 'businessId': orderId, 'businessFileType': 'CONTRACT'};
|
|
|
|
|
contractUploadRef.value!.submit();
|
|
|
|
|
}
|
|
|
|
|
dialogVisible.value = false
|
|
|
|
|
} finally {
|
|
|
|
|
if(protocolUploadFiles.value.length > 0){
|
|
|
|
|
protocolUploadData.value = {'businessType': 'PROJECT_ORDER', 'businessId': orderId, 'businessFileType': 'TECHNOLOGY_PROTOCOL'};
|
|
|
|
|
protocolUploadRef.value!.submit();
|
|
|
|
|
}
|
|
|
|
|
// 成功后刷新
|
|
|
|
|
reload();
|
|
|
|
|
query.id = orderId;
|
|
|
|
|
}finally {
|
|
|
|
|
formLoading.value = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -745,7 +803,7 @@ const onAddItem = () => {
|
|
|
|
|
compositionId: undefined,
|
|
|
|
|
unit: undefined,
|
|
|
|
|
remark: undefined,
|
|
|
|
|
status: undefined,
|
|
|
|
|
status: 1,
|
|
|
|
|
}
|
|
|
|
|
row.projectOrderId = formData.value.id
|
|
|
|
|
formData.value.projectOrderSubs.push(row)
|
|
|
|
@ -758,9 +816,11 @@ const onDeleteItem = (index) => {
|
|
|
|
|
const uploadUrl = ref(import.meta.env.VITE_UPLOAD_BATCH_URL)
|
|
|
|
|
const contractUploadRef = ref();
|
|
|
|
|
const contractUploadFiles = ref<UploadUserFile[]>([]);
|
|
|
|
|
const contractUploadData = ref({});
|
|
|
|
|
|
|
|
|
|
const protocolUploadRef = ref();
|
|
|
|
|
const protocolUploadFiles = ref<UploadUserFile[]>([]);
|
|
|
|
|
const protocolUploadData = ref({});
|
|
|
|
|
|
|
|
|
|
const contractUploadChange = (file, files) => {
|
|
|
|
|
contractUploadFiles.value = files;
|
|
|
|
@ -782,7 +842,7 @@ const refreshAttachments = (files, type) => {
|
|
|
|
|
}
|
|
|
|
|
// 排序
|
|
|
|
|
formData.value.attachments.sort((v1,v2) => {
|
|
|
|
|
return v1.businessFileType == v2.businessFileType ? 0 : 1;
|
|
|
|
|
return v1.createTime - v2.createTime < 0;
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -817,7 +877,7 @@ const resetForm = () => {
|
|
|
|
|
formData.value = {
|
|
|
|
|
id: undefined,
|
|
|
|
|
code: undefined,
|
|
|
|
|
orderStatus: undefined,
|
|
|
|
|
orderStatus: 4,
|
|
|
|
|
deliveryStatus: 1,
|
|
|
|
|
businessDeptId: undefined,
|
|
|
|
|
customerId: undefined,
|
|
|
|
@ -840,12 +900,14 @@ const resetForm = () => {
|
|
|
|
|
hasTechnologyProtocol: 0,
|
|
|
|
|
hasBlueprint: 0,
|
|
|
|
|
blueprintRemark: undefined,
|
|
|
|
|
status: undefined,
|
|
|
|
|
status: 1,
|
|
|
|
|
businessMan: undefined,
|
|
|
|
|
createTime: new Date(),
|
|
|
|
|
projectOrderSubs: [],
|
|
|
|
|
attachments: [],
|
|
|
|
|
contractNo: undefined,
|
|
|
|
|
active: '',
|
|
|
|
|
activeOpinion: ''
|
|
|
|
|
}
|
|
|
|
|
formRef.value?.resetFields()
|
|
|
|
|
}
|
|
|
|
|