This commit is contained in:
xuyuncong 2025-10-21 18:37:28 +08:00
parent 6ec6c1cf61
commit 8e2f59cb96
6 changed files with 773 additions and 8 deletions

View File

@ -0,0 +1,44 @@
import request from '@/utils/request'
// 查询挂账单位列表
export function getChargeCompanyList(params) {
return request({
url: '/base-charge-company/page',
method: 'get',
params
})
}
// 获取挂账单位详情
export function getChargeCompany(id) {
return request({
url: `/base-charge-company/get?id=${id}`,
method: 'get'
})
}
// 新增挂账单位
export function addChargeCompany(data) {
return request({
url: '/base-charge-company/create',
method: 'post',
data
})
}
// 修改挂账单位
export function updateChargeCompany(data) {
return request({
url: '/base-charge-company/update',
method: 'put',
data
})
}
// 删除挂账单位
export function deleteChargeCompany(ids) {
return request({
url: `/base-charge-company/delete?id=${ids}`,
method: 'delete'
})
}

View File

@ -0,0 +1,219 @@
<template>
<el-form ref="form" :model="formData" :rules="rules" label-width="120px">
<el-form-item label="单位名称" prop="companyName">
<el-input v-model="formData.companyName" placeholder="请输入单位名称" />
</el-form-item>
<el-form-item label="联系人" prop="contactPerson">
<el-input v-model="formData.contactPerson" placeholder="请输入联系人" />
</el-form-item>
<el-form-item label="联系电话" prop="contactPhone">
<el-input v-model="formData.contactPhone" placeholder="请输入联系电话" />
</el-form-item>
<el-form-item label="单位地址" prop="address">
<el-input v-model="formData.address" placeholder="请输入单位地址" />
</el-form-item>
<!--
<el-form-item label="状态" prop="status">
<el-switch v-model="formData.status" active-text="启用" inactive-text="禁用" />
</el-form-item> -->
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" type="textarea" />
</el-form-item>
</el-form>
</template>
<script>
export default {
name: 'ChargeCompanyForm',
props: {
// v-model value
value: {
type: Object,
default: () => ({})
},
// systemCode
systemCode: {
type: [String, Number],
default: ''
}
},
data() {
return {
// 便 el-form resetFields
formData: {
id: null,
companyName: null,
contactPerson: null,
contactPhone: null,
address: null,
status: false,
systemCode: '', // created
remark: null
},
//
isSyncingFromParent: false,
rules: {
companyName: [
{ required: true, message: '单位名称不能为空', trigger: 'blur' }
],
contactPerson: [
{ required: true, message: '联系人不能为空', trigger: 'blur' }
],
contactPhone: [
{ required: true, message: '联系电话不能为空', trigger: 'blur' },
{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号码', trigger: 'blur' }
]
}
}
},
watch: {
// systemCode field systemCode
systemCode: {
handler(newVal) {
// 使 $set Vue2
this.$set(this.formData, 'systemCode', newVal === undefined || newVal === null ? '' : newVal)
},
immediate: true
},
// value v-model
value: {
handler(newVal) {
// emit
this.isSyncingFromParent = true
if (newVal && Object.keys(newVal).length > 0) {
// systemCode systemCode systemCode Prop
const keepSystemCode = this.formData.systemCode
// 使 Object.assign formData el-form
Object.assign(this.formData, { ...newVal })
// / systemCode value systemCode
this.$set(this.formData, 'systemCode', keepSystemCode)
} else {
// newVal null systemCode
const keepSystemCode = this.formData.systemCode
Object.assign(this.formData, {
id: null,
companyName: null,
contactPerson: null,
contactPhone: null,
address: null,
status: false,
remark: null
})
this.$set(this.formData, 'systemCode', keepSystemCode)
}
// tick emit
this.$nextTick(() => {
this.isSyncingFromParent = false
})
},
immediate: true,
deep: true
},
// emit v-model
// emit
formData: {
handler(newVal) {
if (this.isSyncingFromParent) {
// emit
return
}
//
this.$emit('input', { ...newVal })
},
deep: true
}
},
methods: {
// callback (valid, fields)
validate(callback) {
if (!this.$refs.form) {
const error = new Error('form ref not found')
if (typeof callback === 'function') callback(false, error)
return Promise.reject(error)
}
// Element UI validate Promise
return new Promise((resolve, reject) => {
this.$refs.form.validate((valid, fields) => {
if (typeof callback === 'function') callback(valid, fields)
if (valid) resolve(true)
else reject(fields)
})
})
},
// systemCode
resetFields() {
if (!this.$refs.form) return
// resetFields model model
this.$refs.form.resetFields()
// systemCode props
this.$set(this.formData, 'systemCode', this.systemCode || '')
},
//
clearValidate() {
if (!this.$refs.form) return
this.$refs.form.clearValidate()
},
// formData systemCode
resetFormData() {
const keepSystemCode = this.systemCode || this.formData.systemCode || ''
Object.assign(this.formData, {
id: null,
companyName: null,
contactPerson: null,
contactPhone: null,
address: null,
status: false,
remark: null
})
this.$set(this.formData, 'systemCode', keepSystemCode)
this.$nextTick(() => {
this.clearValidate()
// emit
this.$emit('input', { ...this.formData })
})
},
// systemCode
setFormData(data = {}) {
if (!data) return
const keepSystemCode = this.formData.systemCode
// emit
this.isSyncingFromParent = true
Object.assign(this.formData, { ...data })
this.$set(this.formData, 'systemCode', keepSystemCode)
this.$nextTick(() => {
this.isSyncingFromParent = false
})
}
},
created() {
// systemCode 使 props
this.$set(this.formData, 'systemCode', this.systemCode || '')
// value value watcher immediate
}
}
</script>
<style scoped>
.el-form {
padding: 20px 10px 0 0;
}
.el-input,
.el-textarea {
width: 100%;
}
</style>

View File

@ -0,0 +1,313 @@
<template>
<div class="app-container">
<!-- 搜索表单 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="单位名称" prop="companyName">
<el-input
v-model="queryParams.companyName"
placeholder="请输入单位名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="true"></el-option>
<el-option label="禁用" :value="false"></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-form-item>
</el-form>
<!-- 工具栏 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
>删除
</el-button>
</el-col>
</el-row>
<!-- 数据表格 -->
<el-table
v-loading="loading"
:data="chargeCompanyList"
@selection-change="handleSelectionChange"
style="width: 100%"
>
<el-table-column type="selection" width="55" align="center"></el-table-column>
<el-table-column label="单位名称" prop="companyName" min-width="180"></el-table-column>
<el-table-column label="联系人" prop="contactPerson" min-width="120"></el-table-column>
<el-table-column label="联系电话" prop="contactPhone" min-width="150"></el-table-column>
<el-table-column label="单位地址" prop="address" min-width="200"></el-table-column>
<el-table-column label="状态" prop="status" min-width="120">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
active-text="启用"
inactive-text="禁用"
@change="handleStatusChange(scope.row)"
:disabled="!checkPermi(['chargeCompany:status:edit'])"
></el-switch>
</template>
</el-table-column>
<el-table-column label="备注" prop="remark" min-width="180"></el-table-column>
<!-- <el-table-column label="创建时间" prop="createTime" min-width="180"></el-table-column> -->
<el-table-column label="操作" min-width="120" fixed="right">
<template slot-scope="scope">
<el-button
type="text"
icon="el-icon-edit"
size="mini"
@click="handleUpdate(scope.row)"
>编辑</el-button>
<el-button
type="text"
icon="el-icon-delete"
size="mini"
@click="handleDelete(scope.row)"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改挂账单位对话框 -->
<el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
<ChargeCompanyForm
ref="chargeCompanyForm"
v-model="formData"
:systemCode="queryParams.systemCode || systemCode || ''"
/>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { getChargeCompanyList, getChargeCompany, addChargeCompany, updateChargeCompany, deleteChargeCompany } from './api/chargeCompanyApi'
import Pagination from '@/components/Pagination'
import { getLastPathSegment } from '@/utils/ruoyi'
import ChargeCompanyForm from './form/ChargeCompanyForm'
export default {
name: 'ChargeCompany',
components: {
Pagination,
ChargeCompanyForm
},
props: {
// systemCodenullcreated
systemCode: {
type: String,
default: null
}
},
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
chargeCompanyList: [],
//
title: '',
//
open: false,
//
queryParams: {
pageNo: 1,
pageSize: 10,
companyName: null,
status: null,
systemCode: ''
},
//
formData: {
id: null,
companyName: null,
contactPerson: null,
contactPhone: null,
address: null,
status: false,
systemCode: '',
remark: null
}
}
},
created() {
// systemCode
const currentSystemCode = String(this.systemCode || getLastPathSegment(this.$route.path))
this.queryParams.systemCode = currentSystemCode
this.formData.systemCode = currentSystemCode
this.getList()
},
watch: {
// systemCode
systemCode: function(newVal) {
const systemCodeStr = String(newVal || '')
this.queryParams.systemCode = systemCodeStr
this.formData.systemCode = systemCodeStr
this.getList()
}
},
methods: {
/** 查询挂账单位列表 */
getList() {
this.loading = true
getChargeCompanyList(this.queryParams).then(response => {
this.chargeCompanyList = response.data.records
this.total = response.data.total
this.loading = false
})
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNo = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm('queryForm')
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
// systemCode
this.formData.systemCode = this.queryParams.systemCode
this.open = true
this.title = '新增挂账单位'
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getChargeCompany(id).then(response => {
this.formData = response.data
this.open = true
this.title = '修改挂账单位'
})
},
/** 状态变更 */
handleStatusChange(row) {
const statusMsg = row.status ? '启用' : '禁用'
this.$modal.confirm(`是否确认${statusMsg}该挂账单位?`).then(() => {
updateChargeCompany(row).then(() => {
this.$modal.msgSuccess(`${statusMsg}成功`)
this.getList()
}).catch(() => {
row.status = !row.status //
this.$modal.msgError(`${statusMsg}失败`)
})
}).catch(() => {
row.status = !row.status //
})
},
/** 提交按钮 */
submitForm() {
this.$refs.chargeCompanyForm.validate(valid => {
if (valid) {
if (this.formData.id != null) {
updateChargeCompany(this.formData).then(() => {
this.$modal.msgSuccess('修改成功')
this.open = false
this.getList()
})
} else {
addChargeCompany(this.formData).then(() => {
this.$modal.msgSuccess('新增成功')
this.open = false
this.getList()
})
}
}
})
},
/** 取消按钮 */
cancel() {
this.open = false
this.reset()
},
/** 重置表单 */
reset() {
this.formData = {
id: null,
companyName: null,
contactPerson: null,
contactPhone: null,
address: null,
status: false,
systemCode: this.queryParams.systemCode,
remark: null
}
if (this.$refs.chargeCompanyForm) {
this.$refs.chargeCompanyForm.resetFields()
}
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除所选挂账单位?').then(() => {
return deleteChargeCompany(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess('删除成功')
}).catch(() => {})
}
}
}
</script>
<style scoped>
.app-container {
padding: 20px;
}
.mb8 {
margin-bottom: 8px;
}
</style>

