代码优化

This commit is contained in:
BianLzhaoMin 2024-08-22 17:00:49 +08:00
parent a35e94d627
commit 6fbe79ad24
6 changed files with 1586 additions and 284 deletions

View File

@ -2,16 +2,16 @@ import request from '@/utils/request'
// 查询费用结算申请列表
export function getSltAgreementInfo(query) {
return request({
url: '/material/sltAgreementInfo/getSltAgreementInfo',
method: 'get',
params: query
})
}
return request({
url: '/material/sltAgreementInfo/getSltAgreementInfo',
method: 'get',
params: query
})
}
// 查询费用结算申请详情
export function getSltInfo(params){
export function getSltInfo(params) {
return request({
url: '/material/sltAgreementInfo/getSltInfo',
method: 'post',
@ -20,7 +20,7 @@ export function getSltInfo(params){
}
// 费用结算申请提交
export function submitFee(params){
export function submitFee(params) {
return request({
url: '/material/sltAgreementInfo/submitFee',
method: 'post',
@ -55,6 +55,33 @@ export function settlementReview(query) {
params: query
})
}
/**
* 7.29
*/
/** 完工结算查询 */
export const getComSellQueryApi = (params) => {
return request.post('/material/sltAgreementInfo/getSltInfo', params)
}
/** 编辑后保存接口 */
export const editSaveApi = (params) => {
return request.post('/material/sltAgreementInfo/updateTrimDay', params)
}
/** 确认结算接口 01和03费用承担方单独结算接口*/
export const submitFeeBearApi = (params) => {
return request.post('/material/sltAgreementInfo/submitFeeBear', params)
}
/** 获取月结记录接口*/
export const getMonthRecordApi = (params) => {
return request.post('/material/sltAgreementInfo/getSltInfoMonth', params)
}
/** 确认结算接口所有结算*/
export const submitAllFeeBearApi = (params) => {
return request.post('/material/sltAgreementInfo/submitFee', params)
}

View File

@ -0,0 +1,92 @@
<template>
<!-- 批量导出月结明细弹框 -->
<div>
<el-dialog
title="明细导出"
append-to-body
:visible.sync="exportDialogVisible"
:before-close="handleCloseDialog"
width="30%"
>
<el-form
:model="exportForm"
label-width="120px"
:rules="rules"
ref="formRef"
>
<!-- <el-form-item label="导出月份">
<el-date-picker
v-model="exportParams.dateMonth"
type="month"
placeholder="请选择导出月份"
value-format="yyyy-MM"
/>
</el-form-item> -->
<el-form-item label="费用承担方" prop="costBearingParty">
<el-checkbox-group v-model="exportForm.costBearingParty">
<el-checkbox label="01" name="01" />
<el-checkbox label="03" name="03" />
</el-checkbox-group>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" @click="handleSubmit"
> </el-button
>
<el-button size="mini" @click="handleCloseDialog"
> </el-button
>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
props: {
//
exportDialogVisible: {
type: Boolean,
default: () => false,
},
},
data() {
return {
exportForm: {
costBearingParty: ['01', '03'],
},
rules: {
costBearingParty: [
{ required: true, message: '请选择费用承担方' },
],
},
}
},
methods: {
/** 关闭 */
handleCloseDialog() {
this.$emit('handleCloseDialog')
},
/** 确定 */
handleSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$emit('handleSubmit', this.exportForm.costBearingParty)
}
})
},
},
watch: {
exportDialogVisible: {
handler(newVla) {
if (!newVla) {
// this.exportParams.dateMonth = ''
}
},
},
},
}
</script>

View File

@ -0,0 +1,414 @@
<template>
<!-- 完工结算和结算明细页面 -->
<div>
<PageHeader :pageContent="pageContent" @goBack="goBack" />
<div class="row-header">
<div>领用单位{{ currRowInfo.unitName }}</div>
<div>工程名称{{ currRowInfo.projectName }}</div>
<div>总合计{{ totalAmount }}</div>
<div>
<el-button size="mini" type="primary" @click="handleExportAll()"
>导出全部明细表</el-button
>
</div>
</div>
<!-- 01承担方 -->
<FinishTable
:tableColumns="settleTableColumns"
:tableTitle="`设备结算清单`"
:isCostBear="true"
:constBear="1"
:totalPrice="settleTotalPrice_01"
:tableData="settleTableData_01"
:isSettle="isSettle_01"
:listType="1"
@submitSell="submitSell"
@handleExport="handleExport"
@handelSaveSuccess="handelSaveSuccess"
v-if="settleTableData_01.length > 0"
/>
<!-- 03承担方 -->
<FinishTable
:tableColumns="settleTableColumns"
:tableTitle="`设备结算清单`"
:isCostBear="true"
:constBear="3"
:totalPrice="settleTotalPrice_03"
:tableData="settleTableData_03"
:isSettle="isSettle_03"
:listType="2"
@submitSell="submitSell"
@handleExport="handleExport"
@handelSaveSuccess="handelSaveSuccess"
v-if="settleTableData_03.length > 0"
/>
<FinishTable
:tableColumns="repairTableColumns"
:tableTitle="`设备维修清单`"
:isRepair="true"
:totalPrice="repairTotalPrice"
:tableData="repairTableData"
:currRowInfo="currRowInfo"
:listType="3"
@handleExport="handleExport"
@onChangeRepairPrice="onChangeRepairPrice"
/>
<FinishTable
:tableColumns="noReturnTableColumns"
:tableTitle="`工机具未还赔偿清单`"
:tableData="noReturnTableData"
:totalPrice="noReturnTotalPrice"
:listType="4"
@handleExport="handleExport"
/>
<FinishTable
:tableColumns="scrapTableColumns"
:tableTitle="`工机具报废赔偿清单`"
:tableData="scrapTableData"
:totalPrice="scrapTotalPrice"
:listType="5"
@handleExport="handleExport"
/>
<FinishTable
:tableColumns="stayScrapTableColumns"
:tableTitle="`工机具待报废清单`"
:tableData="stayScrapTableData"
:listType="6"
@handleExport="handleExport"
/>
<el-row class="submit-btn">
<el-button
size="mini"
type="primary"
@click="submitComSett"
v-if="currRowInfo.isSlt == 0"
>确认完工结算</el-button
>
</el-row>
</div>
</template>
<script>
import PageHeader from '@/components/pageHeader'
import FinishTable from './finishTable.vue'
import {
getComSellQueryApi,
submitFeeBearApi,
submitAllFeeBearApi,
} from '@/api/cost/cost.js'
export default {
components: {
PageHeader,
FinishTable,
},
props: {
//
pageContent: {
type: String,
default: () => '完工结算',
},
//
currRowInfo: {
type: Object,
default: () => null,
},
},
computed: {
totalAmount() {
return (
this.settleTotalPrice_01 * 1 +
this.settleTotalPrice_03 * 1 +
this.repairTotalPrice * 1 +
this.noReturnTotalPrice * 1 +
this.scrapTotalPrice * 1
)
},
},
data() {
return {
//
settleTableColumns: [
{ t_prop: 'typeName', t_label: '设备名称' },
{ t_prop: 'modelName', t_label: '规格型号' },
{ t_prop: 'nuitName', t_label: '计量单位' },
{ t_prop: 'num', t_label: '数量' },
{ t_prop: 'leasePrice', t_label: '台班费单价(元/天)' },
{ t_prop: 'startTime', t_label: '起租日期' },
{ t_prop: 'endTime', t_label: '终止日期', t_slot: 't_date' },
{ t_prop: 'leaseDays', t_label: '应结算天数' },
{ t_prop: 'costs', t_label: '应结算金额(元)' },
{ t_prop: 'trimDay', t_label: '调整天数', t_slot: 't_ipt' },
{ t_prop: 'realDays', t_label: '实际结算天数' },
{ t_prop: 'realCosts', t_label: '实际结算金额(元)' },
// { t_prop: '', t_label: '' },
// { t_prop: '', t_label: '' },
],
//
repairTableColumns: [
{ t_prop: 'typeName', t_label: '设备名称' },
{ t_prop: 'modelName', t_label: '规格型号' },
{ t_prop: 'nuitName', t_label: '计量单位' },
{ t_prop: 'partName', t_label: '维修配件名称' },
{ t_prop: 'partModelName', t_label: '维修配件型号' },
{ t_prop: 'partNum', t_label: '使用数量' },
{ t_prop: 'partPrice', t_label: '配件单价' },
{ t_prop: 'partAllCosts', t_label: '配件总价' },
// { t_prop: '', t_label: '' },
// { t_prop: '', t_label: '' },
],
//
noReturnTableColumns: [
{ t_prop: 'typeName', t_label: '设备名称' },
{ t_prop: 'modelName', t_label: '规格型号' },
{ t_prop: 'nuitName', t_label: '计量单位' },
{ t_prop: 'maCode', t_label: '设备编码' },
{ t_prop: 'num', t_label: '未还数量' },
{ t_prop: 'buyPrice', t_label: '赔偿单价' },
{ t_prop: 'costs', t_label: '赔偿金额' },
],
//
scrapTableColumns: [
{ t_prop: 'typeName', t_label: '设备名称' },
{ t_prop: 'modelName', t_label: '规格型号' },
{ t_prop: 'nuitName', t_label: '计量单位' },
{ t_prop: 'maCode', t_label: '设备编码' },
{ t_prop: 'num', t_label: '报废数量' },
{ t_prop: 'costs', t_label: '赔偿单价' },
{ t_prop: 'buyPrice', t_label: '赔偿金额' },
],
//
stayScrapTableColumns: [
{ t_prop: 'typeName', t_label: '设备名称' },
{ t_prop: 'modelName', t_label: '规格型号' },
{ t_prop: 'nuitName', t_label: '计量单位' },
{ t_prop: 'maCode', t_label: '设备编码' },
{ t_prop: 'num', t_label: '报废数量' },
{ t_prop: '', t_label: '状态', t_slot: 'status' },
],
// 01
settleTableData_01: [],
// 03
settleTableData_03: [],
//
repairTableData: [],
//
noReturnTableData: [],
//
scrapTableData: [],
//
stayScrapTableData: [],
//
settleTotalPrice_01: 0,
settleTotalPrice_03: 0,
repairTotalPrice: 0,
noReturnTotalPrice: 0,
scrapTotalPrice: 0,
//
isSettle_01: 0,
isSettle_03: 0,
//
repairSelectList: [],
}
},
created() {
this.getComSellList()
},
methods: {
/** 获取结算信息 */
async getComSellList() {
const { data: res } = await getComSellQueryApi([
{ agreementId: this.currRowInfo.agreementId },
])
this.settleTableData_01 = res.leaseListOne // 01
this.settleTableData_03 = res.leaseListThree // 03
this.repairTableData = res.repairList //
this.noReturnTableData = res.loseList //
this.scrapTableData = res.scrapList //
this.stayScrapTableData = res.preScrapList //
this.settleTotalPrice_01 = res.relations[0].leaseCostOne
this.settleTotalPrice_03 = res.relations[0].leaseCostThree
this.scrapTotalPrice = res.relations[0].scrapCost
this.noReturnTotalPrice = res.relations[0].loseCost
this.repairTotalPrice = res.relations[0].repairCost
this.isSettle_01 = res.relations[0].isSltOne
this.isSettle_03 = res.relations[0].isSltThree
},
/** 确认结算 01或03 */
async submitSell(type) {
const sellParams = {
agreementId: this.currRowInfo.agreementId,
costBearingParty: type,
}
const res = await submitFeeBearApi(sellParams)
if (res.code == 200) {
this.$message.success('结算成功!')
this.getComSellList()
}
},
/** 确认完工结算 */
submitComSett() {
this.$confirm(
'确定后则会生成财务报表,数据将不可修改,请确认检查无误',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
},
).then(async () => {
// 1. 01 03
this.$message.closeAll()
let isFlag = false
try {
// 1.1
if (this.settleTableData_01.length > 0) {
this.settleTableData_01.map((e, v) => {
if (!e.endTime) {
this.$message.error(
'结算清单内终止日期不能有空值!',
)
isFlag = true
throw new Error()
}
})
}
if (this.settleTableData_03.length > 0) {
this.settleTableData_03.map((e, v) => {
if (!e.endTime) {
this.$message.error(
'结算清单内终止日期不能有空值!',
)
isFlag = true
throw new Error()
}
})
}
} catch {}
if (isFlag) return
let repairIds = []
// 2. ids
if (this.repairSelectList.length > 0) {
this.repairSelectList.forEach((e) => {
repairIds.push(e.id)
})
}
// 3.
const params = {
repairIds: repairIds.join(','),
agreementId: this.currRowInfo.agreementId,
relation: {
leaseCostOne: this.settleTotalPrice_01, // 01
leaseCostThree: this.settleTotalPrice_03, // 0.
repairCos: this.repairTotalPrice, //
scrapCost: this.scrapTotalPrice, //
loseCost: this.noReturnTotalPrice, //
cost: this.totalAmount, //
},
}
// 4.
console.log(params, '参数---')
const res = await submitAllFeeBearApi(params)
if (res.code === 200) {
this.$message.success('结算成功!')
this.$emit('closeCurrPage', true)
}
console.log(res, '结果结果')
})
},
//
handelSaveSuccess() {
this.getComSellList()
},
/** 全部导出 */
handleExportAll() {
for (let i = 1; i < 7; i++) {
this.handleExport(i)
}
},
/** 单个导出 */
handleExport(type) {
let exportUrl = 'material/sltAgreementInfo/'
let exportTitle = ''
switch (type) {
case 1:
exportUrl += 'exportLeaseOne'
exportTitle = '设备结算清单(费用承担方01)'
break
case 2:
exportUrl += 'exportLeaseThree'
exportTitle = '设备结算清单(费用承担方03)'
break
case 3:
exportUrl += 'exportRepair'
exportTitle = '设备维修清单'
break
case 4:
exportUrl += 'exportLose'
exportTitle = '工机具未还赔偿清单'
break
case 5:
exportUrl += 'exportScrap'
exportTitle = '工机具报废赔偿清单'
break
case 6:
exportUrl += 'exportPreScrap'
exportTitle = '工机具待报废清单'
break
}
this.downloadJson(
exportUrl,
JSON.stringify([{ agreementId: this.currRowInfo.agreementId }]),
`${exportTitle}-${new Date().getTime()}.xlsx`,
)
},
/** 维修费用选择时 */
onChangeRepairPrice(val, list) {
this.repairTotalPrice = val
this.repairSelectList = list
},
/** 返回按钮 关闭当前页面 */
goBack() {
this.$emit('closeCurrPage')
},
},
}
</script>
<style scoped lang="scss">
.row-header {
margin-top: 20px;
display: flex;
align-items: center;
font-size: 16px;
font-weight: bold;
div {
margin-right: 30px;
}
& div:nth-child(3) {
margin-right: 15px;
color: rgb(255, 0, 0);
}
}
.submit-btn {
margin-top: 20px;
text-align: right;
.el-button {
padding: 10px 14px;
}
}
</style>

