qzyReal 2 лет назад
Родитель
Сommit
3f4cb7728a

+ 1 - 2
app-ui/pages/wx/index.vue

@@ -27,8 +27,7 @@ export default {
   methods: {
     getRedirectUri() {
       this.$api.getRedirectUrl({path: '/pages/wx/pay', state: this.param}).then(resp => {
-        console.log(resp);
-        window.location.href = resp.data;
+       window.location.href = resp.data;
       })
     }
   }

+ 2 - 2
app-ui/utils/request.js

@@ -1,8 +1,8 @@
 // const server = 'http://127.0.0.1:8099/pro';
-// const server = 'https://pco.aseanbusiness.cn/pro';
+const server = 'https://pco.aseanbusiness.cn/pro';
 
 
-const server = 'https://dxkaa1.gxbtka.com/pro';
+// const server = 'https://dxkaa1.gxbtka.com/pro';
 
 
 import common from '../common/js/common.js';

+ 14 - 11
sp-admin/sa-view/tb-business-car/tb-business-car-edit.html

@@ -45,7 +45,7 @@
 								:min="4.2" :max="50"></el-input-number>
 						</div>
 						<div class="c-item">
-							<label class="c-label">车牌颜色:</label>
+							<label class="c-label"><span style="color: red;">*</span>车牌颜色:</label>
 							<el-select v-model="m.color" placeholder="请选择">
 								<el-option v-for="item in colorList" :label="item.carNoColor" :value="item.carNoColor">
 								</el-option>
@@ -68,7 +68,8 @@
 						</sa-item>
 						<div class="c-item">
 							<label class="c-label">
-								<span style="color: red;" v-if="m.realInTime&&!obj.realInTime||m.carNo!=obj.carNo">*</span>备注:</label>
+								<span style="color: red;"
+									v-if="m.realInTime&&!obj.realInTime||m.carNo!=obj.carNo">*</span>备注:</label>
 							<div style="display: inline-block;">
 								<el-input type="textarea" v-model="m.remark" placeholder="备注"></el-input>
 							</div>
@@ -77,7 +78,8 @@
 							<label class="c-label">
 								<span style="color: red;" v-if="m.realOutTime&&!obj.realOutTime">*</span>出场确认说明:</label>
 							<div style="display: inline-block;">
-								<el-input :disabled="!m.realOutTime" type="textarea" v-model="m.outRemark" placeholder="出场确认说明"></el-input>
+								<el-input :disabled="!m.realOutTime" type="textarea" v-model="m.outRemark"
+									placeholder="出场确认说明"></el-input>
 							</div>
 						</div>
 					</el-form>
@@ -97,7 +99,7 @@
 				el: '.vue-box',
 				data: {
 					colorList: [],
-					obj:{},
+					obj: {},
 					id: sa.p('id', 0), // 获取超链接中的id参数(0=添加,非0=修改)
 					m: {
 						id: '', //
@@ -114,8 +116,8 @@
 						isLock: '',
 						inImage: '',
 						outImage: '',
-						remark:'',
-						outRemark:''
+						remark: '',
+						outRemark: ''
 					}, // 实体对象
 				},
 				methods: {
@@ -128,21 +130,22 @@
 					ok: function() {
 						// 表单校验
 						let m = this.m;
-						let obj=this.obj;
+						let obj = this.obj;
 						sa.checkNull(m.carNo, '请输入 [车牌号]');
+						sa.checkNull(m.color, '请选择 [车牌颜色]');
 						let realInTime = m.realInTime;
-						if (realInTime && !m.remark&&!obj.realInTime) {
+						if (realInTime && !m.remark && !obj.realInTime) {
 							sa.error('入场补录备注必填');
 							return;
 						}
 						console.log(obj.carNo);
 						console.log(m.carNo);
-						if (!m.remark&&obj.carNo!=m.carNo) {
+						if (!m.remark && obj.carNo != m.carNo) {
 							sa.error('修改车牌备注必填');
 							return;
 						}
 						let realOutTime = m.realOutTime;
-						if (realOutTime !=obj.realOutTime&& !m.outRemark) {
+						if (realOutTime != obj.realOutTime && !m.outRemark) {
 							sa.error('离场补录出场确认说明必填');
 							return;
 						}
@@ -170,7 +173,7 @@
 							if (res.data == null) {
 								sa.alert('未能查找到 id=' + this.id + " 详细数据");
 							}
-							this.obj=JSON.parse(JSON.stringify(this.m));
+							this.obj = JSON.parse(JSON.stringify(this.m));
 						}.bind(this))
 					}
 				}

+ 12 - 6
sp-admin/sa-view/tb-fee-statistics/tb-fee-details-list.html

@@ -54,6 +54,7 @@
 							<el-option label="业务费" value="1,2,3,5,6,7"></el-option>
 						</el-select>
 					</div>
+					<sa-item type="text" name="车型" v-model="p.itemName"></sa-item>
 					<sa-item type="text" name="车牌号" v-model="p.carNo"></sa-item>
 					<sa-item type="text" name="业务单号" v-model="p.businessNo"></sa-item>
 					<div class="c-item">
@@ -231,13 +232,12 @@
 					p: { // 查询参数  
 						id: '', // 主键 
 						businessNo: '', // 业务单号 
-						transactionId:'',//微信支付号
-						pickCustomerName:'',
+						transactionId: '', //微信支付号
+						pickCustomerName: '',
 						carNo: '', // 车牌号
 						feeType: '', //收费类型
 						itemTypeId: '', // 业务类型id 
 						itemTypeName: '', // 业务类型 
-						itemId: '', //  
 						itemName: '', // 业务项 
 						itemPrice: '', // 项目金额(元) 
 						payDay: '', // 支付日期 
@@ -458,7 +458,10 @@
 						} else {
 							str += "、业务类型为" + itemTypeName;
 						}
-
+						let itemName=this.p.itemName;
+						if(itemName){
+							str+='车型为:'+itemName;
+						}
 						this.$confirm('确定打印' + str + '的数据?', '提示', {
 							confirmButtonText: '确定',
 							cancelButtonText: '取消',
@@ -513,7 +516,10 @@
 						} else {
 							str += "、业务类型为" + itemTypeName;
 						}
-
+						let itemName=this.p.itemName;
+						if(itemName){
+							str+='车型为:'+itemName;
+						}
 						this.$confirm('确定导出' + str + '的数据?', '提示', {
 							confirmButtonText: '确定',
 							cancelButtonText: '取消',
@@ -534,7 +540,7 @@
 							this.selectTimeRange.beginTime = this.selectTime[0];
 							this.selectTimeRange.endTime = this.selectTime[1];
 						}
-						if(!this.selectTime){
+						if (!this.selectTime) {
 							this.selectTimeRange.beginTime = '';
 							this.selectTimeRange.endTime = '';
 						}

+ 153 - 0
sp-admin/sa-view/tb-mild-car/tb-mild-car-add.html

@@ -0,0 +1,153 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>4.2~9.6车辆管理-添加/修改</title>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="viewport"
+			content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css">
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="../../static/kj/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		<style type="text/css">
+			.c-panel .el-form .c-label {
+				width: 7em !important;
+			}
+
+			.item-num .el-input__inner {
+				width: 130px;
+			}
+
+			.c-panel .el-form .el-input,
+			.c-panel .el-form .el-textarea__inner {
+				width: 250px;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<div class="c-title" v-if="id == 0">数据添加</div>
+					<div class="c-title" v-else>数据修改</div>
+					<el-form v-if="m">
+						<el-row>
+							<el-col :span="12">
+								<sa-item type="text" name="所属公司" v-model="m.company" br></sa-item>
+								<sa-item type="text" name="车牌号" v-model="m.carNo" br need></sa-item>
+								<sa-item type="text" name="联系人" v-model="m.contact" br></sa-item>
+								<sa-item type="text" name="联系电话" v-model="m.contactPhone" br></sa-item>
+							</el-col>
+							<el-col :span="12">
+								<sa-item type="text" name="车辆类型" v-model="m.carType" br></sa-item>
+								<div class="c-item">
+									<label class="c-label">
+										<span style="color: red;">*</span>
+										车长度(米):</label>
+									<el-input-number class="item-num" v-model="m.carLength" :min="4.3"
+										:max="9.6">
+									</el-input-number>
+								</div>
+								<div class="c-item">
+									<label class="c-label">
+										载重(kg):</label>
+									<el-input-number class="item-num" v-model="m.carWeight" :min="1"
+										:max="999999">
+									</el-input-number>
+								</div>
+								<sa-item type="img-list" name="行驶证" v-model="m.carCertificate" br></sa-item>
+							</el-col>
+						</el-row>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0), // 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null, // 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '', // 主键 
+							company: '', // 所属公司 
+							carNo: '', // 车牌号 
+							carType: '', // 车辆类型 
+							carLength: 4.2, // 车长度 
+							carWeight: '', // 载重 
+							contact: '', // 联系人 
+							contactPhone: '', // 联系电话 
+							carCertificate: '', // 行驶证 
+							createTime: '', // 创建时间 
+							updateTime: '', // 更新时间 
+							createBy: '', // 创建人 
+							updateBy: '', // 更新时间 
+						}
+					},
+					// 提交数据 
+					ok: function() {
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.company, '请输入 [所属公司]');
+						sa.checkNull(m.carNo, '请输入 [车牌号]');
+						sa.checkNull(m.carLength, '请输入 [车长度]');
+						// 开始增加或修改
+						if (this.id <= 0) { // 添加
+							sa.ajax('/TbMildCar/add', m, function(res) {
+								sa.alert('增加成功', this.clean);
+							}.bind(this));
+						} else { // 修改
+							sa.ajax('/TbMildCar/update', m, function(res) {
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if (this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5(); // 刷新父页面列表
+							sa.closeCurrIframe(); // 关闭本页 
+						}
+					}
+				},
+				mounted: function() {
+					// 初始化数据 
+					if (this.id <= 0) {
+						this.m = this.createModel();
+					} else {
+						sa.ajax('/TbMildCar/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if (res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+		</script>
+	</body>
+</html>

+ 73 - 0
sp-admin/sa-view/tb-mild-car/tb-mild-car-info.html

@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>4.2~9.6车辆管理-详情</title>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css">
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="../../static/kj/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+			.c-item .image-box-2{height: 90px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<sa-info type="num" name="主键" :value="m.id" br></sa-info>
+						<sa-info name="所属公司" br>{{m.company}}</sa-info>
+						<sa-info name="车牌号" br>{{m.carNo}}</sa-info>
+						<sa-info name="车辆类型" br>{{m.carType}}</sa-info>
+						<sa-info name="车长度" br>{{m.carLength}}</sa-info>
+						<sa-info name="载重" br>{{m.carWeight}}</sa-info>
+						<sa-info name="联系人" br>{{m.contact}}</sa-info>
+						<sa-info name="联系电话" br>{{m.contactPhone}}</sa-info>
+						<sa-info type="img-list" name="行驶证" :value="m.carCertificate" br></sa-info>
+						<sa-info name="创建时间" br>{{m.createTime}}</sa-info>
+						<sa-info name="更新时间" br>{{m.updateTime}}</sa-info>
+						<sa-info name="创建人" br>{{m.createBy}}</sa-info>
+						<sa-info name="更新时间" br>{{m.updateBy}}</sa-info>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/TbMildCar/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 170 - 0
sp-admin/sa-view/tb-mild-car/tb-mild-car-list.html

@@ -0,0 +1,170 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>4.2~9.6车辆管理-列表</title>
+		<meta charset="utf-8">
+		<meta name="viewport"
+			content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css & js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css">
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="../../static/kj/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+				<div class="c-title">检索参数</div>
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="所属公司" v-model="p.company"></sa-item>
+					<sa-item type="text" name="车牌号" v-model="p.carNo"></sa-item>
+					<sa-item type="text" name="联系人" v-model="p.contact"></sa-item>
+					<sa-item type="text" name="联系电话" v-model="p.contactPhone"></sa-item>
+					<div>
+						<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+						<el-button type="info" icon="el-icon-search"
+							@click="p.carNo = '';p.company='';p.contact='';p.contactPhone=''; f5()">重置
+						</el-button>
+						<el-button v-if="sa.isAuth('tb-mild-car-add')" size="mini" type="primary" @click="add()">
+							新增
+						</el-button>
+						<el-button v-if="sa.isAuth('tb-mild-car-export')" size="mini" type="success"
+							@click="exportFn()">
+							导出
+						</el-button>
+					</div>
+				</el-form>
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" style="margin-top: 10px;">
+					<sa-td type="index" name="序号"></sa-td>
+					<sa-td name="所属公司" prop="company" width="180"></sa-td>
+					<sa-td name="车牌号" prop="carNo"></sa-td>
+					<sa-td name="车辆类型" prop="carType"></sa-td>
+					<sa-td name="长度(米)" prop="carLength"></sa-td>
+					<sa-td name="载重(kg)" prop="carWeight"></sa-td>
+					<sa-td name="联系人" prop="contact"></sa-td>
+					<sa-td name="联系电话" prop="contactPhone" width="140"></sa-td>
+					<sa-td name="行驶证" prop="carCertificate" type="img-list"></sa-td>
+					<sa-td name="创建时间" prop="createTime" width="140"></sa-td>
+					<sa-td name="更新时间" prop="updateTime" width="140"></sa-td>
+					<sa-td name="创建人" prop="createBy" width="140"></sa-td>
+					<sa-td name="更新时间" prop="updateBy" width="140"></sa-td>
+					<el-table-column label="操作" fixed="right" width="200px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改
+							</el-button>
+							<el-button class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除
+							</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()">
+				</sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						id: '', // 主键 
+						company: '', // 所属公司 
+						carNo: '', // 车牌号 
+						contact: '', // 联系人 
+						contactPhone: '', // 联系电话 
+						pageNo: 1, // 当前页 
+						pageSize: 10, // 页大小 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					exportFn() {
+						this.$confirm('确定导出符合条件的数据?', '提示', {
+							confirmButtonText: '确定',
+							cancelButtonText: '取消',
+							type: 'warning'
+						}).then(() => {
+							sa.ajax('/TbMildCar/export', sa.removeNull(this.p), function(resp) {
+								window.location.href = resp.data;
+							}.bind(this))
+						}).catch(() => {
+
+						});
+					},
+					// 刷新
+					f5: function() {
+						sa.ajax('/TbMildCar/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight(); // 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-mild-car-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if (selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-mild-car-add.html?id=' + data.id, '800px', '70%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-mild-car-add.html?id=-1', '800px', '70%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/TbMildCar/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight(); // 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if (selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/TbMildCar/deleteByIds', {
+								ids: ids.join(',')
+							}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight(); // 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 2 - 0
sp-server/src/main/java/com/pj/SpServerApplication.java

@@ -5,6 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.context.ApplicationPidFileWriter;
 import org.springframework.boot.web.servlet.ServletComponentScan;
 import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.retry.annotation.EnableRetry;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
@@ -21,6 +22,7 @@ import java.util.Properties;
 @SpringBootApplication // springboot本尊
 @EnableTransactionManagement // 启动注解事务管理
 @ServletComponentScan
+@EnableRetry
 public class SpServerApplication {
 
     public static void main(String[] args) {

+ 0 - 3
sp-server/src/main/java/com/pj/api/jh/service/JhService.java

@@ -8,7 +8,6 @@ import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import cn.hutool.log.StaticLog;
 import com.pj.api.jh.bo.JhNotifyBO;
-import com.pj.api.jh.task.CheckPayStatusTask;
 import com.pj.api.jh.utils.JhHttpUtils;
 import com.pj.api.jh.utils.MerchantApiUtil;
 import com.pj.api.wx.bo.Attach;
@@ -19,8 +18,6 @@ import com.pj.current.config.MyConfig;
 import com.pj.current.config.PartConfig;
 import com.pj.current.config.WxConfig;
 import com.pj.current.task.TaskService;
-import com.pj.project.tb_business.TbBusiness;
-import com.pj.project.tb_business.TbBusinessService;
 import com.pj.project.tb_order.TbOrder;
 import com.pj.project.tb_order.TbOrderService;
 import com.pj.project4sp.global.BusinessException;

+ 53 - 0
sp-server/src/main/java/com/pj/api/jh/task/CheckPayRetry.java

@@ -0,0 +1,53 @@
+package com.pj.api.jh.task;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import cn.hutool.http.HttpException;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.pj.api.jh.bo.JhNotifyBO;
+import com.pj.api.jh.service.JhService;
+import com.pj.api.jh.utils.JhHttpUtils;
+import com.pj.project.tb_order.TbOrder;
+import com.pj.project.tb_order.TbOrderService;
+import com.pj.project4sp.global.BusinessException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.retry.annotation.Backoff;
+import org.springframework.retry.annotation.Retryable;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Map;
+
+@Component
+@Slf4j
+public class CheckPayRetry {
+    @Retryable(maxAttempts = 10, backoff = @Backoff(delay = 5000, maxDelay = 8000))
+    @Async
+    public void check(String url, Map<String, Object> params, String outTradeNo) {
+        JhHttpUtils jhHttpUtils = SpringUtil.getBean(JhHttpUtils.class);
+        JSONObject result = jhHttpUtils.checkStatus(url, params);
+        String orderStatus = result.getStr("orderStatus");
+        if (StrUtil.equals(orderStatus, "WAITING_PAYMENT")) {
+            throw new BusinessException(orderStatus);
+        }
+        TbOrderService tbOrderService = SpringUtil.getBean(TbOrderService.class);
+        TbOrder tbOrder = tbOrderService.findByOutTradeNo(outTradeNo);
+        tbOrder.setOrderStatus(orderStatus);
+        tbOrderService.updateById(tbOrder);
+        if (StrUtil.equals("WAITING_PAYMENT", tbOrder.getOrderStatus())) {
+            JhService jhService = SpringUtil.getBean(JhService.class);
+            JhNotifyBO notifyBO = new JhNotifyBO();
+            String completeDate = result.getStr("completeDate");
+            if (StrUtil.isEmpty(completeDate)) {
+                completeDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
+            }
+            notifyBO.setAttach(tbOrder.getAttach()).setBankTrxNo(tbOrder.getTransactionId())
+                    .setTradeStatus(orderStatus).setSuccessTime(completeDate)
+                    .setOutTradeNo(tbOrder.getOutTradeNo()).setOrderPrice(tbOrder.getPrice());
+            jhService.notifyResult(notifyBO);
+        }
+    }
+}

+ 2 - 36
sp-server/src/main/java/com/pj/api/jh/task/CheckPayStatusTask.java

@@ -34,42 +34,8 @@ public class CheckPayStatusTask extends Task {
         JhService jhService = SpringUtil.getBean(JhService.class);
         String url = jhConfig.getServerUrl() + "/uaps-web-gateway/query/singleOrder";
         Map<String, Object> params = jhService.buildCheckParams(outTradeNo);
-        check(url, params);
+        CheckPayRetry checkPayRetry = SpringUtil.getBean(CheckPayRetry.class);
+        checkPayRetry.check(url,params,outTradeNo);
     }
 
-    private void check(String url, Map<String, Object> params) {
-        log.info("开始查单===:{}", JSONUtil.toJsonStr(params));
-        JhHttpUtils jhHttpUtils = SpringUtil.getBean(JhHttpUtils.class);
-        JSONObject result = jhHttpUtils.checkStatus(url, params);
-        String orderStatus = result.getStr("orderStatus");
-        if (StrUtil.equals(orderStatus, "WAITING_PAYMENT")) {
-            try {
-                Thread.sleep(5000);
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            }
-            this.check(url, params);
-        } else if (StrUtil.equals(orderStatus, "SUCCESS") || StrUtil.equals(orderStatus, "FINISH")) {
-            TbOrderService tbOrderService = SpringUtil.getBean(TbOrderService.class);
-            TbOrder tbOrder = tbOrderService.findByOutTradeNo(outTradeNo);
-            tbOrder.setOrderStatus(orderStatus);
-            tbOrderService.updateById(tbOrder);
-            if (StrUtil.equals("WAITING_PAYMENT", tbOrder.getOrderStatus())) {
-                JhService jhService = SpringUtil.getBean(JhService.class);
-                JhNotifyBO notifyBO = new JhNotifyBO();
-                String completeDate = result.getStr("completeDate");
-                if (StrUtil.isEmpty(completeDate)) {
-                    completeDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
-                }
-                notifyBO.setAttach(tbOrder.getAttach()).setBankTrxNo(tbOrder.getTransactionId())
-                        .setTradeStatus(orderStatus).setSuccessTime(completeDate)
-                        .setOutTradeNo(tbOrder.getOutTradeNo()).setOrderPrice(tbOrder.getPrice());
-                jhService.notifyResult(notifyBO);
-            }
-
-        }
-
-    }
-
-
 }

+ 36 - 35
sp-server/src/main/java/com/pj/api/open/service/OpenService.java

@@ -82,8 +82,7 @@ public class OpenService {
 
     @Resource
     TaskService taskService;
-    @Resource
-    TbCarNoColorService tbCarNoColorService;
+
 
     @Resource
     private TbGoodsService tbGoodsService;
@@ -120,7 +119,7 @@ public class OpenService {
             log.error("入场返回:{}", msg);
             return ResultJson.error(msg);
         }
-        automaticPay.unbindRun(carNo);
+        // automaticPay.unbindRun(carNo);
         TbBusinessCar tbBusinessCar = tbBusinessCarService.findTheLastRecord(carNo);
         Date now = new Date();
         TbCar tbCar = tbCarService.findByCardNo(carNo);
@@ -191,13 +190,13 @@ public class OpenService {
         //判断是否蓝色车牌===免停车费
         if (StrUtil.isNotEmpty(tbBusinessCar.getColor())) {
             String freeColor = partConfig.getFreeColor();
-            if (tbBusinessCar.getColor().contains(freeColor)){
-               TbMildCar tbMildCar= tbMildCarService.findByCarNo(tbBusinessCar.getCarNo());
-               if (tbMildCar==null){
-                   log.error("请求返回【蓝牌未备案车辆,放行】:{},{}", carNo,ResultJson.success());
-                   freeOut(tbBusinessCar, now, channel, image);
-                   return ResultJson.success();
-               }
+            if (tbBusinessCar.getColor().contains(freeColor)) {
+                TbMildCar tbMildCar = tbMildCarService.findByCarNo(tbBusinessCar.getCarNo());
+                if (tbMildCar == null) {
+                    log.error("请求返回【蓝牌未备案车辆,放行】:{},{}", carNo, ResultJson.success());
+                    freeOut(tbBusinessCar, now, channel, image);
+                    return ResultJson.success();
+                }
             }
         }
         //是否行政车辆=====
@@ -246,8 +245,8 @@ public class OpenService {
             if (autoPayCount == businessList.size()) {
                 log.info("车辆到达卡口进行扣停车费和业务费:{}", carNo);
                 //自动缴费
-                automaticPay.run(null, tbBusinessCar.getCarNo(), 3);
-                tbDeductionBindService.autoUnbindCar(tbBusinessCar.getCarNo());
+                // automaticPay.run(null, tbBusinessCar.getCarNo(), 3);
+                //tbDeductionBindService.autoUnbindCar(tbBusinessCar.getCarNo());
                 freeOut(tbBusinessCar, now, channel, image);
                 return ResultJson.success();
             }
@@ -380,29 +379,31 @@ public class OpenService {
     public void handlerInRecord(InRecordBO inRecordBO) {
         String carNo = inRecordBO.getCarNumber().trim().toUpperCase();
         // 入场==>取车牌颜色
-        List<TbBusinessCar> cars = tbBusinessCarService.findByCarNo(carNo);
-        cars.stream().filter(obj -> StrUtil.isEmpty(obj.getColor()))
-                .forEach(tbBusinessCar -> {
-                    String color = inRecordBO.getCarColor();
-                    //蓝牌 4.2米以及以下
-                    if (color.contains(partConfig.getFreeColor())) {
-                        TbMildCar tbMildCar = tbMildCarService.findByCarNo(carNo);
-                        if (tbMildCar == null) {
-                            tbBusinessCar.setPayType(TbBusinessCar.PayTypeEnum.FEE_TYPE.getType()).setPay(1);
-                        }
-                    }
-                    TbCar tbCar = tbCarService.findByCardNo(tbBusinessCar.getCarNo());
-                    if (tbCar != null && !TbCar.CarTypeEnum.BUSINESS_CAR.getType().equals(tbCar.getCarType())) {
-                        tbBusinessCar.setPayType(TbBusinessCar.PayTypeEnum.FEE_TYPE.getType());
-                        List<TbBusiness> businessList = tbBusinessService.findOtherBusinessByCarId(tbBusinessCar.getId());
-                        if (businessList.isEmpty()) {
-                            //无业务&免费车===>无需审核
-                            tbBusinessCar.setConfirmJudge(TbBusinessCar.ConfirmJudgeEnum.NO_NEED_JUDGE.getCode());
-                        }
-                    }
-                    tbBusinessCar.setColor(color);
-                    tbBusinessCarService.updateById(tbBusinessCar);
-                });
+        TbBusinessCar tbBusinessCar = tbBusinessCarService.findTheLastRecord(carNo);
+        if (tbBusinessCar != null) {
+            String color = inRecordBO.getCarColor();
+            TbMildCar tbMildCar = tbMildCarService.findByCarNo(carNo);
+            if (tbMildCar!=null){//车长
+                tbBusinessCar.setCarSize(tbMildCar.getCarLength());
+            }
+            //蓝牌 4.2米以及以下
+            if (color.contains(partConfig.getFreeColor())) {
+                if (tbMildCar == null) {
+                    tbBusinessCar.setPayType(TbBusinessCar.PayTypeEnum.FEE_TYPE.getType()).setPay(1);
+                }
+            }
+            TbCar tbCar = tbCarService.findByCardNo(tbBusinessCar.getCarNo());
+            if (tbCar != null && !TbCar.CarTypeEnum.BUSINESS_CAR.getType().equals(tbCar.getCarType())) {
+                tbBusinessCar.setPayType(TbBusinessCar.PayTypeEnum.FEE_TYPE.getType());
+                List<TbBusiness> businessList = tbBusinessService.findOtherBusinessByCarId(tbBusinessCar.getId());
+                if (businessList.isEmpty()) {
+                    //无业务&免费车===>无需审核
+                    tbBusinessCar.setConfirmJudge(TbBusinessCar.ConfirmJudgeEnum.NO_NEED_JUDGE.getCode());
+                }
+            }
+            tbBusinessCar.setColor(color);
+            tbBusinessCarService.updateById(tbBusinessCar);
+        }
     }
 
 }

+ 1 - 1
sp-server/src/main/java/com/pj/api/wx/service/WxService.java

@@ -345,7 +345,7 @@ public class WxService {
         int code = result.getInt("errcode");
         log.info("send wx msg{},{},{};return :{}", templateId, openid, JSONUtil.toJsonStr(data), resp);
         WxSendMsg wxSendMsg = wxSendMsgService.findByOpenidAndDetailUrl(openid, detailUrl);
-        if (code != 0) {
+        if (code == 42001) {//token过期导致
             if (wxSendMsg == null) {
                 wxSendMsg = new WxSendMsg();
                 wxSendMsg.setCreateTime(DateUtil.now());

+ 0 - 1
sp-server/src/main/java/com/pj/current/task/TokenTask.java

@@ -19,7 +19,6 @@ public class TokenTask implements Runnable {
     WxConfig wxConfig;
 
     @Override
-    @Async
     public void run() {
        try {
            String tokenKey = wxConfig.getAccessTokenKey();

+ 49 - 38
sp-server/src/main/java/com/pj/project/tb_business/TbBusinessService.java

@@ -475,7 +475,7 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
     }
 
 
-    public BigDecimal calculationPartMoney(Date iTime, Date oTime,double carSize) {
+    public BigDecimal calculationPartMoney(Date iTime, Date oTime, double carSize) {
         BigDecimal zero = new BigDecimal("0");
         if (iTime == null || oTime == null) {
             return zero;
@@ -483,21 +483,30 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
         LocalDateTime inDayTime = iTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
         LocalDateTime outDayTime = oTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
         long minutes = ChronoUnit.MINUTES.between(inDayTime, outDayTime);
-        if (minutes < 0) {
+        if (minutes < 0 || minutes < partConfig.getFreeMinutes()) {
             return zero;
         }
-        long days = ChronoUnit.DAYS.between(inDayTime.toLocalDate(), outDayTime.toLocalDate());
-        BigDecimal p = partConfig.getBasePrice();//乘积因子
+        BigDecimal extraPrice=partConfig.getExtraPrice();
+        BigDecimal basePrice=partConfig.getBasePrice();
+        BigDecimal uniPrice = basePrice.add(extraPrice);//超过24小时之后每24个小时收费金额
         //4.2~9.6
-        if (carSize<partConfig.getMildCarLength()&&carSize>=partConfig.getFreeCarLength()){
-            p=partConfig.getMildCarBasePrice();
-        }
-        BigDecimal extraPrice = partConfig.getExtraPrice();
-        int unit = (int) Math.ceil(NumberUtil.div(minutes, 24 * 60));
-        if (minutes < partConfig.getFreeMinutes()) {
-            unit = 0;
-        }
-        return p.multiply(new BigDecimal(unit)).add(new BigDecimal(days).multiply(extraPrice));
+        if (carSize < partConfig.getMildCarLength() && carSize >= partConfig.getFreeCarLength()) {
+            basePrice=partConfig.getMildCarBasePrice();
+            uniPrice = basePrice.add(extraPrice);
+        }
+        //间隔小时
+        long hours = ChronoUnit.HOURS.between(inDayTime, outDayTime);
+        final  int hoursOf24=24;
+        //24小时内只用交20或者30元
+        if (hours<hoursOf24){
+            return basePrice;
+        }
+        //24小时个数
+        int count=(int) Math.ceil(NumberUtil.div(hours, hoursOf24));
+        //超过24小时总停车费
+        BigDecimal price=new BigDecimal(count).multiply(uniPrice);
+        return price.add(basePrice);
+
     }
 
     /**
@@ -559,13 +568,15 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
                 if (tbBusinessCar.getPay() == 1 && tbBusinessCar.getPayTime() != null) {
                     inTime = tbBusinessCar.getPayTime();
                 }
-                partMoney = this.calculationPartMoney(inTime, now,tbBusinessCar.getCarSize());
+                partMoney = this.calculationPartMoney(inTime, now, tbBusinessCar.getCarSize());
             }
-            if (StrUtil.isNotEmpty(tbBusinessCar.getColor())) {//蓝色车辆免费
+            if (StrUtil.isNotEmpty(tbBusinessCar.getColor())) {
                 String freeColor = partConfig.getFreeColor();
-                if (tbBusinessCar.getColor().contains(freeColor)){
-                    TbMildCar tbMildCar= tbMildCarService.findByCarNo(tbBusinessCar.getCarNo());
-                    if (tbMildCar==null){
+                //蓝色车辆
+                if (tbBusinessCar.getColor().contains(freeColor)) {
+                    //不在4.2~9.6米之内的免费
+                    TbMildCar tbMildCar = tbMildCarService.findByCarNo(tbBusinessCar.getCarNo());
+                    if (tbMildCar == null) {
                         partMoney = new BigDecimal("0");
                     }
                 }
@@ -716,7 +727,7 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
             Date realInTime = tbBusinessCar.getRealInTime();
             Date realOutTime = tbBusinessCar.getRealOutTime();
             if (realInTime != null && realOutTime != null) {
-                BigDecimal price = calculationPartMoney(realInTime, realOutTime,tbBusinessCar.getCarSize());
+                BigDecimal price = calculationPartMoney(realInTime, realOutTime, tbBusinessCar.getCarSize());
                 tbBusinessCar.setMoney(price);
             }
             tbBusinessCar.setPay(1).setPayTime(now)
@@ -798,7 +809,7 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
         for (TbBusinessCar car : cars) {
             String carNo = car.getCarNo().trim().toUpperCase();
             String carType = car.getCarType();
-            if (car.getCarSize()==null||car.getCarSize()<=0) {
+            if (car.getCarSize() == null || car.getCarSize() <= 0) {
                 throw new AjaxError(carNo + "规格不正确");
             }
             if (StrUtil.isEmpty(carType)) {
@@ -811,13 +822,13 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
             //最新一条记录
             TbBusinessCar db = tbBusinessCarService.findTheLastRecord(carNo);
             //存在并且未离场+已审核
-            if (db!=null&&db.getConfirmJudge()==TbBusinessCar.ConfirmJudgeEnum.JUDGE_PASS.getCode()&&db.getRealOutTime()==null){
-                throw new BusinessException("车辆【"+carNo+"】已审核,请驳回再录入业务");
+            if (db != null && db.getConfirmJudge() == TbBusinessCar.ConfirmJudgeEnum.JUDGE_PASS.getCode() && db.getRealOutTime() == null) {
+                throw new BusinessException("车辆【" + carNo + "】已审核,请驳回再录入业务");
             }
-            if (!tbGoods.getName().contains("整车")){
+            if (!tbGoods.getName().contains("整车")) {
                 //记录不存在或者已离场
-                if (db==null||db.getRealOutTime()!=null){
-                    throw new BusinessException("车辆【"+carNo+"】未入场,无法录入业务");
+                if (db == null || db.getRealOutTime() != null) {
+                    throw new BusinessException("车辆【" + carNo + "】未入场,无法录入业务");
                 }
             }
             //不存在,或者已离场记录--->新建记录;
@@ -933,8 +944,8 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
             if (StrUtil.isNotEmpty(businessCarId)) {
                 //原来已存在的
                 TbBusinessCar dbBusinessCar = tbBusinessCarService.getById(businessCarId);
-                if (dbBusinessCar.getConfirmJudge()==TbBusinessCar.ConfirmJudgeEnum.JUDGE_PASS.getCode()){
-                    throw new BusinessException("车辆【"+carNo+"】已审核,请驳回再录入业务");
+                if (dbBusinessCar.getConfirmJudge() == TbBusinessCar.ConfirmJudgeEnum.JUDGE_PASS.getCode()) {
+                    throw new BusinessException("车辆【" + carNo + "】已审核,请驳回再录入业务");
                 }
                 //如果修改了车牌号
                 String dbCarNo = dbBusinessCar.getCarNo();
@@ -970,10 +981,10 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
             } else {
                 TbBusinessCar checkCar = tbBusinessCarService.findTheLastRecord(carNo);
                 //存在+审核+未离场的
-                if (checkCar!=null
-                        &&checkCar.getConfirmJudge()==TbBusinessCar.ConfirmJudgeEnum.JUDGE_PASS.getCode()
-                        &&checkCar.getRealOutTime()==null){
-                    throw new BusinessException("车辆【"+carNo+"】已审核,请驳回再录入业务");
+                if (checkCar != null
+                        && checkCar.getConfirmJudge() == TbBusinessCar.ConfirmJudgeEnum.JUDGE_PASS.getCode()
+                        && checkCar.getRealOutTime() == null) {
+                    throw new BusinessException("车辆【" + carNo + "】已审核,请驳回再录入业务");
                 }
                 //不存在或者已经离场的
                 if (checkCar == null ||
@@ -1101,7 +1112,7 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
      * @param isAdmin         是否管理员
      */
     public void selectErrorBusiness(ErrorBusinessBO errorBusinessBO, boolean isAdmin) {
-        log.info("is admin :{}",isAdmin);
+        log.info("is admin :{}", isAdmin);
         TbBusiness tbBusiness = getById(errorBusinessBO.getId());
         if (tbBusiness == null) {
             throw new AjaxError("业务已被删除");
@@ -1153,7 +1164,7 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
             outTime = payTime;
         }
         //计算停车费
-        BigDecimal parkMoney = this.calculationPartMoney(inTime, outTime,tbBusinessCar.getCarSize());
+        BigDecimal parkMoney = this.calculationPartMoney(inTime, outTime, tbBusinessCar.getCarSize());
         tbBusinessCar.setMoney(parkMoney);
     }
 
@@ -1166,7 +1177,7 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
      * @param sendBy
      */
     private void sendOA(TbBusiness tbBusiness, List<TbBusinessItem> items, List<TbBusinessCar> tbBusinessCars, String sendBy) {
-        if (!oaConfig.isEnable()){
+        if (!oaConfig.isEnable()) {
             return;
         }
         ParamsBO paramsBO = buildParams(tbBusiness, items, tbBusinessCars);
@@ -1442,7 +1453,7 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
      * @param id
      */
     public void applyOA(String id, String sendBy) {
-        log.info("发起流程:{},{}",id,sendBy);
+        log.info("发起流程:{},{}", id, sendBy);
         TbBusiness tbBusiness = this.getById(id);
         List<TbBusinessItem> items = tbBusinessItemService.findByBusinessId(id);
         List<TbBusinessCar> tbBusinessCars = tbBusinessCarService.findOtherBusinessCar(id);
@@ -1497,7 +1508,7 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
                 .setOaJudgeTime(new Date());
         this.updateById(tbBusiness);
         String businessId = tbBusiness.getId();
-        if (StrUtil.contains(result, "通过") &&pushfeeConfig.isEnable()) {
+        if (StrUtil.contains(result, "通过") && pushfeeConfig.isEnable()) {
             //todo 审批通过-==>已支付的生成明细===>推送订单到计费系统
             List<TbBusinessCar> cars = tbBusinessCarService.findOtherBusinessCar(businessId);
             String transactionId = tbBusiness.getTransactionId();
@@ -1512,11 +1523,11 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
                     }).
                     collect(Collectors.toList());
             if (!priceBOList.isEmpty()) {
-                tbFeeDetailsService.chargeParkFee(priceBOList, transactionId, outTradeNo, payTime,TbFeeDetails.ModuleEnum.OFFLINE.getDesc());//添加cars的收费明细
+                tbFeeDetailsService.chargeParkFee(priceBOList, transactionId, outTradeNo, payTime, TbFeeDetails.ModuleEnum.OFFLINE.getDesc());//添加cars的收费明细
             }
             if (tbBusiness.getPayStatus() == TbBusiness.PayStatus.HAS_PAY_CONFIRM.getCode()) {
                 List<TbBusinessItem> items = tbBusinessItemService.findByBusinessId(businessId);
-                tbFeeDetailsService.chargeBusinessFee(items, transactionId, outTradeNo, payTime,TbFeeDetails.ModuleEnum.OFFLINE.getDesc());//添加items的收费明细
+                tbFeeDetailsService.chargeBusinessFee(items, transactionId, outTradeNo, payTime, TbFeeDetails.ModuleEnum.OFFLINE.getDesc());//添加items的收费明细
             }
 
         }

+ 5 - 1
sp-server/src/main/java/com/pj/project/tb_business_car/TbBusinessCarService.java

@@ -234,7 +234,11 @@ public class TbBusinessCarService extends ServiceImpl<TbBusinessCarMapper, TbBus
             throw new Exception("补录离场时间,请填写入场时间");
         }
         String carNo = t.getCarNo();
-        if (t.getColor().contains(partConfig.getFreeColor())) {
+        String color=t.getColor();
+        if (StrUtil.isEmpty(color)){
+            throw new AjaxError("车牌颜色不能为空");
+        }
+        if (color.contains(partConfig.getFreeColor())) {
             TbMildCar tbMildCar = tbMildCarService.findByCarNo(carNo);
             if (tbMildCar == null) {
                 t.setPayType(TbBusinessCar.PayTypeEnum.FEE_TYPE.getType()).setPay(1);

+ 2 - 0
sp-server/src/main/java/com/pj/project/tb_fee_details/TbFeeDetails.java

@@ -288,6 +288,8 @@ public class TbFeeDetails implements Serializable {
     public static enum PartFeeEnum {
         DAY_PART("1", "白天停车"),
         NIGHT_PART("2", "夜间停车"),
+        IN_24_HOURS("3","24小时内停车服务收费"),
+        OUT_24_HOURS("4","停放超24小时停车服务收费"),
         UNKNOW("-1", "未知"),
         ;
         private String no;

+ 1 - 1
sp-server/src/main/java/com/pj/project/tb_fee_details/TbFeeDetailsMapper.xml

@@ -84,7 +84,7 @@
             <if test=' this.has("itemTypeId") '>and item_type_id = #{itemTypeId}</if>
             <if test=' this.has("itemTypeName") '>and item_type_name = #{itemTypeName}</if>
             <if test=' this.has("itemId") '>and item_id = #{itemId}</if>
-            <if test=' this.has("itemName") '>and item_name = #{itemName}</if>
+            <if test=' this.has("itemName") '>and item_name like concat('%',#{itemName},'%')</if>
             <if test=' this.has("itemPrice") '>and item_price = #{itemPrice}</if>
             <if test=' this.has("payDay") '>and pay_day = #{payDay}</if>
             <if test=' this.has("payType") '>and pay_type = #{payType}</if>

+ 30 - 64
sp-server/src/main/java/com/pj/project/tb_fee_details/TbFeeDetailsService.java

@@ -211,78 +211,44 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
      * @param outTradeNo
      * @param now
      */
-    public void chargeParkFee(List<PriceBO> cars, String transactionId, String outTradeNo, Date now,String module) {
-        log.info("进入计算停车费:{}", JSONUtil.toJsonStr(cars));
+    public void chargeParkFee(List<PriceBO> cars, String transactionId, String outTradeNo, Date now, String module) {
         String payDay = DateUtil.format(now, "yyyy-MM-dd");
         for (PriceBO bo1 : cars) {
-            if (bo1.getP().compareTo(BigDecimal.valueOf(0)) == 0) {
+            //本次支付的停车费金额
+            BigDecimal payPrice = bo1.getP();
+            if (payPrice.compareTo(BigDecimal.valueOf(0)) == 0) {
                 continue;
             }
             TbBusinessCar car = tbBusinessCarService.getById(bo1.getId());
-
-            //thisCarAllFeeList是当前放行记录的车辆的所有日期的白天停车和夜间停车明细
-            List<TbFeeDetails> thisCarAllFeeList = getByBusinessCarIdAndCarNoAndFeeType(car.getId(), car.getCarNo(), TbFeeDetails.fee.PARK_FEE.getCode());
-            //不是当前日期,当前放行记录的车辆在之前的日期付的钱
-            BigDecimal notToDayMoney = new BigDecimal(0);
-            for (TbFeeDetails d : thisCarAllFeeList) {
-                if (!StrUtil.equals(payDay, d.getPayDay())) {
-                    notToDayMoney = notToDayMoney.add(d.getItemPrice());
-                }
-            }
-            //当前日期付的钱 = 改放行记录总的停车费-之前日前的钱
-            BigDecimal thisDayMoney = car.getMoney().subtract(notToDayMoney);
-
-            //oldFeeList是当前日期的白天停车和夜间停车明细
-            List<TbFeeDetails> oldFeeList = getByBusinessCarIdAndCarNoAndFeeTypeAndPayDay(car.getId(), car.getCarNo(), TbFeeDetails.fee.PARK_FEE.getCode(), payDay);
-            TbFeeDetails nightParkFee = new TbFeeDetails();
-            TbFeeDetails dayParkFee = new TbFeeDetails();
-            dayParkFee.setModule(module);
-            nightParkFee.setModule(module);
-            String transactionIdStr = "";
-            String outTradeNoStr = "";
-            for (TbFeeDetails oldFee : oldFeeList) {
-                if (StrUtil.isNotEmpty(oldFee.getTransactionId())) {
-                    transactionIdStr = oldFee.getTransactionId();
-                    outTradeNoStr = oldFee.getOutTradeNo();
-                }
-                if (StrUtil.equals(oldFee.getItemTypeName(), "白天停车")) {
-                    dayParkFee = oldFee;
-                }
-                if (StrUtil.equals(oldFee.getItemTypeName(), "夜间停车")) {
-                    nightParkFee = oldFee;
-                }
-            }
-            transactionIdStr = transactionIdStr.equals("") ? transactionId : transactionIdStr + "," + transactionId;
-            outTradeNoStr = outTradeNoStr.equals("") ? outTradeNo : outTradeNoStr + "," + outTradeNo;
-            BigDecimal baseNightPrice = partConfig.getBasePrice().add(partConfig.getExtraPrice());
+            //24小时内的停车费
+            BigDecimal in24Price = partConfig.getBasePrice();
             //4.2~9.6
-            if (car.getCarSize()<partConfig.getMildCarLength()&&car.getCarSize()>=partConfig.getFreeCarLength()){
-                baseNightPrice = partConfig.getMildCarBasePrice().add(partConfig.getExtraPrice());
+            if (car.getCarSize() < partConfig.getMildCarLength() && car.getCarSize() >= partConfig.getFreeCarLength()) {
+                in24Price = partConfig.getMildCarBasePrice();
             }
-            BigDecimal[] qr = thisDayMoney.divideAndRemainder(baseNightPrice);//商和余数的数组,商为夜间停车次数,余数为白天停车费用。
-            BigDecimal nightFeeNum = qr[0];
-            if (nightFeeNum.compareTo(BigDecimal.valueOf(0)) > 0) {
-                nightParkFee.setNum(nightFeeNum.intValue()).setItemTypeName("夜间停车")
-                        .setUnitPrice(baseNightPrice).setItemPrice(baseNightPrice.multiply(nightFeeNum));
-                setFee(nightParkFee, car, transactionIdStr, outTradeNoStr, now);
-                String type = StrUtil.isEmpty(nightParkFee.getId()) ? TbFeeDetails.SyncTypeEnum.INSERT.getCode() : TbFeeDetails.SyncTypeEnum.UPDATE.getCode();
-                saveOrUpdate(nightParkFee);
-                taskService.addTask(new FeeDetailSyncTask(RandomUtil.randomNumbers(10), 1000, nightParkFee.getId(), type));
-                if (qr[1].compareTo(BigDecimal.valueOf(0)) == 0 && dayParkFee.getId() != null) {
-                    delete(Long.valueOf(dayParkFee.getId()));
-                    type = TbFeeDetails.SyncTypeEnum.DELETE.getCode();
-                    taskService.addTask(new FeeDetailSyncTask(RandomUtil.randomNumbers(10), 1000, dayParkFee.getId(), type));
-
-                }
+            //24小时外的停车费
+            BigDecimal out24Price = payPrice.subtract(in24Price);
+            if (in24Price.compareTo(BigDecimal.valueOf(0)) > 0) {
+                TbFeeDetails in24Detail = new TbFeeDetails();
+
+                in24Detail.setNum(1).setItemTypeName(TbFeeDetails.PartFeeEnum.IN_24_HOURS.getDesc())
+                        .setUnitPrice(in24Price).setItemPrice(in24Price);
+                setFee(in24Detail, car, transactionId, outTradeNo, now);
+                String type = StrUtil.isEmpty(in24Detail.getId()) ? TbFeeDetails.SyncTypeEnum.INSERT.getCode() : TbFeeDetails.SyncTypeEnum.UPDATE.getCode();
+                saveOrUpdate(in24Detail);
+                taskService.addTask(new FeeDetailSyncTask(RandomUtil.randomNumbers(10), 1000, in24Detail.getId(), type));
             }
-            if (qr[1].compareTo(BigDecimal.valueOf(0)) > 0) {
-                dayParkFee.setNum(1).setItemTypeName("白天停车").setUnitPrice(qr[1]).setItemPrice(qr[1]);
-                setFee(dayParkFee, car, transactionIdStr, outTradeNoStr, now);
-                String type = StrUtil.isEmpty(dayParkFee.getId()) ? TbFeeDetails.SyncTypeEnum.INSERT.getCode() : TbFeeDetails.SyncTypeEnum.UPDATE.getCode();
-                saveOrUpdate(dayParkFee);
-                taskService.addTask(new FeeDetailSyncTask(RandomUtil.randomNumbers(10), 1000, dayParkFee.getId(), type));
+            if (out24Price.compareTo(BigDecimal.valueOf(0)) > 0) {
+                TbFeeDetails out24Details = new TbFeeDetails();
+                BigDecimal unitPrice = in24Price.subtract(partConfig.getExtraPrice());
+                int num = out24Price.divide(unitPrice, BigDecimal.ROUND_UP, 0).intValue();
+                out24Details.setNum(num).setItemTypeName(TbFeeDetails.PartFeeEnum.OUT_24_HOURS.getDesc())
+                        .setUnitPrice(unitPrice).setItemPrice(out24Price);
+                setFee(out24Details, car, transactionId, outTradeNo, now);
+                String type = StrUtil.isEmpty(out24Details.getId()) ? TbFeeDetails.SyncTypeEnum.INSERT.getCode() : TbFeeDetails.SyncTypeEnum.UPDATE.getCode();
+                saveOrUpdate(out24Details);
+                taskService.addTask(new FeeDetailSyncTask(RandomUtil.randomNumbers(10), 1000, out24Details.getId(), type));
             }
-
         }
     }
 
@@ -1019,7 +985,7 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
             outTradeNoStr = outTradeNoStr.equals("") ? outTradeNo : outTradeNoStr + "," + outTradeNo;
             BigDecimal baseNightPrice = partConfig.getBasePrice().add(partConfig.getExtraPrice());
             //4.2~9.6
-            if (car.getCarSize()<partConfig.getMildCarLength()&&car.getCarSize()>=partConfig.getFreeCarLength()){
+            if (car.getCarSize() < partConfig.getMildCarLength() && car.getCarSize() >= partConfig.getFreeCarLength()) {
                 baseNightPrice = partConfig.getMildCarBasePrice().add(partConfig.getExtraPrice());
             }
             BigDecimal[] qr = thisDayMoney.divideAndRemainder(baseNightPrice);//商和余数的数组,商为夜间停车次数,余数为白天停车费用。

+ 1 - 1
sp-server/src/main/resources/application-dev.yml

@@ -46,7 +46,7 @@ spring:
     myconfig:
         # 本项目部署到的服务器域名(文件上传等等模块  要用到)
         domain: http://127.0.0.1:8099/pro
-        web-domain: https://127.0.0.1:8080
+        web-domain: http://127.0.0.1:8080
         login-out-minute: 10
         sys-log-path: D:\project\pco\sp-server\logs\pco\debug
 part-config: