|
|
|
@ -1,13 +1,46 @@
|
|
|
|
|
<template>
|
|
|
|
|
<el-card class="hl-card">
|
|
|
|
|
<el-card class="hl-card" style="position: relative">
|
|
|
|
|
<template #header>
|
|
|
|
|
<span><span v-html="dialogTitle"></span>页</span>
|
|
|
|
|
</template>
|
|
|
|
|
<div class="abstatus">
|
|
|
|
|
<img src="/src/assets/imgs/status/status16.png" v-if="formData.orderStatus == 16" alt="" />
|
|
|
|
|
<img src="/src/assets/imgs/status/status3.png" v-else-if="formData.orderStatus == 3" alt="" />
|
|
|
|
|
<img src="/src/assets/imgs/status/status8.png" v-else-if="formData.orderStatus == 8" alt="" />
|
|
|
|
|
<div v-else-if="formData.orderStatus == 32" class="shipments">
|
|
|
|
|
<div v-if="formData.deliveryStatus == 3">
|
|
|
|
|
<span class="shipmentsfont">已发货</span>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div v-else>
|
|
|
|
|
<span
|
|
|
|
|
v-if="betweenDay(new Date(), new Date(formData.projectEndTime)) == -1"
|
|
|
|
|
class="shipmentsfont"
|
|
|
|
|
>距交货还有{{ betweenDay(new Date(), new Date(formData.projectEndTime)) + 1 }}天
|
|
|
|
|
</span>
|
|
|
|
|
<span
|
|
|
|
|
v-else-if="betweenDay(new Date(), new Date(formData.projectEndTime)) < -1"
|
|
|
|
|
class="shipmentsfont"
|
|
|
|
|
>距交货还有{{ betweenDay(new Date(), new Date(formData.projectEndTime)) + 1 }}天
|
|
|
|
|
</span>
|
|
|
|
|
<span v-else class="shipmentsfont"
|
|
|
|
|
>距交货还有{{ betweenDay(new Date(), new Date(formData.projectEndTime)) + 1 }}天
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
<img src="/src/assets/imgs/status/status32.png" alt="" />
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<img
|
|
|
|
|
src="/src/assets/imgs/status/status64.png"
|
|
|
|
|
v-else-if="formData.orderStatus == 64"
|
|
|
|
|
alt=""
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<el-form
|
|
|
|
|
ref="formRef"
|
|
|
|
|
:model="formData"
|
|
|
|
|
:rules="formRules"
|
|
|
|
|
label-width="100px"
|
|
|
|
|
label-width="160px"
|
|
|
|
|
v-loading="formLoading"
|
|
|
|
|
>
|
|
|
|
|
<el-card class="hl-card-info">
|
|
|
|
@ -19,7 +52,12 @@
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="项目编号" prop="code">
|
|
|
|
|
<el-input disabled v-model="formData.code" placeholder="系统自动生成" />
|
|
|
|
|
<el-input
|
|
|
|
|
disabled
|
|
|
|
|
v-model="formData.code"
|
|
|
|
|
class="!w-250px"
|
|
|
|
|
placeholder="系统自动生成"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
@ -27,6 +65,7 @@
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="提出部门" prop="businessDeptId">
|
|
|
|
|
<el-tree-select
|
|
|
|
|
class="!w-250px"
|
|
|
|
|
v-model="formData.businessDeptId"
|
|
|
|
|
:data="deptList"
|
|
|
|
|
:props="defaultProps"
|
|
|
|
@ -42,7 +81,10 @@
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="所属业务线" prop="businessLine">
|
|
|
|
|
<el-select v-model="formData.businessLine" placeholder="请选择所属业务线"
|
|
|
|
|
<el-select
|
|
|
|
|
class="!w-250px"
|
|
|
|
|
v-model="formData.businessLine"
|
|
|
|
|
placeholder="请选择所属业务线"
|
|
|
|
|
:disabled="alterDisabled || detailDisabled"
|
|
|
|
|
>
|
|
|
|
|
<el-option
|
|
|
|
@ -71,14 +113,27 @@
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="可引用的原有技术" prop="referenceTechnology">
|
|
|
|
|
<el-input :disabled="detailDisabled" v-model="formData.referenceTechnology" placeholder="请输入可引用的原有技术" />
|
|
|
|
|
<el-input
|
|
|
|
|
class="!w-250px"
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
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 :disabled="detailDisabled" type="textarea" v-model="formData.qualityRequirement" placeholder="请输入检验要求" show-word-limit maxlength="200"/>
|
|
|
|
|
<el-input
|
|
|
|
|
class="!w-250px"
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
type="textarea"
|
|
|
|
|
v-model="formData.qualityRequirement"
|
|
|
|
|
placeholder="请输入检验要求"
|
|
|
|
|
show-word-limit
|
|
|
|
|
maxlength="200"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
@ -94,7 +149,9 @@
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="业务员" prop="businessMan">
|
|
|
|
|
<el-select v-model="formData.businessMan"
|
|
|
|
|
<el-select
|
|
|
|
|
class="!w-250px"
|
|
|
|
|
v-model="formData.businessMan"
|
|
|
|
|
placeholder="请输入负责人"
|
|
|
|
|
:remote-method="remoteUserSearch"
|
|
|
|
|
remote-show-suffix
|
|
|
|
@ -118,7 +175,12 @@
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="模具图号" prop="blueprintNo">
|
|
|
|
|
<el-input :disabled="alterDisabled || detailDisabled" v-model="formData.blueprintNo" placeholder="请输入模具图号" />
|
|
|
|
|
<el-input
|
|
|
|
|
class="!w-250px"
|
|
|
|
|
:disabled="alterDisabled || detailDisabled"
|
|
|
|
|
v-model="formData.blueprintNo"
|
|
|
|
|
placeholder="请输入模具图号"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
@ -126,13 +188,25 @@
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="项目结束日期" prop="projectEndTime">
|
|
|
|
|
<el-date-picker
|
|
|
|
|
class="!w-250px"
|
|
|
|
|
v-model="formData.projectEndTime"
|
|
|
|
|
type="date"
|
|
|
|
|
value-format="x"
|
|
|
|
|
placeholder="选择项目结束日期"
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
/>
|
|
|
|
|
<span v-if="formData.projectStartTime && formData.projectEndTime">{{" 共计"+betweenDay(new Date(formData.projectStartTime), new Date(formData.projectEndTime))+"天"}}</span>
|
|
|
|
|
<span
|
|
|
|
|
style="position: absolute; right: -45px"
|
|
|
|
|
v-if="formData.projectStartTime && formData.projectEndTime"
|
|
|
|
|
>{{
|
|
|
|
|
' 共计' +
|
|
|
|
|
betweenDay(
|
|
|
|
|
new Date(formData.projectStartTime),
|
|
|
|
|
new Date(formData.projectEndTime)
|
|
|
|
|
) +
|
|
|
|
|
'天'
|
|
|
|
|
}}</span
|
|
|
|
|
>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
@ -148,7 +222,9 @@
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="客户名称" prop="customerId">
|
|
|
|
|
<el-select v-model="formData.customerId"
|
|
|
|
|
<el-select
|
|
|
|
|
class="!w-250px"
|
|
|
|
|
v-model="formData.customerId"
|
|
|
|
|
placeholder="请输入客户名称"
|
|
|
|
|
:remote-method="remoteCustomerSearch"
|
|
|
|
|
remote-show-suffix
|
|
|
|
@ -217,11 +293,17 @@
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="备注" prop="remark" :disabled="detailDisabled">
|
|
|
|
|
<el-input :disabled="detailDisabled" type="textarea" v-model="formData.remark" show-word-limit maxlength="200"/>
|
|
|
|
|
<el-input
|
|
|
|
|
class="!w-250px"
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
type="textarea"
|
|
|
|
|
v-model="formData.remark"
|
|
|
|
|
show-word-limit
|
|
|
|
|
maxlength="200"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="6">
|
|
|
|
|
<el-row>
|
|
|
|
@ -234,22 +316,46 @@
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="合同号" prop="contractNo">
|
|
|
|
|
<el-input :disabled="alterDisabled || detailDisabled" v-model="formData.contractNo" placeholder="请输入合同号" />
|
|
|
|
|
<el-input
|
|
|
|
|
class="!w-250px"
|
|
|
|
|
:disabled="alterDisabled || detailDisabled"
|
|
|
|
|
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 :disabled="alterDisabled || detailDisabled" v-model="formData.mouldName" placeholder="请输入模具名称" />
|
|
|
|
|
<el-input
|
|
|
|
|
class="!w-250px"
|
|
|
|
|
:disabled="alterDisabled || detailDisabled"
|
|
|
|
|
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-number v-model="formData.price" :disabled="detailDisabled || (formData.hasPrice == 0 && (formData.price = ''))" placeholder="请输入价格(元)" :controls="false" :min="0" :precision="6" />
|
|
|
|
|
<el-select :disabled="detailDisabled" v-model="formData.currency" placeholder="请选择币种">
|
|
|
|
|
<div style="display: flex; align-items: center">
|
|
|
|
|
<el-input-number
|
|
|
|
|
v-model="formData.price"
|
|
|
|
|
:disabled="detailDisabled || formData.hasPrice == 0"
|
|
|
|
|
placeholder="请输入价格"
|
|
|
|
|
:controls="false"
|
|
|
|
|
:min="0"
|
|
|
|
|
:precision="6"
|
|
|
|
|
style="width: 150px"
|
|
|
|
|
/>
|
|
|
|
|
<el-select
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
v-model="formData.currency"
|
|
|
|
|
placeholder="请选择币种"
|
|
|
|
|
style="width: 100px"
|
|
|
|
|
>
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_CURRENCY)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
@ -257,13 +363,19 @@
|
|
|
|
|
:value="dict.value"
|
|
|
|
|
/>
|
|
|
|
|
</el-select>
|
|
|
|
|
</div>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="性质" prop="property">
|
|
|
|
|
<el-select :disabled="detailDisabled" v-model="formData.property" placeholder="请选择性质">
|
|
|
|
|
<el-select
|
|
|
|
|
class="!w-250px"
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
v-model="formData.property"
|
|
|
|
|
placeholder="请选择性质"
|
|
|
|
|
>
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PROPERTY)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
@ -279,7 +391,8 @@
|
|
|
|
|
</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 :span="6">
|
|
|
|
@ -323,7 +436,13 @@
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="6">
|
|
|
|
|
<el-form-item label="" label-width="0" prop="blueprintRemark">
|
|
|
|
|
<el-input v-model="formData.blueprintRemark" placeholder="请输入图纸/数模说明" :disabled="detailDisabled || (formData.hasBlueprint == 0 && (formData.blueprintRemark = ''))"/>
|
|
|
|
|
<el-input
|
|
|
|
|
v-model="formData.blueprintRemark"
|
|
|
|
|
placeholder="请输入图纸/数模说明"
|
|
|
|
|
:disabled="
|
|
|
|
|
detailDisabled || (formData.hasBlueprint == 0 && (formData.blueprintRemark = ''))
|
|
|
|
|
"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
@ -335,43 +454,79 @@
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col>
|
|
|
|
|
<el-card class="hl-incard">
|
|
|
|
|
<el-col v-if="('update,create'.indexOf(query.active) > -1)">
|
|
|
|
|
<el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem">新增</el-button>
|
|
|
|
|
<el-col v-if="'update,create'.indexOf(query.active) > -1">
|
|
|
|
|
<el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem"
|
|
|
|
|
>新增</el-button
|
|
|
|
|
>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-form ref="projectOrderSubFormRef" :model="formData.projectOrderSubs"
|
|
|
|
|
<el-form
|
|
|
|
|
ref="projectOrderSubFormRef"
|
|
|
|
|
:model="formData.projectOrderSubs"
|
|
|
|
|
:rules="subFormRules"
|
|
|
|
|
v-loading="subFormLoading"
|
|
|
|
|
label-width="0">
|
|
|
|
|
<el-table
|
|
|
|
|
:data="formData.projectOrderSubs"
|
|
|
|
|
class="hl-table"
|
|
|
|
|
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 :disabled="detailDisabled" v-model="row.name" placeholder="请输入子项目名称" />
|
|
|
|
|
<el-form-item
|
|
|
|
|
:prop="`${$index}.name`"
|
|
|
|
|
:rules="subFormRules.name"
|
|
|
|
|
class="mb-0px!"
|
|
|
|
|
>
|
|
|
|
|
<el-input
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
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 :disabled="detailDisabled" v-model="row.deviceModel" placeholder="请输入设备型号" />
|
|
|
|
|
<el-form-item
|
|
|
|
|
:prop="`${$index}.deviceModel`"
|
|
|
|
|
:rules="subFormRules.deviceModel"
|
|
|
|
|
class="mb-0px!"
|
|
|
|
|
>
|
|
|
|
|
<el-input
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
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-number :disabled="detailDisabled" v-model="row.amount" placeholder="请输入数量" :min="0" :precision="0"/>
|
|
|
|
|
<el-form-item
|
|
|
|
|
:prop="`${$index}.amount`"
|
|
|
|
|
:rules="subFormRules.amount"
|
|
|
|
|
class="mb-0px!"
|
|
|
|
|
>
|
|
|
|
|
<el-input-number
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
v-model="row.amount"
|
|
|
|
|
placeholder="请输入数量"
|
|
|
|
|
:min="0"
|
|
|
|
|
:precision="0"
|
|
|
|
|
/>
|
|
|
|
|
</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 :disabled="detailDisabled" v-model="row.unit" placeholder="请选择单位">
|
|
|
|
|
<el-form-item
|
|
|
|
|
:prop="`${$index}.unit`"
|
|
|
|
|
:rules="subFormRules.unit"
|
|
|
|
|
class="mb-0px!"
|
|
|
|
|
>
|
|
|
|
|
<el-select
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
v-model="row.unit"
|
|
|
|
|
placeholder="请选择单位"
|
|
|
|
|
>
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_PROJECT_ORDER_SUB_UNIT)"
|
|
|
|
|
:key="dict.value"
|
|
|
|
@ -384,8 +539,13 @@
|
|
|
|
|
</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"
|
|
|
|
|
<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
|
|
|
|
@ -408,15 +568,23 @@
|
|
|
|
|
</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 :disabled="detailDisabled" v-model="row.remark" placeholder="请输入备注" />
|
|
|
|
|
<el-form-item
|
|
|
|
|
:prop="`${$index}.remark`"
|
|
|
|
|
:rules="subFormRules.remark"
|
|
|
|
|
class="mb-0px!"
|
|
|
|
|
>
|
|
|
|
|
<el-input
|
|
|
|
|
:disabled="detailDisabled"
|
|
|
|
|
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
|
|
|
|
|
v-if="('update,create'.indexOf(query.active) > -1) && !formData.hasAlter"
|
|
|
|
|
v-if="'update,create'.indexOf(query.active) > -1 && !formData.hasAlter"
|
|
|
|
|
link
|
|
|
|
|
type="danger"
|
|
|
|
|
size="small"
|
|
|
|
@ -439,14 +607,17 @@
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col>
|
|
|
|
|
<el-card class="hl-incard">
|
|
|
|
|
<el-col v-if="('update,create,alter'.indexOf(query.active) > -1)">
|
|
|
|
|
<el-col v-if="'update,create,alter'.indexOf(query.active) > -1">
|
|
|
|
|
<el-upload
|
|
|
|
|
ref="contractUploadRef"
|
|
|
|
|
:file-list="contractUploadFiles"
|
|
|
|
|
multiple
|
|
|
|
|
:limit="10"
|
|
|
|
|
:action="uploadUrl"
|
|
|
|
|
:headers="{'Authorization': 'Bearer ' + getAccessToken(),'tenant-id': getTenantId()}"
|
|
|
|
|
:headers="{
|
|
|
|
|
Authorization: 'Bearer ' + getAccessToken(),
|
|
|
|
|
'tenant-id': getTenantId()
|
|
|
|
|
}"
|
|
|
|
|
name="files"
|
|
|
|
|
:show-file-list="false"
|
|
|
|
|
:auto-upload="false"
|
|
|
|
@ -461,7 +632,10 @@
|
|
|
|
|
multiple
|
|
|
|
|
:limit="10"
|
|
|
|
|
:action="uploadUrl"
|
|
|
|
|
:headers="{'Authorization': 'Bearer ' + getAccessToken(),'tenant-id': getTenantId()}"
|
|
|
|
|
:headers="{
|
|
|
|
|
Authorization: 'Bearer ' + getAccessToken(),
|
|
|
|
|
'tenant-id': getTenantId()
|
|
|
|
|
}"
|
|
|
|
|
name="files"
|
|
|
|
|
:show-file-list="false"
|
|
|
|
|
:auto-upload="false"
|
|
|
|
@ -476,16 +650,37 @@
|
|
|
|
|
<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)}}
|
|
|
|
|
{{
|
|
|
|
|
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
|
|
|
|
|
prop="createTime"
|
|
|
|
|
align="center"
|
|
|
|
|
label="上传时间"
|
|
|
|
|
:formatter="dateFormatter"
|
|
|
|
|
/>
|
|
|
|
|
<el-table-column label="操作" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-button v-if="('update,create,alter'.indexOf(query.active) > -1)" link type="danger" size="small" @click="handleDeleteAttachment(scope.$index, scope.row.businessFileType)">
|
|
|
|
|
<el-button
|
|
|
|
|
v-if="'update,create,alter'.indexOf(query.active) > -1"
|
|
|
|
|
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="downloadAttachment(scope.row.name, scope.row.url)"
|
|
|
|
|
>
|
|
|
|
|
下载
|
|
|
|
|
</el-button>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
</el-table>
|
|
|
|
@ -523,36 +718,77 @@
|
|
|
|
|
</el-form>
|
|
|
|
|
<div class="text-center hl-footer">
|
|
|
|
|
<el-button @click="() => router.back()" size="large">取 消</el-button>
|
|
|
|
|
<el-button v-if="('update,create'.indexOf(query.active) > -1) && formData.orderStatus <= 4" @click="submitForm('SAVE')" type="success" size="large"
|
|
|
|
|
<el-button
|
|
|
|
|
v-if="'update,create'.indexOf(query.active) > -1 && formData.orderStatus <= 4"
|
|
|
|
|
@click="submitForm('SAVE')"
|
|
|
|
|
type="success"
|
|
|
|
|
size="large"
|
|
|
|
|
>保 存</el-button
|
|
|
|
|
>
|
|
|
|
|
<el-button v-if="('update,create'.indexOf(query.active) > -1) && formData.orderStatus < 8" @click="submitForm('SUBMIT_AUDIT')" type="primary" size="large"
|
|
|
|
|
<el-button
|
|
|
|
|
v-if="'update,create'.indexOf(query.active) > -1 && formData.orderStatus < 8"
|
|
|
|
|
@click="submitForm('SUBMIT_AUDIT')"
|
|
|
|
|
type="primary"
|
|
|
|
|
size="large"
|
|
|
|
|
>送 审</el-button
|
|
|
|
|
>
|
|
|
|
|
<el-button v-if="query.active == 'audit' && formData.orderStatus == 8" @click="submitForm('AUDIT')" type="primary" size="large"
|
|
|
|
|
<el-button
|
|
|
|
|
v-if="query.active == 'audit' && formData.orderStatus == 8"
|
|
|
|
|
@click="submitForm('AUDIT')"
|
|
|
|
|
type="primary"
|
|
|
|
|
size="large"
|
|
|
|
|
>审 核</el-button
|
|
|
|
|
>
|
|
|
|
|
<el-button v-if="query.active == 'approve' && formData.orderStatus == 16" @click="submitForm('APPROVE')" type="primary" size="large"
|
|
|
|
|
<el-button
|
|
|
|
|
v-if="query.active == 'approve' && formData.orderStatus == 16"
|
|
|
|
|
@click="submitForm('APPROVE')"
|
|
|
|
|
type="primary"
|
|
|
|
|
size="large"
|
|
|
|
|
>批 准</el-button
|
|
|
|
|
>
|
|
|
|
|
<el-button v-if="query.active == 'alter' && formData.orderStatus == 32" @click="submitForm('ALTER')" type="danger" size="large"
|
|
|
|
|
<el-button
|
|
|
|
|
v-if="query.active == 'alter' && formData.orderStatus == 32"
|
|
|
|
|
@click="submitForm('ALTER')"
|
|
|
|
|
type="danger"
|
|
|
|
|
size="large"
|
|
|
|
|
>发起变更</el-button
|
|
|
|
|
>
|
|
|
|
|
<el-button v-if="'audit,approve'.indexOf(query.active) > -1 && (formData.orderStatus == 8 || formData.orderStatus == 16)" @click="activeOpinionDialogVisible=true" type="danger" size="large"
|
|
|
|
|
<el-button
|
|
|
|
|
v-if="
|
|
|
|
|
'audit,approve'.indexOf(query.active) > -1 &&
|
|
|
|
|
(formData.orderStatus == 8 || formData.orderStatus == 16)
|
|
|
|
|
"
|
|
|
|
|
@click="activeOpinionDialogVisible = true"
|
|
|
|
|
type="danger"
|
|
|
|
|
size="large"
|
|
|
|
|
>打 回</el-button
|
|
|
|
|
>
|
|
|
|
|
<el-button v-if="query.active == 'terminate' && formData.orderStatus == 32" @click="submitForm('TERMINATE')" type="danger" size="large"
|
|
|
|
|
<el-button
|
|
|
|
|
v-if="query.active == 'terminate' && formData.orderStatus == 32"
|
|
|
|
|
@click="submitForm('TERMINATE')"
|
|
|
|
|
type="danger"
|
|
|
|
|
size="large"
|
|
|
|
|
>直接终止</el-button
|
|
|
|
|
>
|
|
|
|
|
</div>
|
|
|
|
|
</el-card>
|
|
|
|
|
|
|
|
|
|
<el-dialog v-model="activeOpinionDialogVisible" title="打回原因" width="30%" center>
|
|
|
|
|
<el-input type="textarea" v-model="formData.activeOpinion" placeholder="请输入打回原因" show-word-limit maxlength="200"/>
|
|
|
|
|
<el-input
|
|
|
|
|
type="textarea"
|
|
|
|
|
v-model="formData.activeOpinion"
|
|
|
|
|
placeholder="请输入打回原因"
|
|
|
|
|
show-word-limit
|
|
|
|
|
maxlength="200"
|
|
|
|
|
/>
|
|
|
|
|
<template #footer>
|
|
|
|
|
<span class="dialog-footer">
|
|
|
|
|
<el-button @click="activeOpinionDialogVisible = false">取消</el-button>
|
|
|
|
|
<el-button type="primary" @click="submitForm('REPULSE') && (activeOpinionDialogVisible = false)">确认打回</el-button>
|
|
|
|
|
<el-button
|
|
|
|
|
type="primary"
|
|
|
|
|
@click="submitForm('REPULSE') && (activeOpinionDialogVisible = false)"
|
|
|
|
|
>确认打回</el-button
|
|
|
|
|
>
|
|
|
|
|
</span>
|
|
|
|
|
</template>
|
|
|
|
|
</el-dialog>
|
|
|
|
@ -561,25 +797,25 @@
|
|
|
|
|
import { inject } from 'vue'
|
|
|
|
|
import { getIntDictOptions, getStrDictOptions, DICT_TYPE, getDictLabel } from '@/utils/dict'
|
|
|
|
|
import * as ProjectOrderApi from '@/api/heli/projectorder'
|
|
|
|
|
import {betweenDay, dateFormatter, formatDate} from "@/utils/formatTime";
|
|
|
|
|
import {defaultProps, handleTree} from "@/utils/tree";
|
|
|
|
|
import { betweenDay, 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, 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";
|
|
|
|
|
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, 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 router = useRouter()
|
|
|
|
|
const reload = inject('reload')
|
|
|
|
|
|
|
|
|
|
const activeOpinionDialogVisible = ref(false) // 审批意见弹窗
|
|
|
|
@ -598,7 +834,7 @@ const formData = ref({
|
|
|
|
|
blueprintNo: undefined,
|
|
|
|
|
hasPrice: 1,
|
|
|
|
|
price: undefined,
|
|
|
|
|
currency: "1",
|
|
|
|
|
currency: '1',
|
|
|
|
|
projectStartTime: undefined,
|
|
|
|
|
projectEndTime: undefined,
|
|
|
|
|
isUrgency: 0,
|
|
|
|
@ -625,7 +861,7 @@ const formData = ref({
|
|
|
|
|
snapshotId: undefined,
|
|
|
|
|
snapshotCode: undefined,
|
|
|
|
|
orderTime: new Date(),
|
|
|
|
|
snapshotOrderTime: undefined,
|
|
|
|
|
snapshotOrderTime: undefined
|
|
|
|
|
})
|
|
|
|
|
const formRules = reactive({
|
|
|
|
|
businessDeptId: [{ required: true, message: '提出部门不能为空', trigger: 'blur' }],
|
|
|
|
@ -642,7 +878,7 @@ const formRules = reactive({
|
|
|
|
|
hasTechnologyProtocol: [{ required: true, message: '有无技术协议不能为空', trigger: 'blur' }],
|
|
|
|
|
hasBlueprint: [{ required: true, message: '有无图纸/数模不能为空', trigger: 'blur' }],
|
|
|
|
|
status: [{ required: true, message: '状态,1表示正常,2表示禁用不能为空', trigger: 'blur' }],
|
|
|
|
|
businessMan: [{ required: true, message: '业务员不能为空', trigger: 'blur' }],
|
|
|
|
|
businessMan: [{ required: true, message: '业务员不能为空', trigger: 'blur' }]
|
|
|
|
|
})
|
|
|
|
|
const formRef = ref() // 表单 Ref
|
|
|
|
|
const subFormLoading = ref(false) // 子表单的加载中
|
|
|
|
@ -651,13 +887,13 @@ const subFormRules = reactive({
|
|
|
|
|
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' }],
|
|
|
|
|
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 userSelectLoading = ref(false)
|
|
|
|
|
|
|
|
|
|
const remoteUserSearch = (query: string) => {
|
|
|
|
|
if (query) {
|
|
|
|
@ -665,7 +901,10 @@ const remoteUserSearch = (query: string) => {
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
userSelectLoading.value = false
|
|
|
|
|
userSelectList.value = userList.value.filter((item) => {
|
|
|
|
|
return item.nickname.toLowerCase().includes(query.toLowerCase()) || item.username.toLowerCase().includes(query.toLowerCase())
|
|
|
|
|
return (
|
|
|
|
|
item.nickname.toLowerCase().includes(query.toLowerCase()) ||
|
|
|
|
|
item.username.toLowerCase().includes(query.toLowerCase())
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
}, 200)
|
|
|
|
|
} else {
|
|
|
|
@ -675,7 +914,7 @@ const remoteUserSearch = (query: string) => {
|
|
|
|
|
|
|
|
|
|
const customerList = ref<CustomerApi.CustomerVO[]>([])
|
|
|
|
|
const customerSelectList = ref<CustomerApi.CustomerVO[]>([])
|
|
|
|
|
const customerSelectLoading = ref(false);
|
|
|
|
|
const customerSelectLoading = ref(false)
|
|
|
|
|
|
|
|
|
|
const remoteCustomerSearch = (query: string) => {
|
|
|
|
|
if (query) {
|
|
|
|
@ -693,7 +932,7 @@ const remoteCustomerSearch = (query: string) => {
|
|
|
|
|
|
|
|
|
|
const compositionList = ref<CompositionApi.CompositionVO[]>([])
|
|
|
|
|
const compositionSelectList = ref<CompositionApi.CompositionVO[]>([])
|
|
|
|
|
const compositionSelectLoading = ref(false);
|
|
|
|
|
const compositionSelectLoading = ref(false)
|
|
|
|
|
|
|
|
|
|
const remoteCompositionSearch = (query: string) => {
|
|
|
|
|
if (query) {
|
|
|
|
@ -723,7 +962,8 @@ 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)
|
|
|
|
|
|
|
|
|
|
// 如为归档日志
|
|
|
|
|
if(type == 'detailArchive'){
|
|
|
|
@ -736,7 +976,7 @@ const queryData = async (type: string, id?: number) => {
|
|
|
|
|
businessId: id,
|
|
|
|
|
businessType: 'PROJECT_ORDER'
|
|
|
|
|
}
|
|
|
|
|
formData.value.operateLogs = (await getOperateLogPage(logParams)).list;
|
|
|
|
|
formData.value.operateLogs = (await getOperateLogPage(logParams)).list
|
|
|
|
|
|
|
|
|
|
// 附件信息
|
|
|
|
|
let attParams = {
|
|
|
|
@ -745,7 +985,7 @@ const queryData = async (type: string, id?: number) => {
|
|
|
|
|
businessId: id,
|
|
|
|
|
businessType: 'PROJECT_ORDER'
|
|
|
|
|
}
|
|
|
|
|
formData.value.attachments = (await getFilePage(attParams)).list;
|
|
|
|
|
formData.value.attachments = (await getFilePage(attParams)).list
|
|
|
|
|
}
|
|
|
|
|
// 加载部门树
|
|
|
|
|
deptList.value = handleTree(await DeptApi.getSimpleDeptList())
|
|
|
|
@ -754,37 +994,37 @@ const queryData = async (type: string, id?: number) => {
|
|
|
|
|
let userParams = {
|
|
|
|
|
pageNo: 1,
|
|
|
|
|
pageSize: 10,
|
|
|
|
|
status: "0"
|
|
|
|
|
status: '0'
|
|
|
|
|
}
|
|
|
|
|
const data = await UserApi.getUserPage(userParams)
|
|
|
|
|
userList.value = data.list;
|
|
|
|
|
userSelectList.value = data.list;
|
|
|
|
|
userList.value = data.list
|
|
|
|
|
userSelectList.value = data.list
|
|
|
|
|
|
|
|
|
|
// 获得客户列表
|
|
|
|
|
let customerParams = {
|
|
|
|
|
pageNo: 1,
|
|
|
|
|
pageSize: 10,
|
|
|
|
|
status: "1"
|
|
|
|
|
status: '1'
|
|
|
|
|
}
|
|
|
|
|
const customerData = await CustomerApi.getCustomerPage(customerParams)
|
|
|
|
|
customerList.value = customerData.list;
|
|
|
|
|
customerSelectList.value = customerData.list;
|
|
|
|
|
customerList.value = customerData.list
|
|
|
|
|
customerSelectList.value = customerData.list
|
|
|
|
|
|
|
|
|
|
// 获得列表
|
|
|
|
|
let compositionParams = {
|
|
|
|
|
pageNo: 1,
|
|
|
|
|
pageSize: 10,
|
|
|
|
|
status: "1"
|
|
|
|
|
status: '1'
|
|
|
|
|
}
|
|
|
|
|
const compositionData = await CompositionApi.getCompositionPage(compositionParams)
|
|
|
|
|
compositionList.value = compositionData.list;
|
|
|
|
|
compositionSelectList.value = compositionData.list;
|
|
|
|
|
compositionList.value = compositionData.list
|
|
|
|
|
compositionSelectList.value = compositionData.list
|
|
|
|
|
|
|
|
|
|
// 绑定默认部门与业务员
|
|
|
|
|
formData.value.businessMan = useUserStore().getUser.id // 当前登录的编码
|
|
|
|
|
const userProfile = await getUserProfile(formData.value.businessMan);
|
|
|
|
|
const userProfile = await getUserProfile(formData.value.businessMan)
|
|
|
|
|
if (userProfile.dept) {
|
|
|
|
|
formData.value.businessDeptId = userProfile.dept.id;
|
|
|
|
|
formData.value.businessDeptId = userProfile.dept.id
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
formLoading.value = false
|
|
|
|
@ -793,7 +1033,7 @@ const queryData = async (type: string, id?: number) => {
|
|
|
|
|
|
|
|
|
|
const submitForm = async (active) => {
|
|
|
|
|
// 校验表单
|
|
|
|
|
formData.value.active = active;
|
|
|
|
|
formData.value.active = active
|
|
|
|
|
await formRef.value.validate()
|
|
|
|
|
// 校验子表单
|
|
|
|
|
try {
|
|
|
|
@ -806,14 +1046,14 @@ const submitForm = async (active) => {
|
|
|
|
|
try {
|
|
|
|
|
// 如不是退回 清理审批意见
|
|
|
|
|
if (active != 'REPULSE') {
|
|
|
|
|
formData.value.activeOpinion = '';
|
|
|
|
|
formData.value.activeOpinion = ''
|
|
|
|
|
}
|
|
|
|
|
const data = formData.value as unknown as ProjectOrderApi.ProjectOrderVO
|
|
|
|
|
|
|
|
|
|
if (active == 'SUBMIT_AUDIT') {
|
|
|
|
|
// 子项目信息不能为空
|
|
|
|
|
if (!data.projectOrderSubs || data.projectOrderSubs.length == 0) {
|
|
|
|
|
message.error("子项目信息不能为空")
|
|
|
|
|
message.error('子项目信息不能为空')
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -822,7 +1062,7 @@ const submitForm = async (active) => {
|
|
|
|
|
// 不能提交存在数量为0的数据
|
|
|
|
|
if (data.projectOrderSubs && data.projectOrderSubs.length > 0) {
|
|
|
|
|
if (data.projectOrderSubs.some((sub) => !sub.amount || sub.amount <= 0)) {
|
|
|
|
|
message.error("子项目数量不能为0")
|
|
|
|
|
message.error('子项目数量不能为0')
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -832,10 +1072,10 @@ const submitForm = async (active) => {
|
|
|
|
|
// 总数量不能为0
|
|
|
|
|
if (data.projectOrderSubs && data.projectOrderSubs.length > 0) {
|
|
|
|
|
const total = data.projectOrderSubs.reduce((acc, cur) => {
|
|
|
|
|
return acc+cur;
|
|
|
|
|
}, 0);
|
|
|
|
|
return acc + cur
|
|
|
|
|
}, 0)
|
|
|
|
|
if (total <= 0) {
|
|
|
|
|
message.error("子项目数量和不能为0")
|
|
|
|
|
message.error('子项目数量和不能为0')
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -868,20 +1108,20 @@ const submitForm = async (active) => {
|
|
|
|
|
// 上传附件
|
|
|
|
|
if (contractUploadFiles.value.length > 0) {
|
|
|
|
|
contractUploadData.value.businessId = orderId
|
|
|
|
|
contractUploadRef.value!.submit();
|
|
|
|
|
contractUploadRef.value!.submit()
|
|
|
|
|
}
|
|
|
|
|
if (protocolUploadFiles.value.length > 0) {
|
|
|
|
|
protocolUploadData.value.businessId = orderId
|
|
|
|
|
protocolUploadRef.value!.submit();
|
|
|
|
|
protocolUploadRef.value!.submit()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如非保存 返回列表页
|
|
|
|
|
if (active != 'SAVE') {
|
|
|
|
|
router.back();
|
|
|
|
|
router.back()
|
|
|
|
|
} else {
|
|
|
|
|
// 成功后刷新
|
|
|
|
|
reload();
|
|
|
|
|
query.id = orderId;
|
|
|
|
|
reload()
|
|
|
|
|
query.id = orderId
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
formLoading.value = false
|
|
|
|
@ -899,7 +1139,7 @@ const onAddItem = () => {
|
|
|
|
|
compositionId: undefined,
|
|
|
|
|
unit: undefined,
|
|
|
|
|
remark: undefined,
|
|
|
|
|
status: 1,
|
|
|
|
|
status: 1
|
|
|
|
|
}
|
|
|
|
|
row.projectOrderId = formData.value.id
|
|
|
|
|
formData.value.projectOrderSubs.push(row)
|
|
|
|
@ -910,54 +1150,62 @@ 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 contractUploadData = ref({'businessType': 'PROJECT_ORDER', 'businessId': formData.value.id, 'businessFileType': 'CONTRACT'});
|
|
|
|
|
const contractUploadRef = ref()
|
|
|
|
|
const contractUploadFiles = ref<UploadUserFile[]>([])
|
|
|
|
|
const contractUploadData = ref({
|
|
|
|
|
businessType: 'PROJECT_ORDER',
|
|
|
|
|
businessId: formData.value.id,
|
|
|
|
|
businessFileType: 'CONTRACT'
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const protocolUploadRef = ref();
|
|
|
|
|
const protocolUploadFiles = ref<UploadUserFile[]>([]);
|
|
|
|
|
const protocolUploadData = ref({'businessType': 'PROJECT_ORDER', 'businessId': formData.value.id, 'businessFileType': 'TECHNOLOGY_PROTOCOL'});
|
|
|
|
|
const protocolUploadRef = ref()
|
|
|
|
|
const protocolUploadFiles = ref<UploadUserFile[]>([])
|
|
|
|
|
const protocolUploadData = ref({
|
|
|
|
|
businessType: 'PROJECT_ORDER',
|
|
|
|
|
businessId: formData.value.id,
|
|
|
|
|
businessFileType: 'TECHNOLOGY_PROTOCOL'
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const contractUploadChange = (file, files) => {
|
|
|
|
|
contractUploadFiles.value = files;
|
|
|
|
|
contractUploadFiles.value = files
|
|
|
|
|
refreshAttachments(files, 'CONTRACT')
|
|
|
|
|
}
|
|
|
|
|
const protocolUploadChange = (file, files) => {
|
|
|
|
|
protocolUploadFiles.value = 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;
|
|
|
|
|
});
|
|
|
|
|
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);
|
|
|
|
|
let file = files[i]
|
|
|
|
|
file.businessFileType = type
|
|
|
|
|
file.createTime = new Date()
|
|
|
|
|
formData.value.attachments.push(file)
|
|
|
|
|
}
|
|
|
|
|
// 排序
|
|
|
|
|
formData.value.attachments.sort((v1, v2) => {
|
|
|
|
|
return v1.createTime - v2.createTime < 0;
|
|
|
|
|
return v1.createTime - v2.createTime < 0
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 删除附件
|
|
|
|
|
const handleDeleteAttachment = async (index, type) => {
|
|
|
|
|
const deletedAttachments = formData.value.attachments.splice(index, 1);
|
|
|
|
|
const deletedAttachments = formData.value.attachments.splice(index, 1)
|
|
|
|
|
for (let i = 0; i < deletedAttachments.length; i++) {
|
|
|
|
|
const attachment = deletedAttachments[i];
|
|
|
|
|
const attachment = deletedAttachments[i]
|
|
|
|
|
if (attachment.id) {
|
|
|
|
|
// 清理已上传文件
|
|
|
|
|
await deleteFile(attachment.id);
|
|
|
|
|
await deleteFile(attachment.id)
|
|
|
|
|
}
|
|
|
|
|
// 清理待上传文件
|
|
|
|
|
contractUploadFiles.value = contractUploadFiles.value.filter(file1 => {
|
|
|
|
|
return file1.name != attachment.name || file1.businessFileType != type;
|
|
|
|
|
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;
|
|
|
|
|
protocolUploadFiles.value = protocolUploadFiles.value.filter((file2) => {
|
|
|
|
|
return file2.name != attachment.name || file2.businessFileType != type
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -965,7 +1213,7 @@ const handleDeleteAttachment = async (index, type) => {
|
|
|
|
|
// 下载文件
|
|
|
|
|
const downloadAttachment = async (name, url) => {
|
|
|
|
|
const data = await downloadFile(url)
|
|
|
|
|
download.any(data, name);
|
|
|
|
|
download.any(data, name)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 重置表单 */
|
|
|
|
@ -982,7 +1230,7 @@ const resetForm = () => {
|
|
|
|
|
blueprintNo: undefined,
|
|
|
|
|
hasPrice: 1,
|
|
|
|
|
price: undefined,
|
|
|
|
|
currency: "1",
|
|
|
|
|
currency: '1',
|
|
|
|
|
projectStartTime: undefined,
|
|
|
|
|
projectEndTime: undefined,
|
|
|
|
|
isUrgency: 0,
|
|
|
|
@ -1001,6 +1249,7 @@ const resetForm = () => {
|
|
|
|
|
createTime: new Date(),
|
|
|
|
|
projectOrderSubs: [],
|
|
|
|
|
attachments: [],
|
|
|
|
|
operateLogs: [],
|
|
|
|
|
contractNo: undefined,
|
|
|
|
|
active: '',
|
|
|
|
|
activeOpinion: '',
|
|
|
|
@ -1021,12 +1270,12 @@ const alterDisabled = ref(false)
|
|
|
|
|
const detailDisabled = ref(false)
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
if (query.active == 'alter') {
|
|
|
|
|
alterDisabled.value = true;
|
|
|
|
|
alterDisabled.value = true
|
|
|
|
|
}
|
|
|
|
|
if('detail,audit,approve,terminate,detailArchive'.indexOf(query.active) > -1){
|
|
|
|
|
detailDisabled.value = true;
|
|
|
|
|
detailDisabled.value = true
|
|
|
|
|
}
|
|
|
|
|
queryData(query.active, query.id);
|
|
|
|
|
queryData(query.active, query.id)
|
|
|
|
|
})
|
|
|
|
|
</script>
|
|
|
|
|
<style>
|
|
|
|
|