Merge branch 'master' into repair

# Conflicts:
#	src/store/modules/permission.js
This commit is contained in:
xyc 2025-08-01 14:43:01 +08:00
commit ab82fc9228
7 changed files with 932 additions and 142 deletions

View File

@ -0,0 +1,22 @@
import request from '@/utils/request'
export function getInfo(){
return request({
url: '/inspection-reminder-config',
method: 'get',
})
}
export function add(data){
return request({
url: '/inspection-reminder-config',
method: 'post',
data: data
})
}
export function update(data){
return request({
url: '/inspection-reminder-config',
method: 'put',
data: data
})
}

View File

@ -0,0 +1,210 @@
<template>
<div class="inspection-reminder-config">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>年审和年检提醒配置</span>
</div>
<el-form
ref="form"
:model="form"
:rules="rules"
label-width="180px"
label-position="right"
>
<el-form-item label="开启提醒-状态" prop="status">
<el-switch
v-model="form.status"
:active-value="0"
:inactive-value="1"
active-text="启用"
inactive-text="禁用"
>
</el-switch>
</el-form-item>
<el-form-item label="年审提前提醒天数" prop="annualEviewDay">
<el-input-number
v-model="form.annualEviewDay"
:min="1"
placeholder="请输入年审提前提醒天数"
></el-input-number>
<span class="tip-text"></span>
</el-form-item>
<el-form-item label="保险提前提醒天数" prop="insuranceDay">
<el-input-number
v-model="form.insuranceDay"
:min="1"
placeholder="请输入保险提前提醒天数"
></el-input-number>
<span class="tip-text"></span>
</el-form-item>
<el-form-item label="提醒对象" prop="reminderPeople">
<el-radio-group v-model="form.reminderPeople">
<el-radio :label="0">车主</el-radio>
<el-radio :label="1">经办人</el-radio>
<el-radio :label="2">都提醒</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="短信AppId" prop="sdkAppId">
<el-input
v-model="form.sdkAppId"
placeholder="请输入短信AppId"
clearable
></el-input>
</el-form-item>
<el-form-item label="短信签名" prop="signName">
<el-input
v-model="form.signName"
placeholder="请输入短信签名"
clearable
></el-input>
</el-form-item>
<el-form-item label="短信模板ID" prop="templateId">
<el-input
v-model="form.templateId"
placeholder="请输入短信模板ID"
clearable
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm">保存配置</el-button>
<el-button @click="resetForm">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</template>
<script>
import { add, getInfo, update } from "@/api/inspection/reminderConfig";
export default {
name: "index",
data() {
return {
form: {
id: null,
annualEviewDay: null,
insuranceDay: null,
status: 0,
reminderPeople: 2,
sdkAppId: "",
signName: "",
templateId: "",
},
rules: {
annualEviewDay: [
{
required: true,
message: "请输入年审提前提醒天数",
trigger: "blur",
},
{
type: "number",
min: 1,
message: "天数必须在1-30之间",
trigger: "blur",
},
],
insuranceDay: [
{
required: true,
message: "请输入保险提前提醒天数",
trigger: "blur",
},
{
type: "number",
min: 1,
message: "天数必须在1-30之间",
trigger: "blur",
},
],
reminderPeople: [
{ required: true, message: "请选择提醒对象", trigger: "change" },
],
sdkAppId: [
{ required: true, message: "请输入短信AppId", trigger: "blur" },
],
signName: [
{ required: true, message: "请输入短信签名", trigger: "blur" },
],
templateId: [
{ required: true, message: "请输入短信模板ID", trigger: "blur" },
],
},
};
},
created() {
this.fetchConfig();
},
methods: {
//
async fetchConfig() {
const response = await getInfo();
if (response.data) {
this.form = response.data;
}
},
//
async submitForm() {
this.$refs.form.validate(async (valid) => {
if (valid) {
// API
if (this.form.id) {
const res = await update(this.form);
if (res.code === 0) {
this.$message.success("配置修改成功");
this.fetchConfig(); //
}
} else {
const res = await add(this.form);
if (res.code === 0) {
this.$message.success("配置保存成功");
this.fetchConfig();
}
}
} else {
return false;
}
});
},
//
resetForm() {
this.$refs.form.resetFields();
},
},
};
</script>
<style scoped>
.inspection-reminder-config {
padding: 20px;
}
.box-card {
max-width: 1000px;
margin: 0 auto;
}
.tip-text {
margin-left: 10px;
color: #999;
}
.el-input-number {
width: 200px;
}
.el-input {
width: 300px;
}
</style>