View File

@ -0,0 +1,420 @@
<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
>
<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)) &&
tableData.length > 0
"
@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"
:header-cell-class-name="setClassName"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
v-if="isRepair && currRowInfo.isSlt == 0"
: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>
<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>
<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,
},
},
data() {
return {
isEdit: false, //
batchNum: '', //
activeIndex: '', // index class
activeIndexTime: '', // index class
selDisabled: true,
}
},
methods: {
/** 编辑按钮 */
handleEdit() {
this.isEdit = !this.isEdit
if (!this.isEdit) {
this.batchNum = ''
this.$emit('handelSaveSuccess')
}
if (this.isRepair) {
this.$refs.tableRef.clearSelection()
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) => {
console.log(e)
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 (e.trimDay < 0 && Math.abs(e.trimDay) > e.leaseDays) {
this.$message.error('减免天数不能大于应结算天数!')
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
id: e.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('终止日期不能有空值!')
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)
},
},
}
</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>

View File

@ -0,0 +1,347 @@
<template>
<!-- 月结记录弹框 -->
<div>
<el-dialog
title="月结记录"
append-to-body
:visible.sync="monthRecordDialogVisible"
:before-close="handleCloseMonthRecordDialog"
width="80%"
>
<el-form inline :model="monthRecordParams" ref="monthRecordFormRef">
<el-form-item label="结算月份" prop="dateMonth">
<el-date-picker
v-model="dateMonth"
type="month"
placeholder="请选择月份"
value-format="yyyy-MM"
@change="onChangeTime"
/>
</el-form-item>
<el-form-item label="费用承担方" prop="costBearingParty">
<el-select
v-model="monthRecordParams.costBearingParty"
clearable
>
<el-option
v-for="item in costBearList"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>查询</el-button
>
<el-button
icon="el-icon-refresh"
size="mini"
@click="resetQuery"
>重置</el-button
>
<el-button
type="primary"
plain
size="mini"
@click="handelExport(null)"
>批量导出</el-button
>
</el-form-item>
</el-form>
<el-table
border
:data="monthRecordList"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" align="center" />
<el-table-column
prop="unitName"
align="center"
label="单位名称"
/>
<el-table-column
prop="projectName"
align="center"
label="工程名称"
/>
<el-table-column prop="month" align="center" label="结算月份" />
<el-table-column
prop="costBearingParty"
align="center"
label="费用承担方"
/>
<el-table-column prop="costs" align="center" label="结算金额" />
<el-table-column align="center" label="操作">
<template slot-scope="{ row }">
<el-button type="text" @click="previewDetails(row)"
>明细</el-button
>
<el-button type="text" @click="handelExport(row)"
>导出明细表</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
:total="monthRecordTotal"
:page.sync="monthRecordParams.pageNum"
:limit.sync="monthRecordParams.pageSize"
@pagination="getMonthRecordList"
/>
<!-- 内层弹框 -->
<el-dialog
width="75%"
title="明细"
:visible.sync="innerVisible"
append-to-body
:before-close="handleCloseMInnerDialog"
>
<el-row :gutter="20" class="title-row">
<el-col :span="12">
领用单位{{ monthDetailsInfo.unitName || '' }}
</el-col>
<el-col :span="12" class="pl-col">
月结月份
{{ monthDetailsInfo.month || '' }}</el-col
>
</el-row>
<el-row :gutter="20" class="title-row">
<el-col :span="12">
工程名称{{ monthDetailsInfo.projectName || '' }}
</el-col>
<el-col :span="12" class="pl-col" style="color: red">
费用承担方{{
monthDetailsInfo.costBearingParty || ''
}}
{{
monthDetailsInfo.costBearingParty == '01'
? '(项目)'
: '(分包)'
}}
</el-col>
</el-row>
<el-table border :data="monthDetails" max-height="600">
<el-table-column
label="序号"
align="center"
type="index"
width="55"
/>
<el-table-column
prop="typeName"
label="设备名称"
align="center"
/>
<el-table-column
prop="modelName"
label="规格型号"
align="center"
/>
<el-table-column
prop="nuitName"
label="计量单位"
align="center"
/>
<el-table-column prop="num" label="数量" align="center" />
<el-table-column
prop="leasePrice"
label="台班费单价 (元/天)"
align="center"
/>
<el-table-column
prop="startTime"
label="开始日期"
align="center"
/>
<el-table-column
prop="endTime"
label="结算日期"
align="center"
/>
<el-table-column
prop="leaseDays"
label="结算天数"
align="center"
/>
<el-table-column
prop="costs"
label="结算金额"
align="center"
/>
<el-table-column
prop="realCosts"
label="本月暂记金额(元)"
align="center"
/>
</el-table>
</el-dialog>
</el-dialog>
</div>
</template>
<script>
import { getMonthRecordApi } from '@/api/cost/cost.js'
export default {
props: {
monthRecordDialogVisible: {
type: Boolean,
default: () => false,
},
agreementId: {
type: [String, Number],
default: () => '',
},
},
data() {
return {
//
costBearList: [
{ id: 1, label: '全部', value: '' },
{ id: 2, label: '01', value: '01' },
{ id: 3, label: '03', value: '03' },
],
//
monthRecordParams: {
startTime: '',
endTime: '',
agreementId: '',
costBearingParty: '',
pageNum: 1,
pageSize: 10,
},
//
monthRecordList: [],
//
selectList: [],
//
innerVisible: false,
//
monthRecordTotal: 1,
//
dateMonth: '',
//
monthDetailsInfo: {},
//
monthDetails: [],
}
},
created() {
this.getMonthRecordList()
},
methods: {
/** 获取月结记录列表数据 */
async getMonthRecordList() {
this.monthRecordParams.agreementId = this.agreementId
// Api
const res = await getMonthRecordApi([this.monthRecordParams])
this.monthRecordList = res.data
},
/** 查询 */
handleQuery() {
this.getMonthRecordList()
},
/** 重置 */
resetQuery() {
this.resetForm('monthRecordFormRef')
this.monthRecordParams.startTime = ''
this.monthRecordParams.endTime = ''
this.dateMonth = ''
this.getMonthRecordList()
},
/** 导出按钮 */
handelExport(row) {
// row null
const { startTime, endTime, agreementId, costBearingParty } =
this.monthRecordParams
let exportList = [
{
codeNum: '',
startTime,
endTime,
agreementId,
costBearingParty,
},
]
if (!row && this.selectList.length < 1) {
this.$message.error('请勾选需要导出的数据!')
return
} else if (!row && this.selectList.length > 0) {
this.selectList.map((e) => {
exportList[0].codeNum += e.codeNum + ','
})
exportList[0].codeNum = exportList[0].codeNum.slice(0, -1)
} else {
exportList[0].codeNum = row.codeNum
}
this.downloadJson(
'material/sltAgreementInfo/exportSltInfoMonth',
JSON.stringify(exportList),
`月结明细${new Date().getTime()}.xlsx`,
)
},
/** 列表勾选 */
handleSelectionChange(list) {
this.selectList = list
},
/** 关闭外侧弹框*/
handleCloseMonthRecordDialog() {
this.$emit('handleCloseMonthRecordDialog')
},
/** 关闭内测弹框 */
handleCloseMInnerDialog() {
this.innerVisible = false
},
/** 明细按钮 */
previewDetails(row) {
const { unitName, month, projectName, costBearingParty } = row
this.monthDetailsInfo = {
unitName,
month,
projectName,
costBearingParty,
}
console.log(row, '明细')
this.monthDetails = row.node
this.innerVisible = true
},
/** 时间变化 */
onChangeTime(val) {
let startTime = ''
if (val.split('-')[1] == 1) {
startTime = `${val.split('-')[0] * 1 - 1}-12-21`
} else {
startTime = `${val.split('-')[0]}-0${
val.split('-')[1] * 1 - 1
}-21`
}
let endTime = val + '-20'
this.monthRecordParams.startTime = startTime
this.monthRecordParams.endTime = endTime
},
},
}
</script>
<style scoped>
.title-row {
min-height: 38px;
line-height: 38px;
font-size: 16px;
}
.pl-col {
padding-left: 180px !important;
}
</style>