View File

@ -348,7 +348,8 @@ export default {
isInsert: false,
//
form: {
driverLicenseTypeArr: []
driverLicenseTypeArr: [],
roleIds:[]
},
defaultProps: {
children: "children",

View File

@ -221,6 +221,7 @@
label="参考成本"
align="center"
prop="accessoriesMoney"
v-if="checkPermi(['repair:tick:profit'])"
width="180"
/>

View File

@ -285,6 +285,40 @@
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="1">
<el-col :span="24">
<el-form-item label="支付方式" prop="payType">
<el-radio-group v-model="settlementFormData.payType" @change="handlePayTypeChange">
<el-radio label="xj">现结</el-radio>
<el-radio label="gz">挂账</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="1" v-if="settlementFormData.payType === 'gz'">
<el-col :span="24">
<el-form-item label="挂账单位" prop="chargeCompanyId">
<el-select
v-model="settlementFormData.chargeCompanyId"
placeholder="请选择挂账单位"
filterable
remote
:remote-method="searchChargeCompany"
:loading="searchLoading"
>
<el-option
v-for="item in chargeCompanyList"
:key="item.id"
:label="item.companyName"
:value="item.id">
</el-option>
</el-select>
<el-button type="text" @click="handleAddChargeCompany">申请新增</el-button>
</el-form-item>
</el-col>
</el-row>
<!-- <el-row :gutter="1">-->
<!-- <el-col :span="24">-->
<!-- <el-form-item label="结算备注" prop="remark">-->
@ -374,6 +408,45 @@
<p>数据加载中...</p>
</div>
</div>
<!-- 新增挂账单位弹窗 -->
<el-dialog title="申请新增挂账单位" :visible.sync="chargeCompanyDialogVisible" width="500px" append-to-body>
<el-form ref="chargeCompanyFormRef" :model="chargeCompanyForm" :rules="chargeCompanyRules" label-width="120px">
<el-form-item label="单位名称" prop="companyName">
<el-input v-model="chargeCompanyForm.companyName" placeholder="请输入单位名称" />
</el-form-item>
<el-form-item label="联系人" prop="contactPerson">
<el-input v-model="chargeCompanyForm.contactPerson" placeholder="请输入联系人" />
</el-form-item>
<el-form-item label="联系电话" prop="contactPhone">
<el-input v-model="chargeCompanyForm.contactPhone" placeholder="请输入联系电话" />
</el-form-item>
<el-form-item label="单位地址" prop="address">
<el-input v-model="chargeCompanyForm.address" placeholder="请输入单位地址" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="chargeCompanyForm.remark" placeholder="请输入备注" type="textarea" />
</el-form-item>
<!-- 隐藏字段 -->
<el-form-item label="" prop="status" style="display: none;">
<el-input v-model="chargeCompanyForm.status" type="hidden" />
</el-form-item>
<el-form-item label="" prop="systemCode" style="display: none;">
<el-input v-model="chargeCompanyForm.systemCode" type="hidden" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitChargeCompany"> </el-button>
<el-button @click="cancelChargeCompany"> </el-button>
</div>
</el-dialog>
</div>
</template>
@ -391,6 +464,7 @@ import {
import TicketsShow from "@/views/repair/tickets/Components/TicketsShow.vue";
import {getByNameAndMobile} from "@/api/base/customer";
import EditTickets from "@/views/repair/tickets/form/EditTickets.vue";
import { getChargeCompanyList, addChargeCompany } from '@/views/base/chargeCompany/api/chargeCompanyApi'
export default {
name: "TicketTable",
@ -428,8 +502,28 @@ export default {
settlementFormData: {
actualMoney: 0,
discountType: this.defaultDiscountType,
discount: 0
discount: 0,
payType: 'xj', //
chargeCompanyId: null
},
chargeCompanyList: [], //
searchLoading: false, //
//
chargeCompanyForm: {
companyName: '',
contactPerson: '',
contactPhone: '',
address: '',
status: false, //
systemCode: 'repair',
remark: ''
},
chargeCompanyRules: {
companyName: [{ required: true, message: '单位名称不能为空', trigger: 'blur' }],
contactPerson: [{ required: true, message: '联系人不能为空', trigger: 'blur' }],
contactPhone: [{ required: true, message: '联系电话不能为空', trigger: 'blur' }]
},
chargeCompanyDialogVisible: false, //
formRules: {
payType: [{required: true, message: '支付方式不能为空', trigger: 'blur'}],
isPaid: [{required: true, message: '请选择是否支付', trigger: 'blur'}],
@ -556,6 +650,55 @@ export default {
}
console.log(this.settlementFormData)
},
//
async handlePayTypeChange(value) {
if (value === 'gz') {
// systemCoderepair
try {
const res = await getChargeCompanyList({
status: 1,
systemCode: 'repair'
});
this.chargeCompanyList = res.data.records || [];
} catch (err) {
console.error('获取挂账单位列表失败:', err);
this.$modal.msgError('获取挂账单位列表失败');
}
}
},
//
async searchChargeCompany(query) {
if (query !== '') {
this.searchLoading = true;
try {
const res = await getChargeCompanyList({
companyName: query,
status: 1,
systemCode: 'repair'
});
this.chargeCompanyList = res.data.records || [];
} catch (err) {
console.error('搜索挂账单位失败:', err);
this.$modal.msgError('搜索挂账单位失败');
} finally {
this.searchLoading = false;
}
} else {
//
try {
const res = await getChargeCompanyList({
status: 1,
systemCode: 'repair'
});
this.chargeCompanyList = res.data.records || [];
} catch (err) {
console.error('获取挂账单位列表失败:', err);
this.$modal.msgError('获取挂账单位列表失败');
}
}
},
//
handlePaid(row) {
@ -627,13 +770,16 @@ export default {
}
},
async doSettlement() {
console.log('提交的数据',this.settlementFormData);
try {
await this.$refs['formRefSettlement'].validate()
if (this.settlementType === 'jssh') {
await settlementReview(this.settlementFormData)
} else {
await setTicketsSettlement(this.settlementFormData)
}
// if (this.settlementType === 'jssh') {
// await settlementReview(this.settlementFormData)
// } else {
// await setTicketsSettlement(this.settlementFormData)
// }
this.$modal.msgSuccess("提交成功")
this.dialogVisibleSettlement = false
this.$emit("setVoid")
@ -749,6 +895,47 @@ export default {
}
});
},
//
handleAddChargeCompany() {
//
this.chargeCompanyForm = {
companyName: '',
contactPerson: '',
contactPhone: '',
address: '',
status: false, //
systemCode: 'repair',
remark: ''
};
this.chargeCompanyDialogVisible = true;
},
//
async submitChargeCompany() {
this.$refs.chargeCompanyFormRef.validate(async (valid) => {
if (valid) {
try {
await addChargeCompany(this.chargeCompanyForm);
this.$modal.msgSuccess('挂账单位申请成功,请等待审核');
this.chargeCompanyDialogVisible = false;
//
if (this.settlementFormData.payType === 'gz') {
await this.searchChargeCompany(''); //
}
} catch (err) {
console.error('新增挂账单位失败:', err);
this.$modal.msgError('新增挂账单位失败');
}
}
});
},
//
cancelChargeCompany() {
this.chargeCompanyDialogVisible = false;
this.$refs.chargeCompanyFormRef && this.$refs.chargeCompanyFormRef.resetFields();
}
}
}
</script>
@ -779,4 +966,4 @@ export default {
color: #409EFF;
margin-bottom: 10px;
}
</style>
</style>