View File

@ -0,0 +1,7 @@
export function getServerData1(params) {
return request({
url: '/partnerOwn/partner/chartInfoAmount',
method: 'get',
params: params
})
}

View File

@ -0,0 +1,370 @@
<template>
<div class="statistics-container">
<!-- 检测数量统计 -->
<el-card class="box-card" shadow="hover">
<div slot="header">
<span>检测数量统计</span>
<el-date-picker
v-model="ranges"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
@change="slectRangeInspectionCount"
style="float: right;"
/>
</div>
<el-row :gutter="20">
<el-col :span="4">
<div class="stat-item" @click="goOrderList">
<div class="stat-title">订单数量</div>
<div class="stat-value">{{ data2.allNum || 0 }}</div>
</div>
</el-col>
<el-col :span="4">
<div class="stat-item">
<div class="stat-title">完成数量</div>
<div class="stat-value">{{ data2.ywcNum || 0 }}</div>
</div>
</el-col>
<el-col :span="4">
<div class="stat-item">
<div class="stat-title">检测中数量</div>
<div class="stat-value">{{ data2.jxzNum || 0 }}</div>
</div>
</el-col>
<el-col :span="4">
<div class="stat-item">
<div class="stat-title">重检数量</div>
<div class="stat-value">{{ data2.reinspectNum || 0 }}</div>
</div>
</el-col>
<el-col :span="4">
<div class="stat-item">
<div class="stat-title">复检数量</div>
<div class="stat-value">{{ data2.recheckNum || 0 }}</div>
</div>
</el-col>
<el-col :span="4">
<div class="stat-item">
<div class="stat-title">退办理数量</div>
<div class="stat-value">{{ data2.tblNum || 0 }}</div>
</div>
</el-col>
</el-row>
</el-card>
<!-- 营业额统计 -->
<el-card class="box-card" shadow="hover" style="margin-top: 20px;">
<div slot="header">
<span>营业额统计</span>
<el-date-picker
v-model="rangeYYE"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
@change="slectRangeYYECount"
style="float: right;"
/>
</div>
<el-row :gutter="20">
<el-col :span="6" v-for="item in amountList" :key="item.key">
<div class="stat-item" @click="goOrderStatistic(item.clickParam)">
<div class="stat-title">{{ item.title }}</div>
<div class="stat-value">{{ data1[item.key] || 0 }}</div>
</div>
</el-col>
</el-row>
</el-card>
<!-- 业务渠道统计 -->
<el-card class="box-card" shadow="hover" style="margin-top: 20px;">
<div slot="header">
<span>业务渠道统计</span>
<el-date-picker
v-model="rangeBusiness"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
@change="slectRangeBusinessCount"
style="float: right;"
/>
</div>
<el-table :data="data3" style="width: 100%;" v-if="data3.length > 0">
<el-table-column prop="name" label="业务渠道"></el-table-column>
<el-table-column prop="theNum" label="数量"></el-table-column>
<el-table-column prop="theAmount" label="公示金额"></el-table-column>
</el-table>
<div v-else style="padding: 20px; text-align: center;">暂无数据</div>
</el-card>
<!-- 资料统计 -->
<el-card class="box-card" shadow="hover" style="margin-top: 20px;">
<div slot="header">
<span>资料统计</span>
<el-date-picker
v-model="rangeZL"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
@change="slectRangeZLCount"
style="float: right;"
/>
</div>
<el-row :gutter="20">
<el-col :span="6">
<div class="stat-item" @click="goxiangqing2(6, 'add')">
<div class="stat-title">新增</div>
<div class="stat-value">{{ fileRes.addCount || 0 }}</div>
</div>
</el-col>
<el-col :span="6">
<div class="stat-item" @click="goxiangqing2(6, 'update')">
<div class="stat-title">修改</div>
<div class="stat-value">{{ fileRes.updateCount || 0 }}</div>
</div>
</el-col>
</el-row>
</el-card>
<!-- 检测车型统计 -->
<el-card class="box-card" shadow="hover" style="margin-top: 20px;">
<div slot="header">
<span>检测车型统计</span>
<el-button type="text" @click="goxiangqing(2)" style="float: right;">更多 ></el-button>
</div>
<el-table :data="data4" style="width: 100%;" v-if="data4.length > 0">
<el-table-column prop="goodsTitle" label="车型"></el-table-column>
<el-table-column prop="theNum" label="数量"></el-table-column>
</el-table>
<div v-else style="padding: 20px; text-align: center;">暂无数据</div>
</el-card>
<!-- 检测类型统计 -->
<el-card class="box-card" shadow="hover" style="margin-top: 20px;">
<div slot="header">
<span>检测类型统计</span>
<el-button type="text" @click="goxiangqing(4)" style="float: right;">更多 ></el-button>
</div>
<el-row :gutter="20">
<el-col :span="4" v-for="skuData in skuList" :key="skuData.skuName">
<div class="stat-item">
<div class="stat-title">{{ skuData.skuName }}</div>
<div class="stat-value">{{ skuData.orderCount || 0 }}</div>
</div>
</el-col>
</el-row>
<div v-if="skuList.length === 0" style="padding: 20px; text-align: center;">暂无数据</div>
</el-card>
</div>
</template>
<script>
import request from '@/utils/request'
export default {
data() {
return {
ranges: [],
rangeYYE: [],
rangeBusiness: [],
rangeZL: [],
data1: {},
data2: {},
data3: [],
data4: [],
skuList: [],
fileRes: {},
amountList: [
{ title: '公示价格', key: 'gsAmount', clickParam: '' },
{ title: '应收款', key: 'ysAmount', clickParam: '' },
{ title: '已收款', key: 'yjsAmount', clickParam: '1' },
{ title: '待收款', key: 'dsAmount', clickParam: '0' }
]
}
},
async created() {
// this.getServerData();
await this.getServerData1();
await this.getServerData2();
await this.getServerData3();
await this.chartLineInspectionAmount()
await this.chartLineInspectionNum()
await this.getInspectionSku()
// this.sanxiang()
await this.getfive()
},
methods: {
async getServerData1() {
let data = {
partnerId: this.partnerId,
unit: this.unit,
startTime: this.rangeYSK[0],
endTime: this.rangeYSK[1]
}
let rex = await request({
url: '/partnerOwn/partner/chartInfoAmount',
method: 'get',
params: data
})
let res = rex.data
this.chartData2 = JSON.parse(JSON.stringify(res));
this.opts1.xAxis.itemCount = res.categories.length
},
async getfive() {
let data1 = {
startTime: this.range[0],
endTime: this.range[1]
}
let res1 = await request({
url: '/partnerOwn/partner/staticsTable1',
method: 'get',
params: data1
})
this.data1 = res1.data
// 2
let data2 = {
startTime: this.ranges[0],
endTime: this.ranges[1]
}
let res2 = await request({
url: '/partnerOwn/partner/staticsTable2',
method: 'get',
params: data2
})
this.data2 = res2.data
// 3
let data3 = {
startTime: this.rangeBusiness[0],
endTime: this.rangeBusiness[1]
}
let res3 = await request({
url: '/partnerOwn/partner/staticsTable3',
method: 'get',
params: data3
})
this.data3 = res3.data
console.log('业务渠道数据', this.data3);
// 4
let data4 = {
startTime: this.rangeGoods[0],
endTime: this.rangeGoods[1]
}
let res4 = await request({
url: '/partnerOwn/partner/staticsTable4',
method: 'get',
params: data4
})
this.data4 = res4.data
// 5
let data5 = {
startTime: this.rangeDsk[0],
endTime: this.rangeDsk[1]
}
let res5 = await request({
url: '/partnerOwn/partner/staticsTable5',
method: 'get',
params: data5
})
this.data5 = res5.data
let fileRes = await request({
url: '/partnerOwn/partner/fileStatistics',
method: 'get',
params: {
startTime: this.rangeZL[0],
servicePackageId: 'jiance',
endTime: this.rangeZL[1]
}
})
this.fileRes = fileRes.data
},
//
getInspectionSku() {
let data = {
startTime: this.rangeSku[0],
endTime: this.rangeSku[1]
}
request({
url: '/partnerOwn/partner/queryInspectionSkuList',
method: 'get',
params: data
}).then((res) => {
this.skuList = res.data
})
},
async slectRangeInspectionCount(e) {
this.ranges = e
console.log(this.ranges);
let data2 = {
startTime: this.ranges[0],
endTime: this.ranges[1]
}
//
let res2 = await request({
url: '/partnerOwn/partner/staticsTable2',
method: 'get',
params: data2
})
this.data2 = res2.data
},
//
async getServerData2() {
let data = {
partnerId: this.partnerId,
unit: this.unit1,
}
let rex = await request({
url: '/partnerOwn/partner/chartInfoNum',
method: 'get',
params: data
})
let res = rex.data
this.chartData2 = JSON.parse(JSON.stringify(res));
},
//
async getServerData3() {
let data = {
partnerId: this.partnerId,
unit: this.unit2,
}
let rex = await request({
url: '/partnerOwn/partner/chartInfoRatio',
method: 'get',
params: data
})
let res = rex.data
this.chartData3 = JSON.parse(JSON.stringify(res));
},
}
}
</script>
<style scoped>
.statistics-container {
padding: 20px;
}
.stat-item {
background: #f5f5f5;
text-align: center;
padding: 10px;
border-radius: 4px;
}
.stat-title {
font-size: 14px;
color: #666;
}
.stat-value {
font-size: 18px;
font-weight: bold;
margin-top: 4px;
}
</style>

