You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2872 lines
82 KiB

<template>
<div ref="contractList" style="padding: 0 20px">
<lx-header
icon="md-apps"
style="margin-bottom: 10px; border: 0px; margin-top: 15px"
text="合同列表"
>
<div slot="content"></div>
<slot>
<div class="selects">
<div>
<span style="padding: 0 6px; word-break: keep-all">关键字</span>
<span>
<Input
v-model="select.keyword"
clearable
placeholder="关键字搜索"
style="width: 200px"
/>
</span>
</div>
<xy-selectors style="margin-left: 10px;" @search="getContracts" @reset="reset">
<div class="select-content">
<div>
<span style="padding: 0 6px; word-break: keep-all"
>服务商/供应商</span
>
<span>
<Input
v-model="select.supply"
clearable
placeholder="请输入服务商/供应商"
style="width: 200px"
/>
</span>
</div>
<div>
<span style="padding: 0 6px; word-break: keep-all">预算计划</span>
<span>
<Input
v-model="select.plan_name"
clearable
placeholder="请选择预算计划"
@on-focus="showPlanForSearch"
style="width: 200px"
@on-clear="clearSelectForSearch"
/>
</span>
</div>
<div>
<span style="padding: 0 6px; word-break: keep-all">签订年份</span>
<span>
<DatePicker
:value="select.year"
placeholder="选择年份"
placement="bottom"
style="width: 90px"
type="year"
@on-change="(e) => (select.year = e)"
></DatePicker>
</span>
</div>
<div>
<span style="padding: 0 6px; word-break: keep-all">创建日期</span>
<span>
<DatePicker
v-model="select.showDatePicker"
clearable
placeholder="请选择日期"
placement="bottom-start"
style="width: 200px"
type="daterange"
@on-change="datePick"
></DatePicker>
</span>
</div>
<div>
<span style="padding: 0 6px; word-break: keep-all"> 项目类型 </span>
<Select
v-model="select.type"
clearable
placeholder="请选择项目类型"
style="width: 140px"
>
<Option
v-for="item in type"
:key="item.value"
:value="item.value"
>{{ item.label }}</Option
>
</Select>
</div>
<div>
<span style="padding: 0 6px; word-break: keep-all"> 业务科室 </span>
<el-select
v-model="select.department_id"
clearable
placeholder="业务科室选择"
size="small"
style="width: 120px"
>
<el-option
v-for="item in departments"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</div>
<div>
<span style="padding: 0 6px; word-break: keep-all"> 采购形式 </span>
<Select
v-model="select.purchase_type_id"
clearable
placeholder="请选择采购形式"
style="width: 140px"
>
<Option
v-for="item in purchaseType"
:key="item.id"
:value="item.id"
>{{ item.value }}</Option
>
</Select>
</div>
<div>
<span style="padding: 0 6px; word-break: keep-all"> 采购方式 </span>
<Select
v-model="select.purchase_way_id"
clearable
placeholder="请选择采购方式"
style="width: 200px"
>
<Option
v-for="item in purchaseWay"
:key="item.id"
:value="item.id"
>{{ item.value }}</Option
>
</Select>
</div>
<div>
<span style="padding: 0 6px; word-break: keep-all"> 预算金额 </span>
<el-input-number
size="small"
:controls="false"
v-model="select.start_plan_price"
:min="0"
placeholder="最小金额"
style="width: 100px"
/>
<span style="padding: 0 5px">-</span>
<el-input-number
size="small"
:controls="false"
v-model="select.end_plan_price"
:min="0"
placeholder="最大金额"
style="width: 100px"
/>
</div>
<div>
<span style="padding: 0 6px; word-break: keep-all"> 合同状态 </span>
<Select
v-model="select.status"
clearable
placeholder="请选择"
style="width: 100px"
>
<Option
v-for="item in [
{ label: '待签订', value: 1 },
{ label: '已签订', value: 2 },
]"
:key="item.value"
:value="item.value"
>{{ item.label }}
</Option>
</Select>
</div>
<div>
<span style="padding: 0 6px; word-break: keep-all">
招标流程状态
</span>
<Select
v-model="select.invite_status"
clearable
placeholder="请选择"
style="width: 100px"
>
<Option
v-for="item in options"
:key="item.value"
:value="item.value"
>{{ item.label }}
</Option>
</Select>
</div>
<div>
<span style="padding: 0 6px; word-break: keep-all">
采购流程状态
</span>
<Select
v-model="select.purchase_status"
clearable
placeholder="请选择"
style="width: 100px"
>
<Option
v-for="item in options"
:key="item.value"
:value="item.value"
>{{ item.label }}
</Option>
</Select>
</div>
<div>
<span style="padding: 0 6px; word-break: keep-all">
合同审批状态
</span>
<Select
v-model="select.join_status"
clearable
placeholder="请选择"
style="width: 100px"
>
<Option
v-for="item in options"
:key="item.value"
:value="item.value"
>{{ item.label }}
</Option>
</Select>
</div>
<!-- <div>-->
<!-- <span style="padding: 0 6px; word-break: keep-all">-->
<!-- 请示流程状态-->
<!-- </span>-->
<!-- <Select-->
<!-- v-model="select.req_status"-->
<!-- clearable-->
<!-- placeholder="请选择"-->
<!-- style="width: 100px"-->
<!-- >-->
<!-- <Option-->
<!-- v-for="item in options"-->
<!-- :key="item.value"-->
<!-- :value="item.value"-->
<!-- >{{ item.label }}-->
<!-- </Option>-->
<!-- </Select>-->
<!-- </div>-->
</div>
</xy-selectors>
<Button
style="margin-left: 10px"
type="primary"
@click="isShowAdd = true"
>新增</Button
>
<Button style="margin-left: 10px" type="primary" @click="getContracts"
>查询</Button
>
<Button type="primary" @click="toExport()" style="margin-left: 10px"
>导出</Button
>
<!-- <Button type="primary" style="margin-left: 10px">导出</Button>-->
</div>
</slot>
</lx-header>
<xy-table
ref="xyTable"
:cell-style="cellStyle"
:list="list"
:show-summary="true"
:summary-method="summary"
:table-item="table"
@cellClick="showPaymentPlan"
@delete="(row) => deleteContract(row.id)"
@editor=""
>
<template v-slot:btns>
<el-table-column
fixed="right"
header-align="center"
label="操作"
width="200"
>
<template slot-scope="scope">
<div class="slot-btns">
<template v-if="scope.row.status === 2 && scope.row.is_end === 0">
<template v-if="scope.row.is_assurance == 1">
<!-- 如果是 履约文件-->
<template v-if="scope.row.assurance_status == 1">
<!-- 那么必须财务审核通过-->
<Button
class="slot-btns-item"
size="small"
type="primary"
@click="
$refs['paymentRegistration'].getContract(scope.row),
($refs[
'paymentRegistration'
].isShowPaymentRegistration = true)
"
>
<!-- paying(scope.row) @click="$refs['paymentRegistration'].getContract(scope.row),$refs['paymentRegistration'].isShowPaymentRegistration = true"-->
付款登记
</Button>
</template>
</template>
<template v-else>
<Button
class="slot-btns-item"
size="small"
type="primary"
@click="
$refs['paymentRegistration'].getContract(scope.row),
($refs[
'paymentRegistration'
].isShowPaymentRegistration = true)
"
>
<!-- @click="$refs['paymentRegistration'].getContract(scope.row),$refs['paymentRegistration'].isShowPaymentRegistration = true"-->
付款登记
</Button>
</template>
</template>
<template
v-if="scope.row.status === 1 && scope.row.join_status === 3"
>
<Button
class="slot-btns-item"
size="small"
type="primary"
@click="
($refs['contractSign'].isShow = true),
($refs['contractSign'].contractId = scope.row.id)
"
>
签订合同
</Button>
</template>
<!-- 采购完成 -->
<template
v-if="
scope.row.invite_status === 1 &&
scope.row.purchase_status === 3 &&
(scope.row.purchase_way
? scope.row.purchase_way.remark === 'true'
: false) &&
!scope.row.is_substitute
"
>
<Button
class="slot-btns-item"
size="small"
type="primary"
@click="
$refs['biddingUpload'].setId(scope.row.id),
$refs['biddingUpload'].show()
"
>招标审查</Button
>
</template>
<!-- <Button class="slot-btns-item" type="primary" size="small">附件管理</Button>-->
<!-- <template-->
<!-- v-if="-->
<!-- scope.row.req_status === 1 &&-->
<!-- scope.row.is_plan === 0 &&-->
<!-- !scope.row.is_substitute-->
<!-- "-->
<!-- >-->
<!-- <Button-->
<!-- class="slot-btns-item"-->
<!-- size="small"-->
<!-- type="primary"-->
<!-- @click="askProcess(scope.row)"-->
<!-- >请示流程-->
<!-- </Button>-->
<!-- </template>-->
<!-- 中标-->
<!-- <template v-if="false">-->
<!-- <Button class="slot-btns-item" size="small" type="primary" @click="">中标公告上传</Button>-->
<!-- </template>-->
<!--不需要走采购流程那么直接就是会签,如果采购方式不需要招标的也是直接会签-->
<template
v-if="
(scope.row.join_status === 1 &&
(scope.row.invite_status === 3 ||
((scope.row.purchase_way
? scope.row.purchase_way.remark === 'false'
: false) &&
scope.row.purchase_status === 3))) ||
(scope.row.is_substitute && scope.row.join_status === 1)
"
>
<Button
class="slot-btns-item"
size="small"
type="primary"
@click="signProcess(scope.row)"
>合同审批
</Button>
</template>
<template
v-if="
scope.row.is_simple !== 1 &&
scope.row.purchase_status === 1 &&
((scope.row.req_status === 3 && scope.row.is_plan === 0) ||
scope.row.is_plan === 1) &&
!scope.row.is_substitute
"
>
<Button
class="slot-btns-item"
size="small"
type="primary"
@click="buyProcess(scope.row)"
>采购流程
</Button>
</template>
<Poptip trigger="hover" placement="bottom" transfer>
<Button ghost size="small" type="primary">更多</Button>
<div slot="content">
<template
v-if="
!(
scope.row.req_status != 1 ||
scope.row.join_status != 1 ||
scope.row.invite_status != 1 ||
scope.row.purchase_status != 1 ||
scope.row.status === 2
)
"
>
<Poptip
:transfer="true"
confirm
placement="bottom"
title="确认要删除吗"
@on-ok="() => deleteContract(scope.row.id)"
>
<i-button
class="slot-btns-item"
ghost
size="small"
type="error"
>删除
</i-button>
</Poptip>
</template>
<Button
class="slot-btns-item"
size="small"
type="primary"
@click="
$refs['oaFiles'].setId(scope.row.id),
($refs['oaFiles'].show())
"
>
流程附件
</Button>
<Button
class="slot-btns-item"
size="small"
type="primary"
@click="
$refs['detailContract'].getDetail(scope.row.id),
($refs['detailContract'].isShowDetail = true)
"
>
查看
</Button>
<template v-if="scope.row.status != 2 || hasEdit">
<Button
class="slot-btns-item"
size="small"
type="primary"
@click="
($refs['editor'].isShowEditor = true),
$refs['editor'].getDetail(scope.row.id)
"
>编辑
</Button>
</template>
<template v-if="hasEdit && scope.row.status === 2">
<Button
class="slot-btns-item"
size="small"
type="primary"
@click="
($refs['contractSign'].contractId = scope.row.id),
($refs['contractSign'].isShow = true)
"
>
签订修改
</Button>
</template>
</div>
</Poptip>
</div>
</template>
</el-table-column>
</template>
</xy-table>
<div style="display: flex; justify-content: flex-end">
<Page
:total="total"
show-elevator
@on-change="pageChange"
show-sizer
@on-page-size-change="pageSizeChange"
/>
</div>
<!-- 新增合同 -->
<xy-dialog
ref="addContract"
:form="form"
:is-show.sync="isShowAdd"
:rules="rules"
title="新增采购事项"
type="form"
@submit="submit"
>
<template v-slot:name>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>项目名称
</div>
<div class="xy-table-item-content">
<el-input
v-model="form.name"
@change="checkName"
placeholder="请填写项目名称"
style="width: 300px"
/>
</div>
</div>
</template>
<template v-slot:is_simple>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*是否为简易流程</span
>
</div>
<div class="xy-table-item-content">
<div style="display: flex; width: 300px; align-items: center">
<el-switch
v-model="form.is_simple"
active-text="是"
inactive-text="否"
:active-value="1"
:inactive-value="0"
/>
<div style="flex: 1; text-align: right">
(水电煤等费用付款)
</div>
</div>
</div>
</div>
</template>
<template v-slot:supply v-if="form.is_simple">
<div class="xy-table-item">
<div class="xy-table-item-label">
<span
style="
color: red;
font-weight: 600;
padding-right: 4px;
font-size: 11px;
"
>*</span
>承包商/供货商
</div>
<div class="xy-table-item-content">
<el-input
v-model="form.supply"
placeholder="请填写承包商/供货商"
style="width: 300px"
/>
</div>
</div>
</template>
<template v-slot:money v-if="form.is_simple">
<div class="xy-table-item">
<div class="xy-table-item-label">
<span
style="
color: red;
font-weight: 600;
padding-right: 4px;
font-size: 11px;
"
>*</span
>合同金额
</div>
<div class="xy-table-item-content">
<el-input
v-model="form.money"
placeholder="请填写合同金额"
style="width: 300px"
/>
</div>
</div>
</template>
<template v-slot:type v-if="!form.is_simple">
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>项目类型
</div>
<div class="xy-table-item-content">
<el-select
v-model="form.type"
placeholder="请选择项目类型"
style="width: 300px"
>
<el-option
v-for="item in type"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:methods v-if="!form.is_simple">
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>采购形式
</div>
<div class="xy-table-item-content">
<el-select
v-model="form.methods"
placeholder="请选择采购形式"
style="width: 300px"
>
<el-option
v-for="item in purchaseType"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:modality v-if="!form.is_simple">
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>采购类型
</div>
<div class="xy-table-item-content">
<el-select
v-model="form.modality"
placeholder="请选择采购类型"
style="width: 300px"
>
<el-option
v-for="item in purchaseWayFormat()"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:price v-if="!form.is_simple">
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>采购预算价
</div>
<div class="xy-table-item-content xy-table-item-price">
<el-input
v-model="form.price"
placeholder="请填写采购预算价"
style="width: 300px"
/>
</div>
</div>
</template>
<template v-slot:fundingChannels>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>资金渠道
</div>
<div class="xy-table-item-content">
<el-select
v-model="form.fundingChannels"
multiple
placeholder="请选择资金渠道"
style="width: 300px"
>
<el-option
v-for="item in moneyWay"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
</div>
</div>
</template>
<!-- <template v-slot:isBudget>-->
<!-- <div class="xy-table-item">-->
<!-- <div class="xy-table-item-label" style="width: 200px">-->
<!-- <span style="color: red; font-weight: 600; padding-right: 4px"-->
<!-- >*</span-->
<!-- >是否为预算内确定项目-->
<!-- </div>-->
<!-- <div class="xy-table-item-content">-->
<!-- <el-switch v-model="form.isBudget" />-->
<!-- </div>-->
<!-- </div>-->
<!-- </template>-->
<template v-slot:is_substitute v-if="!form.is_simple">
<div class="xy-table-item">
<div class="xy-table-item-label" style="width: 200px">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>是否为代建项目
</div>
<div class="xy-table-item-content">
<el-switch
v-model="form.is_substitute"
active-text="是"
inactive-text="否"
:active-value="1"
:inactive-value="0"
/>
</div>
</div>
</template>
<template v-slot:is_framework>
<div class="xy-table-item">
<div class="xy-table-item-label" style="width: 200px">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>是否框架协议
</div>
<div class="xy-table-item-content">
<el-switch
v-model="form.is_framework"
active-text="是"
inactive-text="否"
:active-value="1"
:inactive-value="0"
/>
</div>
</div>
</template>
<template v-slot:use_framework_buy>
<div class="xy-table-item">
<div class="xy-table-item-label" style="width: 200px">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>是否使用框架协议内的采购
</div>
<div class="xy-table-item-content">
<el-switch
v-model="form.use_framework_buy"
active-text="是"
inactive-text="否"
:active-value="1"
:inactive-value="0"
/>
</div>
</div>
</template>
<template v-slot:contract_to_contracts v-if="form.use_framework_buy">
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>关联的框架协议合同
</div>
<div class="xy-table-item-content">
<div
class="contract-add-plan"
style="width: 300px"
@click="isShowContractToContracts = true"
>
<template v-if="selections.length > 0">
<template v-for="item in selections">
<Tag
closable
color="primary"
@on-close="delSelections(item)"
>{{ item.name }}</Tag
>
</template>
</template>
<template v-else>
<div class="contract-add-plan-no-plan">
请选择关联的框架协议合同
</div>
</template>
</div>
</div>
</div>
</template>
<template v-slot:plan>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>关联预算计划
</div>
<div class="xy-table-item-content">
<div
class="contract-add-plan"
style="width: 300px"
@click="showPlan"
>
<template v-if="form.plan.length > 0">
<template v-for="item in form.plan">
<Tag closable color="primary" @on-close="delPlan(item)">{{
item.label
}}</Tag>
</template>
</template>
<template v-else>
<div class="contract-add-plan-no-plan">请选择关联计划</div>
</template>
</div>
</div>
</div>
</template>
</xy-dialog>
<!-- 搜索使用 预算计划 -->
<xy-dialog
:is-show.sync="isShowPlanForSearch"
title="预算计划"
:width="720"
@on-ok="planSelectForSearch"
>
<template>
<Input
v-model="planSearch.name"
search
enter-button="搜 索"
placeholder="搜索预算计划.."
@on-search="searchBudgets"
/>
<div
style="
margin: 10px 0;
display: flex;
justify-content: space-between;
align-items: center;
"
>
<div>
已选择:<span style="margin-right: 10px">{{
select.plan_name
}}</span>
</div>
<el-link type="success" @click="clearSelectForSearch"
>清空选择</el-link
>
</div>
<xy-table
:list="plans"
@rowClick="selectPlanForSearch"
:show-index="false"
:table-item="planTableSearch"
:height="310"
style="margin-top: 10px"
ref="singlePlanTable"
>
<template v-slot:btns> </template>
</xy-table>
<div style="display: flex; justify-content: flex-end">
<Page :total="planTotal" show-elevator @on-change="planPageChange" />
</div>
<el-tag type="warning">点击行进行选择</el-tag>
</template>
<template v-slot:footerContent>
<Button type="primary" @click="confirmPlanForSearch">确定</Button>
</template>
</xy-dialog>
<!-- 新增表 预算计划 -->
<xy-dialog
:is-show.sync="isShowPlan"
:width="820"
title="预算计划"
@on-ok="planSelect"
>
<template>
<div style="display: flex">
<el-select
placeholder="科室选择"
clearable
size="small"
v-model="planSearch.plan_department_id"
style="width: 160px"
>
<el-option
v-for="item in departments"
:label="item.name"
:value="item.id"
:key="item.id"
>
</el-option>
</el-select>
<Input
v-model="planSearch.name"
enter-button="搜 索"
placeholder="搜索预算计划.."
search
@on-search="searchBudgets"
/>
</div>
<xy-table
ref="planTable"
:height="300"
:list="plans"
:show-index="false"
:table-item="planTable"
style="margin-top: 10px"
row-key="id"
border
default-expand-all
:tree-props="{ children: 'notChildren', hasChildren: 'hasChildren' }"
@select="selectPlan"
>
<template v-slot:btns>
<el-table-column
header-align="center"
label="使用金额"
fixed="right"
width="140"
>
<template slot-scope="scope">
<Input v-if="scope.row.pid === 0"
:value="scope.row.useMoney"
@input="planInput($event, scope.row)"
/>
</template>
</el-table-column>
</template>
</xy-table>
<div style="display: flex; justify-content: flex-end">
<Page :total="planTotal" show-elevator @on-change="planPageChange" />
</div>
</template>
<template v-slot:footerContent>
<Button type="primary" @click="planSelect">确定</Button>
</template>
</xy-dialog>
<!-- 新增表 框架合同-->
<Modal
title="框架协议"
v-model="isShowContractToContracts"
width="54%"
>
<Table
:data="contractList"
:columns="contractTable"
:loading="loading"
border
size="small"
@on-selection-change="selectionChange"
></Table>
<div style="display: flex; justify-content: center; margin: 10px 0">
<Page
:total="contractTotal"
size="small"
show-elevator
show-total
@on-change="
(e) => {
contractSelect.page = e;
getContractToContracts();
}
"
/>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="isShowContractToContracts = false">取 消</el-button>
<el-button type="primary" @click="isShowContractToContracts = false"
>确 定</el-button
>
</span>
</Modal>
<!-- 编辑-->
<editor
ref="editor"
:is-show-editor.sync="isShowEditor"
:money-way="moneyWay"
:purchase-type="purchaseType"
:purchase-way="purchaseWay"
@success="getContracts"
></editor>
<!-- 查看-->
<detail ref="detailContract"></detail>
<!--付款登记-->
<paymentRegistration
ref="paymentRegistration"
@paid="paying"
></paymentRegistration>
<!-- 合同签订-->
<contractSign ref="contractSign" @signSuccess="getContracts"></contractSign>
<!-- 查看付款计划-->
<contractPaymentRegistration
ref="contractPaymentRegistration"
></contractPaymentRegistration>
<biddingUpload ref="biddingUpload" @refresh="getContracts"></biddingUpload>
<oaFiles ref="oaFiles"></oaFiles>
</div>
</template>
<script>
import {
getContract,
addContrant,
delContract,
checkContractName,
updateStatus,
} from "@/api/contract/contract";
import { getparameter } from "@/api/system/dictionary";
import { listdeptNoAuth } from "@/api/system/department";
import { getBudget } from "@/api/budget/budget";
import { getOatoken } from "@/api/oatoken";
import { deepCopy, parseTime, resetSelect } from '@/utils'
import { Message } from "element-ui";
import { getInfo } from "@/api/user.js";
import { getToken } from "@/utils/auth";
import { getOutDetail, httpCurl, updateFlow } from "@/api/out";
import editor from "./components/editorContract";
import detail from "./components/detailContract";
import paymentRegistration from "./components/paymentRegistration";
import contractSign from "@/views/contract/components/contractSign";
import contractPaymentRegistration from "@/views/contract/components/contractPaymentRegistration";
import biddingUpload from "./components/biddingUpload.vue";
import oaFiles from './components/oaFiles.vue';
let iframe;
export default {
components: {
editor,
detail,
paymentRegistration,
contractSign,
contractPaymentRegistration,
biddingUpload,
oaFiles
},
data() {
var planPass = (rule, value, callback) => {
if (this.form.isBudget) {
if (this.form.plan.length === 0) {
callback(new Error("必选"));
} else {
callback();
}
} else {
callback();
}
};
var supplyPass = (rule, value, callback) => {
if (this.form.is_simple) {
if (value === "") {
callback(new Error("必填"));
} else {
callback();
}
} else {
callback();
}
};
var moneyPass = (rule, value, callback) => {
if (this.form.is_simple) {
if (value === "") {
callback(new Error("必填"));
} else {
if (/^\d+(\.\d+)?$/.test(value)) {
callback();
} else {
callback(new Error("必须为数字"));
}
}
} else {
callback();
}
};
var typePass = (rule, value, callback) => {
if (!this.form.is_simple) {
if (value === "") {
callback(new Error("必填"));
} else {
callback();
}
} else {
callback();
}
};
var methodsPass = (rule, value, callback) => {
if (!this.form.is_simple) {
if (value === "") {
callback(new Error("必填"));
} else {
callback();
}
} else {
callback();
}
};
var modalityPass = (rule, value, callback) => {
if (!this.form.is_simple) {
if (value === "") {
callback(new Error("必填"));
} else {
callback();
}
} else {
callback();
}
};
var pricePass = (rule, value, callback) => {
if (!this.form.is_simple) {
if (value === "") {
callback(new Error("必填"));
} else {
if (/^\d+(\.\d+)?$/.test(value)) {
callback();
} else {
callback(new Error("必须为数字"));
}
}
} else {
callback();
}
};
return {
userList: ["liuxiangyu", "zhushulan", "admin", "jiangjiao"],
nowContract: {},
window: {
width: 0,
height: 0,
top: 0,
left: 0,
},
hasEdit: false,
isShowPlanForSearch: false,
options: [
{
value: "",
label: "全部",
},
{
value: 1,
label: "待申请",
},
{
value: 2,
label: "流转中",
},
{
value: 3,
label: "已办结",
},
],
//搜索
select: {
keyword: "",
showDatePicker: "",
pageIndex: 1,
pageSize: 10,
startDate: "",
endDate: "",
type: "",
department_id: "",
purchaseModality: "",
purchaseMethods: "",
status: "",
year: "",
plan_id: "",
outcome_type: 1,
plan_name: "请选择预算计划",
start_plan_price: undefined,
end_plan_price: undefined,
is_myself: 0
},
selectCopy: {
keyword: "",
showDatePicker: "",
pageIndex: 1,
pageSize: 10,
startDate: "",
endDate: "",
type: "",
department_id: "",
purchaseModality: "",
purchaseMethods: "",
status: "",
year: "",
plan_id: "",
outcome_type: 1,
plan_name: "请选择预算计划",
start_plan_price: undefined,
end_plan_price: undefined,
},
type: [
{
label: "服务",
value: 1,
},
{
label: "货物",
value: 2,
},
{
label: "工程",
value: 3,
},
],
purchaseType: [], //购买形式
purchaseWay: [], //购买方式
moneyWay: [], //资金渠道
departments: [], //部门科室
list: [], //数据
total: 0,
//表格
table: [
{
label: "项目名称",
width: 380,
prop: "name",
fixed: "left",
align: "left",
},
{
label: "采购形式",
width: 120,
prop: "purchase_type.value",
formatter: (cell, data, value) => {
return value ? value : "无";
},
},
{
label: "项目类型",
width: 120,
prop: "type",
formatter: (cell, data, value) => {
switch (value) {
case 1:
return "服务";
break;
case 2:
return "货物";
break;
case 3:
return "工程";
break;
default:
return "无";
}
}
},
{
label: "采购流程",
multiHd: [
// {
// label: "请示流程",
// width: 140,
// prop: "req_status",
// formatter: (cell, data, value) => {
// if (cell.is_substitute) {
// return "无";
// }
// if (cell.is_plan === 1) {
// return "无";
// }
// switch (value) {
// case 1:
// return "待申请";
// break;
// case 2:
// return "流转中";
// break;
// case 3:
// return "已办结";
// break;
// default:
// return "异常";
// break;
// }
// },
// customFn:row => {
// const getDate = (value) => {
// if (row.is_substitute) {
// return "无";
// }
// if (row.is_plan === 1) {
// return "无";
// }
// switch (value) {
// case 1:
// return "待申请";
// break;
// case 2:
// return "流转中";
// break;
// case 3:
// return "已办结";
// break;
// default:
// return "异常";
// break;
// }
// }
// return (
// <div>
// <span>{ getDate(row.purchase_status) }</span>
// <br/>
// {
// (row.purchase_status === 1 || row.is_substitute || row.is_plan === 1) ? '' : <a style="color: #333" on={{['click']:this.toOaDetail}}>查看</a>
// }
// </div>
// )
// }
// },
{
label: "采购业务审批流程",
width: 158,
prop: "purchase_status",
formatter: (cell, data, value) => {
if (cell.is_substitute || cell.is_simple) {
return "无";
}
switch (value) {
case 1:
return "待申请";
break;
case 2:
return "流转中";
break;
case 3:
return "已办结";
break;
default:
return "异常";
break;
}
},
customFn:row => {
const getDate = (value) => {
if (row.is_substitute || row.is_simple) {
return "无";
}
switch (value) {
case 1:
return "待申请";
break;
case 2:
return "流转中";
break;
case 3:
return "已办结";
break;
default:
return "异常";
break;
}
}
return (
<div>
<span>{ getDate(row.purchase_status) }</span>
<br/>
{
(row.purchase_status === 1 || row.is_substitute || row.is_simple) ? '' : <a style="color: #333" on={{['click']:()=>this.toOaDetail('caigou',row)}}>查看</a>
}
</div>
)
}
},
{
label: "招标审核流程",
width: 145,
prop: "invite_status",
formatter: (cell, data, value) => {
if (cell.is_substitute || cell.is_simple) {
return "无";
}
if (cell.purchase_way?.remark === "false") {
return "无";
}
switch (value) {
case 1:
return "待申请";
break;
case 2:
return "流转中";
break;
case 3:
return "已办结";
break;
default:
return "异常";
break;
}
},
customFn:row => {
const getDate = (value) => {
if (row.is_substitute || row.is_simple) {
return "无";
}
if (row.purchase_way?.remark === "false") {
return "无";
}
switch (value) {
case 1:
return "待申请";
break;
case 2:
return "流转中";
break;
case 3:
return "已办结";
break;
default:
return "异常";
break;
}
}
return (
<div>
<span>{ getDate(row.invite_status) }</span>
<br/>
{
(row.is_substitute || row.is_simple || row.purchase_way?.remark === "false" || row.invite_status === 1)
? '' :
<a style="color: #333"
on={{['click']:()=>{
this.$refs['biddingUpload'].setId(row.id)
this.$refs['biddingUpload'].show()
}}}>查看</a>
}
</div>
)
}
},
{
label: "合同审批流程",
width: 145,
prop: "join_status",
formatter: (cell, data, value) => {
if (cell.is_simple) {
return "无";
}
switch (value) {
case 1:
return "待申请";
break;
case 2:
return "流转中";
break;
case 3:
return "已办结";
break;
default:
return "异常";
break;
}
},
customFn:row => {
const getDate = (value) => {
if (row.is_simple) {
return "无";
}
switch (value) {
case 1:
return "待申请";
break;
case 2:
return "流转中";
break;
case 3:
return "已办结";
break;
default:
return "异常";
break;
}
}
return (
<div>
<span>{ getDate(row.join_status) }</span>
<br/>
{
(row.is_simple || row.join_status === 1) ? '' : <a style="color: #333" on={{['click']:()=>this.toOaDetail('hetong',row)}}>查看</a>
}
</div>
)
}
},
],
},
{
label: "采购方式",
width: 120,
prop: "purchase_way.value",
formatter: (cell, data, value) => {
return value ? value : "无";
},
},
{
label: "资金来源",
width: 120,
customFn: (row) => {
{
return row.money_way_detail.map((item) => {
return <div> {item.value} </div>;
});
}
},
},
{
label: "预算计划",
width: 330,
align: "left",
customFn: (row) => {
{
return row.plans.map((item) => {
return (
<div>
{" "}
[{item.year}] {item.pid_info ? item.pid_info.name : ''} - {item.name}{" "}
</div>
);
});
}
},
},
{
label: "合同预算价(元)",
width: 140,
prop: "plan_price",
align: "right",
formatter: (v1, v2, value) => {
return Number(value)
.toFixed(2)
.replace(/(\d)(?=(\d{3})+\.)/g, "$1,");
},
},
{
label: "合同签订价(元)",
width: 140,
prop: "money",
align: "right",
formatter: (cell, data, value) => {
return Number(value)
.toFixed(2)
.replace(/(\d)(?=(\d{3})+\.)/g, "$1,");
},
},
{
label: "已申请金额(元)",
prop: "apply_money_total",
width: 140,
align: "right",
formatter: (cell, data, value) => {
return Number(value)
.toFixed(2)
.replace(/(\d)(?=(\d{3})+\.)/g, "$1,");
},
},
{
label: "已付金额(元)",
prop: "fund_log_total",
width: 140,
align: "right",
formatter: (cell, data, value) => {
return Number(value)
.toFixed(2)
.replace(/(\d)(?=(\d{3})+\.)/g, "$1,");
},
},
{
label: "支付占比",
width: 140,
customFn: (row) => {
let per =
((row.fund_log_total / row.money || 0) * 100)?.toFixed(2) || 0;
return (
<div
style={{
color: per > 110 ? "red" : "green",
}}
>
{" "}
{per} %
</div>
);
},
},
{
label: "合同状态",
width: 120,
prop: "status",
formatter: (cell, data, value) => {
switch (value) {
case 1:
return "待签订";
break;
case 2:
return "已签订";
break;
default:
return "未知";
}
},
},
{
label: "结算状态",
width: 120,
prop: "is_end",
formatter: (cell, data, value) => {
return value === 0 ? "未结清" : "已结清";
},
},
{
label: "付款计划",
prop: "sign_plan_count",
width: 120,
formatter: (cell, data, value) => {
if (value == 0) return "暂无";
return value + "期";
},
},
{
label: "供应商/服务商",
width: 220,
prop: "supply",
align: "left",
},
{
label: "业务科室",
width: 140,
prop: "department.name",
},
{
label: "经办人",
width: 140,
prop: "admin.name",
},
{
label: "合同服务日期",
width: 200,
customFn: (row) => {
if (row.start_date && row.end_date) {
return (
<div>
<span>
{row.start_date} ~ {row.end_date}
</span>
</div>
);
} else {
return <span></span>;
}
},
},
{
label: "签订日期",
width: 160,
prop: "date",
formatter: (cell, data, value) => {
if (value) return parseTime(new Date(value), "{y}-{m}-{d}");
},
},
{
label: "创建日期",
width: 160,
prop: "created_at",
formatter: (cell, data, value) => {
return parseTime(new Date(value), "{y}-{m}-{d}");
},
},
],
//总计
tableTotal: {
fundLogTotal: 0,
moneyTotal: 0,
planPriceTotal: 0,
},
planTypes: [],
planTableSearch: [
{
label: "分类",
prop: "type",
formatter: (cell, data, value) => {
let res = this.moneyWay.filter((item) => {
return item.id === value;
});
return res[0]?.value || "未知";
},
},
{
label: "年份",
prop: "year",
align: "center",
},
{
label: "名称",
prop: "name",
align: "left",
},
{
label: "计划金额",
prop: "money",
align: "right",
width: 120,
customFn: (row) => {
let m1 = row.money;
let m2 = row.update_money;
return m2 == 0 ? m1 : m2;
},
},
],
planTable: [
{
width: 44,
sortable: false,
type: "selection",
fixed: "left",
selectable: (row, index) => {
return row.pid === 0
}
},
{
label: "分类",
prop: "type_detail.value",
width: 100,
fixed: "left",
},
{
label: "科室",
prop: "plan_department.name",
width: 100,
align: "center",
},
{
label: "年份",
prop: "year",
width: 80,
align: "center",
},
{
label: "隶属",
prop: "pid_info.name",
width: 180,
align: "left",
},
{
label: "名称",
prop: "name",
width: 320,
align: "left",
},
{
label: "计划金额",
prop: "money",
align: "right",
width: 120,
customFn: (row) => {
let m1 = row.money;
let m2 = row.update_money;
return m2 == 0 ? m1 : m2;
},
},
{
label: "实付金额",
prop: "use_money_total",
width: 120,
align: "right",
},
{
label: "已用金额",
prop: "has_money_total",
width: 120,
align: "right",
},
],
//新增
isShowAdd: false,
form: {
name: "",
is_simple: 0,
supply: "",
money: 0,
type: "",
methods: "",
modality: "",
price: 0,
fundingChannels: [],
isBudget: true,
plan: [],
//is_substitute: 0,
is_framework: 0,
use_framework_buy: 0,
contract_to_contracts: [],
},
plan: [],
rules: {
name: [
{
required: true,
message: "必填",
},
],
supply: [
{
validator: supplyPass,
trigger: "change",
},
],
money: [
{
validator: moneyPass,
trigger: "change",
},
],
type: [
{
validator: typePass,
trigger: "change",
},
],
methods: [
{
validator: methodsPass,
trigger: "change",
},
],
modality: [
{
validator: modalityPass,
trigger: "change",
},
],
price: [
{
validator: pricePass,
trigger: "change",
},
],
fundingChannels: [
{
required: true,
message: "必填",
},
],
plan: [
{
validator: planPass,
trigger: "change",
},
],
},
isShowPlan: false, //新增中预算计划
plans: [], //预算数据
planSearch: {
name: "",
plan_department_id: "",
},
planTotal: 0,
plansPageIndex: 1,
//新增中框架合同
isShowContract: false,
isShowContractToContracts: false,
contractSelect: {
page: 1,
page_size: 10,
is_framework: 1,
},
contractTotal: 0,
contractList: [],
loading: false,
contractTable: [
{
type: "selection",
width: 56,
align: "center",
},
{
title: "项目名称",
key: "name",
minWidth: 180,
align: "left",
},
{
title: "采购形势",
width: 120,
render: (h, { row }) => {
return h("span", {}, row.purchase_type?.value || "无");
},
},
{
title: "项目类型",
width: 120,
render: (h, { row }) => {
let map = new Map([
[1, "服务"],
[2, "货物"],
[3, "工程"],
]);
return h("span", {}, map.get(row.type));
},
},
{
title: "采购方式",
width: 120,
render: (h, { row }) => {
return h("span", {}, row.purchase_way?.value || "无");
},
},
],
selections: [], //已选择的框架合同
isShowEditor: false,
};
},
methods: {
async toOaDetail (tbname,row) {
let res;
switch (tbname) {
case 'hetong':
res = await httpCurl({
tbname,
out_contract_id: row.id
})
break;
case 'caigou':
res = await httpCurl({
tbname,
out_caigou_id: row.id
})
break;
case 'pay':
res = await httpCurl({
tbname,
out_pay_id: row.id
})
break;
}
console.log(res)
if (res && res.flow?.id) {
window.open(
`http://hjjc-szemcold-test.ali251.langye.net/index.php?s=/flow/edit/id/${res.flow.id}&auth_token=${this.$store.getters.oa_token}`,
"bidding",
`top=${this.window.top},left=${this.window.left},width=${this.window.width},height=${this.window.height},location=0`
)
} else {
this.$message({
type: 'warning',
message: '未查找到该流程'
})
}
},
reset () {
this.select = deepCopy(this.selectCopy)
},
toExport() {
this.select.is_export = 1;
this.getContracts(true);
},
clearSelectForSearch() {
this.select.plan_id = "";
this.select.plan_name = "请选择预算计划";
},
async getPlanTypes() {
const res = await getparameter({
number: "money_way",
});
this.planTypes = res.detail;
console.log(this.planTypes);
},
//预算计划金额输入
planInput(e, row) {
if (!/^[0-9]+.?[0-9]*$/.test(e) && e) {
Message({
type: "warning",
message: "金额格式错误",
});
row.useMoney = 0;
return;
}
let money =
Number(row.update_money) == 0
? Number(row.money)
: Number(row.update_money);
console.log(e, money, row.use_money_total);
console.log(e <= money - Number(row.use_money_total));
if (e <= money - Number(row.use_money_total)) {
row.useMoney = e;
this.plan.forEach((item) => {
if (item.value.plan_id == row.id) {
item.value.use_money = e;
}
});
return;
}
Message({
type: "warning",
message: "使用金额大于剩余预算",
});
row.useMoney = 0;
},
//合计
summary(param) {
this.$nextTick(() => {
this.$refs["xyTable"].$children[0].doLayout();
});
const { columns, data } = param;
const sums = [];
columns.map((column, index) => {
if (index === 0) {
sums[index] = "总计";
return;
}
if (column.property === "fund_log_total") {
sums[index] = this.tableTotal.fundLogTotal;
return;
}
if (column.property === "plan_price") {
sums[index] = this.tableTotal.planPriceTotal;
return;
}
if (column.property === "money") {
sums[index] = this.tableTotal.moneyTotal;
return;
}
// const values = data.map(item => Number(item[column.property]));
// if (!values.every(value => isNaN(value)) && (column.property === 'money' || column.property === 'plan_price'|| column.property === 'fund_log_total')) {
//
// sums[index] = sums[index].toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,')
// } else {
// sums[index] = '';
// }
});
return sums;
},
cellStyle({ row, column, rowIndex, columnIndex }) {
if (column.property === "req_status") {
if (row.is_plan || row.is_substitute || row.is_simple) {
return {
color: "rgb(140,140,140)",
};
}
switch (row.req_status) {
case 1:
return {
color: "rgb(96,109,241)",
};
break;
case 2:
return {
color: "rgb(219,122,122)",
};
break;
case 3:
return {
color: "rgb(147,201,134)",
};
break;
default:
return {
color: "rgb(220,185,126)",
};
}
}
if (column.property === "purchase_status") {
if (row.is_substitute || row.is_simple) {
return {
color: "rgb(140,140,140)",
};
}
switch (row.purchase_status) {
case 1:
return {
color: "rgb(96,109,241)",
};
break;
case 2:
return {
color: "rgb(219,122,122)",
};
break;
case 3:
return {
color: "rgb(147,201,134)",
};
break;
default:
return {
color: "rgb(220,185,126)",
};
}
}
if (column.property === "invite_status") {
if (
row.purchase_way?.remark === "false" ||
row.is_substitute ||
row.is_simple
) {
return {
color: "rgb(140,140,140)",
};
}
switch (row.invite_status) {
case 1:
return {
color: "rgb(96,109,241)",
};
break;
case 2:
return {
color: "rgb(219,122,122)",
};
break;
case 3:
return {
color: "rgb(147,201,134)",
};
break;
default:
return {
color: "rgb(220,185,126)",
};
}
}
if (column.property === "join_status") {
if (row.is_simple) {
return {
color: "rgb(140,140,140)",
};
}
switch (row.join_status) {
case 1:
return {
color: "rgb(96,109,241)",
};
break;
case 2:
return {
color: "rgb(219,122,122)",
};
break;
case 3:
return {
color: "rgb(147,201,134)",
};
break;
default:
return {
color: "rgb(220,185,126)",
};
}
}
},
//y验证合同的名称是否存在重复
checkName(e) {
checkContractName({ name: e }).then((res) => {
console.log(res);
});
},
confirmPlanForSearch() {
this.isShowPlanForSearch = false;
this.getContracts();
},
//
setNowContract(contract, tbname) {
this.nowContract = {
tbname,
...contract,
};
},
//点击付款计划查看
showPaymentPlan(row, column, cell) {
if (column.property === "sign_plan_count") {
this.$refs["contractPaymentRegistration"].getSignPlan(row.id);
row.status === 2
? (this.$refs["contractPaymentRegistration"].isSign = true)
: (this.$refs["contractPaymentRegistration"].isSign = false);
this.$refs["contractPaymentRegistration"].isShow = true;
}
if (column.property === "fund_log_total") {
this.$router.push(
`/contract/paymentRegistrationList?contractId=${row.id}`
);
}
},
//招标文件审查
async bidding(row) {
this.setNowContract(row, "zhaobiao");
let baseInfo = {
title: row?.name,
out_zhaobiao_id: row.id,
};
//let res = await getOatoken()
let url = `${process.env.VUE_APP_OUT_OLD}?s=/flow/add/modid/30&auth_token=${this.$store.getters.oa_token}&out_zhaobiao_id=${
row.id
}&contract_json=${JSON.stringify(baseInfo)}`;
let bidding = window.open(
url,
"bidding",
`top=${this.window.top},left=${this.window.left},width=${this.window.width},height=${this.window.height},location=0`
);
},
//采购流程
async buyProcess(row) {
let zijinlaiyuanjuti = row.plans?.map(plan => {
return this.plans.find(p => p.id === plan.pid)?.name
})
this.setNowContract(row, "caigou");
let baseInfo = {
title: row?.name,
//"采购形式": row?.purchase_type?.value,
iszhengfucaigou:
(row.purchase_type?.value === "政府采购") ? "政府采购" : "否",
out_caigou_id: row.id,
type: this.type.find((item) => {
return item.value === row.type;
})?.label,
yusuan: row?.plan_price?.toString(),
zijinlaiyuan: row.money_way_detail?.reduce((prev, cur, index) => {
if (index === 0) {
return cur?.value;
} else {
return prev + "," + cur?.value;
}
}, ""),
zijinlaiyuanjuti: zijinlaiyuanjuti.toString()
};
// let res = await getOatoken()
let url = `${process.env.VUE_APP_OUT_OLD}?s=/flow/add/modid/8&auth_token=${this.$store.getters.oa_token}&out_caigou_id=${
row.id
}&contract_json=${JSON.stringify(baseInfo)}`;
let buyProcess = window.open(
url,
"buyProcess",
`top=${this.window.top},left=${this.window.left},width=${this.window.width},height=${this.window.height},location=0`
);
},
//会签流程
async signProcess(row) {
this.setNowContract(row, "hetong");
let baseInfo = {
title: row?.name,
执行部门: row?.carry_department,
total: row?.money || row?.plan_price,
out_contract_id: row.id,
//"承包商\\供应商":row.supply
};
// let res = await getOatoken()
let url = `${process.env.VUE_APP_OUT_OLD}?s=/flow/add/modid/9&auth_token=${this.$store.getters.oa_token}&out_contract_id=${
row.id
}&contract_json=${JSON.stringify(baseInfo)}`;
let signProcess = window.open(
url,
"signProcess",
`top=${this.window.top},left=${this.window.left},width=${this.window.width},height=${this.window.height},location=0`
);
},
//付款流程
async paying(row) {
let typeMap = new Map([
['货物','货物采购'],
['服务','服务采购'],
['其他','其他项目']
])
// this.setNowContract(row,'pay')
let baseInfo = {
title: row?.name,
xiangmuleibie: typeMap.get(this.type.find((item) => {
return item.value === row.type;
})?.label),
things: row?.name,
hetongbianhao: row?.number,
out_pay_id: row?.out_pay_id,
reason: row?.reason,
yizhifucishu: row?.yizhifucishu,
yizhifujine: row?.yizhifujine,
zongjia: row?.zongjia,
zhifucishu: row?.zhifucishu,
total: row?.total
//"承包商\\供应商":row.supply
};
let url = `${process.env.VUE_APP_OUT_OLD}?s=/flow/add/modid/24&auth_token=${this.$store.getters.oa_token}&out_pay_id=${
row?.out_pay_id
}&contract_json=${JSON.stringify(baseInfo)}`;
let signProcess = window.open(
url,
"signProcess",
`top=${this.window.top},left=${this.window.left},width=${this.window.width},height=${this.window.height},location=0`
);
this.$router.push('/contract/contract/paymentRegistrationList_1')
},
//请示流程
async askProcess(row) {
let res = await getOatoken();
let url = `${process.env.VUE_APP_OUT_URL}/admin/flow/create/17?oatoken=${res.oatoken}&out_contract_id=${row.id}`;
let askProcess = window.open(
url,
"askProcess",
`top=${this.window.top},left=${this.window.left},width=${this.window.width},height=${this.window.height},location=0`
);
},
//翻页
pageChange(e) {
this.select.pageIndex = e;
this.getContracts();
},
planPageChange(e) {
this.plansPageIndex = e;
this.getBudgets();
},
//日期选择
datePick(e) {
this.select.start_created_at = e[0];
this.select.end_created_at = e[1];
},
//获取预算计划
async getBudgets() {
let res = await getBudget({
name: this.planSearch.name,
page_size: 10,
page: this.plansPageIndex,
plan_department_id: this.planSearch.plan_department_id,
top_pid: '',
is_tree: 1
});
this.plans = res.list;
this.planTotal = res.list.total || 0;
this.toggleSelection(
this.plan.map((item) => {
return item.value.plan_id;
}),
1
);
},
//获取资金渠道
async getMoneyWay() {
this.moneyWay = (
await getparameter({
number: "money_way",
})
).detail;
},
//获取购买方式
async getPurchaseWay() {
this.purchaseWay = (
await getparameter({
number: "purchase_way",
})
).detail;
}, //计划搜索
searchBudgets() {
this.plansPageIndex = 1;
this.getBudgets();
},
//获取科室
async getDepartment() {
this.departments = await listdeptNoAuth();
},
//获取购买形式列表
async getPurchaseType() {
this.purchaseType = (
await getparameter({
number: "purchase_type",
})
).detail;
},
pageSizeChange(e) {
this.select.pageSize = e;
this.select.pageIndex = 1;
this.getContracts();
},
//获取合同列表
async getContracts(is_export,noloading=false) {
const res = await getContract({
page_size: this.select.pageSize,
page: this.select.pageIndex,
is_auth: 1,
...this.select,
},noloading);
let tokens = getToken();
if (is_export && this.select.is_export == 1) {
var url = "/api/admin/contract/index?is_auth=1&token=" + tokens;
Object.keys(this.select).map((key, item) => {
url += "&" + key + "=" + this.select[key];
});
url = location.host + url;
console.log(url);
window.open("http://" + url, "_blank");
this.select.is_export = 0;
return;
}
this.list = res.list.data;
this.total = res.list.total;
this.tableTotal.fundLogTotal = res.fund_log_total;
this.tableTotal.moneyTotal = Number(res.money_total)
.toFixed(2)
.replace(/(\d)(?=(\d{3})+\.)/g, "$1,");
this.tableTotal.planPriceTotal = Number(res.plan_price_total)
.toFixed(2)
.replace(/(\d)(?=(\d{3})+\.)/g, "$1,");
},
//新建合同
//显示
async showPlan() {
this.isShowPlan = true;
await this.getBudgets();
},
async showPlanForSearch() {
this.isShowPlanForSearch = true;
await this.getBudgets();
},
//选择计划 搜索
selectPlanForSearch(sel) {
console.log(sel);
if (sel) {
this.select.plan_id = sel.id;
this.select.plan_name = sel.name;
} else {
this.select.plan_id = "";
this.select.plan_name = "";
}
},
//选择计划
selectPlan(sel, row) {
console.log(sel);
if (sel) {
let select = sel.map((item) => {
return {
label: item.name,
value: {
plan_id: item.id,
use_money: item.useMoney,
new_money: item.money,
},
};
});
//说明被删除了
if (
sel.filter((plan) => {
return plan.id == row.id;
}).length == 0
) {
this.delPlan({
value: {
plan_id: row.id,
},
});
}
let _plan = JSON.parse(JSON.stringify(this.plan));
var _select = [];
select.map((item) => {
if (
_plan.filter((plan) => {
return plan.value.plan_id == item.value.plan_id;
}).length == 0
) {
_select.push(item);
}
});
this.plan = [..._plan, ..._select];
} else {
this.plan = [];
}
},
//确认计划选择
planSelect() {
if (this.plan.length === 0) {
Message({
type: "warning",
message: "选择计划不能为空",
});
return;
}
for (let item of this.plan) {
console.log(item);
if (!item.value.use_money) {
Message({
type: "warning",
message: "金额不能为空",
});
return;
}
}
this.form.plan = this.plan;
this.isShowPlan = false;
},
delPlan(val) {
this.form.plan.map((item, index) => {
if (item.value.plan_id === val.value.plan_id) {
this.form.plan.splice(index, 1);
}
});
this.plan.map((item, index) => {
if (item.value.plan_id === val.value.plan_id) {
this.plan.splice(index, 1);
}
});
},
delSelections(val) {
this.selections.map((item, index) => {
if (item.id === val.id) {
this.selections.splice(index, 1);
}
});
},
//确认计划选择搜索
planSelectForSearch() {
if (this.select.plan_id == "") {
Message({
type: "warning",
message: "选择计划不能为空",
});
return;
}
this.isShowPlanForSearch = false;
},
//默认选择计划
toggleSelection(plans, type) {
if (plans) {
this.plans
.filter((plan) => {
if (plans.includes(plan.id)) {
plan.useMoney = this.plan[plans.indexOf(plan.id)].value.use_money;
return true;
}
})
.map((row) => {
this.$refs.planTable.toggleRowSelection(row);
});
} else {
this.$refs.planTable.clearSelection();
}
},
//提交新建
submit() {
addContrant({
type: this.form.type,
is_plan: this.form.isBudget ? 1 : 0,
purchase_type_id: this.form.methods,
purchase_way_id: this.form.modality,
money_way_id: `${this.form.fundingChannels.toString()}`,
plan_price: this.form.price,
name: this.form.name,
contract_plan_links: this.form.plan.map((item) => {
return item.value;
}),
is_substitute: this.form.is_substitute,
is_simple: this.form.is_simple,
supply: this.form.supply,
money: this.form?.money,
status: this.form?.is_simple ? 2 : 1,
is_framework: this.form?.is_framework,
use_framework_buy: this.form.use_framework_buy,
contract_to_contracts: this.selections.map((i) => {
return {
to_contract_id: i.id,
use_money: i.money,
};
}),
}).then((res) => {
this.isShowAdd = false;
Message({
type: "success",
message: "操作成功",
});
this.selections = [];
this.$refs["addContract"].reset();
this.$refs["planTable"].clearSelection();
this.getContracts();
});
},
//删除合同
deleteContract(id) {
delContract({
id,
}).then((res) => {
Message({
type: "success",
message: "操作成功",
});
this.getContracts();
});
},
//框架合同
async getContractToContracts() {
const res = await getContract(this.contractSelect);
let selectedIds = this.selections.map((i) => i.id);
this.contractList = res.list.data.map((item) => {
return {
...item,
_checked: !!selectedIds.find((i) => i === item.id),
};
});
this.contractTotal = res.list.total;
},
selectionChange(selection) {
this.selections = Array.from(new Set(selection));
},
},
computed: {
purchaseWayFormat() {
return function () {
if (!this.form.methods) {
return this.purchaseWay;
} else {
let temp = this.purchaseType.find((i) => i.id === this.form.methods);
let arr = temp?.remark?.split(",")?.map((i) => Number(i));
return this.purchaseWay.filter((i) => arr.indexOf(i.id) !== -1);
}
};
},
},
watch: {
isShowContractToContracts(val) {
if (val) {
this.getContractToContracts();
} else {
resetSelect(this.contractSelect);
this.contractList = [];
this.contractTotal = 0;
}
},
},
mounted() {
this.window.width = screen.availWidth * 0.95;
this.window.height = screen.availHeight * 0.95;
this.window.top = (window.screen.height - 30 - this.window.height) / 2;
this.window.left = (window.screen.width - 10 - this.window.width) / 2;
let that = this;
getInfo()
.then((response) => {
console.log(response);
this.user = response;
if (that.userList.indexOf(response.username) != -1) {
that.hasEdit = true;
}
})
.catch((error) => {});
this.getPurchaseType();
this.select.is_myself = this.$route.path.split('_')[1] ? Number(this.$route.path.split('_')[1]) : 0
this.getDepartment();
this.getPurchaseWay();
this.getMoneyWay();
updateFlow().then(_ => this.getContracts())
//页面激活后刷新合同列表
window.onfocus = async () => {
await updateFlow();
await this.getContracts(false,true)
// if (this.nowContract?.tbname && this.nowContract?.id) {
// let select = {};
// select["tbname"] = this.nowContract.tbname;
// switch (this.nowContract.tbname) {
// case "caigou":
// select["out_caigou_id"] = this.nowContract.id;
// break;
// case "hetong":
// select["out_contract_id"] = this.nowContract.id;
// break;
// case "zhaobiao":
// select["out_zhaobiao_id"] = this.nowContract.id;
// break;
// }
// const res = await httpCurl(select);
// let flowIdMap = new Map([
// ["caigou", 8],
// ["hetong", 9],
// ["zhaobiao", 30],
// ]);
// let flowTypeMap = new Map([
// ["caigou", 2],
// ["hetong", 3],
// ["zhaobiao", 27],
// ]);
// let getStatus = (status) => {
// if (status === "end") {
// return 1;
// }
// if (Number(status)) {
// return 0;
// }
// return -1;
// };
// await updateStatus({
// flow_id: flowIdMap.get(this.nowContract.tbname),
// flow_type: flowTypeMap.get(this.nowContract.tbname),
// out_contract_id: this.nowContract.id,
// status: getStatus(res.flow?.current_step),
// },true);
// await this.getContracts(false,true);
// }
};
},
created() {
this.getBudgets();
this.select.keyword = this.$route.query.keyword;
// iframe = document.createElement("iframe");
// iframe.src = `${process.env.VUE_APP_OUT_OLD}/login/oss_login?id=${this.$store.state.user.userId}&username=${this.$store.state.user.username}`;
// iframe.style.display = "none";
// document.body.appendChild(iframe);
},
destroyed() {
window.onfocus = null;
//document.body.removeChild(iframe);
},
};
</script>
<style lang="scss" scoped>
.selects {
display: flex;
flex-wrap: wrap;
& > div {
margin-bottom: 6px;
}
}
.selectTop {
margin-top: 10px;
}
.contract-add-plan {
min-height: 30px;
border: 1px solid #dcdee2;
border-radius: 4px;
display: flex;
flex-wrap: wrap;
align-items: center;
align-content: center;
padding: 0 8px;
&-no-plan {
height: 30px;
line-height: 30px;
color: #cdd0d5;
}
}
.slot-btns {
display: flex;
flex-wrap: wrap;
align-content: center;
justify-content: flex-start;
&-item {
margin: 0 6px 4px 0;
}
}
.xy-table-item-label {
width: 200px;
}
.xy-table-item-price {
position: relative;
&::after {
position: absolute;
right: 0;
top: 0;
content: "(元)";
}
}
.select-content {
display: flex;
flex-wrap: wrap;
& > div {
flex-basis: 45%;
margin: 5px;
& > span:nth-child(1) {
display: inline-block;
width: 140px;
}
}
}
a:hover {
transition: all .2s;
text-decoration: underline;
}
</style>