Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	mes-ui/mes-ui-admin-vue3/src/views/heli/projectorder/detail.vue
pull/1/head
zengchenxi 9 months ago
commit 73c09b4f90

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

@ -78,7 +78,6 @@
} }
} }
.hl-card-info { .hl-card-info {
box-shadow: none !important; box-shadow: none !important;
border: none !important; border: none !important;
@ -120,7 +119,23 @@
.hl-footer { .hl-footer {
margin: 30px 0; margin: 30px 0;
} }
.abstatus {
position: absolute;
right: 80px;
top: 20px;
z-index: 999;
img {
width: 150px;
}
.shipments {
display: flex;
align-items: center;
width: 450px;
justify-content: space-between;
.shipmentsfont {
font-size: 35px !important;
font-weight: 500;
color: red;
}
}
}

@ -1,13 +1,46 @@
<template> <template>
<el-card class="hl-card"> <el-card class="hl-card" style="position: relative">
<template #header> <template #header>
<span><span v-html="dialogTitle"></span></span> <span><span v-html="dialogTitle"></span></span>
</template> </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 <el-form
ref="formRef" ref="formRef"
:model="formData" :model="formData"
:rules="formRules" :rules="formRules"
label-width="100px" label-width="160px"
v-loading="formLoading" v-loading="formLoading"
> >
<el-card class="hl-card-info"> <el-card class="hl-card-info">
@ -19,7 +52,12 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="项目编号" prop="code"> <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-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -27,6 +65,7 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item label="提出部门" prop="businessDeptId"> <el-form-item label="提出部门" prop="businessDeptId">
<el-tree-select <el-tree-select
class="!w-250px"
v-model="formData.businessDeptId" v-model="formData.businessDeptId"
:data="deptList" :data="deptList"
:props="defaultProps" :props="defaultProps"
@ -42,7 +81,10 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="所属业务线" prop="businessLine"> <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" :disabled="alterDisabled || detailDisabled"
> >
<el-option <el-option
@ -71,14 +113,27 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="可引用的原有技术" prop="referenceTechnology"> <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-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="检验要求" prop="qualityRequirement"> <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-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -94,7 +149,9 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="业务员" prop="businessMan"> <el-form-item label="业务员" prop="businessMan">
<el-select v-model="formData.businessMan" <el-select
class="!w-250px"
v-model="formData.businessMan"
placeholder="请输入负责人" placeholder="请输入负责人"
:remote-method="remoteUserSearch" :remote-method="remoteUserSearch"
remote-show-suffix remote-show-suffix
@ -118,7 +175,12 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="模具图号" prop="blueprintNo"> <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-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -126,13 +188,25 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item label="项目结束日期" prop="projectEndTime"> <el-form-item label="项目结束日期" prop="projectEndTime">
<el-date-picker <el-date-picker
class="!w-250px"
v-model="formData.projectEndTime" v-model="formData.projectEndTime"
type="date" type="date"
value-format="x" value-format="x"
placeholder="选择项目结束日期" placeholder="选择项目结束日期"
:disabled="detailDisabled" :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-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -148,7 +222,9 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="客户名称" prop="customerId"> <el-form-item label="客户名称" prop="customerId">
<el-select v-model="formData.customerId" <el-select
class="!w-250px"
v-model="formData.customerId"
placeholder="请输入客户名称" placeholder="请输入客户名称"
:remote-method="remoteCustomerSearch" :remote-method="remoteCustomerSearch"
remote-show-suffix remote-show-suffix
@ -217,11 +293,17 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="备注" prop="remark" :disabled="detailDisabled"> <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-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-row> <el-row>
@ -234,22 +316,46 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="合同号" prop="contractNo"> <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-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="模具名称" prop="mouldName"> <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-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="价格(元)" prop="price"> <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" /> <div style="display: flex; align-items: center">
<el-select :disabled="detailDisabled" v-model="formData.currency" placeholder="请选择币种"> <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 <el-option
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_CURRENCY)" v-for="dict in getStrDictOptions(DICT_TYPE.HELI_CURRENCY)"
:key="dict.value" :key="dict.value"
@ -257,13 +363,19 @@
:value="dict.value" :value="dict.value"
/> />
</el-select> </el-select>
</div>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="性质" prop="property"> <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 <el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PROPERTY)" v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PROPERTY)"
:key="dict.value" :key="dict.value"
@ -279,7 +391,8 @@
</el-card> </el-card>
<el-card class="hl-card-info"> <el-card class="hl-card-info">
<template #header> <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> </template>
<el-row> <el-row>
<el-col :span="6"> <el-col :span="6">
@ -323,7 +436,13 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="" label-width="0" prop="blueprintRemark"> <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-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -335,43 +454,79 @@
<el-row> <el-row>
<el-col> <el-col>
<el-card class="hl-incard"> <el-card class="hl-incard">
<el-col v-if="('update,create'.indexOf(query.active) > -1)"> <el-col v-if="'update,create'.indexOf(query.active) > -1">
<el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem"></el-button> <el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem"
>新增</el-button
>
</el-col> </el-col>
<el-form ref="projectOrderSubFormRef" :model="formData.projectOrderSubs" <el-form
ref="projectOrderSubFormRef"
:model="formData.projectOrderSubs"
:rules="subFormRules" :rules="subFormRules"
v-loading="subFormLoading" v-loading="subFormLoading"
label-width="0"> label-width="0"
<el-table
:data="formData.projectOrderSubs"
class="hl-table"
> >
<el-table :data="formData.projectOrderSubs" class="hl-table">
<el-table-column label="序号" type="index" width="100" /> <el-table-column label="序号" type="index" width="100" />
<el-table-column label="子项目名称" min-width="150"> <el-table-column label="子项目名称" min-width="150">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.name`" :rules="subFormRules.name" class="mb-0px!"> <el-form-item
<el-input :disabled="detailDisabled" v-model="row.name" placeholder="请输入子项目名称" /> :prop="`${$index}.name`"
:rules="subFormRules.name"
class="mb-0px!"
>
<el-input
:disabled="detailDisabled"
v-model="row.name"
placeholder="请输入子项目名称"
/>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="设备型号" min-width="150"> <el-table-column label="设备型号" min-width="150">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.deviceModel`" :rules="subFormRules.deviceModel" class="mb-0px!"> <el-form-item
<el-input :disabled="detailDisabled" v-model="row.deviceModel" placeholder="请输入设备型号" /> :prop="`${$index}.deviceModel`"
:rules="subFormRules.deviceModel"
class="mb-0px!"
>
<el-input
:disabled="detailDisabled"
v-model="row.deviceModel"
placeholder="请输入设备型号"
/>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="数量" min-width="150"> <el-table-column label="数量" min-width="150">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.amount`" :rules="subFormRules.amount" class="mb-0px!"> <el-form-item
<el-input-number :disabled="detailDisabled" v-model="row.amount" placeholder="请输入数量" :min="0" :precision="0"/> :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> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="单位" min-width="150"> <el-table-column label="单位" min-width="150">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.unit`" :rules="subFormRules.unit" class="mb-0px!"> <el-form-item
<el-select :disabled="detailDisabled" v-model="row.unit" placeholder="请选择单位"> :prop="`${$index}.unit`"
:rules="subFormRules.unit"
class="mb-0px!"
>
<el-select
:disabled="detailDisabled"
v-model="row.unit"
placeholder="请选择单位"
>
<el-option <el-option
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_PROJECT_ORDER_SUB_UNIT)" v-for="dict in getStrDictOptions(DICT_TYPE.HELI_PROJECT_ORDER_SUB_UNIT)"
:key="dict.value" :key="dict.value"
@ -384,8 +539,13 @@
</el-table-column> </el-table-column>
<el-table-column label="材质" min-width="150"> <el-table-column label="材质" min-width="150">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.compositionId`" :rules="subFormRules.compositionId" class="mb-0px!"> <el-form-item
<el-select v-model="row.compositionId" :prop="`${$index}.compositionId`"
:rules="subFormRules.compositionId"
class="mb-0px!"
>
<el-select
v-model="row.compositionId"
placeholder="请输入材质" placeholder="请输入材质"
:remote-method="remoteCompositionSearch" :remote-method="remoteCompositionSearch"
remote-show-suffix remote-show-suffix
@ -408,15 +568,23 @@
</el-table-column> </el-table-column>
<el-table-column label="备注" min-width="150"> <el-table-column label="备注" min-width="150">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" :rules="subFormRules.remark" class="mb-0px!"> <el-form-item
<el-input :disabled="detailDisabled" v-model="row.remark" placeholder="请输入备注" /> :prop="`${$index}.remark`"
:rules="subFormRules.remark"
class="mb-0px!"
>
<el-input
:disabled="detailDisabled"
v-model="row.remark"
placeholder="请输入备注"
/>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" width="240"> <el-table-column label="操作" align="center" width="240">
<template #default="scope"> <template #default="scope">
<el-button <el-button
v-if="('update,create'.indexOf(query.active) > -1) && !formData.hasAlter" v-if="'update,create'.indexOf(query.active) > -1 && !formData.hasAlter"
link link
type="danger" type="danger"
size="small" size="small"
@ -439,14 +607,17 @@
<el-row> <el-row>
<el-col> <el-col>
<el-card class="hl-incard"> <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 <el-upload
ref="contractUploadRef" ref="contractUploadRef"
:file-list="contractUploadFiles" :file-list="contractUploadFiles"
multiple multiple
:limit="10" :limit="10"
:action="uploadUrl" :action="uploadUrl"
:headers="{'Authorization': 'Bearer ' + getAccessToken(),'tenant-id': getTenantId()}" :headers="{
Authorization: 'Bearer ' + getAccessToken(),
'tenant-id': getTenantId()
}"
name="files" name="files"
:show-file-list="false" :show-file-list="false"
:auto-upload="false" :auto-upload="false"
@ -461,7 +632,10 @@
multiple multiple
:limit="10" :limit="10"
:action="uploadUrl" :action="uploadUrl"
:headers="{'Authorization': 'Bearer ' + getAccessToken(),'tenant-id': getTenantId()}" :headers="{
Authorization: 'Bearer ' + getAccessToken(),
'tenant-id': getTenantId()
}"
name="files" name="files"
:show-file-list="false" :show-file-list="false"
:auto-upload="false" :auto-upload="false"
@ -476,16 +650,37 @@
<el-table-column prop="name" label="文件名称" align="center" /> <el-table-column prop="name" label="文件名称" align="center" />
<el-table-column prop="businessFileType" label="文件类型" align="center"> <el-table-column prop="businessFileType" label="文件类型" align="center">
<template #default="scope"> <template #default="scope">
{{getDictLabel(DICT_TYPE.HELI_BUSINESS_FILE_TYPE, scope.row.businessFileType)}} {{
getDictLabel(DICT_TYPE.HELI_BUSINESS_FILE_TYPE, scope.row.businessFileType)
}}
</template> </template>
</el-table-column> </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"> <el-table-column label="操作" align="center">
<template #default="scope"> <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>
<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> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -523,36 +718,77 @@
</el-form> </el-form>
<div class="text-center hl-footer"> <div class="text-center hl-footer">
<el-button @click="() => router.back()" size="large"> </el-button> <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
> >
<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
> >
<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
> >
<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
> >
<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
> >
<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
> >
<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 >直接终止</el-button
> >
</div> </div>
</el-card> </el-card>
<el-dialog v-model="activeOpinionDialogVisible" title="打回原因" width="30%" center> <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> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="activeOpinionDialogVisible = false">取消</el-button> <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> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -561,25 +797,25 @@
import { inject } from 'vue' import { inject } from 'vue'
import { getIntDictOptions, getStrDictOptions, DICT_TYPE, getDictLabel } from '@/utils/dict' import { getIntDictOptions, getStrDictOptions, DICT_TYPE, getDictLabel } from '@/utils/dict'
import * as ProjectOrderApi from '@/api/heli/projectorder' import * as ProjectOrderApi from '@/api/heli/projectorder'
import {betweenDay, dateFormatter, formatDate} from "@/utils/formatTime"; import { betweenDay, dateFormatter, formatDate } from '@/utils/formatTime'
import {defaultProps, handleTree} from "@/utils/tree"; import { defaultProps, handleTree } from '@/utils/tree'
import * as DeptApi from '@/api/system/dept' import * as DeptApi from '@/api/system/dept'
import * as UserApi from "@/api/system/user"; import * as UserApi from '@/api/system/user'
import * as CustomerApi from "@/api/heli/customer/index" import * as CustomerApi from '@/api/heli/customer/index'
import * as CompositionApi from "@/api/heli/composition/index" import * as CompositionApi from '@/api/heli/composition/index'
import {getAccessToken, getTenantId} from "@/utils/auth"; import { getAccessToken, getTenantId } from '@/utils/auth'
import {UploadUserFile} from "element-plus"; import { UploadUserFile } from 'element-plus'
import {deleteFile, downloadFile, getFilePage} from "@/api/infra/file"; import { deleteFile, downloadFile, getFilePage } from '@/api/infra/file'
import {propTypes} from "@/utils/propTypes"; import { propTypes } from '@/utils/propTypes'
import download from "@/utils/download"; import download from '@/utils/download'
import {useUserStore} from "@/store/modules/user"; import { useUserStore } from '@/store/modules/user'
import {getUserProfile} from "@/api/system/user/profile"; import { getUserProfile } from '@/api/system/user/profile'
import {getOperateLogPage} from "@/api/system/operatelog"; import { getOperateLogPage } from '@/api/system/operatelog'
const { t } = useI18n() // const { t } = useI18n() //
const message = useMessage() // const message = useMessage() //
const { query } = useRoute() const { query } = useRoute()
const router = useRouter(); const router = useRouter()
const reload = inject('reload') const reload = inject('reload')
const activeOpinionDialogVisible = ref(false) // const activeOpinionDialogVisible = ref(false) //
@ -598,7 +834,7 @@ const formData = ref({
blueprintNo: undefined, blueprintNo: undefined,
hasPrice: 1, hasPrice: 1,
price: undefined, price: undefined,
currency: "1", currency: '1',
projectStartTime: undefined, projectStartTime: undefined,
projectEndTime: undefined, projectEndTime: undefined,
isUrgency: 0, isUrgency: 0,
@ -625,7 +861,7 @@ const formData = ref({
snapshotId: undefined, snapshotId: undefined,
snapshotCode: undefined, snapshotCode: undefined,
orderTime: new Date(), orderTime: new Date(),
snapshotOrderTime: undefined, snapshotOrderTime: undefined
}) })
const formRules = reactive({ const formRules = reactive({
businessDeptId: [{ required: true, message: '提出部门不能为空', trigger: 'blur' }], businessDeptId: [{ required: true, message: '提出部门不能为空', trigger: 'blur' }],
@ -642,7 +878,7 @@ const formRules = reactive({
hasTechnologyProtocol: [{ required: true, message: '有无技术协议不能为空', trigger: 'blur' }], hasTechnologyProtocol: [{ required: true, message: '有无技术协议不能为空', trigger: 'blur' }],
hasBlueprint: [{ required: true, message: '有无图纸/数模不能为空', trigger: 'blur' }], hasBlueprint: [{ required: true, message: '有无图纸/数模不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态,1表示正常2表示禁用不能为空', 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 formRef = ref() // Ref
const subFormLoading = ref(false) // const subFormLoading = ref(false) //
@ -651,13 +887,13 @@ const subFormRules = reactive({
amount: [{ required: true, message: '数量不能为空', trigger: 'blur' }], amount: [{ required: true, message: '数量不能为空', trigger: 'blur' }],
unit: [{ required: true, message: '单位不能为空', trigger: 'blur' }], unit: [{ required: true, message: '单位不能为空', trigger: 'blur' }],
compositionId: [{ 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 deptList = ref<Tree[]>([]) //
const userList = ref<UserApi.UserVO[]>([]) // const userList = ref<UserApi.UserVO[]>([]) //
const userSelectList = ref<UserApi.UserVO[]>([]) const userSelectList = ref<UserApi.UserVO[]>([])
const userSelectLoading = ref(false); const userSelectLoading = ref(false)
const remoteUserSearch = (query: string) => { const remoteUserSearch = (query: string) => {
if (query) { if (query) {
@ -665,7 +901,10 @@ const remoteUserSearch = (query: string) => {
setTimeout(() => { setTimeout(() => {
userSelectLoading.value = false userSelectLoading.value = false
userSelectList.value = userList.value.filter((item) => { 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) }, 200)
} else { } else {
@ -675,7 +914,7 @@ const remoteUserSearch = (query: string) => {
const customerList = ref<CustomerApi.CustomerVO[]>([]) const customerList = ref<CustomerApi.CustomerVO[]>([])
const customerSelectList = ref<CustomerApi.CustomerVO[]>([]) const customerSelectList = ref<CustomerApi.CustomerVO[]>([])
const customerSelectLoading = ref(false); const customerSelectLoading = ref(false)
const remoteCustomerSearch = (query: string) => { const remoteCustomerSearch = (query: string) => {
if (query) { if (query) {
@ -693,7 +932,7 @@ const remoteCustomerSearch = (query: string) => {
const compositionList = ref<CompositionApi.CompositionVO[]>([]) const compositionList = ref<CompositionApi.CompositionVO[]>([])
const compositionSelectList = ref<CompositionApi.CompositionVO[]>([]) const compositionSelectList = ref<CompositionApi.CompositionVO[]>([])
const compositionSelectLoading = ref(false); const compositionSelectLoading = ref(false)
const remoteCompositionSearch = (query: string) => { const remoteCompositionSearch = (query: string) => {
if (query) { if (query) {
@ -723,7 +962,8 @@ const queryData = async (type: string, id?: number) => {
if (id) { if (id) {
formData.value = await ProjectOrderApi.getProjectOrder(id) formData.value = await ProjectOrderApi.getProjectOrder(id)
// //
formData.value.projectOrderSubs = await ProjectOrderApi.getProjectOrderSubListByProjectOrderId(id); formData.value.projectOrderSubs =
await ProjectOrderApi.getProjectOrderSubListByProjectOrderId(id)
// //
if(type == 'detailArchive'){ if(type == 'detailArchive'){
@ -736,7 +976,7 @@ const queryData = async (type: string, id?: number) => {
businessId: id, businessId: id,
businessType: 'PROJECT_ORDER' businessType: 'PROJECT_ORDER'
} }
formData.value.operateLogs = (await getOperateLogPage(logParams)).list; formData.value.operateLogs = (await getOperateLogPage(logParams)).list
// //
let attParams = { let attParams = {
@ -745,7 +985,7 @@ const queryData = async (type: string, id?: number) => {
businessId: id, businessId: id,
businessType: 'PROJECT_ORDER' businessType: 'PROJECT_ORDER'
} }
formData.value.attachments = (await getFilePage(attParams)).list; formData.value.attachments = (await getFilePage(attParams)).list
} }
// //
deptList.value = handleTree(await DeptApi.getSimpleDeptList()) deptList.value = handleTree(await DeptApi.getSimpleDeptList())
@ -754,37 +994,37 @@ const queryData = async (type: string, id?: number) => {
let userParams = { let userParams = {
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
status: "0" status: '0'
} }
const data = await UserApi.getUserPage(userParams) const data = await UserApi.getUserPage(userParams)
userList.value = data.list; userList.value = data.list
userSelectList.value = data.list; userSelectList.value = data.list
// //
let customerParams = { let customerParams = {
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
status: "1" status: '1'
} }
const customerData = await CustomerApi.getCustomerPage(customerParams) const customerData = await CustomerApi.getCustomerPage(customerParams)
customerList.value = customerData.list; customerList.value = customerData.list
customerSelectList.value = customerData.list; customerSelectList.value = customerData.list
// //
let compositionParams = { let compositionParams = {
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
status: "1" status: '1'
} }
const compositionData = await CompositionApi.getCompositionPage(compositionParams) const compositionData = await CompositionApi.getCompositionPage(compositionParams)
compositionList.value = compositionData.list; compositionList.value = compositionData.list
compositionSelectList.value = compositionData.list; compositionSelectList.value = compositionData.list
// //
formData.value.businessMan = useUserStore().getUser.id // formData.value.businessMan = useUserStore().getUser.id //
const userProfile = await getUserProfile(formData.value.businessMan); const userProfile = await getUserProfile(formData.value.businessMan)
if (userProfile.dept) { if (userProfile.dept) {
formData.value.businessDeptId = userProfile.dept.id; formData.value.businessDeptId = userProfile.dept.id
} }
} finally { } finally {
formLoading.value = false formLoading.value = false
@ -793,7 +1033,7 @@ const queryData = async (type: string, id?: number) => {
const submitForm = async (active) => { const submitForm = async (active) => {
// //
formData.value.active = active; formData.value.active = active
await formRef.value.validate() await formRef.value.validate()
// //
try { try {
@ -806,14 +1046,14 @@ const submitForm = async (active) => {
try { try {
// 退 // 退
if (active != 'REPULSE') { if (active != 'REPULSE') {
formData.value.activeOpinion = ''; formData.value.activeOpinion = ''
} }
const data = formData.value as unknown as ProjectOrderApi.ProjectOrderVO const data = formData.value as unknown as ProjectOrderApi.ProjectOrderVO
if (active == 'SUBMIT_AUDIT') { if (active == 'SUBMIT_AUDIT') {
// //
if (!data.projectOrderSubs || data.projectOrderSubs.length == 0) { if (!data.projectOrderSubs || data.projectOrderSubs.length == 0) {
message.error("子项目信息不能为空") message.error('子项目信息不能为空')
return return
} }
} }
@ -822,7 +1062,7 @@ const submitForm = async (active) => {
// 0 // 0
if (data.projectOrderSubs && data.projectOrderSubs.length > 0) { if (data.projectOrderSubs && data.projectOrderSubs.length > 0) {
if (data.projectOrderSubs.some((sub) => !sub.amount || sub.amount <= 0)) { if (data.projectOrderSubs.some((sub) => !sub.amount || sub.amount <= 0)) {
message.error("子项目数量不能为0") message.error('子项目数量不能为0')
return return
} }
} }
@ -832,10 +1072,10 @@ const submitForm = async (active) => {
// 0 // 0
if (data.projectOrderSubs && data.projectOrderSubs.length > 0) { if (data.projectOrderSubs && data.projectOrderSubs.length > 0) {
const total = data.projectOrderSubs.reduce((acc, cur) => { const total = data.projectOrderSubs.reduce((acc, cur) => {
return acc+cur; return acc + cur
}, 0); }, 0)
if (total <= 0) { if (total <= 0) {
message.error("子项目数量和不能为0") message.error('子项目数量和不能为0')
return return
} }
} }
@ -868,20 +1108,20 @@ const submitForm = async (active) => {
// //
if (contractUploadFiles.value.length > 0) { if (contractUploadFiles.value.length > 0) {
contractUploadData.value.businessId = orderId contractUploadData.value.businessId = orderId
contractUploadRef.value!.submit(); contractUploadRef.value!.submit()
} }
if (protocolUploadFiles.value.length > 0) { if (protocolUploadFiles.value.length > 0) {
protocolUploadData.value.businessId = orderId protocolUploadData.value.businessId = orderId
protocolUploadRef.value!.submit(); protocolUploadRef.value!.submit()
} }
// //
if (active != 'SAVE') { if (active != 'SAVE') {
router.back(); router.back()
} else { } else {
// //
reload(); reload()
query.id = orderId; query.id = orderId
} }
} finally { } finally {
formLoading.value = false formLoading.value = false
@ -899,7 +1139,7 @@ const onAddItem = () => {
compositionId: undefined, compositionId: undefined,
unit: undefined, unit: undefined,
remark: undefined, remark: undefined,
status: 1, status: 1
} }
row.projectOrderId = formData.value.id row.projectOrderId = formData.value.id
formData.value.projectOrderSubs.push(row) formData.value.projectOrderSubs.push(row)
@ -910,54 +1150,62 @@ const onDeleteItem = (index) => {
formData.value.projectOrderSubs.splice(index, 1) formData.value.projectOrderSubs.splice(index, 1)
} }
const uploadUrl = ref(import.meta.env.VITE_UPLOAD_BATCH_URL) const uploadUrl = ref(import.meta.env.VITE_UPLOAD_BATCH_URL)
const contractUploadRef = ref(); const contractUploadRef = ref()
const contractUploadFiles = ref<UploadUserFile[]>([]); const contractUploadFiles = ref<UploadUserFile[]>([])
const contractUploadData = ref({'businessType': 'PROJECT_ORDER', 'businessId': formData.value.id, 'businessFileType': 'CONTRACT'}); const contractUploadData = ref({
businessType: 'PROJECT_ORDER',
businessId: formData.value.id,
businessFileType: 'CONTRACT'
})
const protocolUploadRef = ref(); const protocolUploadRef = ref()
const protocolUploadFiles = ref<UploadUserFile[]>([]); const protocolUploadFiles = ref<UploadUserFile[]>([])
const protocolUploadData = ref({'businessType': 'PROJECT_ORDER', 'businessId': formData.value.id, 'businessFileType': 'TECHNOLOGY_PROTOCOL'}); const protocolUploadData = ref({
businessType: 'PROJECT_ORDER',
businessId: formData.value.id,
businessFileType: 'TECHNOLOGY_PROTOCOL'
})
const contractUploadChange = (file, files) => { const contractUploadChange = (file, files) => {
contractUploadFiles.value = files; contractUploadFiles.value = files
refreshAttachments(files, 'CONTRACT') refreshAttachments(files, 'CONTRACT')
} }
const protocolUploadChange = (file, files) => { const protocolUploadChange = (file, files) => {
protocolUploadFiles.value = files; protocolUploadFiles.value = files
refreshAttachments(files, 'TECHNOLOGY_PROTOCOL') refreshAttachments(files, 'TECHNOLOGY_PROTOCOL')
} }
const refreshAttachments = (files, type) => { const refreshAttachments = (files, type) => {
formData.value.attachments = formData.value.attachments.filter((value, index, array) => { 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++) { for (let i = 0; i < files.length; i++) {
let file = files[i]; let file = files[i]
file.businessFileType = type; file.businessFileType = type
file.createTime = new Date(); file.createTime = new Date()
formData.value.attachments.push(file); formData.value.attachments.push(file)
} }
// //
formData.value.attachments.sort((v1, v2) => { formData.value.attachments.sort((v1, v2) => {
return v1.createTime - v2.createTime < 0; return v1.createTime - v2.createTime < 0
}) })
} }
// //
const handleDeleteAttachment = async (index, type) => { 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++) { for (let i = 0; i < deletedAttachments.length; i++) {
const attachment = deletedAttachments[i]; const attachment = deletedAttachments[i]
if (attachment.id) { if (attachment.id) {
// //
await deleteFile(attachment.id); await deleteFile(attachment.id)
} }
// //
contractUploadFiles.value = contractUploadFiles.value.filter(file1 => { contractUploadFiles.value = contractUploadFiles.value.filter((file1) => {
return file1.name != attachment.name || file1.businessFileType != type; return file1.name != attachment.name || file1.businessFileType != type
}) })
protocolUploadFiles.value = protocolUploadFiles.value.filter(file2 => { protocolUploadFiles.value = protocolUploadFiles.value.filter((file2) => {
return file2.name != attachment.name || file2.businessFileType != type; return file2.name != attachment.name || file2.businessFileType != type
}) })
} }
} }
@ -965,7 +1213,7 @@ const handleDeleteAttachment = async (index, type) => {
// //
const downloadAttachment = async (name, url) => { const downloadAttachment = async (name, url) => {
const data = await downloadFile(url) const data = await downloadFile(url)
download.any(data, name); download.any(data, name)
} }
/** 重置表单 */ /** 重置表单 */
@ -982,7 +1230,7 @@ const resetForm = () => {
blueprintNo: undefined, blueprintNo: undefined,
hasPrice: 1, hasPrice: 1,
price: undefined, price: undefined,
currency: "1", currency: '1',
projectStartTime: undefined, projectStartTime: undefined,
projectEndTime: undefined, projectEndTime: undefined,
isUrgency: 0, isUrgency: 0,
@ -1001,6 +1249,7 @@ const resetForm = () => {
createTime: new Date(), createTime: new Date(),
projectOrderSubs: [], projectOrderSubs: [],
attachments: [], attachments: [],
operateLogs: [],
contractNo: undefined, contractNo: undefined,
active: '', active: '',
activeOpinion: '', activeOpinion: '',
@ -1021,12 +1270,12 @@ const alterDisabled = ref(false)
const detailDisabled = ref(false) const detailDisabled = ref(false)
onMounted(() => { onMounted(() => {
if (query.active == 'alter') { if (query.active == 'alter') {
alterDisabled.value = true; alterDisabled.value = true
} }
if('detail,audit,approve,terminate,detailArchive'.indexOf(query.active) > -1){ 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> </script>
<style> <style>

Loading…
Cancel
Save