View File

@ -185,3 +185,11 @@ export function batchSettlement(data) {
data: data
})
}
export function getBatchList(query) {
return request({
url: '/batchSettlement/page',
method: 'get',
params: query
})
}

View File

@ -7,14 +7,17 @@
<el-collapse-item title="收款信息" name="1">
<el-row>
<el-col :span="24">
<el-form-item label="优惠金额" prop="cashierConfirm">
<el-input disabled v-model="formData.reduceMoney / 100" placeholder="暂未优惠"></el-input>
</el-form-item>
<el-form-item label="收款金额" prop="cashierConfirm">
<el-input disabled v-model="orderInfo.payMoney / 100" placeholder="暂未结算"></el-input>
</el-form-item>
<el-form-item label="收费备注" prop="cashierConfirm">
<el-input disabled v-model="orderInfo.payRemark" placeholder="暂无备注"></el-input>
<el-input disabled v-model="formData.payMoney / 100" placeholder="暂未结算"></el-input>
</el-form-item>
<!-- <el-form-item label="收费备注" prop="cashierConfirm">-->
<!-- <el-input disabled v-model="formData.payRemark" placeholder="暂无备注"></el-input>-->
<!-- </el-form-item>-->
<el-form-item label="查看附件" prop="cashierConfirm">
<el-button @click="handleViewFiles(orderInfo.files)">查看附件</el-button>
<el-button @click="handleViewFiles(formData.files)">查看附件</el-button>
</el-form-item>
</el-col>
</el-row>
@ -253,7 +256,7 @@ export default {
try {
//
const res = await getOrderInfo(id)
this.orderInfo = res.data
this.formData = res.data
// const res = await SchoolCourseOrderApi.getSchoolCourseOrder(id)
// this.formData = res.data
// this.title = ''

View File

@ -16,6 +16,14 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="车龄" prop="carYear">
<el-input
v-model="queryParams.carYear"
placeholder="请输入车龄"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="检测类型" prop="goodsTitle">
<el-select
v-model="queryParams.skuName"
@ -77,9 +85,23 @@
</el-select>
<!-- </template> -->
</el-form-item>
<el-form-item label="检测时间" prop="startTime">
<el-form-item label="筛选类型" prop="dateType">
<el-select
v-model="queryParams.dateType"
placeholder="请选择日期类型"
clearable
style="width: 180px"
>
<el-option label="检测时间" value="jcTime"/>
<el-option label="保险到期时间(交强)" value="bxTime"/>
<el-option label="保险到期时间(商业)" value="bxVehicleTime"/>
<el-option label="下次年检时间" value="nextInspectionTime"/>
</el-select>
</el-form-item>
<el-form-item :label="dateTypeLabel" prop="datetimeRange">
<el-date-picker
v-model="queryParams.jcTime"
v-model="queryParams.datetimeRange"
type="daterange"
value-format="yyyy-MM-dd"
range-separator="至"
@ -88,16 +110,19 @@
>
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>搜索
</el-button
>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
>重置</el-button
>重置
</el-button
>
</el-form-item>
</el-form>
@ -109,7 +134,7 @@
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>录入
>录入
</el-button>
</el-col>
<el-col :span="1.5">
@ -119,7 +144,7 @@
icon="el-icon-download"
size="mini"
@click="handleExport"
>导出
>导出
</el-button>
</el-col>
<el-col :span="1.5" v-if="showCashierColumn">
@ -129,7 +154,7 @@
icon="el-icon-download"
size="mini"
@click="handleBatchSettle('cn')"
>批量结算
>批量结算
</el-button>
</el-col>
@ -140,7 +165,7 @@
icon="el-icon-download"
size="mini"
@click="handleBatchSettle('kj')"
>批量审核
>批量审核
</el-button>
</el-col>
<div style="margin-left: 72%; font-weight: bold">
@ -154,9 +179,10 @@
<el-table
v-loading="loading"
:data="infoList"
:columns="columns"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column type="selection" width="55" align="center"/>
<el-table-column label="车牌号" align="center">
<template slot-scope="scope">
{{ scope.row.carNum || scope.row.certificateNum || "----" }}
@ -176,8 +202,8 @@
<span v-else>进行中</span>
</template>
</el-table-column>
<el-table-column label="车辆类型" align="center" prop="goodsTitle" />
<el-table-column label="检测项目" align="center" prop="skuName" />
<el-table-column label="车辆类型" align="center" prop="goodsTitle"/>
<el-table-column label="检测项目" align="center" prop="skuName"/>
<el-table-column
label="公示应收价格"
align="center"
@ -193,18 +219,38 @@
<span>{{ scope.row.realPayMoney / 100 }}</span>
</template>
</el-table-column>
<el-table-column label="收款时间" align="center" prop="payTime" />
<el-table-column label="收款时间" align="center" prop="payTime"/>
<!-- <el-table-column label="客户" align="center" prop="buyName" />-->
<el-table-column label="客户手机号" align="center" prop="buyPhone" />
<el-table-column label="客户手机号" align="center" prop="buyPhone"/>
<!-- <el-table-column label="接待员" align="center" prop="workerName"/>-->
<el-table-column label="接待员手机号" align="center" prop="workerPhone" />
<el-table-column label="接待员手机号" align="center" prop="workerPhone"/>
<el-table-column label="支付方式" align="center" prop="payType">
<template slot-scope="scope">
<dict-tag :options="dict.type.pay_type" :value="scope.row.payType" />
<dict-tag :options="dict.type.pay_type" :value="scope.row.payType"/>
</template>
</el-table-column>
<el-table-column label="开始时间" align="center" prop="startTime" />
<el-table-column label="结束时间" align="center" prop="endTime" />
<el-table-column
label="承保公司"
align="center"
prop="insuranceCompanyName"
/>
<el-table-column
label="下次年检时间"
align="center"
prop="nextInspectionDate"
/>
<el-table-column
label="交强险到期日期"
align="center"
prop="insuranceExpiryDate"
/>
<el-table-column
label="商业险到期日期"
align="center"
prop="vehicleInsuranceExpiryDate"
/>
<el-table-column label="开始时间" align="center" prop="startTime"/>
<el-table-column label="结束时间" align="center" prop="endTime"/>
<el-table-column
label="操作"
align="center"
@ -216,7 +262,7 @@
type="text"
icon="el-icon-edit"
@click="watchWork(scope.row)"
>打印
>打印
</el-button>
<el-button
size="mini"
@ -238,14 +284,14 @@
scope.row.makeCert != 1
"
@click="zhizheng(scope.row)"
>制证
>制证
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="detail(scope.row)"
>详情
>详情
</el-button>
<!-- <el-button size="mini" type="text" icon="el-icon-edit" v-if="scope.row.status && scope.row.status == 0"-->
<!-- @click="jieshu(scope.row)">完工-->
@ -255,14 +301,14 @@
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>修改
>修改
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleDelete(scope.row)"
>删除
>删除
</el-button>
</template>
</el-table-column>
@ -378,7 +424,7 @@
style="margin-left: 90%; margin-top: 20px"
v-print="'#printMe'"
size="small"
>打印
>打印
</el-button>
</el-dialog>
<!-- 弹窗 -->
@ -460,7 +506,11 @@
</el-select>
</el-form-item>
<el-form-item label="收款账号">
<el-select v-model="receivablesAccount" clearable placeholder="请选择收款账号">
<el-select
v-model="receivablesAccount"
clearable
placeholder="请选择收款账号"
>
<el-option
v-for="item in BankAccountList"
:key="item.label"
@ -650,93 +700,167 @@
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<InspectionCashierConfirmForm ref="cashierConfirmRef" @success="getList" />
<InspectionCashierConfirmForm ref="cashierConfirmRef" @success="getList"/>
<!-- 批量结算弹窗 -->
<el-dialog title="批量结算" :visible.sync="batchSettleVisible" width="80%">
<el-form :inline="true" :model="batchQueryParams" size="small">
<el-form-item label="支付状态" v-if="batchType == 'cn'">
<el-select
v-model="batchQueryParams.payStatus"
clearable
placeholder="请选择"
>
<el-option label="未支付" :value="0" />
<el-option label="已支付" :value="1" />
</el-select>
</el-form-item>
<el-form-item label="时间">
<el-date-picker
v-model="batchQueryParams.datetimeRange"
type="daterange"
value-format="yyyy-MM-dd"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item>
<el-form-item label="业务渠道">
<el-select
v-model="batchQueryParams.businessChannel"
clearable
filterable
placeholder="请选择业务渠道"
>
<el-option
v-for="dict in businessList"
:key="dict.id"
:label="dict.name"
:value="dict.name"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="客户来源">
<el-select
v-model="batchQueryParams.customerSource"
clearable
filterable
placeholder="请选择客户来源"
>
<el-option
v-for="dict in customerData"
:key="dict.id"
:label="dict.name"
:value="dict.name"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleBatchQuery">筛选</el-button>
</el-form-item>
</el-form>
<el-dialog :title="batchType == 'cn' ? '批量结算' : '批量审核'" :visible.sync="batchSettleVisible" width="80%">
<div v-show="selectBatchType == 'cn'">
<el-form :inline="true" :model="batchQueryParams" size="small">
<el-form-item label="支付状态" v-if="batchType == 'cn'">
<el-select
v-model="batchQueryParams.payStatus"
clearable
placeholder="请选择"
>
<el-option label="未支付" :value="0"/>
<el-option label="已支付" :value="1"/>
</el-select>
</el-form-item>
<el-form-item label="时间">
<el-date-picker
v-model="batchQueryParams.datetimeRange"
type="daterange"
value-format="yyyy-MM-dd"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item>
<el-form-item label="业务渠道">
<el-select
v-model="batchQueryParams.businessChannel"
clearable
filterable
placeholder="请选择业务渠道"
>
<el-option
v-for="dict in businessList"
:key="dict.id"
:label="dict.name"
:value="dict.name"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="客户来源">
<el-select
v-model="batchQueryParams.customerSource"
clearable
filterable
placeholder="请选择客户来源"
>
<el-option
v-for="dict in customerData"
:key="dict.id"
:label="dict.name"
:value="dict.name"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleBatchQuery">筛选</el-button>
</el-form-item>
</el-form>
<el-table
:data="batchOrderList"
@selection-change="handleBatchSelectionChange"
>
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column label="车牌号" prop="carNum">
<template slot-scope="scope">{{
scope.row.carNum || scope.row.certificateNum || "----"
}}</template>
</el-table-column>
<el-table-column label="客户名称" prop="buyName"></el-table-column>
<el-table-column label="客户手机号" prop="buyPhone"></el-table-column>
<el-table-column
label="业务渠道"
prop="businessChannel"
></el-table-column>
<el-table-column
label="客户来源"
prop="customerSource"
></el-table-column>
<el-table-column label="检测项目" prop="skuName"></el-table-column>
<el-table-column label="应收金额" prop="goodsPrice">
<template slot-scope="scope">{{
scope.row.goodsPrice / 100
}}</template>
</el-table-column>
</el-table>
<el-table
:data="batchOrderList"
@selection-change="handleBatchSelectionChange"
>
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column label="车牌号" prop="carNum">
<template slot-scope="scope">{{
scope.row.carNum || scope.row.certificateNum || "----"
}}
</template>
</el-table-column>
<el-table-column label="客户名称" prop="buyName"></el-table-column>
<el-table-column label="客户手机号" prop="buyPhone"></el-table-column>
<el-table-column
label="业务渠道"
prop="businessChannel"
></el-table-column>
<el-table-column
label="客户来源"
prop="customerSource"
></el-table-column>
<el-table-column label="检测项目" prop="skuName"></el-table-column>
<el-table-column label="应收金额" prop="goodsPrice">
<template slot-scope="scope">{{
scope.row.goodsPrice / 100
}}
</template>
</el-table-column>
</el-table>
</div>
<div v-show="selectBatchType == 'kj'">
<el-form :inline="true" :model="batchQueryParams" size="small">
<el-form-item label="时间">
<el-date-picker
v-model="batchQueryParams.datetimeRange"
type="daterange"
value-format="yyyy-MM-dd"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleBatchQuery">筛选</el-button>
</el-form-item>
</el-form>
<el-table :data="batchOrderList"
@selection-change="handleBatchSelectionChange"
style="width: 100%">
<el-table-column
type="selection"
width="55">
</el-table-column>
<el-table-column type="expand">
<template slot-scope="props">
<el-table
:data="props.row.orderInfoList"
style="width: 100%"
border
stripe
>
<el-table-column prop="carNum" label="车牌号"></el-table-column>
<el-table-column prop="buyName" label="车主姓名"></el-table-column>
<el-table-column prop="buyPhone" label="车主联系方式"></el-table-column>
<el-table-column prop="customerSource" label="客户来源"></el-table-column>
<el-table-column prop="businessChannel" label="业务渠道"></el-table-column>
</el-table>
</template>
</el-table-column>
<el-table-column
prop="payMoney"
label="支付金额"
sortable
width="180"
>
<template slot-scope="scope">{{
scope.row.payMoney / 100
}}
</template>
</el-table-column>
<el-table-column
prop="reduceMoney"
label="优惠金额"
sortable
width="180"
>
<template slot-scope="scope">{{
scope.row.reduceMoney / 100
}}
</template>
</el-table-column>
<el-table-column prop="cashierName" label="出纳"></el-table-column>
<el-table-column
prop="createTime"
label="出纳确认时间"
:formatter="formatDate">
</el-table-column>
</el-table>
</div>
<div slot="footer">
<pagination
@ -751,7 +875,8 @@
<el-button
@click="batchSettleVisible = false"
style="margin-right: 10px"
>取消</el-button
>取消
</el-button
>
<el-button
style="margin-top: 10px"
@ -798,6 +923,16 @@
</el-select>
</el-form-item>
<el-form-item label="优惠金额" v-if="batchType == 'cn'">
<el-input-number
:min="0"
@input="batchJisuan"
:max="settleForm.realPayMoney"
type="text"
v-model="settleForm.reduceMoney"
></el-input-number>
</el-form-item>
<el-form-item
label="实付金额"
prop="realPayMoney"
@ -824,7 +959,7 @@
>
<el-option
v-for="item in BankAccountList"
:key="item.label"
:key="item.id"
:label="item.label"
:value="item.label"
></el-option>
@ -856,9 +991,7 @@
<div slot="footer" class="dialog-footer">
<el-button @click="settleDialogVisible = false"> </el-button>
<el-button type="primary" @click="handleSettleSubmit"
>确认</el-button
>
<el-button type="primary" @click="handleSettleSubmit">确认</el-button>
</div>
</el-dialog>
</div>
@ -886,6 +1019,7 @@ import {
getWeorkNodesById,
getCustomerSource,
batchSettlement,
getBatchList,
} from "./api/workOrder";
import print from "vue-print-nb";
import moment from "moment";
@ -920,6 +1054,7 @@ export default {
settleDialogVisible: false,
batchSelectedOrders: [],
batchSelectedMoney: [],
selectBatchType: undefined,
batchQueryParams: {
pageNum: 1,
pageSize: 100,
@ -928,12 +1063,12 @@ export default {
},
cashierConfirmOption: [
{
value: '0',
label: '未到账'
value: "0",
label: "未到账",
},
{
value: '1',
label: '已到账'
value: "1",
label: "已到账",
},
],
batchOrderList: [],
@ -1020,6 +1155,12 @@ export default {
total: 0,
//
infoList: [],
columns: [
{
prop: "carNum",
label: "车牌号",
},
],
//
title: "",
addOpen: false,
@ -1056,13 +1197,13 @@ export default {
//
rules: {
connectionName: [
{ required: true, message: "联系人名称不能为空", trigger: "blur" },
{required: true, message: "联系人名称不能为空", trigger: "blur"},
],
connectionPhone: [
{ required: true, message: "联系人手机号不能为空", trigger: "blur" },
{required: true, message: "联系人手机号不能为空", trigger: "blur"},
],
licenseNum: [
{ required: true, message: "车牌号不能为空", trigger: "blur" },
{required: true, message: "车牌号不能为空", trigger: "blur"},
],
isAppointment: [
{
@ -1093,21 +1234,21 @@ export default {
},
],
feeType: [
{ required: true, message: "收费类型不能为空", trigger: "change" },
{required: true, message: "收费类型不能为空", trigger: "change"},
],
},
settleRules: {
payType: [
{ required: true, message: "请选择支付方式", trigger: "change" },
{required: true, message: "请选择支付方式", trigger: "change"},
],
realPayMoney: [
{ required: true, message: "请输入实付金额", trigger: "blur" },
{required: true, message: "请输入实付金额", trigger: "blur"},
],
},
};
},
created() {
this.dict = { type: {} };
this.dict = {type: {}};
for (let i = 0; i < this.$options.dicts.length; i++) {
request({
url: "/rescue/dict/data/type/" + this.$options.dicts[i],
@ -1125,14 +1266,14 @@ export default {
//
showCashierColumn() {
// return this.$store.getters.roles.includes('cn')
return ["cn", "jcnc","tenant_admin"].some((role) =>
return ["cn", "jcnc", "tenant_admin"].some((role) =>
this.$store.getters.roles.includes(role)
);
},
//
showAccountingColumn() {
// return this.$store.getters.roles.includes('cn')
return ["kj", "jckj","tenant_admin"].some((role) =>
return ["kj", "jckj", "tenant_admin"].some((role) =>
this.$store.getters.roles.includes(role)
);
},
@ -1142,7 +1283,9 @@ export default {
},
methods: {
handleBatchSettle(type) {
if(type == 'cn') {
this.selectBatchType = type;
this.batchOrderList = [];
if (type == "cn") {
this.batchQueryParams.payStatus = 0;
} else {
this.batchQueryParams.payStatus = 2;
@ -1151,16 +1294,30 @@ export default {
this.batchSettleVisible = true;
this.handleBatchQuery();
},
formatDate(row, column, cellValue) {
if (!cellValue) return ''; //
const date = new Date(cellValue);
return date.toISOString().split('T')[0]; // 2023-10-25
// 使 moment.js day.js
},
handleBatchQuery() {
const params = {
...this.batchQueryParams,
pageNum: this.batchQueryParams.pageNum || 1,
pageSize: this.batchQueryParams.pageSize || 100,
accountingConfirm: '1'
};
listWorkOrder(params).then((response) => {
this.batchOrderList = response.data.records;
this.batchTotal = response.data.total;
});
if (this.selectBatchType == "cn") {
listWorkOrder(params).then((response) => {
this.batchOrderList = response.data.records;
this.batchTotal = response.data.total;
});
} else {
getBatchList(params).then((response) => {
this.batchOrderList = response.data.records;
this.batchTotal = response.data.total;
});
}
},
handleBatchSelectionChange(selection) {
this.batchSelectedOrders = selection.map((item) => item.id);
@ -1170,7 +1327,7 @@ export default {
//
if (this.batchSelectedOrders.length === 0) {
this.$message.warning("请选择结算工单");
this.$message.warning("请选择工单");
return;
}
this.settleDialogVisible = true;
@ -1183,6 +1340,7 @@ export default {
},
0
);
this.settleForm.goodsPrice = this.settleForm.realPayMoney;
},
handleSettleSubmit() {
this.$refs.settleForm.validate((valid) => {
@ -1192,6 +1350,7 @@ export default {
...this.settleForm,
realPayMoney: this.settleForm.realPayMoney * 100, //
type: this.batchType,
reduceMoney: this.settleForm.reduceMoney * 100,
};
this.$modal.loading("正在提交结算信息...");
batchSettlement(params)
@ -1223,7 +1382,7 @@ export default {
}
},
checkoutBatchSettlement(ids) {
const data = { ids: ids };
const data = {ids: ids};
this.$modal
.confirm("确定要结算吗?")
.then(() => {
@ -1299,6 +1458,13 @@ export default {
}
this.payMoney = this.goodsPrice / 100 - this.reduceMoney;
},
batchJisuan() {
if (this.settleForm.reduceMoney > this.settleForm.goodsPrice) {
this.settleForm.reduceMoney = this.settleForm.goodsPrice;
}
this.settleForm.realPayMoney =
this.settleForm.goodsPrice - this.settleForm.reduceMoney;
},
tijiao() {
console.log(this.fileUrls);
if (Array.isArray(this.fileUrls)) {
@ -1423,7 +1589,7 @@ export default {
// this.workerList = res.rows
// })
getBankAccountList().then((res) => {
this.BankAccountList = res.data
this.BankAccountList = res.data;
// res.data.forEach((it) => {
// let temp = {};
// temp.key = it.remark + it.label;
@ -1638,7 +1804,8 @@ export default {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => {});
.catch(() => {
});
},
/** 导出按钮操作 */
handleExport() {
@ -1698,7 +1865,10 @@ export default {
font-weight: bold;
}
* 对话框整体样式 * / .custom-dialog {
* 对话框整体样式 *
/
.custom-dialog {
border-radius: 8px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
}