|
|
|
@ -0,0 +1,868 @@
|
|
|
|
|
<template>
|
|
|
|
|
<el-card class="hl-card">
|
|
|
|
|
<template #header>
|
|
|
|
|
<span>编辑页</span>
|
|
|
|
|
</template>
|
|
|
|
|
<el-form
|
|
|
|
|
ref="formRef"
|
|
|
|
|
:model="formData"
|
|
|
|
|
:rules="formRules"
|
|
|
|
|
label-width="100px"
|
|
|
|
|
v-loading="formLoading"
|
|
|
|
|
>
|
|
|
|
|
<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 :span="6">
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="项目编号" prop="code">
|
|
|
|
|
<el-input disabled v-model="formData.code" placeholder="系统自动生成" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="提出部门" prop="businessDeptId">
|
|
|
|
|
<el-tree-select
|
|
|
|
|
v-model="formData.businessDeptId"
|
|
|
|
|
:data="deptList"
|
|
|
|
|
:props="defaultProps"
|
|
|
|
|
check-strictly
|
|
|
|
|
node-key="id"
|
|
|
|
|
clearable
|
|
|
|
|
placeholder="请选择提出部门"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="所属业务线" prop="businessLine">
|
|
|
|
|
<el-select v-model="formData.businessLine" placeholder="请选择所属业务线">
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_BUSINESS_LINE)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
|
:label="dict.label"
|
|
|
|
|
:value="dict.value"
|
|
|
|
|
/>
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="项目开始日期" prop="projectStartTime">
|
|
|
|
|
<el-date-picker
|
|
|
|
|
v-model="formData.projectStartTime"
|
|
|
|
|
type="date"
|
|
|
|
|
value-format="x"
|
|
|
|
|
placeholder="选择项目开始日期"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="可引用的原有技术" prop="referenceTechnology">
|
|
|
|
|
<el-input v-model="formData.referenceTechnology" placeholder="请输入可引用的原有技术" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="检验要求" prop="qualityRequirement">
|
|
|
|
|
<el-input type="textarea" v-model="formData.qualityRequirement" placeholder="请输入检验要求" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="6">
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="单据日期" prop="createTime">
|
|
|
|
|
{{formatDate(formData.createTime, 'YYYY-MM-DD')}}
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="业务员" prop="businessMan">
|
|
|
|
|
<el-select v-model="formData.businessMan"
|
|
|
|
|
placeholder="请输入负责人"
|
|
|
|
|
:remote-method="remoteUserSearch"
|
|
|
|
|
remote-show-suffix
|
|
|
|
|
remote
|
|
|
|
|
clearable
|
|
|
|
|
reserve-keyword
|
|
|
|
|
filterable
|
|
|
|
|
:loading="userSelectLoading"
|
|
|
|
|
>
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="item in userSelectList"
|
|
|
|
|
:key="item.id"
|
|
|
|
|
:label="item.username + ' ' + item.nickname"
|
|
|
|
|
:value="item.id"
|
|
|
|
|
/>
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="模具图号" prop="blueprintNo">
|
|
|
|
|
<el-input v-model="formData.blueprintNo" placeholder="请输入模具图号" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="项目结束日期" prop="projectEndTime">
|
|
|
|
|
<el-date-picker
|
|
|
|
|
v-model="formData.projectEndTime"
|
|
|
|
|
type="date"
|
|
|
|
|
value-format="x"
|
|
|
|
|
placeholder="选择项目结束日期"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="6">
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="单据状态" prop="orderStatus">
|
|
|
|
|
{{getDictLabel(DICT_TYPE.HELI_PROJECT_ORDER_STATUS, formData.orderStatus)}}
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="客户名称" prop="customerId">
|
|
|
|
|
<el-select v-model="formData.customerId"
|
|
|
|
|
placeholder="请输入负责人"
|
|
|
|
|
:remote-method="remoteCustomerSearch"
|
|
|
|
|
remote-show-suffix
|
|
|
|
|
remote
|
|
|
|
|
clearable
|
|
|
|
|
reserve-keyword
|
|
|
|
|
filterable
|
|
|
|
|
:loading="customerSelectLoading"
|
|
|
|
|
>
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="item in customerSelectList"
|
|
|
|
|
:key="item.id"
|
|
|
|
|
:label="item.name"
|
|
|
|
|
:value="item.id"
|
|
|
|
|
/>
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="是否有价格" prop="hasPrice">
|
|
|
|
|
<el-radio-group v-model="formData.hasPrice">
|
|
|
|
|
<el-radio
|
|
|
|
|
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
|
:label="dict.value"
|
|
|
|
|
>
|
|
|
|
|
{{ dict.label }}
|
|
|
|
|
</el-radio>
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="是否紧急" prop="isUrgency">
|
|
|
|
|
<el-radio-group v-model="formData.isUrgency">
|
|
|
|
|
<el-radio
|
|
|
|
|
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
|
:label="dict.value"
|
|
|
|
|
>
|
|
|
|
|
{{ dict.label }}
|
|
|
|
|
</el-radio>
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="是否已变更" prop="hasAlter">
|
|
|
|
|
<el-radio-group v-model="formData.hasAlter">
|
|
|
|
|
<el-radio
|
|
|
|
|
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
|
:label="dict.value"
|
|
|
|
|
>
|
|
|
|
|
{{ dict.label }}
|
|
|
|
|
</el-radio>
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</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>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="6">
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="发货状态" prop="deliveryStatus">
|
|
|
|
|
{{getDictLabel(DICT_TYPE.HELI_DELIVERY_STATUS, formData.deliveryStatus)}}
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="合同号" prop="contractNo">
|
|
|
|
|
<el-input v-model="formData.contractNo" placeholder="请输入合同号" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="模具名称" prop="mouldName">
|
|
|
|
|
<el-input v-model="formData.mouldName" placeholder="请输入模具名称" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<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-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="性质" prop="property">
|
|
|
|
|
<el-select v-model="formData.property" placeholder="请选择性质">
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PROPERTY)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
|
:label="dict.label"
|
|
|
|
|
:value="dict.value"
|
|
|
|
|
/>
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
</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 :span="6">
|
|
|
|
|
<el-form-item label="有无合同" prop="hasContract">
|
|
|
|
|
<el-radio-group v-model="formData.hasContract">
|
|
|
|
|
<el-radio
|
|
|
|
|
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
|
:label="dict.value"
|
|
|
|
|
>
|
|
|
|
|
{{ dict.label }}
|
|
|
|
|
</el-radio>
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="6">
|
|
|
|
|
<el-form-item label="有无技术协议" prop="hasTechnologyProtocol">
|
|
|
|
|
<el-radio-group v-model="formData.hasTechnologyProtocol">
|
|
|
|
|
<el-radio
|
|
|
|
|
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
|
:label="dict.value"
|
|
|
|
|
>
|
|
|
|
|
{{ dict.label }}
|
|
|
|
|
</el-radio>
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="6">
|
|
|
|
|
<el-form-item label="有无图纸/数模" prop="hasBlueprint">
|
|
|
|
|
<el-radio-group v-model="formData.hasBlueprint">
|
|
|
|
|
<el-radio
|
|
|
|
|
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
|
:label="dict.value"
|
|
|
|
|
>
|
|
|
|
|
{{ dict.label }}
|
|
|
|
|
</el-radio>
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="6">
|
|
|
|
|
<el-form-item label="" label-width="0" prop="blueprintRemark">
|
|
|
|
|
<el-input v-model="formData.blueprintRemark" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</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-col>
|
|
|
|
|
<el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem">新增</el-button>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-form ref="projectOrderSubFormRef" :model="formData.projectOrderSubs"
|
|
|
|
|
:rules="subFormRules"
|
|
|
|
|
v-loading="subFormLoading"
|
|
|
|
|
label-width="0">
|
|
|
|
|
<el-table
|
|
|
|
|
:data="formData.projectOrderSubs"
|
|
|
|
|
class="hl-table"
|
|
|
|
|
>
|
|
|
|
|
<el-table-column label="序号" type="index" width="100" />
|
|
|
|
|
<el-table-column label="子项目名称" min-width="150">
|
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
|
<el-form-item :prop="`${$index}.name`" :rules="subFormRules.name" class="mb-0px!">
|
|
|
|
|
<el-input v-model="row.name" placeholder="请输入子项目名称" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="设备型号" min-width="150">
|
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
|
<el-form-item :prop="`${$index}.deviceModel`" :rules="subFormRules.deviceModel" class="mb-0px!">
|
|
|
|
|
<el-input v-model="row.deviceModel" placeholder="请输入设备型号" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<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-form-item>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="单位" min-width="150">
|
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
|
<el-form-item :prop="`${$index}.unit`" :rules="subFormRules.unit" class="mb-0px!">
|
|
|
|
|
<el-select v-model="row.unit" placeholder="请选择单位">
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_PROJECT_ORDER_SUB_UNIT)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
|
:label="dict.label"
|
|
|
|
|
:value="dict.value"
|
|
|
|
|
/>
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="材质" min-width="150">
|
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
|
<el-form-item :prop="`${$index}.compositionId`" :rules="subFormRules.compositionId" class="mb-0px!">
|
|
|
|
|
<el-select v-model="row.compositionId"
|
|
|
|
|
placeholder="请输入材质"
|
|
|
|
|
:remote-method="remoteCompositionSearch"
|
|
|
|
|
remote-show-suffix
|
|
|
|
|
remote
|
|
|
|
|
clearable
|
|
|
|
|
reserve-keyword
|
|
|
|
|
filterable
|
|
|
|
|
:loading="compositionSelectLoading"
|
|
|
|
|
>
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="item in compositionSelectList"
|
|
|
|
|
:key="item.id"
|
|
|
|
|
:label="item.name"
|
|
|
|
|
:value="item.id"
|
|
|
|
|
/>
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="备注" min-width="150">
|
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
|
<el-form-item :prop="`${$index}.remark`" :rules="subFormRules.remark" class="mb-0px!">
|
|
|
|
|
<el-input v-model="row.remark" placeholder="请输入备注" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="操作" align="center" width="240">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-button
|
|
|
|
|
link
|
|
|
|
|
type="danger"
|
|
|
|
|
size="small"
|
|
|
|
|
@click.prevent="onDeleteItem(scope.$index)"
|
|
|
|
|
>
|
|
|
|
|
删除
|
|
|
|
|
</el-button>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
</el-table>
|
|
|
|
|
</el-form>
|
|
|
|
|
</el-card>
|
|
|
|
|
</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-col>
|
|
|
|
|
<el-upload
|
|
|
|
|
ref="contractUploadRef"
|
|
|
|
|
:file-list="contractUploadFiles"
|
|
|
|
|
multiple
|
|
|
|
|
:limit="10"
|
|
|
|
|
:action="uploadUrl"
|
|
|
|
|
:headers="{'Authorization': 'Bearer ' + getAccessToken(),'tenant-id': getTenantId()}"
|
|
|
|
|
name="files"
|
|
|
|
|
:show-file-list="false"
|
|
|
|
|
:auto-upload="false"
|
|
|
|
|
:data="{'businessType': 'PROJECT_ORDER', 'businessId': formData.id, 'businessFileType': 'CONTRACT'}"
|
|
|
|
|
:on-change="contractUploadChange"
|
|
|
|
|
class="upload-file-uploader"
|
|
|
|
|
>
|
|
|
|
|
<el-button type="primary"><Icon icon="ep:upload-filled" />上传合同</el-button>
|
|
|
|
|
</el-upload>
|
|
|
|
|
<el-upload
|
|
|
|
|
ref="protocolUploadRef"
|
|
|
|
|
multiple
|
|
|
|
|
:limit="10"
|
|
|
|
|
:action="uploadUrl"
|
|
|
|
|
:headers="{'Authorization': 'Bearer ' + getAccessToken(),'tenant-id': getTenantId()}"
|
|
|
|
|
name="files"
|
|
|
|
|
:show-file-list="false"
|
|
|
|
|
:auto-upload="false"
|
|
|
|
|
:data="{'businessType': 'PROJECT_ORDER', 'businessId': formData.id, 'businessFileType': 'TECHNOLOGY_PROTOCOL'}"
|
|
|
|
|
:on-change="protocolUploadChange"
|
|
|
|
|
class="upload-file-uploader"
|
|
|
|
|
>
|
|
|
|
|
<el-button type="primary"><Icon icon="ep:upload-filled" />上传技术协议</el-button>
|
|
|
|
|
</el-upload>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-table :data="formData.attachments" class="hl-table">
|
|
|
|
|
<el-table-column prop="name" label="文件名称" align="center" />
|
|
|
|
|
<el-table-column prop="businessFileType" label="文件类型" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
{{getDictLabel(DICT_TYPE.HELI_BUSINESS_FILE_TYPE, scope.row.businessFileType)}}
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column prop="createTime" align="center" label="上传时间" :formatter="dateFormatter"/>
|
|
|
|
|
<el-table-column label="操作" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-button link type="danger" size="small" @click="handleDeleteAttachment(scope.$index, scope.row.businessFileType)">
|
|
|
|
|
删除
|
|
|
|
|
</el-button>
|
|
|
|
|
<el-button v-if="!!scope.row.id" link type="primary" size="small" @click="downloadAttachment(scope.row.name, scope.row.url)"> 下载 </el-button>
|
|
|
|
|
<el-button v-if="!!scope.row.id" link type="primary" size="small" @click="window.open(scope.row.url)"> 查看 </el-button>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
</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
|
|
|
|
|
>
|
|
|
|
|
<el-button @click="formData.active='SUBMIT_AUDIT' && submitForm" type="primary" :disabled="formLoading" size="large"
|
|
|
|
|
>送 审</el-button
|
|
|
|
|
>
|
|
|
|
|
<el-button @click="formData.active='AUDIT' && submitForm" type="primary" :disabled="formLoading" size="large"
|
|
|
|
|
>审 核</el-button
|
|
|
|
|
>
|
|
|
|
|
<el-button @click="formData.active='APPROVE' && submitForm" type="primary" :disabled="formLoading" size="large"
|
|
|
|
|
>批 准</el-button
|
|
|
|
|
>
|
|
|
|
|
<el-button @click="formData.active='REPULSE' && submitForm" type="danger" :disabled="formLoading" size="large"
|
|
|
|
|
>打 回</el-button
|
|
|
|
|
>
|
|
|
|
|
<el-button @click="formData.active='TERMINATE' && submitForm" type="danger" :disabled="formLoading" size="large"
|
|
|
|
|
>直接终止</el-button
|
|
|
|
|
>
|
|
|
|
|
</div>
|
|
|
|
|
</el-card>
|
|
|
|
|
</template>
|
|
|
|
|
<script setup lang="ts">
|
|
|
|
|
import {getIntDictOptions, getStrDictOptions, DICT_TYPE, getDictLabel} from '@/utils/dict'
|
|
|
|
|
import * as ProjectOrderApi from '@/api/heli/projectorder'
|
|
|
|
|
import {dateFormatter, formatDate} from "@/utils/formatTime";
|
|
|
|
|
import {defaultProps, handleTree} from "@/utils/tree";
|
|
|
|
|
import * as DeptApi from '@/api/system/dept'
|
|
|
|
|
import * as UserApi from "@/api/system/user";
|
|
|
|
|
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 {propTypes} from "@/utils/propTypes";
|
|
|
|
|
import download from "@/utils/download";
|
|
|
|
|
import {useUserStore} from "@/store/modules/user";
|
|
|
|
|
import {getUserProfile} from "@/api/system/user/profile";
|
|
|
|
|
|
|
|
|
|
const { t } = useI18n() // 国际化
|
|
|
|
|
const message = useMessage() // 消息弹窗
|
|
|
|
|
const { query } = useRoute()
|
|
|
|
|
const router = useRouter();
|
|
|
|
|
|
|
|
|
|
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,
|
|
|
|
|
deliveryStatus: 1,
|
|
|
|
|
businessDeptId: undefined,
|
|
|
|
|
customerId: undefined,
|
|
|
|
|
mouldName: undefined,
|
|
|
|
|
businessLine: undefined,
|
|
|
|
|
blueprintNo: undefined,
|
|
|
|
|
hasPrice: 1,
|
|
|
|
|
price: undefined,
|
|
|
|
|
currency: 1,
|
|
|
|
|
projectStartTime: undefined,
|
|
|
|
|
projectEndTime: undefined,
|
|
|
|
|
isUrgency: 0,
|
|
|
|
|
property: 1,
|
|
|
|
|
referenceTechnology: undefined,
|
|
|
|
|
hasAlter: 0,
|
|
|
|
|
lastAlterTime: undefined,
|
|
|
|
|
qualityRequirement: undefined,
|
|
|
|
|
remark: undefined,
|
|
|
|
|
hasContract: 0,
|
|
|
|
|
hasTechnologyProtocol: 0,
|
|
|
|
|
hasBlueprint: 0,
|
|
|
|
|
blueprintRemark: undefined,
|
|
|
|
|
status: undefined,
|
|
|
|
|
businessMan: undefined,
|
|
|
|
|
createTime: new Date(),
|
|
|
|
|
projectOrderSubs: [],
|
|
|
|
|
attachments: [],
|
|
|
|
|
contractNo: undefined,
|
|
|
|
|
active: ''
|
|
|
|
|
})
|
|
|
|
|
const formRules = reactive({
|
|
|
|
|
businessDeptId: [{ required: true, message: '提出部门不能为空', trigger: 'blur' }],
|
|
|
|
|
customerId: [{ required: true, message: '客户id不能为空', trigger: 'blur' }],
|
|
|
|
|
mouldName: [{ required: true, message: '模具名称不能为空', trigger: 'blur' }],
|
|
|
|
|
businessLine: [{ required: true, message: '所属业务线不能为空', trigger: 'change' }],
|
|
|
|
|
hasPrice: [{ required: true, message: '是否有价格不能为空', trigger: 'blur' }],
|
|
|
|
|
projectStartTime: [{ required: true, message: '项目开始日期不能为空', trigger: 'blur' }],
|
|
|
|
|
isUrgency: [{ required: true, message: '是否紧急不能为空', trigger: 'blur' }],
|
|
|
|
|
property: [{ required: true, message: '性质不能为空', trigger: 'blur' }],
|
|
|
|
|
hasAlter: [{ required: true, message: '是否已变更不能为空', trigger: 'blur' }],
|
|
|
|
|
hasContract: [{ required: true, message: '有无合同不能为空', trigger: 'blur' }],
|
|
|
|
|
hasTechnologyProtocol: [{ required: true, message: '有无技术协议不能为空', trigger: 'blur' }],
|
|
|
|
|
hasBlueprint: [{ required: true, message: '有无图纸/数模不能为空', trigger: 'blur' }],
|
|
|
|
|
blueprintRemark: [{ required: true, message: '图纸/数模 说明不能为空', trigger: 'blur' }],
|
|
|
|
|
status: [{ required: true, message: '状态,1表示正常,2表示禁用不能为空', trigger: 'blur' }],
|
|
|
|
|
businessMan: [{ required: true, message: '业务员不能为空', trigger: 'blur' }],
|
|
|
|
|
})
|
|
|
|
|
const formRef = ref() // 表单 Ref
|
|
|
|
|
const subFormLoading = ref(false) // 子表单的加载中
|
|
|
|
|
const subFormRules = reactive({
|
|
|
|
|
name: [{ required: true, message: '子项目名称不能为空', trigger: 'blur' }],
|
|
|
|
|
amount: [{ required: true, message: '数量不能为空', trigger: 'blur' }],
|
|
|
|
|
unit: [{ required: true, message: '单位不能为空', trigger: 'blur' }],
|
|
|
|
|
compositionId: [{ required: true, message: '材质不能为空', trigger: 'blur' }],
|
|
|
|
|
status: [{ required: true, message: '状态,1表示正常,2表示禁用不能为空', trigger: 'blur' }],
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const deptList = ref<Tree[]>([]) // 树形结构
|
|
|
|
|
const userList = ref<UserApi.UserVO[]>([]) // 用户列表
|
|
|
|
|
const userSelectList = ref<UserApi.UserVO[]>([])
|
|
|
|
|
const userSelectLoading = ref(false);
|
|
|
|
|
|
|
|
|
|
const remoteUserSearch = (query: string) => {
|
|
|
|
|
if (query) {
|
|
|
|
|
userSelectLoading.value = true
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
userSelectLoading.value = false
|
|
|
|
|
userSelectList.value = userList.value.filter((item) => {
|
|
|
|
|
return item.nickname.toLowerCase().includes(query.toLowerCase()) || item.username.toLowerCase().includes(query.toLowerCase())
|
|
|
|
|
})
|
|
|
|
|
}, 200)
|
|
|
|
|
} else {
|
|
|
|
|
userSelectList.value = userList.value
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const customerList = ref<CustomerApi.CustomerVO[]>([])
|
|
|
|
|
const customerSelectList = ref<CustomerApi.CustomerVO[]>([])
|
|
|
|
|
const customerSelectLoading = ref(false);
|
|
|
|
|
|
|
|
|
|
const remoteCustomerSearch = (query: string) => {
|
|
|
|
|
if (query) {
|
|
|
|
|
customerSelectLoading.value = true
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
customerSelectLoading.value = false
|
|
|
|
|
customerSelectList.value = customerList.value.filter((item) => {
|
|
|
|
|
return item.name.toLowerCase().includes(query.toLowerCase())
|
|
|
|
|
})
|
|
|
|
|
}, 200)
|
|
|
|
|
} else {
|
|
|
|
|
customerSelectList.value = customerList.value
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const compositionList = ref<CompositionApi.CompositionVO[]>([])
|
|
|
|
|
const compositionSelectList = ref<CompositionApi.CompositionVO[]>([])
|
|
|
|
|
const compositionSelectLoading = ref(false);
|
|
|
|
|
|
|
|
|
|
const remoteCompositionSearch = (query: string) => {
|
|
|
|
|
if (query) {
|
|
|
|
|
compositionSelectLoading.value = true
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
compositionSelectLoading.value = false
|
|
|
|
|
compositionSelectList.value = compositionList.value.filter((item) => {
|
|
|
|
|
return item.name.toLowerCase().includes(query.toLowerCase())
|
|
|
|
|
})
|
|
|
|
|
}, 200)
|
|
|
|
|
} else {
|
|
|
|
|
compositionSelectList.value = compositionList.value
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 子表的表单 */
|
|
|
|
|
const projectOrderSubFormRef = ref()
|
|
|
|
|
|
|
|
|
|
/** 打开弹窗 */
|
|
|
|
|
const queryData = async (type: string, id?: number) => {
|
|
|
|
|
dialogVisible.value = true
|
|
|
|
|
dialogTitle.value = t('action.' + type)
|
|
|
|
|
formType.value = type
|
|
|
|
|
resetForm()
|
|
|
|
|
// 修改时,设置数据
|
|
|
|
|
formLoading.value = true
|
|
|
|
|
try {
|
|
|
|
|
if (id) {
|
|
|
|
|
formData.value = await ProjectOrderApi.getProjectOrder(id)
|
|
|
|
|
}
|
|
|
|
|
// 加载部门树
|
|
|
|
|
deptList.value = handleTree(await DeptApi.getSimpleDeptList())
|
|
|
|
|
|
|
|
|
|
// 获得用户列表
|
|
|
|
|
let userParams = {
|
|
|
|
|
pageNo: 1,
|
|
|
|
|
pageSize: 10,
|
|
|
|
|
status: "0"
|
|
|
|
|
}
|
|
|
|
|
const data = await UserApi.getUserPage(userParams)
|
|
|
|
|
userList.value = data.list;
|
|
|
|
|
userSelectList.value = data.list;
|
|
|
|
|
|
|
|
|
|
// 获得客户列表
|
|
|
|
|
let customerParams = {
|
|
|
|
|
pageNo: 1,
|
|
|
|
|
pageSize: 10,
|
|
|
|
|
status: "1"
|
|
|
|
|
}
|
|
|
|
|
const customerData = await CustomerApi.getCustomerPage(customerParams)
|
|
|
|
|
customerList.value = customerData.list;
|
|
|
|
|
customerSelectList.value = customerData.list;
|
|
|
|
|
|
|
|
|
|
// 获得列表
|
|
|
|
|
let compositionParams = {
|
|
|
|
|
pageNo: 1,
|
|
|
|
|
pageSize: 10,
|
|
|
|
|
status: "1"
|
|
|
|
|
}
|
|
|
|
|
const compositionData = await CompositionApi.getCompositionPage(compositionParams)
|
|
|
|
|
compositionList.value = compositionData.list;
|
|
|
|
|
compositionSelectList.value = compositionData.list;
|
|
|
|
|
|
|
|
|
|
// 绑定默认部门与业务员
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
formLoading.value = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const submitForm = async () => {
|
|
|
|
|
// 校验表单
|
|
|
|
|
await formRef.value.validate()
|
|
|
|
|
// 校验子表单
|
|
|
|
|
try {
|
|
|
|
|
await projectOrderSubFormRef.value.validate()
|
|
|
|
|
} catch (e) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
// 提交请求
|
|
|
|
|
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'))
|
|
|
|
|
}
|
|
|
|
|
dialogVisible.value = false
|
|
|
|
|
} finally {
|
|
|
|
|
formLoading.value = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 新增子项按钮操作 */
|
|
|
|
|
const onAddItem = () => {
|
|
|
|
|
const row = {
|
|
|
|
|
id: undefined,
|
|
|
|
|
projectOrderId: undefined,
|
|
|
|
|
name: undefined,
|
|
|
|
|
deviceModel: undefined,
|
|
|
|
|
amount: undefined,
|
|
|
|
|
compositionId: undefined,
|
|
|
|
|
unit: undefined,
|
|
|
|
|
remark: undefined,
|
|
|
|
|
status: undefined,
|
|
|
|
|
}
|
|
|
|
|
row.projectOrderId = formData.value.id
|
|
|
|
|
formData.value.projectOrderSubs.push(row)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 删除子项操作 */
|
|
|
|
|
const onDeleteItem = (index) => {
|
|
|
|
|
formData.value.projectOrderSubs.splice(index, 1)
|
|
|
|
|
}
|
|
|
|
|
const uploadUrl = ref(import.meta.env.VITE_UPLOAD_BATCH_URL)
|
|
|
|
|
const contractUploadRef = ref();
|
|
|
|
|
const contractUploadFiles = ref<UploadUserFile[]>([]);
|
|
|
|
|
|
|
|
|
|
const protocolUploadRef = ref();
|
|
|
|
|
const protocolUploadFiles = ref<UploadUserFile[]>([]);
|
|
|
|
|
|
|
|
|
|
const contractUploadChange = (file, files) => {
|
|
|
|
|
contractUploadFiles.value = files;
|
|
|
|
|
refreshAttachments(files, 'CONTRACT')
|
|
|
|
|
}
|
|
|
|
|
const protocolUploadChange = (file, files) => {
|
|
|
|
|
protocolUploadFiles.value = files;
|
|
|
|
|
refreshAttachments(files, 'TECHNOLOGY_PROTOCOL')
|
|
|
|
|
}
|
|
|
|
|
const refreshAttachments = (files, type) => {
|
|
|
|
|
formData.value.attachments = formData.value.attachments.filter((value, index, array) => {
|
|
|
|
|
return value.businessFileType != type;
|
|
|
|
|
});
|
|
|
|
|
for (let i = 0; i < files.length; i++) {
|
|
|
|
|
let file = files[i];
|
|
|
|
|
file.businessFileType = type;
|
|
|
|
|
file.createTime = new Date();
|
|
|
|
|
formData.value.attachments.push(file);
|
|
|
|
|
}
|
|
|
|
|
// 排序
|
|
|
|
|
formData.value.attachments.sort((v1,v2) => {
|
|
|
|
|
return v1.businessFileType == v2.businessFileType ? 0 : 1;
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 删除附件
|
|
|
|
|
const handleDeleteAttachment = async (index, type) => {
|
|
|
|
|
const deletedAttachments = formData.value.attachments.splice(index, 1);
|
|
|
|
|
for (let i = 0; i < deletedAttachments.length; i++) {
|
|
|
|
|
const attachment = deletedAttachments[i];
|
|
|
|
|
if(attachment.id){
|
|
|
|
|
// 清理已上传文件
|
|
|
|
|
await deleteFile(attachment.id);
|
|
|
|
|
}
|
|
|
|
|
// 清理待上传文件
|
|
|
|
|
contractUploadFiles.value = contractUploadFiles.value.filter(file1 => {
|
|
|
|
|
return file1.name != attachment.name || file1.businessFileType != type;
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
protocolUploadFiles.value = protocolUploadFiles.value.filter(file2 => {
|
|
|
|
|
return file2.name != attachment.name || file2.businessFileType != type;
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 下载文件
|
|
|
|
|
const downloadAttachment = async (name, url) => {
|
|
|
|
|
const data = await downloadFile(url)
|
|
|
|
|
download.any(data, name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 重置表单 */
|
|
|
|
|
const resetForm = () => {
|
|
|
|
|
formData.value = {
|
|
|
|
|
id: undefined,
|
|
|
|
|
code: undefined,
|
|
|
|
|
orderStatus: undefined,
|
|
|
|
|
deliveryStatus: 1,
|
|
|
|
|
businessDeptId: undefined,
|
|
|
|
|
customerId: undefined,
|
|
|
|
|
mouldName: undefined,
|
|
|
|
|
businessLine: undefined,
|
|
|
|
|
blueprintNo: undefined,
|
|
|
|
|
hasPrice: 1,
|
|
|
|
|
price: undefined,
|
|
|
|
|
currency: 1,
|
|
|
|
|
projectStartTime: undefined,
|
|
|
|
|
projectEndTime: undefined,
|
|
|
|
|
isUrgency: 0,
|
|
|
|
|
property: 1,
|
|
|
|
|
referenceTechnology: undefined,
|
|
|
|
|
hasAlter: 0,
|
|
|
|
|
lastAlterTime: undefined,
|
|
|
|
|
qualityRequirement: undefined,
|
|
|
|
|
remark: undefined,
|
|
|
|
|
hasContract: 0,
|
|
|
|
|
hasTechnologyProtocol: 0,
|
|
|
|
|
hasBlueprint: 0,
|
|
|
|
|
blueprintRemark: undefined,
|
|
|
|
|
status: undefined,
|
|
|
|
|
businessMan: undefined,
|
|
|
|
|
createTime: new Date(),
|
|
|
|
|
projectOrderSubs: [],
|
|
|
|
|
attachments: [],
|
|
|
|
|
contractNo: undefined,
|
|
|
|
|
}
|
|
|
|
|
formRef.value?.resetFields()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
queryData(query.active, query.id);
|
|
|
|
|
})
|
|
|
|
|
</script>
|
|
|
|
|
<style>
|
|
|
|
|
a {
|
|
|
|
|
color: #409eff;
|
|
|
|
|
text-decoration: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.upload-file-uploader {
|
|
|
|
|
margin-bottom: 10px;
|
|
|
|
|
display: inline-block;
|
|
|
|
|
margin-right: 20px;
|
|
|
|
|
}
|
|
|
|
|
</style>
|