View File

@ -1,207 +1,217 @@
<template>
<!-- 费用结算页面 -->
<div class="app-container" id="costApplyList">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="80px"
>
<el-form-item label="结算单位" prop="unitId">
<el-select
v-model="queryParams.unitId"
placeholder="请选择往来单位"
clearable
filterable
>
<el-option
v-for="item in unitList"
:key="item.unitId"
:label="item.unitName"
:value="item.unitId"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="结算工程" prop="projectId">
<el-select
v-model="queryParams.projectId"
placeholder="请选择工程名称"
clearable
filterable
>
<el-option
v-for="item in projectList"
:key="item.projectId"
:label="item.projectName"
:value="item.projectId"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="结算状态" prop="sltStatus">
<el-select
v-model="queryParams.sltStatus"
placeholder="请选择结算状态"
clearable
filterable
>
<el-option
v-for="item in statusList"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>查询</el-button
>
<el-button
icon="el-icon-refresh"
size="mini"
@click="resetQuery"
>重置</el-button
>
<el-button
type="primary"
plain
size="mini"
@click="handleApplyList"
>批量结算</el-button
>
</el-form-item>
</el-form>
<el-table
v-loading="loading"
:data="agreementList"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column
label="序号"
align="center"
width="80"
type="index"
<template v-if="isHome">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="80px"
>
<template scope="scope">
<span>{{
(queryParams.pageNum - 1) * 10 + scope.$index + 1
}}</span>
</template>
</el-table-column> -->
<el-table-column
align="center"
label="序号"
type="index"
:index="
indexContinuation(queryParams.pageNum, queryParams.pageSize)
"
/>
<el-table-column
label="协议编号"
align="center"
prop="agreementCode"
:show-overflow-tooltip="true"
/>
<!-- <el-table-column label="合同编号" align="center" prop="contractCode" :show-overflow-tooltip="true" />
<el-table-column label="附件图片" align="center" prop="fileName" :show-overflow-tooltip="true" />
<el-table-column label="签订日期" align="center" prop="signTime" :show-overflow-tooltip="true" /> -->
<el-table-column
label="结算单位"
align="center"
prop="unitName"
:show-overflow-tooltip="true"
/>
<el-table-column
label="结算工程"
align="center"
prop="projectName"
:show-overflow-tooltip="true"
/>
<el-table-column
label="合计费用"
align="center"
prop="cost"
:show-overflow-tooltip="true"
/>
<el-table-column
label="结算状态"
align="center"
prop="sltStatus"
:show-overflow-tooltip="true"
>
<template slot-scope="scope">
<span v-if="scope.row.sltStatus == '1'">未结算</span>
<span v-if="scope.row.sltStatus == '2'">已结算</span>
<span v-if="scope.row.sltStatus == '3'">待审核</span>
</template>
</el-table-column>
<!-- <el-table-column label="租赁期限(天)" align="center" prop="leaseDay" :show-overflow-tooltip="true" />
<el-table-column label="授权人" align="center" prop="authPerson" :show-overflow-tooltip="true" />
<el-table-column label="联系电话 " align="center" prop="phone" :show-overflow-tooltip="true" />
<el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" /> -->
<el-table-column
label="操作"
align="center"
width="300"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
type="primary"
icon="el-icon-edit"
@click="handleApply(scope.row)"
v-if="scope.row.sltStatus != '2'"
>结算申请</el-button
<el-form-item label="结算单位" prop="unitId">
<el-select
v-model="queryParams.unitId"
placeholder="请选择往来单位"
clearable
filterable
>
<!-- <el-button
size="mini"
type="danger"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
>撤销申请</el-button> -->
</template>
</el-table-column>
</el-table>
<el-option
v-for="item in unitList"
:key="item.unitId"
:label="item.unitName"
:value="item.unitId"
/>
</el-select>
</el-form-item>
<el-form-item label="结算工程" prop="projectId">
<el-select
v-model="queryParams.projectId"
placeholder="请选择工程名称"
clearable
filterable
>
<el-option
v-for="item in projectList"
:key="item.projectId"
:label="item.projectName"
:value="item.projectId"
/>
</el-select>
</el-form-item>
<el-form-item label="结算状态" prop="sltStatus">
<el-select
v-model="queryParams.sltStatus"
placeholder="请选择结算状态"
clearable
filterable
>
<el-option
v-for="item in statusList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>查询</el-button
>
<el-button
icon="el-icon-refresh"
size="mini"
@click="resetQuery"
>重置</el-button
>
<el-button
type="primary"
plain
size="mini"
@click="handleBatchExport"
>批量导出月结明细表</el-button
>
</el-form-item>
</el-form>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<el-table
v-loading="loading"
:data="agreementList"
border
@selection-change="handleSelectionChange"
ref="tableRef"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column
align="center"
label="序号"
type="index"
:index="
indexContinuation(
queryParams.pageNum,
queryParams.pageSize,
)
"
/>
<el-table-column
label="协议编号"
align="center"
prop="agreementCode"
show-overflow-tooltipp
/>
<el-table-column
label="结算单位"
align="center"
prop="unitName"
show-overflow-tooltip
/>
<el-table-column
label="结算工程"
align="center"
prop="projectName"
show-overflow-tooltip
/>
<el-table-column
label="累计结算费用"
align="center"
prop="cost"
show-overflow-tooltip
/>
<el-table-column label="结算状态" align="center">
<template slot-scope="{ row }">
<!-- <span v-if="scope.row.sltStatus == '1'">未结算</span>
<span v-if="scope.row.sltStatus == '2'">已结算</span>
<span v-if="scope.row.sltStatus == '3'">待审核</span> -->
<el-tag type="warning" size="mini" v-if="row.isSlt == 0"
>结算中</el-tag
>
<el-tag type="success" size="mini" v-if="row.isSlt == 1"
>已结算</el-tag
>
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="{ row }">
<el-button
size="mini"
type="primary"
style="padding: 5px 10px"
@click="handleMonthRecord(row)"
>月结记录</el-button
>
<el-button
size="mini"
:type="row.isSlt == 1 ? 'success' : 'primary'"
style="padding: 5px 10px"
@click="handleFinishCostAndDetails(row)"
>{{
row.isSlt == 1 ? '结算明细' : '完工结算'
}}</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 批量导出月结明细 -->
<ExportDialog
:exportDialogVisible="exportDialogVisible"
:exportParams="exportParams"
@handleCloseDialog="handleCloseDialog"
@handleSubmit="handleSubmit"
/>
<!-- 月结记录弹框 -->
<MonthRecord
v-if="monthRecordDialogVisible"
:monthRecordDialogVisible="monthRecordDialogVisible"
:agreementId="agreementId"
@handleCloseMonthRecordDialog="handleCloseMonthRecordDialog"
/>
</template>
<template v-else>
<FinishAndDetails
:currRowInfo="currRowInfo"
:pageContent="pageContent"
@closeCurrPage="closeCurrPage"
/>
</template>
</div>
</template>
<script>
import {
getAgreementList,
getUnitList,
getProjectList,
} from '@/api/claimAndRefund/receive'
import { getUnitList, getProjectList } from '@/api/claimAndRefund/receive'
import { getSltAgreementInfo } from '@/api/cost/cost'
import ExportDialog from './component/exportDialog.vue'
import MonthRecord from './component/monthRecord.vue'
import FinishAndDetails from './component/finishAndDetails.vue'
export default {
name: 'CostApplyList',
dicts: ['sys_normal_disable'],
components: {
ExportDialog,
MonthRecord,
FinishAndDetails,
},
data() {
return {
//
loading: true,
loading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
@ -211,13 +221,16 @@ export default {
//
projectList: [],
statusList: [
{ id: '0', name: '请选择' },
{ id: '1', name: '未结算' },
{ id: '2', name: '已结算' },
{ id: '3', name: '待审核' },
{ id: '', name: '请选择' },
{ id: '0', name: '结算中' },
{ id: '1', name: '已结算' },
], //
//
agreementList: [],
agreementList: [
{
agreementCode: '测试',
},
],
//
title: '',
//
@ -233,66 +246,20 @@ export default {
unitId: '',
projectId: '',
},
//
form: {},
//
uploadHeader: process.env.VUE_APP_BASE_API,
imageUrl: '',
imageName: '',
fileList: [],
field101fileList: [],
dialogImageUrl: '',
dialogVisible: false,
//
// uploadUrl:'http://192.168.0.14:21624/system',//线+system
// uploadUrl:'http://112.29.103.165:21626/system',//线+system
uploadUrl: process.env.VUE_APP_BASE_API + '/system', //
//
rules: {
contractCode: [
{
required: true,
message: '合同编号不能为空',
trigger: 'blur',
},
],
signTime: [
{
required: true,
message: '签订日期不能为空',
trigger: 'blur',
},
],
unitName: [
{
required: true,
message: '往来单位不能为空',
trigger: 'blur',
},
],
projectName: [
{
required: true,
message: '工程名称不能为空',
trigger: 'blur',
},
],
},
peopleOpen: false,
noticeOpen: false,
nform: {
notice: '',
},
nrules: {
notice: [
{
required: true,
message: '通知内容不能为空',
trigger: 'blur',
},
],
},
deptName: undefined,
//
exportDialogVisible: false,
//
monthRecordDialogVisible: false,
//
isHome: true,
//
currRowInfo: null,
//
pageContent: '',
//
agreementId: '',
//
exportParams: [],
}
},
created() {
@ -361,35 +328,70 @@ export default {
//
handleSelectionChange(selection) {
this.ids = selection.map((item) => item)
this.single = selection.length != 1
this.multiple = !selection.length
},
/** 删除按钮操作 */
handleDelete(row) {
// const agreementId = row.agreementId;
// let param = {
// agreementId:row.agreementId+''
// }
// this.$modal.confirm('').then(function() {
// return removeAgreement(param);
// }).then(() => {
// this.getList();
// this.$modal.msgSuccess("");
// }).catch(() => {});
/** 批量导出月结明细表 */
handleBatchExport() {
console.log('批量导出月结明细表')
this.exportParams = []
if (this.ids.length < 1) {
this.$message.error('请勾选需要导出的数据!')
return
}
// id
this.ids.forEach((e) => {
this.exportParams.push({
agreementId: e.agreementId,
costBearingParty: '',
})
})
this.exportDialogVisible = true
},
/** 导出按钮操作 */
handleExport() {
// this.download('material/agreementInfo/export', {
// ...this.queryParams
// }, `_${new Date().getTime()}.xlsx`)
/** 关闭弹框 */
handleCloseDialog() {
this.exportDialogVisible = false
},
/** 确定按钮 */
handleSubmit(form) {
if (form.length === 1) {
this.exportParams.forEach((e) => {
e.costBearingParty = form[0]
})
}
this.downloadJson(
'material/sltAgreementInfo/exportSltInfoMonth',
JSON.stringify(this.exportParams),
`月结明细${new Date().getTime()}.xlsx`,
)
this.exportDialogVisible = false
this.$refs.tableRef.clearSelection()
},
/** 月结记录 */
handleMonthRecord(row) {
this.agreementId = row.agreementId
this.monthRecordDialogVisible = true
},
/** 完工结算 结算明细*/
handleFinishCostAndDetails(row) {
this.currRowInfo = row
this.pageContent = '结算明细'
this.isHome = false
},
/** 关闭月结记录弹框 */
handleCloseMonthRecordDialog() {
this.monthRecordDialogVisible = false
},
/** 关闭完工结算或结算明细页面 */
closeCurrPage(isRefresh) {
this.isHome = true
if (isRefresh) {
this.getList()
}
},
},
}
</script>
<style lang="scss" scoped>
::v-deep.el-table .fixed-width .el-button--mini {
width: 80px !important;
margin-bottom: 10px;
}
</style>