heli-mes/mes-ui/mes-ui-admin-vue3/src/views/heli/projectorder/detail.vue

1899 lines
65 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<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">
<div v-if="query.active != 'detailArchive'" class="shipments">
<div v-if="formData.deliveryStatus == 3">
<span class="shipmentsfont" style="margin-left:50px">已发货</span>
</div>
<div v-else class="shipments">
<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 v-else 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="160px" 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="12">
<el-row>
<el-col :span="12">
<el-row>
<el-col :span="24">
<el-form-item label="项目编号" prop="code">
<el-input v-if="query.active != 'detailArchive'" disabled
v-model="formData.code" class="!w-250px" placeholder="系统自动生成" />
<el-input v-else disabled v-model="formData.snapshotCode" class="!w-250px"
placeholder="系统自动生成" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="提出部门" prop="businessDeptId">
<el-tree-select class="!w-250px" v-model="formData.businessDeptId"
:data="deptList" :props="defaultProps" check-strictly node-key="id"
clearable placeholder="请选择提出部门"
:disabled="alterDisabled || detailDisabled || priceDisabled" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="项目名称" prop="projectName">
<el-input class="!w-250px" :disabled="alterDisabled || detailDisabled || priceDisabled"
v-model="formData.projectName" placeholder="请输入项目名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="项目开始日期" prop="projectStartTime">
<el-date-picker class="!w-250px" v-model="formData.projectStartTime"
type="date" value-format="x" placeholder="选择项目开始日期"
:disabled="alterDisabled || detailDisabled || priceDisabled" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="首付款" prop="shouFuKuan">
<div style="display: flex; align-items: center">
<el-input-number v-model="formData.shouFuKuan"
:disabled="detailDisabled || formData.hasPrice == 0"
placeholder="请输入首付款" @blur="handleBlur" :controls="false" :min="0"
:precision="6" style="width: 150px"
:class="{ 'alter-class': fieldHasAlter('price') }" />
<el-input
v-model="formData.shouFuKuanBiLi" @blur="handleBlurBL"
placeholder="比例" style="width: 100px"
:class="{ 'alter-class': fieldHasAlter('currency') }">%</el-input>
</div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="第三笔款" prop="threeFuKuan">
<div style="display: flex; align-items: center">
<el-input-number v-model="formData.threeFuKuan"
:disabled="detailDisabled || formData.hasPrice == 0"
placeholder="输入第三笔付款" @blur="threehandleBlur" :controls="false"
:min="0" :precision="6" style="width: 150px"
:class="{ 'alter-class': fieldHasAlter('price') }" />
<el-input
v-model="formData.threeFuKuanBiLi" @blur="threehandleBlurBL"
placeholder="比例" style="width: 100px"
:class="{ 'alter-class': fieldHasAlter('currency') }" />
</div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="第五笔款" prop="fiveFuKuan">
<div style="display: flex; align-items: center">
<el-input-number v-model="formData.fiveFuKuan"
:disabled="detailDisabled || formData.hasPrice == 0"
placeholder="输入第三笔付款" @blur="fivehandleBlur" :controls="false"
:min="0" :precision="6" style="width: 150px"
:class="{ 'alter-class': fieldHasAlter('price') }" />
<el-input
v-model="formData.fiveFuKuanBiLi" @blur="fivehandleBlurBL"
placeholder="比例" style="width: 100px"
:class="{ 'alter-class': fieldHasAlter('currency') }" />
</div>
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="12">
<el-row>
<el-col :span="24">
<el-form-item label="单据日期" prop="orderTime">
{{
query.active != 'detailArchive'
? formatDate(formData.orderTime, 'YYYY-MM-DD')
: formatDate(formData.snapshotOrderTime, 'YYYY-MM-DD')
}}
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="业务员" prop="businessMan">
<el-tree-select class="!w-250px" v-model="formData.businessMan"
:data="userList" :props="userProps" check-strictly node-key="id"
clearable placeholder="请选择业务员"
:disabled="alterDisabled || detailDisabled || priceDisabled" />
<!-- <UserSelect :disabled="alterDisabled || detailDisabled || priceDisabled"-->
<!-- v-model="formData.businessMan" @update:newValue="handleSelectedUser" />-->
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="所属业务线" prop="businessLine">
<el-select class="!w-250px" v-model="formData.businessLine"
placeholder="请选择所属业务线" :disabled="alterDisabled || detailDisabled">
<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="projectEndTime">
<el-date-picker class="!w-250px"
:class="{ 'alter-class': fieldHasAlter('projectEndTime') }"
v-model="formData.projectEndTime" type="date" value-format="x"
placeholder="选择项目结束日期" :disabled="detailDisabled || priceDisabled" />
<span style="position: absolute; left: 0; top: 30px"
v-if="formData.projectStartTime && formData.projectEndTime">{{
' 共计' +
betweenDay1(
new Date(formData.projectStartTime),
new Date(formData.projectEndTime)
) +
'天'
}}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="首付款预计时间" prop="shouFuKuanTime">
<el-date-picker class="!w-250px" v-model="formData.shouFuKuanTime"
type="date" value-format="x" placeholder="选择日期"
:disabled="detailDisabled || formData.hasPrice == 0" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="第三笔款预计时间" prop="threeFuKuanTime">
<el-date-picker class="!w-250px" v-model="formData.threeFuKuanTime"
type="date" value-format="x" placeholder="选择日期"
:disabled="detailDisabled || formData.hasPrice == 0" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="第五笔款预计时间" prop="fiveFuKuanTime">
<el-date-picker class="!w-250px" v-model="formData.fiveFuKuanTime"
type="date" value-format="x" placeholder="选择日期"
:disabled="detailDisabled || formData.hasPrice == 0" />
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="可引用的原有技术" prop="referenceTechnology">
<el-input class="!w-703px" :disabled="detailDisabled || priceDisabled"
v-model="formData.referenceTechnology" placeholder="请输入可引用的原有技术"
:class="{ 'alter-class': fieldHasAlter('referenceTechnology') }" />
</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">
<ClientSelect :disabled="alterDisabled || detailDisabled || priceDisabled"
v-model="formData.customerId" @update:newValue="handleSelectedClient" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="性质" prop="property">
<el-select class="!w-250px" :class="{ 'alter-class': fieldHasAlter('property') }"
:disabled="detailDisabled || priceDisabled" 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-row>
<el-col :span="24">
<el-form-item label="是否有价格" prop="hasPrice">
<el-radio-group v-model="formData.hasPrice" :disabled="detailDisabled || priceDisabled"
:class="{ 'alter-class': fieldHasAlter('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="twoFuKuan">
<div style="display: flex; align-items: center">
<el-input-number v-model="formData.twoFuKuan"
:disabled="detailDisabled || formData.hasPrice == 0" placeholder="输入第二笔付款"
@blur="twohandleBlur" :controls="false" :min="0" :precision="6"
style="width: 150px" :class="{ 'alter-class': fieldHasAlter('price') }" />
<el-input
v-model="formData.twoFuKuanBiLi" @blur="twohandleBlurBL" placeholder="比例"
style="width: 100px"
:class="{ 'alter-class': fieldHasAlter('currency') }" />
</div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="第四笔款" prop="fourFuKuan">
<div style="display: flex; align-items: center">
<el-input-number v-model="formData.fourFuKuan"
:disabled="detailDisabled || formData.hasPrice == 0" placeholder="输入第四笔付款"
@blur="fourhandleBlur" :controls="false" :min="0" :precision="6"
style="width: 150px" :class="{ 'alter-class': fieldHasAlter('price') }" />
<el-input
v-model="formData.fourFuKuanBiLi" @blur="fourhandleBlurBL" placeholder="比例"
style="width: 100px"
:class="{ 'alter-class': fieldHasAlter('currency') }" />
</div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="第六笔款" prop="sixFuKuan">
<div style="display: flex; align-items: center">
<el-input-number v-model="formData.sixFuKuan"
:disabled="detailDisabled || formData.hasPrice == 0" placeholder="输入第六笔付款"
@blur="sixhandleBlur" :controls="false" :min="0" :precision="6"
style="width: 150px" :class="{ 'alter-class': fieldHasAlter('price') }" />
<el-input
v-model="formData.sixFuKuanBiLi" @blur="sixhandleBlurBL" placeholder="比例"
style="width: 100px"
:class="{ 'alter-class': fieldHasAlter('currency') }" />
</div>
</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" :disabled="detailDisabled || priceDisabled"
:class="{ 'alter-class': fieldHasAlter('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-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 class="!w-250px" :disabled="alterDisabled || detailDisabled || priceDisabled"
v-model="formData.contractNo" placeholder="请输入合同号" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="模具图号" prop="blueprintNo">
<el-input class="!w-250px" :disabled="alterDisabled || detailDisabled || priceDisabled"
v-model="formData.blueprintNo" placeholder="请输入模具图号" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="价格(元)" prop="price">
<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"
: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)"
:key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="第二笔预计时间" prop="twoFuKuanTime">
<el-date-picker class="!w-250px" v-model="formData.twoFuKuanTime" type="date"
value-format="x" placeholder="选择日期"
:disabled="detailDisabled || formData.hasPrice == 0" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="第四笔款预计时间" prop="fourFuKuanTime">
<el-date-picker class="!w-250px" v-model="formData.fourFuKuanTime" type="date"
value-format="x" placeholder="选择日期"
:disabled="detailDisabled || formData.hasPrice == 0" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="第六笔款预计时间" prop="sixFuKuanTime">
<el-date-picker class="!w-250px" v-model="formData.sixFuKuanTime" type="date"
value-format="x" placeholder="选择日期"
:disabled="detailDisabled || formData.hasPrice == 0" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="是否已变更" prop="hasAlter">
<el-select class="!w-250px" v-model="formData.hasAlter" placeholder="请选择" disabled>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
:key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="检验要求" prop="qualityRequirement">
<el-input class="!w-703px" :disabled="detailDisabled || priceDisabled " type="textarea"
v-model="formData.qualityRequirement" placeholder="请输入检验要求" show-word-limit
maxlength="200" :class="{ 'alter-class': fieldHasAlter('qualityRequirement') }" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark" :disabled="detailDisabled">
<el-input class="!w-703px" :disabled="detailDisabled || priceDisabled" type="textarea"
v-model="formData.remark" placeholder="请输入检验备注" show-word-limit maxlength="200"
:class="{ 'alter-class': fieldHasAlter('remark') }" />
</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 :span="6">
<el-form-item label="有无合同" prop="hasContract">
<el-radio-group :disabled="detailDisabled || priceDisabled" 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" :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 :disabled="detailDisabled || priceDisabled" 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" :label="dict.value">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="有无图纸/数模" prop="hasBlueprint">
<el-radio-group :disabled="detailDisabled || priceDisabled" 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" :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" placeholder="请输入图纸/数模说明" :disabled="
detailDisabled || (formData.hasBlueprint == 0 && (formData.blueprintRemark = '')) || priceDisabled
" :class="{ 'alter-class': fieldHasAlter('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 v-if="'update,create,alter'.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"
:rules="subFormRules" v-loading="subFormLoading" label-width="0">
<el-table :data="formData.projectOrderSubs" class="hl-table"
:row-class-name="({row,rowIndex}) => { return fieldHasAlterInRow('NEW', row) ? 'alter-class1' : ''}">
<el-table-column label="序号" type="index" width="80" />
<el-table-column min-width="200" align="center">
<template #header> <span class="hl-table_header">*</span>子项目名称 </template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.name`" :rules="subFormRules.name"
class="mb-0px!">
<el-input :disabled="detailDisabled || row.id || priceDisabled" v-model="row.name"
placeholder="请输入子项目名称" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="设备型号" min-width="150" align="center">
<!-- <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.deviceModel`" :rules="subFormRules.deviceModel" class="mb-0px!">
<el-input :disabled="detailDisabled || (alterDisabled && row.id)" v-model="row.deviceModel" placeholder="请输入设备型号" />
</el-form-item>
</template> -->
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.deviceModel`"
:rules="subFormRules.deviceModel" class="mb-0px!">
<EquipSelect v-model="row.deviceModel"
@update:newValue="handleSelectedequip($index, $event)"
:disabled="detailDisabled || (alterDisabled && row.id) || priceDisabled" />
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="125" align="center">
<template #header> <span class="hl-table_header">*</span>数量 </template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.amount`" :rules="subFormRules.amount"
class="mb-0px!">
<el-input-number style="width: 100%" :disabled="auditDisabled&&(detailDisabled || priceDisabled)"
v-model="row.amount" placeholder="请输入数量" :min="0" :precision="0"
:class="{ 'alter-class': fieldHasAlterInRow('amount', row) }" />
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="125" align="center">
<template #header> <span class="hl-table_header">*</span>单位 </template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.unit`" :rules="subFormRules.unit"
class="mb-0px!">
<el-select :disabled="detailDisabled || priceDisabled" v-model="row.unit"
placeholder="请选择单位"
:class="{ 'alter-class': fieldHasAlterInRow('unit', row) }">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_MATERIAL_UNIT)"
:key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="150" align="center">
<template #header> <span class="hl-table_header">*</span>材质 </template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.compositionId`"
:rules="subFormRules.compositionId" class="mb-0px!">
<CompositionSelect v-model="row.compositionId"
@update:newValue="handleSelectedcomposition($index, $event)"
:disabled="detailDisabled || priceDisabled"
:class="{ 'alter-class': fieldHasAlterInRow('compositionId', row) }" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="备注" min-width="180" align="center">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" :rules="subFormRules.remark"
class="mb-0px!">
<el-input :disabled="detailDisabled || priceDisabled" v-model="row.remark"
placeholder="请输入备注"
:class="{ 'alter-class': fieldHasAlterInRow('remark', row) }" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="150">
<template #default="scope">
<el-button
v-if="'update,create'.indexOf(query.active) > -1 && !formData.hasAlter"
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" :class="{ 'alter-class': fieldHasAlter('attachments') }">
<el-col v-if="'update,create,alter'.indexOf(query.active) > -1">
<el-upload v-if="formData.hasContract == 1" ref="contractUploadRef"
:file-list="contractUploadFiles" multiple :action="uploadUrl" :headers="{
Authorization: 'Bearer ' + getAccessToken(),
'tenant-id': getTenantId()
}" name="files" :show-file-list="false" :auto-upload="false" :data="contractUploadData"
:on-change="contractUploadChange" :on-error="handleError"
:on-success="handleSuccess" :before-upload="before" class="upload-file-uploader">
<el-button type="primary">
<Icon icon="ep:upload-filled" />上传合同
</el-button>
</el-upload>
<el-upload v-if="formData.hasTechnologyProtocol == 1" ref="protocolUploadRef" multiple
:action="uploadUrl" :headers="{
Authorization: 'Bearer ' + getAccessToken(),
'tenant-id': getTenantId()
}" name="files" :show-file-list="false" :auto-upload="false" :data="protocolUploadData"
:on-change="protocolUploadChange" :on-error="handleError"
:on-success="handleSuccess" :before-upload="before" class="upload-file-uploader">
<el-button type="primary">
<Icon icon="ep:upload-filled" />上传技术协议
</el-button>
</el-upload>
</el-col>
<el-table :data="formData.attachments" v-loading.fullscreen.lock="uploading"
element-loading-text="附件上传中..." element-loading-background="rgba(122, 122, 122, 0.6)"
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 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>
</template>
</el-table-column>
</el-table>
</el-card>
</el-col>
</el-row>
</el-card>
<el-card class="hl-card-info" v-if="query.active != 'detailArchive'">
<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 v-if="formData && formData.operateLogs" :data="formData.operateLogs"
class="hl-table" :style="{ height: formData.operateLogs.length > 10 ? '450px' : '' }">
<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="220"
: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 v-if="'update,create'.indexOf(query.active) > -1 && formData.orderStatus <= 4"
@click="submitForm('SAVE')" type="success" size="large" :disabled="saveDisabled">保 存</el-button>
<el-button v-if="'price'.indexOf(query.active) > -1"
@click="submitForm('PRICE')" 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" :disabled="submitDisabled"> </el-button>
<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>
<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>
<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" />
<template #footer>
<span class="dialog-footer">
<el-button @click="activeOpinionDialogVisible = false">取消</el-button>
<el-button type="primary" @click="submitForm('REPULSE') && (activeOpinionDialogVisible = false)">确认打回
</el-button>
</span>
</template>
</el-dialog>
</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 {
betweenDay, betweenDay1,
dateFormatter,
formatDate
} from '@/utils/formatTime'
import {
defaultProps,
handleTree, userProps
} 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 {
deleteFileLogic,
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 UserSelect from '@/views/heli/hlvuestyle/userSelect.vue'
import CompositionSelect from '@/views/heli/hlvuestyle/compositionSelect.vue'
import EquipSelect from '@/views/heli/hlvuestyle/equipSelect.vue'
import ClientSelect from '@/views/heli/hlvuestyle/clientSelect.vue'
import request from "@/config/axios";
import {getDeptId} from "@/api/system/user";
const {
t
} = useI18n() // 国际化
const message = useMessage() // 消息弹窗
const {
query
} = useRoute()
const router = useRouter()
const reload: any = inject('reload')
const activeOpinionDialogVisible = ref(false) // 审批意见弹窗
const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 表单的加载中1修改时的数据加载2提交的按钮禁用
const formType = ref('') // 表单的类型create - 新增update - 修改
const formData = ref({
id: undefined,
code: undefined,
orderStatus: 4,
deliveryStatus: 1,
businessDeptId: undefined,
customerId: undefined,
projectName: 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: 1,
businessMan: undefined,
createTime: new Date(),
projectOrderSubs: [],
attachments: [],
operateLogs: [],
contractNo: undefined,
active: '',
activeOpinion: '',
isSnapshot: 0,
snapshotId: undefined,
snapshotCode: undefined,
orderTime: new Date(),
snapshotOrderTime: undefined,
alterFieldNames: [],
shouFuKuan: undefined,
shouFuKuanBiLi: undefined,
threeFuKuan: undefined,
threeFuKuanBiLi: undefined,
fiveFuKuan: undefined,
fiveFuKuanBiLi: undefined,
threeFuKuanTime: undefined,
fiveFuKuanTime: undefined,
shouFuKuanTime: undefined,
twoFuKuan: undefined,
twoFuKuanBiLi: undefined,
twoFuKuanTime: undefined,
fourFuKuan: undefined,
fourFuKuanBiLi: undefined,
fourFuKuanTime: undefined,
sixFuKuan: undefined,
sixFuKuanBiLi: undefined,
sixFuKuanTime: undefined,
sumMoney:undefined,
sumBl:undefined
})
const formRules = reactive({
businessDeptId: [{
required: true,
message: '提出部门不能为空',
trigger: 'blur'
}],
customerId: [{
required: true,
message: '客户名称不能为空',
trigger: 'blur'
}],
projectName: [{
required: true,
message: '项目名称不能为空',
trigger: 'blur'
}],
businessLine: [{
required: true,
message: '所属业务线不能为空',
trigger: 'change'
}],
hasPrice: [{
required: true,
message: '是否有价格不能为空',
trigger: 'blur'
}],
projectStartTime: [{
required: true,
message: '项目开始日期不能为空',
trigger: 'blur'
}],
projectEndTime: [{
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'
}],
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 handleBlur = (event) => {
console.log("首付款")
if (!formData.value.price && formData.value.price !== 0) {
message.error('请先输入合同价格')
formData.value.shouFuKuan = undefined;
return;
}
;
if (formData.value.shouFuKuan > 0) {
let bollen = sumBl();
//判断是否超出合同比例
if(!bollen){
jsEndMoney();
formData.value.shouFuKuan = formData.value.price;
formData.value.shouFuKuanBiLi = 100;
return;
}
formData.value.shouFuKuanBiLi = ((formData.value.shouFuKuan / formData.value.price) * 100).toFixed(2);
} else {
formData.value.shouFuKuanBiLi = undefined;
}
// 可以在这里进行例如数据保存等操作
};
//比例算首付款
const handleBlurBL = (event) => {
if (!formData.value.price && formData.value.price !== 0) {
message.error('请先输入合同价格')
formData.value.shouFuKuan = undefined;
return;
}
;
if (formData.value.shouFuKuanBiLi > 0) {
formData.value.shouFuKuan = ((formData.value.shouFuKuanBiLi / 100) * formData.value.price).toFixed(2);
let bollen = sumBl();
//判断是否超出合同比例
if(!bollen){
jsEndMoney();
formData.value.shouFuKuan = formData.value.price;
formData.value.shouFuKuanBiLi = 100;
return;
}
} else {
formData.value.shouFuKuan = undefined;
}
};
//第三笔付款算比例
const threehandleBlur = (event) => {
;
if (!formData.value.price && formData.value.price !== 0) {
message.error('请先输入合同价格')
formData.value.threeFuKuan = undefined;
return;
}
if (formData.value.twoFuKuan > 0) {
if (formData.value.threeFuKuan > 0) {
let bollen = sumBl();
//判断是否超出合同比例
if(!bollen){
jsEndMoney(formData.value.threeFuKuan,formData.value.threeFuKuanBiLi);
formData.value.threeFuKuan = formData.value.sumMoney;
formData.value.threeFuKuanBiLi = formData.value.sumBl;
return;
}
formData.value.threeFuKuanBiLi = ((formData.value.threeFuKuan / formData.value.price) * 100).toFixed(
2);
} else {
formData.value.threeFuKuanBiLi = undefined;
}
} else {
message.error('请先填写第二笔付款金额!');
formData.value.threeFuKuan = undefined;
}
};
//比例算第三笔付款
const threehandleBlurBL = (event) => {
if (!formData.value.price && formData.value.price !== 0) {
message.error('请先输入合同价格')
formData.value.threeFuKuanBiLi = undefined;
return;
}
if (formData.value.twoFuKuan > 0) {
if (formData.value.threeFuKuanBiLi > 0) {
formData.value.threeFuKuan = ((formData.value.threeFuKuanBiLi / 100) * formData.value.price).toFixed(
2);
let bollen = sumBl();
//判断是否超出合同比例
if(!bollen){
jsEndMoney(formData.value.threeFuKuan,formData.value.threeFuKuanBiLi);
formData.value.threeFuKuan = formData.value.sumMoney;
formData.value.threeFuKuanBiLi = formData.value.sumBl;
return;
}
} else {
formData.value.threeFuKuan = undefined;
}
} else {
message.error('请先填写第二笔付款金额!');
formData.value.threeFuKuanBiLi = undefined;
}
};
//第五笔付款算比例
const fivehandleBlur = (event) => {
;
if (!formData.value.price && formData.value.price !== 0) {
message.error('请先输入合同价格')
formData.value.fiveFuKuan = undefined;
return;
}
if (formData.value.fourFuKuan > 0) {
if (formData.value.fiveFuKuan > 0) {
let bollen = sumBl();
//判断是否超出合同比例
if(!bollen){
jsEndMoney(formData.value.fiveFuKuan,formData.value.fiveFuKuanBiLi);
formData.value.fiveFuKuan = formData.value.sumMoney;
formData.value.fiveFuKuanBiLi = formData.value.sumBl;
return;
}
formData.value.fiveFuKuanBiLi = ((formData.value.fiveFuKuan / formData.value.price) * 100).toFixed(2);
} else {
formData.value.fiveFuKuanBiLi = undefined;
}
} else {
message.error('请先填写第四笔付款金额!');
formData.value.fiveFuKuan = undefined;
}
};
//比例算第五笔付款
const fivehandleBlurBL = (event) => {
if (!formData.value.price && formData.value.price !== 0) {
message.error('请先输入合同价格')
formData.value.fiveFuKuanBiLi = undefined;
return;
}
if (formData.value.fourFuKuan > 0) {
if (formData.value.fiveFuKuanBiLi > 0) {
formData.value.fiveFuKuan = ((formData.value.fiveFuKuanBiLi / 100) * formData.value.price).toFixed(2);
let bollen = sumBl();
//判断是否超出合同比例
if(!bollen){
jsEndMoney(formData.value.fiveFuKuan,formData.value.fiveFuKuanBiLi);
formData.value.fiveFuKuan = formData.value.sumMoney;
formData.value.fiveFuKuanBiLi = formData.value.sumBl;
return;
}
} else {
formData.value.fiveFuKuan = undefined;
}
} else {
message.error('请先填写第四笔付款金额!');
formData.value.fiveFuKuanBiLi = undefined;
}
};
//第二笔付款算比例
const twohandleBlur = (event) => {
;
if (!formData.value.price && formData.value.price !== 0) {
message.error('请先输入合同价格')
formData.value.twoFuKuan = undefined;
return;
}
if (formData.value.shouFuKuan > 0) {
if (formData.value.twoFuKuan > 0) {
let bollen = sumBl();
//判断是否超出合同比例
if(!bollen){
jsEndMoney(formData.value.twoFuKuan,formData.value.twoFuKuanBiLi);
formData.value.twoFuKuan = formData.value.sumMoney;
formData.value.twoFuKuanBiLi = formData.value.sumBl;
return;
}
formData.value.twoFuKuanBiLi = ((formData.value.twoFuKuan / formData.value.price) * 100).toFixed(2);
} else {
formData.value.twoFuKuanBiLi = undefined;
}
} else {
message.error('请先填写首付款金额!');
formData.value.twoFuKuan = undefined;
}
};
//比例算第二笔付款
const twohandleBlurBL = (event) => {
if (!formData.value.price && formData.value.price !== 0) {
message.error('请先输入合同价格')
formData.value.twoFuKuanBiLi = undefined;
return;
}
if (formData.value.shouFuKuan > 0) {
if (formData.value.twoFuKuanBiLi > 0) {
formData.value.twoFuKuan = ((formData.value.twoFuKuanBiLi / 100) * formData.value.price).toFixed(2);
let bollen = sumBl();
//判断是否超出合同比例
if(!bollen){
jsEndMoney(formData.value.twoFuKuan,formData.value.twoFuKuanBiLi);
formData.value.twoFuKuan = formData.value.sumMoney;
formData.value.twoFuKuanBiLi = formData.value.sumBl;
return;
}
} else {
formData.value.twoFuKuan = undefined;
}
} else {
message.error('请先填写首付款金额!');
formData.value.twoFuKuanBiLi = undefined;
}
};
//第四笔付款算比例
const fourhandleBlur = (event) => {
;
if (!formData.value.price && formData.value.price !== 0) {
message.error('请先输入合同价格')
formData.value.fourFuKuan = undefined;
return;
}
if (formData.value.threeFuKuan > 0) {
if (formData.value.fourFuKuan > 0) {
let bollen = sumBl();
//判断是否超出合同比例
if(!bollen){
jsEndMoney(formData.value.fourFuKuan,formData.value.fourFuKuanBiLi);
formData.value.fourFuKuan = formData.value.sumMoney;
formData.value.fourFuKuanBiLi = formData.value.sumBl;
return;
}
formData.value.fourFuKuanBiLi = ((formData.value.fourFuKuan / formData.value.price) * 100).toFixed(2);
} else {
formData.value.fourFuKuanBiLi = undefined;
}
} else {
message.error('请先填写第三笔付款金额!');
formData.value.fourFuKuan = undefined;
}
};
//比例算第四笔付款
const fourhandleBlurBL = (event) => {
if (!formData.value.price && formData.value.price !== 0) {
message.error('请先输入合同价格')
formData.value.fourFuKuanBiLi = undefined;
return;
}
if (formData.value.threeFuKuan > 0) {
if (formData.value.fourFuKuanBiLi > 0) {
formData.value.fourFuKuan = ((formData.value.fourFuKuanBiLi / 100) * formData.value.price).toFixed(2);
let bollen = sumBl();
//判断是否超出合同比例
if(!bollen){
jsEndMoney(formData.value.fourFuKuan,formData.value.fourFuKuanBiLi);
formData.value.fourFuKuan = formData.value.sumMoney;
formData.value.fourFuKuanBiLi = formData.value.sumBl;
return;
}
} else {
formData.value.fourFuKuan = undefined;
}
} else {
message.error('请先填写第三笔付款金额!');
formData.value.fourFuKuanBiLi = undefined;
}
};
//第六笔付款算比例
const sixhandleBlur = (event) => {
;
if (!formData.value.price && formData.value.price !== 0) {
message.error('请先输入合同价格')
formData.value.sixFuKuan = undefined;
return;
}
if (formData.value.fourFuKuan > 0) {
if (formData.value.sixFuKuan > 0) {
let bollen = sumBl();
//判断是否超出合同比例
if(!bollen){
jsEndMoney(formData.value.sixFuKuan,formData.value.sixFuKuanBiLi);
formData.value.sixFuKuan = formData.value.sumMoney;
formData.value.sixFuKuanBiLi = formData.value.sumBl;
return;
}
formData.value.sixFuKuanBiLi = ((formData.value.sixFuKuan / formData.value.price) * 100).toFixed(2);
} else {
formData.value.sixFuKuanBiLi = undefined;
}
} else {
message.error('请先填写第五笔付款金额!');
formData.value.sixFuKuan = undefined;
}
};
//比例算第六笔付款
const sixhandleBlurBL = (event) => {
if (!formData.value.price && formData.value.price !== 0) {
message.error('请先输入合同价格')
formData.value.sixFuKuanBiLi = undefined;
return;
}
if (formData.value.fourFuKuan > 0) {
if (formData.value.sixFuKuanBiLi > 0) {
formData.value.sixFuKuan = ((formData.value.sixFuKuanBiLi / 100) * formData.value.price).toFixed(2);
let bollen = sumBl();
//判断是否超出合同比例
if(!bollen){
jsEndMoney(formData.value.sixFuKuan,formData.value.sixFuKuanBiLi);
formData.value.sixFuKuan = formData.value.sumMoney;
formData.value.sixFuKuanBiLi = formData.value.sumBl;
return;
}
} else {
formData.value.sixFuKuan = undefined;
}
} else {
message.error('请先填写第五笔付款金额!');
formData.value.sixFuKuanBiLi = undefined;
}
};
//根据付款计算总比例如果超过100%提示用户重新输入
const sumBl = () =>{
let money = toSafeNumber(formData.value.shouFuKuan)+toSafeNumber(formData.value.twoFuKuan)+toSafeNumber(formData.value.threeFuKuan)
+toSafeNumber(formData.value.fourFuKuan)+toSafeNumber(formData.value.fiveFuKuan)+toSafeNumber(formData.value.sixFuKuan);
let bl = ((money / formData.value.price) * 100).toFixed(2);
let bollen = true;
if(bl>100){
message.error('当前付款金额或比例已经超出合同价格本身,系统已自动更正请检查!');
bollen = false
}
return bollen;
}
//当超出100%后系统自动计算剩余应收金额和比例并返回
const jsEndMoney = (num: number,bl: number) =>{
let money = toSafeNumber(formData.value.shouFuKuan)+toSafeNumber(formData.value.twoFuKuan)+toSafeNumber(formData.value.threeFuKuan)
+toSafeNumber(formData.value.fourFuKuan)+toSafeNumber(formData.value.fiveFuKuan)+toSafeNumber(formData.value.sixFuKuan);
formData.value.sumMoney = (toSafeNumber(formData.value.price)-toSafeNumber(money))+toSafeNumber(num);
let BiLi = toSafeNumber(formData.value.shouFuKuanBiLi)+ toSafeNumber(formData.value.twoFuKuanBiLi)+ toSafeNumber(formData.value.threeFuKuanBiLi)
+ toSafeNumber(formData.value.fourFuKuanBiLi)+ toSafeNumber(formData.value.fiveFuKuanBiLi)+ toSafeNumber(formData.value.sixFuKuanBiLi);
formData.value.sumBl = ((toSafeNumber(100)-toSafeNumber(BiLi))+toSafeNumber(bl)).toFixed(2);
console.log('计算出的比例');
console.log(formData.value.sumBl);
console.log('算出的金额')
console.log(formData.value.sumMoney);
}
const toSafeNumber = (value) => {
if (typeof value === 'number') {
return value;
}
if (typeof value === 'string' && /^\d+(\.\d+)?$/.test(value)) {
return Number(value);
}
return 0; // 如果不是有效数字默认返回0可以根据需求调整
};
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 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 projectOrderSubFormRef = ref()
const userInit = ref()
/** 打开弹窗 */
const queryData = async (type: string, id ? : number) => {
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
// 修改时,设置数据
formLoading.value = true
try {
if (id) {
formData.value = await ProjectOrderApi.getProjectOrder(id)
if (formData.value.hasAlter == 1) {
alterDisabled.value = true
}
// 子项列表
formData.value.projectOrderSubs =
await ProjectOrderApi.getProjectOrderSubListByProjectOrderId(id)
// 如为归档
let businessType = 'PROJECT_ORDER'
if (type == 'detailArchive') {
businessType = 'PROJECT_ORDER_SNAPSHOT'
} else {
// 操作日志
let logParams = {
pageNo: 1,
pageSize: 99,
businessId: id,
businessType: businessType
}
formData.value.operateLogs = (await getOperateLogPage(logParams)).list
}
// 附件信息
let attParams = {
pageNo: 1,
pageSize: 99,
businessId: id,
businessType: businessType
}
formData.value.attachments = (await getFilePage(attParams)).list
}
// 加载部门树
deptList.value = handleTree(await DeptApi.getSimpleDeptList())
userInit.value = await UserApi.getDeptName("市场部")
// 获得客户列表
// let customerParams = {
// pageNo: 1,
// pageSize: 10,
// status: '1'
// }
// const customerData = await CustomerApi.getCustomerPage(customerParams)
// customerList.value = customerData.list
// customerSelectList.value = customerData.list
// // 绑定默认部门
// const userProfile = await getUserProfile(formData.value.businessMan)
// if (userProfile.dept) {
for (let i = 0; i < userInit.value.length; i++) {
if (userInit.value[i].deptName=='市场部'){
formData.value.businessDeptId = userInit.value[i].deptId//userProfile.dept.id
break
}
}
getUserList(formData.value.businessDeptId);
// }
} finally {
formLoading.value = false
}
}
// function getUserList(newValue: any){
// console.log(1)
// console.log(newValue?.id)
// // userList.value =(await UserApi.getDeptId())
// console.log(userList)
// }
const getUserList = async ( id) => {
if (id!=null&&id!=''){
userList.value =handleTree(await UserApi.getDeptId(id))
}
}
watch(() => formData.value.businessDeptId, (newValue) => {
getUserList(newValue)
});
const submitForm = async (active) => {
if (active=='SAVE'){
submitDisabled.value = true
}
if (active=='SUBMIT_AUDIT'){
saveDisabled.value = true
}
// 校验子表单
try {
// 校验表单
formData.value.active = active
await formRef.value.validate()
await projectOrderSubFormRef.value.validate()
} catch (e) {
saveDisabled.value = false
submitDisabled.value = false
return
}
// 提交请求
formLoading.value = true
try {
// 如不是退回 清理审批意见
if (active != 'REPULSE') {
formData.value.activeOpinion = ''
}
// 如变更 置为已变更
if (active == 'ALTER') {
formData.value.hasAlter = 1
}
const data = formData.value as unknown as ProjectOrderApi.ProjectOrderVO
if ('SUBMIT_AUDIT,ALTER'.indexOf(active) > -1) {
// 子项目信息不能为空
if (!data.projectOrderSubs || data.projectOrderSubs.length == 0) {
message.error('子项目信息不能为空')
return
}
}
if ((active == 'SAVE' || active == 'SUBMIT_AUDIT') && active != 'ALTER') {
// 不能提交存在数量为0的数据
if (data.projectOrderSubs && data.projectOrderSubs.length > 0) {
if (data.projectOrderSubs.some((sub) => !sub.amount || sub.amount <= 0)) {
message.error('子项目数量不能为0')
return
}
}
}
// 变更
if (active == 'ALTER') {
// 总数量不能为0
if (data.projectOrderSubs && data.projectOrderSubs.length > 0) {
const total = data.projectOrderSubs.reduce((acc, cur) => {
return acc + cur.amount
}, 0)
if (total <= 0) {
message.error('子项目数量和不能为0')
return
}
}
}
// 附件校验
if ('SUBMIT_AUDIT,ALTER'.indexOf(active) > -1) {
if (formData.value.hasContract) {
const hasContractFile = formData.value.attachments.some((file) => {
return file.businessFileType == 'CONTRACT'
})
if (!hasContractFile) {
message.error('请上传合同')
return
}
}
if (formData.value.hasTechnologyProtocol) {
const hasProtocolFile = formData.value.attachments.some((file) => {
return file.businessFileType == 'TECHNOLOGY_PROTOCOL'
})
if (!hasProtocolFile) {
message.error('请上传技术协议')
return
}
}
}
const orderId = await ProjectOrderApi.operateProjectOrder(data)
message.success(t('common.operationSuccess'))
// 上传附件
if (contractUploadFiles.value.length > 0) {
contractUploadData.value.businessId = orderId
await contractUploadRef.value!.submit()
}
if (protocolUploadFiles.value.length > 0) {
protocolUploadData.value.businessId = orderId
await protocolUploadRef.value!.submit()
}
// 如非保存 返回列表页
if (active != 'SAVE') {
if (active=='SUBMIT_AUDIT'){
saveDisabled.value = false
}
router.back()
} else {
saveDisabled.value = false
submitDisabled.value = false
// 成功后刷新
query.active = 'update'
query.id = orderId
if (sumbefore.value == 0) {
reload()
}
}
} catch (e) {
saveDisabled.value = false
submitDisabled.value = false
}
finally {
formLoading.value = false
}
}
/** 新增子项按钮操作 */
const onAddItem = () => {
const row = {
id: undefined,
projectOrderId: undefined,
name: undefined,
deviceModel: undefined,
amount: undefined,
compositionId: undefined,
unit: '21',
remark: undefined,
status: 1,
alterFieldNames: []
}
row.projectOrderId = formData.value.id
formData.value.projectOrderSubs.push(row)
}
/** 删除子项操作 */
const onDeleteItem = async (index) => {
let deletedItems = formData.value.projectOrderSubs.splice(index, 1)
let id = deletedItems[0].id;
if (id) await ProjectOrderApi.deleteProjectOrderSub(id)
}
// ====================附件信息 开始=======================================
const uploading = ref(false)
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 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
refreshAttachments(files, 'CONTRACT')
}
const protocolUploadChange = (file, files) => {
protocolUploadFiles.value = files
refreshAttachments(files, 'TECHNOLOGY_PROTOCOL')
}
// 记录待上传、成功上传及失败上传的文件数量
const sumbefore = ref(0)
const successfulUploadsCount = ref(0)
const failedUploadsCount = ref(0)
const failedAttachments = ref < UploadUserFile[] > ([])
const failedAttachmentsName = ref()
// 处理单个文件上传成功的情况
const handleSuccess = (response: any, file: UploadUserFile) => {
successfulUploadsCount.value++
// console.log('上传成功数量', successfulUploadsCount.value)
}
// 处理单个文件上传失败的情况
const handleError = (error: Error, file: UploadUserFile) => {
failedUploadsCount.value++
if (failedUploadsCount.value > 0) {
// 当有上传错误时
// 将失败的附件添加到failedAttachments.value数组中
failedAttachments.value.push(file)
failedAttachmentsName.value = failedAttachments.value.map((value) => value.name)
}
// console.log('上传失败数量', failedUploadsCount.value)
}
// 文件上传前的钩子
const before = (rawFile) => {
sumbefore.value++
}
const refreshAttachments = (files, type) => {
formData.value.attachments = formData.value.attachments.filter((value, index, array) => {
return value.businessFileType != type || value.id
})
// 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.createTime - v2.createTime > 0
// })
// formData.value.attachments = formData.value.attachments.filter((value) => value.id)
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) => v1.createTime - v2.createTime)
// 文件上传一遍 上传总数等于要上传文件时 刷新页面
const sum = successfulUploadsCount.value + failedUploadsCount.value
// console.log('上传总数', sum)
// console.log('要上传文件数量', sumbefore.value)
if (sumbefore.value !== sum && sumbefore.value !== 0 && sum !== 0) {
// console.log('要上传文件数量不等于上传总数时等待',uploading.value)
uploading.value = true
} else if (sum == sumbefore.value && sumbefore.value > 0 && sum > 0) {
// console.log('要上传文件数量等于上传总数 刷新页面并给出提示')
if (failedUploadsCount.value > 0) {
ElMessageBox.alert(
// 使用错误信息作为提示内容
`文件名为:${failedAttachmentsName.value.join(' / ')}上传失败`,
`文件格式不正确或网络问题 请您稍后再试`, {
dangerouslyUseHTMLString: false, // 由于我们不是使用HTML字符串所以这里设置为false
confirmButtonText: '知道了',
center: true
}
)
}
reload()
uploading.value = false
}
}
// 删除附件
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 deleteFileLogic(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: 4,
deliveryStatus: 1,
businessDeptId: undefined,
customerId: undefined,
projectName: 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: 1,
businessMan: undefined,
createTime: new Date(),
projectOrderSubs: [],
attachments: [],
operateLogs: [],
contractNo: undefined,
active: '',
activeOpinion: '',
isSnapshot: 0,
snapshotId: undefined,
snapshotCode: undefined,
orderTime: new Date(),
snapshotOrderTime: undefined,
alterFieldNames: []
}
formRef.value?.resetFields()
}
const openMe = (url) => {
window.open(url)
}
const auditDisabled=ref(true)
const alterDisabled = ref(false)
const detailDisabled = ref(false)
const priceDisabled = ref(false)
const saveDisabled = ref(false)
const submitDisabled = ref(false)
onMounted(() => {
if (query.active == 'alter') {
alterDisabled.value = true
}
if (query.active == 'price') {
priceDisabled.value = true
}
if ('detail,audit,approve,terminate,detailArchive'.indexOf(query.active) > -1) {
detailDisabled.value = true
}
if ('audit,approve'.indexOf(query.active) > -1){
auditDisabled.value = false
}
queryData(query.active, query.id)
// 绑定默认业务员
// if (!formData.value.businessMan) {
// formData.value.businessMan = useUserStore().getUser.id // 当前登录的编码
// }
})
// 材质传递的值
const handleSelectedcomposition = (currentIndex: number, newValue: any) => {
formData.value.projectOrderSubs[currentIndex].compositionId = newValue?.id
}
//职工
const handleSelectedUser = (newValue: any) => {
formData.value.businessMan = newValue?.id
}
// 设备
const handleSelectedequip = (currentIndex: number, newValue: any) => {
// console.log(currentIndex, newValue)
formData.value.projectOrderSubs[currentIndex].deviceModel = newValue?.id
}
//客户
const handleSelectedClient = (newValue: any) => {
formData.value.customerId = newValue?.id
}
</script>
<style>
a {
color: #409eff;
text-decoration: none;
}
.upload-file-uploader {
margin-bottom: 10px;
display: inline-block;
margin-right: 20px;
}
.alter-class {
position: relative;
border: solid 1px orange !important;
outline: solid 1px orange !important;
}
/* .hl-card .el-table__body tr.alter-class1 {
border: solid 3px orange !important;
} */
</style>
<style scoped>
.hl-card /deep/ .el-table__body tr.alter-class1 {
position: relative;
/*重点*/
z-index: 2;
/*重点*/
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
--el-table-row-hover-bg-color: transparent;
}
.hl-card /deep/ .el-table__body tr.alter-class1::after {
position: absolute;
content: ' ';
width: calc(100% - 6px);
/*改动处*/
height: calc(100% - 6px);
left: 2px;
/*改动处*/
background: transparent;
border: 3px solid orange !important;
}
</style>