This repository has been archived on 2025-02-05. You can view files and clone it, but cannot push or open issues or pull requests.
cqdevicemgt-ui/src/views/cost/csotSettlement/component/finishTable.vue

411 lines
13 KiB
Vue
Raw Normal View History

2024-08-13 11:45:31 +08:00
<template>
<!-- 完工结算和结算明细页面的表格组件 -->
<div style="margin-top: 60px">
<el-row class="table-title" type="flex">
<div class="batch-system-day" v-if="isCostBear && isEdit">
调整天数批量设置
<el-input
v-model="batchNum"
ref="batchNumRef"
type="number"
clearable
style="width: 120px"
@change="iptChange"
/>
</div>
<span class="repair-tip" v-if="isRepair">
{{
currRowInfo.isSlt == 0
? '勾选需要赔偿的维修项目'
: '已选的维修赔偿项目'
}}</span
2024-08-13 11:45:31 +08:00
>
<el-col :span="5" class="cost-bear">
<span v-if="isCostBear">{{
constBear === 1 ? '费用承担方01' : '费用承担方03'
}}</span>
<span v-else />
<span v-if="totalPrice !== -1">合计{{ totalPrice }}</span>
</el-col>
<el-col :span="14" class="title">{{ tableTitle }}</el-col>
<el-col :span="5" class="btn-item">
<el-button
size="mini"
type="warning"
v-if="!isEdit"
@click="handleExport"
>导出</el-button
>
<el-button
size="mini"
type="primary"
v-if="
isSettle == 0 &&
(isCostBear || (isRepair && currRowInfo.isSlt == 0))
"
2024-08-13 11:45:31 +08:00
@click="handleEdit"
>{{ isEdit ? '取消编辑' : '编辑' }}</el-button
>
<el-button
size="mini"
type="success"
v-if="!isEdit && isCostBear && isSettle == 0"
@click="submitSell"
>确认结算</el-button
>
<el-button
size="mini"
type="success"
v-if="isEdit && isCostBear && isSettle == 0"
@click="handleSave"
>保存</el-button
>
</el-col>
</el-row>
<el-table
border
:data="tableData"
ref="tableRef"
2024-08-13 11:45:31 +08:00
:header-cell-class-name="setClassName"
@selection-change="handleSelectionChange"
2024-08-13 11:45:31 +08:00
>
<el-table-column
type="selection"
v-if="isRepair && currRowInfo.isSlt == 0"
2024-08-13 11:45:31 +08:00
:selectable="() => !this.selDisabled"
/>
<el-table-column
align="center"
width="55"
v-if="isRepair && currRowInfo.isSlt == 1"
>
<template slot-scope="{ row }">
<el-checkbox :checked="row.isSlt == 1" disabled />
</template>
</el-table-column>
2024-08-13 11:45:31 +08:00
<el-table-column
align="center"
v-for="(t, index) in tableColumns"
:key="index"
:label="t.t_label"
:width="t.t_slot === 't_date' ? '180' : ''"
show-overflow-tooltip
>
<template slot-scope="scope">
<template v-if="t.t_slot && isEdit">
<!-- 调整天数时的输入框 -->
<el-input
v-if="t.t_slot === 't_ipt'"
v-model.number="scope.row[t.t_prop]"
style="width: 80px"
type="number"
:ref="`editIpt_${scope.$index}`"
:class="{
active: activeIndex === scope.$index,
}"
/>
<!-- 调整终结日期的日期选择组件 -->
<el-date-picker
v-model="scope.row[t.t_prop]"
type="date"
placeholder="选择日期"
v-if="t.t_slot === 't_date'"
value-format="yyyy-MM-dd"
:ref="`editTime_${scope.$index}`"
:class="{
active: activeIndexTime === scope.$index,
}"
:picker-options="{
disabledDate: (time) => {
const currentDate = new Date(
scope.row.startTime || new Date(),
)
currentDate.setDate(
currentDate.getDate() - 1,
)
return (
time.getTime() < currentDate.getTime()
)
},
}"
style="width: 150px"
/>
</template>
<template v-else-if="t.t_slot && t.t_slot === 'status'">
<el-tag size="mini" type="warning">待报废</el-tag>
</template>
2024-08-13 11:45:31 +08:00
<template v-else>
{{ scope.row[t.t_prop] }}
</template>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { editSaveApi } from '@/api/cost/cost.js'
export default {
props: {
// 列表每一列配置项
tableColumns: {
type: Array,
default: () => [],
},
// 列表上方标题
tableTitle: {
type: String,
default: () => '',
},
// 是否显示费用承担方
isCostBear: {
type: Boolean,
default: () => false,
},
// 是否是维修单
isRepair: {
type: Boolean,
default: () => false,
},
// 列表数据源
tableData: {
type: Array,
default: () => [],
},
// 01 或者 03 承担方
constBear: {
type: Number,
default: () => 1,
},
// 合计金额
totalPrice: {
type: [Number, String],
default: () => -1,
},
// 是否结算 0是未结算 1是已结算
isSettle: {
type: [Number, String],
default: () => 0,
},
// 列表类型 1 01承担方 2 03承担方 3 维修 4 未还 5 报废 6 待报废
listType: {
type: Number,
default: () => 0,
},
// 当前行的数据信息
currRowInfo: {
type: Object,
default: () => null,
},
2024-08-13 11:45:31 +08:00
},
2024-08-13 11:45:31 +08:00
data() {
return {
isEdit: false, // 是否编辑数据
batchNum: '', // 批量调整天数的数据源
activeIndex: '', // 调整天数输入框不合格时的 index 用来设置动态 class 增加一个红色边框
activeIndexTime: '', // 调整终结日期时的 index 用来设置动态 class 增加一个红色边框
selDisabled: true,
}
},
2024-08-13 11:45:31 +08:00
methods: {
/** 编辑按钮 */
handleEdit() {
this.isEdit = !this.isEdit
if (!this.isEdit) {
this.batchNum = ''
this.$emit('handelSaveSuccess')
}
if (this.isRepair) {
this.$refs.tableRef.clearSelection()
2024-08-13 11:45:31 +08:00
this.selDisabled = !this.selDisabled
}
},
/** 调整天数 */
iptChange(val) {
const regex = /^-?\d+$/
const isNum = regex.test(val)
if (!isNum) {
this.$message.error('请输入正整数或负整数或0')
return
}
this.tableData.map((e) => {
e.trimDay = val
})
},
/** 保存按钮 */
async handleSave() {
const regex = /^-?\d+$/
let isNum = false
try {
// 1. 先循环列表数据 判断调整的天数是否符合要求
this.tableData.map((e, v) => {
this.$message.closeAll()
if (!e.endTime) {
this.$message.error('请选择终结日期!')
this.activeIndexTime = v
this.$refs[`editTime_${v}`][0].focus()
isNum = true
throw new Error()
}
if (!regex.test(e.trimDay)) {
this.$message.error('请输入正整数或负整数或0')
this.activeIndex = v
this.$refs[`editIpt_${v}`][0].focus()
isNum = true
throw new Error()
}
})
if (isNum) return
// 2. 组装保存时的参数
let saveParams = []
this.tableData.map((e) => {
const item = {
agreementId: e.agreementId, // 协议id
typeId: e.typeId, // 设备id
trimDay: e.trimDay, // 调整的天数
maId: e.maId || '',
endTime: e.endTime, // 终结时间
}
saveParams.push(item)
})
// 3. 请求后台接口传递更改后的数据
const res = await editSaveApi(saveParams)
if (res.code == 200) {
this.$message.success('保存成功!')
this.activeIndex = ''
this.activeIndexTime = ''
this.batchNum = ''
this.isEdit = false
this.$emit('handelSaveSuccess')
}
} catch {}
},
/** 单个列表确认结算 */
submitSell() {
let isFlag = false
this.$message.closeAll()
try {
// 1. 先循环列表数据 判断 终结日期是否为空
this.tableData.map((e, v) => {
if (!e.endTime) {
this.$message.error('终止日期不能有空值!')
2024-08-13 11:45:31 +08:00
isFlag = true
throw new Error()
}
})
if (isFlag) return
// 2. 提示并通知父组件请求后台接口
this.$confirm(
'确定后则会生成财务报表,数据将不可修改,请确认检查无误',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
},
).then(() => {
this.$emit('submitSell', `0${this.constBear}`)
})
} catch {}
},
/** 导出按钮 */
handleExport() {
this.$emit('handleExport', this.listType)
},
setClassName({ column }) {
// 若为选择框,且数据皆为不可选时
if (column.type == 'selection' && this.selDisabled) {
return 'all-disabled'
}
},
/** 列表复选框选择事件 */
handleSelectionChange(list) {
let repairPriceAmount = 0
console.log(list, 'list')
list.forEach((e) => {
repairPriceAmount += e.partAllCosts * 1
})
this.$emit('onChangeRepairPrice', repairPriceAmount, list)
},
2024-08-13 11:45:31 +08:00
},
}
</script>
<style scoped lang="scss">
.table-title {
position: relative;
min-height: 48px;
border: 1px solid #7e7e7e;
background: linear-gradient(to right, #b4b3b3, #edebeb);
align-items: center !important;
justify-content: space-around;
.cost-bear {
display: flex;
padding-left: 12px;
font-weight: bold;
color: red;
span {
width: 50%;
}
}
.title {
text-align: center;
font-size: 20px;
font-weight: bold;
letter-spacing: 4px;
}
.btn-item {
text-align: right;
padding-right: 12px;
.el-button {
padding: 6px 10px;
}
}
// 维修单提示
.repair-tip {
position: absolute;
left: 2px;
bottom: 2px;
color: red;
font-size: 12px;
}
// 批量调整天数设置
.batch-system-day {
position: absolute;
top: -50px;
right: 30px;
height: 36px;
line-height: 36px;
}
}
::v-deep .active {
.el-input__inner:focus {
border-color: #f56c6c;
}
}
::v-deep .all-disabled .el-checkbox__input .el-checkbox__inner {
background-color: #edf2fc;
border-color: #dcdfe6;
cursor: not-allowed;
}
</style>