qzyReal преди 2 години
родител
ревизия
1959631451

+ 30 - 8
sp-admin/sa-frame/menu-list.js

@@ -1,5 +1,3 @@
-
-
 // 定义菜单列表 
 var menuList = [{
 		id: 'auth',
@@ -261,8 +259,7 @@ var menuList = [{
 		name: '业务管理',
 		icon: 'el-icon-edit-outline',
 		parent: true,
-		childList: [
-			{
+		childList: [{
 				id: 'tb-car-disincle-list',
 				name: '业务管理',
 				url: 'sa-view/tb-business/tb-car-disincle-list.html',
@@ -299,6 +296,33 @@ var menuList = [{
 					},
 				]
 			},
+			{
+				id: 'tb-supplement-list',
+				name: '补录订单',
+				url: 'sa-view/tb-business/tb-supplement-list.html',
+				childList:[
+					{
+						id: 'tb-supplement-add',
+						name: '添加',
+						isShow: false
+					},
+					{
+						id: 'tb-supplement-edit',
+						name: '修改',
+						isShow: false
+					},
+					{
+						id: 'tb-supplement-del',
+						name: '删除',
+						isShow: false
+					},
+					{
+						id: 'tb-supplement-push',
+						name: '推送流程',
+						isShow: false
+					},
+				]
+			}
 
 
 		]
@@ -612,8 +636,7 @@ var menuList = [{
 				id: 'tb-fee-details-list',
 				name: '收费明细',
 				url: 'sa-view/tb-fee-statistics/tb-fee-details-list.html',
-				childList: [
-					{
+				childList: [{
 						id: 'tb-kaidan-confirm',
 						name: '开单确认',
 						isShow: false
@@ -685,8 +708,7 @@ var menuList = [{
 		name: '开票管理',
 		icon: 'el-icon-folder-opened',
 		parent: true,
-		childList: [
-			{
+		childList: [{
 				id: 'tb-entity-list',
 				name: '开票主体',
 				url: 'sa-view/tb-entity/tb-entity-list.html'

+ 9 - 7
sp-admin/sa-view/tb-business/tb-car-disincle-list.html

@@ -54,13 +54,13 @@
 					<div class="c-item">
 						<label class="c-label">业务项:</label>
 						<el-select v-model="p.goodsId">
-							<el-option v-for="good in goodsList" :key="good.id"
-									   :label="good.name" :value="good.id">
+							<el-option v-for="good in goodsList" :key="good.id" :label="good.name" :value="good.id">
 							</el-option>
 						</el-select>
 					</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.adminConfirmInput=-1;p.customerName='';p.owner='';p.no=''; f5()">重置
+					<el-button type="info" icon="el-icon-search"
+						@click="p.carNo = '';p.adminConfirmInput=-1;p.customerName='';p.owner='';p.no=''; f5()">重置
 					</el-button>
 					<el-button v-if="sa.isAuth('tb-flex-business-add')" size="mini" type="primary" @click="add()">
 						新增</el-button>
@@ -82,6 +82,7 @@
 					<sa-td name="确认" prop="adminConfirmInput" type="enum" :jv="{1: '已确认', 0: '未确认'}"></sa-td>
 					<sa-td name="已支付(元)" prop="payMoney" width="140"></sa-td>
 					<sa-td name="业务费用(元)" prop="itemPrice" width="120"></sa-td>
+					<sa-td name="支付时间" prop="payTime" width="140"></sa-td>
 					<sa-td width="160" name="创建时间" prop="createTime"></sa-td>
 					</sa-td>
 					<el-table-column label="操作" width="415px" fixed="right">
@@ -157,9 +158,10 @@
 					},
 					p: { // 查询参数  
 						adminConfirmInput: -1,
-						customerName:'',
-						owner:'',
-						no:'',
+						customerName: '',
+						owner: '',
+						no: '',
+						supplement: 0,
 						carNo: '', // 车牌号
 						goodsId: '',
 						pageNo: 1, // 当前页 
@@ -175,7 +177,7 @@
 					goodsList: [],
 				},
 				methods: {
-					getGoodsList(){
+					getGoodsList() {
 						sa.ajax('/TbGoods/getList', function(resp) {
 							this.goodsList = resp.data;
 						}.bind(this));

+ 835 - 0
sp-admin/sa-view/tb-business/tb-supplement-add.html

@@ -0,0 +1,835 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>入境登记-添加/修改</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;
+			}
+
+			.c-panel .el-form .c-panel .el-form {
+				width: 180px;
+			}
+
+			.item-num .el-input__inner {
+				width: 130px;
+			}
+
+			.xj {
+				display: inline;
+				color: red;
+				margin-left: 9px;
+				font-weight: bold;
+			}
+
+			.hj {
+				color: red;
+				margin-left: 9px;
+				font-weight: bold;
+
+			}
+
+			.china-car-size .el-input__inner {
+				width: 130px;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<div class="c-title">数据添加</div>
+					<el-form v-if="m" label-position="left">
+						<el-row>
+							<el-card class="box-card">
+								<div slot="header" class="clearfix">
+									<span>基本资料</span>
+									<el-button style="float: right; padding: 3px 0;padding: 7px;border-radius: 4px;"
+										type="primary" @click="selectFn">选择异常业务单</el-button>
+								</div>
+								<div>
+									<el-row>
+										<el-col span=8>
+											<div class="c-item">
+												<label class="c-label"><span style="color: red;">*</span>业务项目:</label>
+												<el-select v-model="m.goodsId" placeholder="请选择" @change="goodsChange">
+													<el-option v-for="item in goodsList" :key="item.id"
+														:label="item.name" :value="item.id">
+													</el-option>
+												</el-select>
+											</div>
+											<div class="c-item" v-if="goods.needDeclare==1">
+												<label class="c-label">
+													<span style="color: red;">*</span>
+													申报单号:</label>
+												<el-input v-model="m.declareNo" placeholder="选择申报单"
+													:readonly="goods.needDeclare==1" clearable>
+												</el-input>
+												<div style="cursor: pointer;color: blue;display: inline;"
+													@click="handlerDeclare">
+													<i class="el-icon-folder-add"></i>
+												</div>
+											</div>
+										</el-col>
+										<el-col span=8>
+											<div class="c-item" v-if="goods.needCustomer">
+												<label class="c-label"><span style="color: red;">*</span>客户:</label>
+												<el-select :disabled="goods.needDeclare||m.declareNo"
+													v-model="m.customerId" placeholder="请选择">
+													<el-option v-for="item in customerList" :key="item.id"
+														:label="item.name" :value="item.id">
+													</el-option>
+												</el-select>
+											</div>
+											<div class="c-item" v-if="goods.needOwner==1">
+												<label class="c-label">
+													<span style="color: red;">*</span>
+													货主:</label>
+												<el-input v-model="m.owner" placeholder="填写货主" clearable>
+												</el-input>
+											</div>
+										</el-col>
+										<el-col span=8>
+											<div class="c-item">
+												<label class="c-label">作业人员:</label>
+												<el-input v-model="m.operator" placeholder="作业人员" clearable>
+												</el-input>
+											</div>
+											<div class="c-item">
+												<label class="c-label"><span style="color: red;"
+														v-if="goods.needOperateTime==1">*</span>作业时间:</label>
+												<el-date-picker type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
+													v-model="m.operateTime"></el-date-picker>
+											</div>
+										</el-col>
+									</el-row>
+								</div>
+							</el-card>
+						</el-row>
+						<el-row>
+							<el-card class="box-card">
+								<div slot="header" class="clearfix">
+									<span>车辆</span>
+									<el-button style="float: right;" icon="el-icon-plus" type="primary"
+										@click="showAddModal" v-if="goods.mulCar==1||car.list.length==0">添加
+									</el-button>
+								</div>
+								<el-table :data="car.list">
+									<el-table-column type="index" width="50" label="序号">
+									</el-table-column>
+									<el-table-column prop="carNo" label="车牌号">
+									</el-table-column>
+									<el-table-column prop="carSize" label="规格(米)">
+									</el-table-column>
+									<el-table-column prop="carType" label="类型">
+									</el-table-column>
+									<el-table-column prop="netWeight" label="载重(kg)">
+									</el-table-column>
+									<el-table-column label="操作">
+										<template slot-scope="s">
+											<el-button class="c-btn" type="info" @click="editFn(s.row)">修改</el-button>
+											<el-button class="c-btn" type="danger" @click="deleteFn(s.row)">删除
+											</el-button>
+										</template>
+									</el-table-column>
+								</el-table>
+							</el-card>
+						</el-row>
+						<el-row>
+							<el-card class="box-card">
+								<div slot="header" class="clearfix">
+									<span>收费项</span>
+								</div>
+								<div>
+									<el-form-item v-for="(type,index) in itemTypeList">
+										<el-row justify="center">
+											<el-col span="9">
+												<label style="color: red;"
+													v-if="type.need==1">*</label><label>{{type.name}}:</label>
+												<el-select v-model="type.itemId" style="width: 120px;"
+													@change="itemChange(type)" placeholder="请选择">
+													<el-option v-for="item in type.items" :key="item.id"
+														:label="item.itemName" :value="item.id">
+													</el-option>
+												</el-select>
+											</el-col>
+											<el-col span="7">
+												<el-input-number style="margin-left: 60px;" class="item-num"
+													v-model="type.num" :min="1" :max="10" size="mini"
+													:disabled="type.inc==0"></el-input-number>
+												<div class="xj" v-if="type.itemId">
+													{{type.price*type.num}}元
+													<label @click="cleanItem(type)"
+														style="margin-left: 5px;cursor: pointer">(<i
+															class="el-icon-delete"></i>)</label>
+												</div>
+											</el-col>
+											<el-col span="8">
+												<label class="c-label">
+													备注:</label>
+												<el-input v-model="type.remark" placeholder="请输入备注" clearable>
+												</el-input>
+											</el-col>
+										</el-row>
+										<el-divider></el-divider>
+									</el-form-item>
+									<div class="hj" v-if="totalPrice>0">
+										合计费用:{{totalPrice}}<label>元</label>
+									</div>
+								</div>
+							</el-card>
+						</el-row>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="closeFn()">取消</el-button>
+			</div>
+			<el-dialog title="车辆录入" :visible.sync="car.visible" width="400">
+				<span>
+					<el-form label-position="left">
+						<div class="c-item">
+							<label class="c-label"><span style="color: red;">*</span>车牌号:</label>
+							<el-autocomplete v-model="car.form.carNo" placeholder="请输入车牌号" value-key='carNo'
+								:fetch-suggestions="queryCarAsync">
+							</el-autocomplete>
+						</div>
+						<div class="c-item">
+							<label class="c-label">车辆类型:</label>
+							<el-select v-model="car.form.carType" placeholder="请选择" @change="carTypeChange">
+								<el-option :label="item.name" :value="item.name" v-for="(item,index) in carTypeList">
+								</el-option>
+							</el-select>
+						</div>
+						<div class="c-item">
+							<label class="c-label">
+								<span style="color: red;" v-if="goods.needCarSize==1">*</span>
+								规格(米):</label>
+							<el-input-number class="item-num" v-model="car.form.carSize" :min="1" :max="50">
+							</el-input-number>
+						</div>
+						<div class="c-item" v-if="car.form.carType.indexOf('空')==-1">
+							<label class="c-label">
+								<span style="color: red;" v-if="goods.needCarSize==1">*</span>
+								载重(kg):</label>
+							<el-input-number class="item-num" v-model="car.form.netWeight" :min="1" :max="999999">
+							</el-input-number>
+						</div>
+					</el-form>
+				</span>
+				<span slot="footer" class="dialog-footer">
+					<el-button @click="car.visible = false">取 消</el-button>
+					<el-button type="primary" @click="confirmAdd">确 定</el-button>
+				</span>
+			</el-dialog>
+			<el-dialog title="申报单" :visible.sync="declare.visible" width="90%">
+				<div class="delect-search">
+					申报人:
+					<el-input style="width: 140px;" v-model="declare.p.declarePeople" placeholder="申报人">
+					</el-input>
+					<el-button type="primary" @click="getDeclareList">搜索</el-button>
+					<el-button type="info" @click="resetDclare">重置</el-button>
+				</div>
+				<el-card class="box-card" style="margin-top: 20px;">
+					<div slot="header">
+						<span>列表</span>
+					</div>
+					<el-table :data="declare.list" ref="declareTable">
+						<el-table-column type="selection">
+						</el-table-column>
+						<el-table-column prop="declarePeople" label="申报人">
+						</el-table-column>
+						<el-table-column prop="customerName" label="申报公司" width=200>
+						</el-table-column>
+						<el-table-column prop="sendUnit" label="货主" width=200>
+						</el-table-column>
+						<el-table-column prop="createTime" width="140" label="申报时间">
+						</el-table-column>
+						<el-table-column prop="declareNo" width="180" label="申报单号">
+						</el-table-column>
+						<el-table-column prop="goodsName" label="产品学名">
+						</el-table-column>
+						<el-table-column prop="carNo" label="越南车牌">
+						</el-table-column>
+						<el-table-column prop="grossWeight" label="毛重(kg)">
+						</el-table-column>
+					</el-table>
+					<div class="block">
+						<el-pagination layout="prev, pager, next" @current-change="currentPageChange"
+							:page-size="declare.p.pageSize" :total="declare.p.dataCount"
+							:current-page="declare.p.pageNo">
+						</el-pagination>
+					</div>
+				</el-card>
+				<span slot="footer" class="dialog-footer">
+					<el-button @click="declare.visible = false">取 消</el-button>
+					<el-button type="primary" @click="confirmSelectDeclare">确 定</el-button>
+				</span>
+			</el-dialog>
+			<el-dialog title="选择异常业务单" :visible.sync="form.visible" width="90%">
+				<div class="delect-search">
+					<sa-item type="text" name="业务单号" placeholder="业务单号" v-model="form.p.no"></sa-item>
+					<sa-item type="text" name="车牌号" placeholder="车牌号" v-model="form.p.carNo"></sa-item>
+					<el-button type="primary" @click="getList">搜索</el-button>
+					<el-button type="info" @click="form.p.carNo='';form.p.no='';getList()">重置</el-button>
+				</div>
+				<el-card class="box-card" style="margin-top: 20px;">
+					<div slot="header">
+						<span>未支付业务列表</span>
+					</div>
+					<el-table :data="form.dataList" ref="errorTable">
+						<el-table-column type="selection">
+						</el-table-column>
+						<el-table-column prop="no" label="业务单号" width="190">
+						</el-table-column>
+						<el-table-column label="车牌号" width="160">
+							<template slot-scope="s">
+								<label>{{s.row.carNoStr}}</label>
+							</template>
+						</el-table-column>
+						<el-table-column prop="goodsName" label="业务项" width=200>
+						</el-table-column>
+						<sa-td name="业务费用(元)" prop="itemPrice" width="120"></sa-td>
+						<sa-td width="160" name="创建时间" prop="createTime"></sa-td>
+						<sa-td name="创建人" prop="createBy" width="100"></sa-td>
+					</el-table>
+					<div class="block">
+						<el-pagination layout="prev, pager, next" @current-change="businessPageChange"
+							:page-size="form.p.pageSize" :total="form.dataCount" :current-page="form.p.pageNo">
+						</el-pagination>
+					</div>
+				</el-card>
+				<span slot="footer" class="dialog-footer">
+					<el-button @click="form.visible = false">取 消</el-button>
+					<el-button type="primary" @click="selectBusinessFn">确 定</el-button>
+				</span>
+			</el-dialog>
+		</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: {
+					form: {
+						visible: false,
+						dataList: [],
+						dataCount: 0,
+						p: {
+							no: '',
+							carNo: '',
+							supplement: 0,
+							pageSize: 10,
+							pageNo: 1,
+							error: 1
+						}
+					},
+					m: {
+						id: '', // 主键 
+						customerId: '', // 客户id 
+						customerName: '', // 客户名称 
+						operateTime: '',
+						no: '', // 编号
+						goodsId: '',
+						goodsName: '', // 商品 
+					}, // 实体对象 
+					customerList: [],
+					carList: [],
+					currentCustomerId: 1,
+					itemTypeList: [],
+					filterTypeList: [],
+					goodsList: [],
+					tableData: [],
+					car: {
+						visible: false,
+						list: [],
+						form: {
+							carNo: '',
+							carType: '',
+							netWeight: '',
+							carSize: ''
+						}
+					},
+					declare: {
+						visible: false,
+						list: [],
+						p: {
+							pageNo: 1,
+							pageSize: 8,
+							dataCount: 0,
+							declarePeople: '',
+							production: '',
+							declareNo: '1'
+						}
+					},
+					goods: {
+						id: '',
+						name: '',
+						needWeight: 1,
+						needCarSize: 1,
+						needDeclare: 1,
+						needOperateTime: 1,
+						chinaCarPay: 1,
+						vietnamCarPay: 1,
+						mulCar: 0,
+					},
+					carTypeList: []
+				},
+				computed: {
+					totalPrice() {
+						let itemList = this.itemTypeList.filter(obj => obj.itemId);
+						let price = 0;
+						for (let i in itemList) {
+							let type = itemList[i];
+							let num = type.num;
+							let items = type.items;
+							for (let j in items) {
+								let item = items[j];
+								if (item.id == type.itemId) {
+									price += num * item.price;
+									break;
+								}
+							}
+						}
+						return price;
+					}
+				},
+				methods: {
+					selectFn() {
+						this.form.visible = true;
+						this.getList()
+					},
+					businessPageChange() {
+
+					},
+					getList() {
+						sa.ajaxNoLoading('/TbBusiness/getOtherBusiness', sa.removeNull(this.form.p), function(res) {
+							this.form.dataList = res.data; // 数据
+							this.form.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight(); // 刷新表格高度 
+						}.bind(this));
+					},
+					selectBusinessFn() {
+						// 获取选中元素的id列表
+						let selection = this.$refs['errorTable'].selection;
+						if (selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						let ids = sa.getArrayField(selection, 'id');
+					},
+					resetDclare() {
+						this.declare.p.pageNo = 1;
+						this.declare.p.pageSize = 8;
+						this.declare.p.production = '';
+						this.declare.p.declarePeople = '';
+						this.getDeclareList();
+					},
+					handlerDeclare() {
+						this.declare.visible = true;
+						this.getDeclareList();
+					},
+					currentPageChange(page) {
+						this.declare.p.pageNo = page;
+						this.getDeclareList();
+					},
+					getDeclareList() {
+						let declareNo = this.m.declareNo;
+						if (declareNo) {
+							this.declare.p.declareNo = declareNo;
+						}
+						sa.ajax('/TbDeclare/getNotBindList', sa.removeNull(this.declare.p), function(resp) {
+							let list = resp.data;
+							this.declare.list = list;
+							this.declare.p.pageNo = resp.pageNo;
+							this.declare.p.dataCount = resp.dataCount;
+							list.forEach(row => {
+								if (row.declareNo == this.m.declareNo && this.m.declareNo) {
+									this.$nextTick(() => {
+										this.$refs['declareTable'].toggleRowSelection(row, true)
+									})
+								}
+							})
+						}.bind(this))
+					},
+					confirmSelectDeclare() {
+						// 获取选中元素的id列表
+						let selection = this.$refs['declareTable'].selection;
+						let declareNo = sa.getArrayField(selection, 'declareNo');
+						if (selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						if (selection.length > 1) {
+							return sa.msg('只能选择一条数据')
+						}
+						let declare = selection[0];
+						let oldNo = this.m.declareNo;
+						if (oldNo && oldNo !== declare.declareNo) {
+							this.car.list = [];
+						}
+						if (oldNo !== declare.declareNo) {
+							this.m.declareNo = declare.declareNo;
+							this.m.customerId = declare.customerId;
+							this.m.customerName = declare.customerName;
+							this.m.owner = declare.sendUnit;
+							let carNo = declare.carNo;
+							let grossWeight = declare.grossWeight;
+							let carList = this.car.list;
+							let exit = carList.filter(obj => obj.carNo == carNo).pop();
+							if (!exit) {
+								let car = {
+									carNo: carNo,
+									netWeight: grossWeight,
+									carType: '载重'
+								}
+								this.car.list.push(car)
+							}
+							this.m.cardNo = declare.carNo;
+							this.m.chinaCarNo = declare.chinaCarNo;
+							this.m.netWeight = declare.grossWeight;
+							let chinaCarNo = declare.chinaCarNo;
+							if (chinaCarNo) {
+								let list = [];
+								chinaCarNo.replace(",", ",").split(",").forEach(carNo => {
+									let exit = carList.filter(obj => obj.carNo == carNo).pop();
+									if (!exit) {
+										let car = {
+											carNo: carNo,
+											carType: '空车'
+										}
+										this.car.list.push(car)
+									}
+								})
+							}
+							this.filterItems();
+						}
+						this.declare.visible = false;
+					},
+					cleanItem(type) {
+						type.itemId = '';
+						type.itemName = '';
+						type.price = '';
+					},
+					itemChange(type) {
+						let itemId = type.itemId;
+						let item = type.items.filter(obj => obj.id == itemId).pop();
+						if (item) {
+							type.inc = item.inc;
+							type.price = item.price;
+							type.needRemark = item.needRemark
+						}
+						this.validBefore();
+					},
+					confirmAdd() {
+						let list = this.car.list;
+						let carNo = this.car.form.carNo;
+						let netWeight = this.car.form.netWeight;
+						let goods = this.goods;
+						let form = this.car.form;
+						let carType = form.carType;
+
+						if (!carNo) {
+							sa.error('请录入车牌号')
+							return false;
+						}
+						if (!form.carSize && goods.needCarSize == 1) {
+							sa.error('请填入车辆规格')
+							return false;
+						}
+						if (carType.indexOf('空') !== -1) {
+							netWeight = 0;
+						}
+						let index = list.map(obj => obj.carNo).indexOf(carNo);
+						if (index > -1) {
+							list.splice(index, 1);
+						}
+						let carSize = form.carSize;
+						let car = {
+							id: form.id,
+							carNo: form.carNo.toUpperCase(),
+							carType: carType,
+							carSize: carSize,
+							netWeight: netWeight
+						}
+						this.car.list.push(car);
+						this.car.visible = false;
+						this.filterItems();
+					},
+					filterItems() {
+						let carList = this.car.list;
+						let filterTypeList = JSON.parse(JSON.stringify(this.filterTypeList));
+						if (carList.length == 0) {
+							this.itemTypeList = filterTypeList;
+							return;
+						}
+						let car = this.car.form;
+						if (car == null) {
+							let checkList = carList.filter(obj => obj.carType.indexOf('空') === -1);
+							if (checkList.length > 0) {
+								car = checkList[0];
+							}
+						}
+						let carSize = car.carSize;
+						let carType = car.carType;
+						if (carType.indexOf('空') !== -1 && carList.length > 1) {
+							return;
+						}
+						let netWeight = car.netWeight;
+						let tempList = [];
+						for (let i in filterTypeList) {
+							let type = filterTypeList[i];
+							let items = type.items;
+							if (carType) {
+								items = items.filter(item => item.itemType && item.itemType.indexOf(carType) !== -1);
+							}
+							if (carSize && carSize > 1) {
+								items = items.filter(item => item.minLength <= carSize && item.carLength >= carSize);
+							}
+							if (netWeight && netWeight > 1 && carType.indexOf('空') == -1) {
+								items = items.filter(item => item.minWeight <= netWeight && item.maxWeight >= netWeight);
+							}
+							let itemIds = items.map(item => item.id);
+							if (itemIds.indexOf(type.itemId) == -1) {
+								this.cleanItem(type);
+							}
+							type.items = items;
+							tempList.push(type);
+						}
+						this.itemTypeList = tempList;
+					},
+					showAddModal() {
+						this.car.visible = true;
+						this.car.form.carNo = '';
+						this.car.form.carSize = '';
+						this.car.form.netWeight = '';
+					},
+					editFn(data) {
+						Object.assign(this.car, {
+							visible: true,
+							form: JSON.parse(JSON.stringify(data))
+						})
+					},
+					deleteFn(data) {
+						this.car.list.splice(this.car.list.indexOf(data), 1);
+						this.filterItems();
+					},
+					getGoods() {
+						sa.ajax('/TbGoods/getList', {
+							pageNo: 1,
+							pageSize: 10
+						}, function(resp) {
+							let list = resp.data;
+							if (list.length >= 1) {
+								let initGoods = list[0];
+								this.goods = initGoods
+								this.m.goodsId = initGoods.id;
+								this.m.goodsName = initGoods.name;
+								this.getTypeByGoodsId();
+							}
+							this.goodsList = list;
+
+						}.bind(this))
+					},
+					goodsChange(v) {
+						let goodsList = this.goodsList;
+						let goods = goodsList.filter(goods => goods.id == v).pop();
+						this.goods = goods;
+						this.m.goodsName = goods.name;
+						this.getTypeByGoodsId();
+					},
+					getTypeByGoodsId() {
+						sa.ajax('/TbItemType/getTypeByGoodsId', {
+							goodsId: this.m.goodsId
+						}, function(resp) {
+							let list = resp.data;
+							this.itemTypeList = list;
+							this.filterTypeList = JSON.parse(JSON.stringify(this.itemTypeList));
+							this.filterItems();
+						}.bind(this))
+					},
+					getItemType() {
+						sa.ajax('/TbItem/getItemType', function(resp) {
+							let list = resp.data;
+							if (list.length > 0) {
+								this.car.form.carType = list[0].name;
+							}
+							this.carTypeList = list;
+						}.bind(this))
+					},
+					carTypeChange(v) {
+
+					},
+					getCustomerList() {
+						sa.ajax('/TbCostomer/getList', {
+							pageNo: 1,
+							pageSize: 30,
+							sortType: 20,
+							judgeStatus: 2
+						}, function(res) {
+							let list = res.data;
+							this.customerList = list;
+						}.bind(this));
+					},
+					queryCarAsync(queryStr, cb) {
+						sa.ajaxNoLoading('/TbBusinessCar/searchByNo', {
+							carNo: queryStr
+						}, function(resp) {
+							cb(resp.data)
+						}.bind(this))
+					},
+					closeFn() {
+						parent.app.f5();
+						sa.closeCurrIframe();
+					},
+					validBefore() {
+						let goods = this.goods;
+						let needCustomer = goods.needCustomer;
+						let m = this.m;
+						if (goods.needDeclare == 1 && !m.declareNo) {
+							sa.error('请选择申报单');
+							return false;
+						}
+						if (needCustomer == 1 && !m.customerId) {
+							sa.error('请选择客户');
+							return false;
+						}
+						if (goods.needOperateTime == 1 && !m.operateTime) {
+							sa.error('请选择作业时间');
+							return false;
+						}
+						if (!m.owner && goods.needOwner == 1) {
+							sa.error('请填写货主');
+							return false;
+						}
+						if (this.car.list.length == 0) {
+							sa.error('请录入车辆');
+							return false;
+						}
+						let needCarSize = goods.needCarSize;
+						let carList = this.car.list;
+						for (let i in carList) {
+							let car = carList[i];
+							if (needCarSize == 1 && !car.carSize) {
+								sa.error('请补充' + car.carNo + '规格');
+								return;
+							}
+
+						}
+					},
+					// 提交数据 
+					ok: function() {
+						let goods = this.goods;
+						let needCustomer = goods.needCustomer;
+						let m = this.m;
+						if (goods.needDeclare == 1 && !m.declareNo) {
+							sa.error('请选择申报单');
+							return false;
+						}
+						if (needCustomer == 1 && !m.customerId) {
+							sa.error('请选择客户');
+							return false;
+						}
+						if (goods.needOperateTime == 1 && !m.operateTime) {
+							sa.error('请选择作业时间');
+							return false;
+						}
+						if (!m.owner && goods.needOwner == 1) {
+							sa.error('请填写货主');
+							return false;
+						}
+						if (this.car.list.length == 0) {
+							sa.error('请录入车辆');
+							return false;
+						}
+						let needCarSize = goods.needCarSize;
+						let carList = this.car.list;
+						for (let i in carList) {
+							let car = carList[i];
+							if (needCarSize == 1 && !car.carSize) {
+								sa.error('请补充' + car.carNo + '规格');
+								return;
+							}
+
+						}
+						let typeList = this.itemTypeList;
+						let selectList = [];
+						for (let i in typeList) {
+							let type = typeList[i];
+							if (type.need == 1 && !type.itemId) {
+								sa.error('【' + type.name + '】必选');
+								return false;
+							}
+							if (type.needRemark == 1 && !type.remark) {
+								sa.error('请输入【' + type.name + '】的备注');
+								return false;
+							}
+							if (type.itemId) {
+								let obj = {
+									typeId: type.id,
+									typeName: type.name,
+									id: type.itemId,
+									num: type.num,
+									price: type.price,
+									remark: type.remark
+								}
+								selectList.push(obj);
+							}
+						}
+						if (needCustomer != 1) {
+							m.customerId = '';
+						}
+						m.itemJson = JSON.stringify(selectList);
+						m.carJson = JSON.stringify(carList);
+						let chinaCarNo = carList
+							.filter(car => sa.isCarNo(car.carNo.toUpperCase()))
+							.map(car => car.carNo.toUpperCase())
+							.join("、");
+						let yueCarNo = carList
+							.filter(car => !sa.isCarNo(car.carNo.toUpperCase()))
+							.map(car => car.carNo.toUpperCase())
+							.join("、");
+						m.cardNo = yueCarNo;
+						m.chinaCarNo = chinaCarNo;
+						sa.ajax('/TbBusiness/addOtherBusiness', sa.removeNull(m), function(res) {
+							sa.alert('增加成功', this.clean);
+						}.bind(this));
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						parent.app.f5(); // 刷新父页面列表
+						sa.closeCurrIframe(); // 关闭本页 
+					},
+					getCurrentCustomer() {
+						sa.ajax('/TbCostomer/getCurrentCustomerId', function(resp) {
+							let id = resp.data;
+							this.currentCustomerId = id;
+						}.bind(this));
+					},
+				},
+				mounted: function() {
+					this.getCurrentCustomer();
+					this.getGoods();
+					this.getItemType();
+					this.getCustomerList();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 209 - 0
sp-admin/sa-view/tb-business/tb-supplement-list.html

@@ -0,0 +1,209 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>入境登记-列表</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>
+		<script src="../../static/kj/upload-util.js"></script>
+	</head>
+	<style>
+		.complete-modal .c-label,
+		.confirm-in .c-label,
+		.confirm-info .c-label {
+			width: 290px;
+		}
+	</style>
+	<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="业务单号" placeholder="业务单号" v-model="p.no"></sa-item>
+					<sa-item type="text" name="车牌号" placeholder="车牌号" v-model="p.carNo"></sa-item>
+					<sa-item type="text" name="客户" placeholder="客户" v-model="p.customerName"></sa-item>
+					<sa-item type="text" name="货主" placeholder="客户" v-model="p.owner"></sa-item>
+					<div class="c-item">
+						<label class="c-label">审批状态:</label>
+						<el-select v-model="p.oaResult" placeholder="请选择" @change="f5()">
+							<el-option label="全部" value=""></el-option>
+							<el-option label="未审核" :value="0"></el-option>
+							<el-option label="审核通过" :value="1"></el-option>
+							<el-option label="不通过" :value="2"></el-option>
+						</el-select>
+					</div>
+					<div class="c-item">
+						<label class="c-label">业务项:</label>
+						<el-select v-model="p.goodsId">
+							<el-option v-for="good in goodsList" :key="good.id" :label="good.name" :value="good.id">
+							</el-option>
+						</el-select>
+					</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.oaResult='';p.customerName='';p.owner='';p.no=''; f5()">重置
+					</el-button>
+					<el-button v-if="sa.isAuth('tb-flex-business-add')" size="mini" type="primary" @click="add()">
+						新增</el-button>
+					<br />
+				</el-form>
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" style="margin-top: 20px;">
+					<el-table-column type="index" width="50"></el-table-column>
+					<sa-td name="业务单号" prop="no" width="160"></sa-td>
+					<sa-td name="客户名称" prop="customerName" width="190"></sa-td>
+					<sa-td name="货主" prop="owner" width="160"></sa-td>
+					<sa-td name="业务项" prop="goodsName" width="160"></sa-td>
+					<el-table-column label="车牌号" width="160">
+						<template slot-scope="s">
+							<label>{{s.row.carNoStr}}</label>
+						</template>
+					</el-table-column>
+					<sa-td name="作业时间" prop="operateTime" width="160"></sa-td>
+					<sa-td name="确认" prop="adminConfirmInput" type="enum" :jv="{1: '已确认', 0: '未确认'}"></sa-td>
+					<sa-td name="已支付(元)" prop="payMoney" width="140"></sa-td>
+					<sa-td name="业务费用(元)" prop="itemPrice" width="120"></sa-td>
+					<sa-td width="160" name="创建时间" prop="createTime"></sa-td>
+					</sa-td>
+					<el-table-column label="操作" width="415px" fixed="right">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="primary" v-if="sa.isAuth('tb-flex-business-confirm')
+								&&currentCustomerId=='1'&&s.row.adminConfirmInput==0" @click="confirmFn(s.row)">账单确认</el-button>
+							<el-button class="c-btn" type="primary" v-if="sa.isAuth('tb-business-confirm')
+									&&currentCustomerId=='1'&&s.row.adminConfirmInput==1" @click="checkConfirmFn(s.row)">查看账单</el-button>
+							<el-button class="c-btn" type="success" @click="get(s.row)">查看</el-button>
+							<el-button class="c-btn" type="primary"
+								v-if="currentCustomerId=='1'||(s.row.adminConfirmInput==0&&sa.isAuth('tb-flex-business-edit'))"
+								@click="update(s.row)">
+								修改</el-button>
+							<el-button class="c-btn" type="danger"
+								v-if="sa.isAuth('tb-flex-business-del')&&s.row.adminConfirmInput==0&&s.row.payMoney==0"
+								@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-info": httpVueLoader('../../sa-frame/com/sa-info.vue'),
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),
+				},
+				el: '.vue-box',
+				data: {
+					value: '',
+					currentCustomerId: '1',
+					confirm: {
+						visible: false,
+						title: '',
+						form: {
+							ids: ''
+						}
+					},
+					p: { // 查询参数  
+						oaResult: '',
+						customerName: '',
+						owner: '',
+						no: '',
+						supplement: 1,
+						carNo: '', // 车牌号
+						goodsId: '',
+						pageNo: 1, // 当前页 
+						pageSize: 20, // 页大小 
+						sortType: 0 // 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+					timmer: null,
+					fresh: {
+						value: 60
+					},
+					goodsList: [],
+				},
+				methods: {
+					getGoodsList() {
+						sa.ajax('/TbGoods/getList', function(resp) {
+							this.goodsList = resp.data;
+						}.bind(this));
+					},
+					businessFn(data) {
+						sa.ajaxNoLoading('/TbBusinessCar/getOtherBusinessCarByBusinessId', {
+							businessId: data.id
+						}, function(resp) {
+							let list = resp.data;
+							let str = list.map(car => car.carNo).join('、');
+							let businessCarIds = list.map(car => car.id).join(',');
+							sa.showIframe('绑定车辆', 'tb-business-car-business.html?id=' + data.id +
+								'&businessCarId=' + data.businessCarId + '&carNo=' + str +
+								'&businessCarIds=' + businessCarIds, '90%', "90%");
+						}.bind(this))
+					},
+					getCurrendCustomer() {
+						sa.ajax('/TbCostomer/getCurrentCustomerId', function(resp) {
+							this.currentCustomerId = resp.data;
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('补录单详情', 'tb-car-disincle-info.html?id=' + data.id, '1050px', '90%');
+					},
+					add: function(data) {
+						sa.showIframe('新增补录单', 'tb-supplement-add.html?id=-1', '1080px', '90%');
+					},
+					update(data) {
+						sa.showIframe('修改补录单', 'tb-car-disincle-edit.html?id=' + data.id, '1080px', '90%');
+					},
+					getPcodeByCurrRid() {
+						sa.ajax('/SpRolePermission/getPcodeByCurrRid', function(resp) {
+							this.perCode = resp.data;
+						}.bind(this))
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/TbBusiness/deleteOtherBusiness?id=' + data.id + '&businessCarId=' +
+								data.businessCarId,
+								function(res) {
+									sa.arrayDelete(this.dataList, data);
+									sa.ok('删除成功');
+									sa.f5TableHeight(); // 刷新表格高度 
+								}.bind(this))
+						}.bind(this));
+					},
+					// 刷新
+					f5: function() {
+						sa.ajaxNoLoading('/TbBusiness/getOtherBusiness', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight(); // 刷新表格高度 
+						}.bind(this));
+					},
+				},
+				created: function() {
+					sa.onInputEnter();
+				},
+				mounted() {
+					this.getCurrendCustomer();
+					this.getGoodsList();
+					this.f5();
+				},
+			})
+		</script>
+	</body>
+</html>

+ 4 - 0
sp-server/src/main/java/com/pj/api/pushfee/task/FeeDetailSyncTask.java

@@ -44,6 +44,10 @@ public class FeeDetailSyncTask {
      */
     @Scheduled(fixedRate = 600000)
     public void send() {
+        if (!pushfeeConfig.isEnable()){
+            log.info("pushfee_info:未启用推送");
+            return;
+        }
         if(partConfig.isTestEnv()){
             log.info("pushfee_info: 测试环境不推送");
             return;

+ 23 - 0
sp-server/src/main/java/com/pj/current/config/OAConfig.java

@@ -0,0 +1,23 @@
+package com.pj.current.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@ConfigurationProperties(prefix = "oa")
+@Data
+@Component
+public class OAConfig {
+    /**
+     * 来源编号
+     */
+    private String systemCode;
+    /**
+     * 模板ID
+     */
+    private String templateId;
+    /**
+     * 发起人
+     */
+    private String personNo;
+}

+ 1 - 0
sp-server/src/main/java/com/pj/current/config/PushfeeConfig.java

@@ -14,6 +14,7 @@ import org.springframework.stereotype.Component;
 @ConfigurationProperties(prefix = "pushfee-config")
 public class PushfeeConfig {
 
+    private boolean enable;
     private String remotePublicKeyBase6;
     private String syncUrl;
     private String sysId;

+ 193 - 0
sp-server/src/main/java/com/pj/project/oa/bo/ParamsBO.java

@@ -0,0 +1,193 @@
+package com.pj.project.oa.bo;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+public class ParamsBO implements Serializable {
+    /**
+     * 请求标识
+     */
+    private String requestId;
+    /**
+     * 系统编号 0101为A1场站系统来源编码
+     */
+    private String businessSystemCode="0101";
+    /**
+     * 具体业务数据
+     */
+    private DataBO data;
+
+    @Data
+    public static class DataBO{
+        /**
+         * 补单业务名称
+         */
+        private String operationalProject;
+        //补单人
+        private String operationalPerson;
+        /**
+         * 补单原因
+         */
+        private String operationalReason;
+        /**
+         * 文档标题==>xxx的流程
+         */
+        private String docSubject;
+        /**
+         * 文档模板id
+         */
+        private String fdTemplateId="169b437e7e1cd1bd7b6367c4563b24ef";
+        /**
+         * 文档的富文本内容==>可为空
+         */
+        private String docContent;
+        /**
+         * 流程发起人 固定值 json格式 {"PersonNo":"00013"}
+         */
+        private String docCreator;
+        /**
+         * 流程表单数据 json格式
+         * {
+         * 	"operationalProject": "入境车辆核酸检测",
+         * 	"workingTime": "2022-09-06 21:41:05",
+         * 	"operatingOutlay": 160,
+         * 	"paymentTime": "2022-09-07 20:25:19",
+         * 	"cargoOwner": "",
+         * 	"operationNo": "2022090621417765",
+         * 	"recordingTime": "2022-09-06 11:54:47",
+         * 	"recorder": "echs999",
+         * 	"isPay": "已支付",
+         * 	"vehicleInfo.licenseNo": ["桂KV9616"],
+         * 	"vehicleInfo.type": ["空车"],
+         * 	"vehicleInfo.load": ["0"],
+         * 	"vehicleInfo.specifications": ["1"],
+         * 	"vehicleInfo.paymentStatus": ["已支付"],
+         * 	"vehicleInfo.vehicleState": ["正常"],
+         * 	"vehicleInfo.parkingFee": ["70"],
+         * 	"vehicleInfo.entryTime": ["2022-09-06 11:54:47"],
+         * 	"vehicleInfo.departureTime": ["2022-09-07 20:25:26"],
+         * 	"amount": "160"
+         * 	"specificBusinessItems.chargingItem": ["入境车辆核酸检测"],
+         * 	"specificBusinessItems.chargeDetail": ["入境车辆车体核酸检测费"],
+         * 	"specificBusinessItems.unitPrice": ["160"],
+         * 	"specificBusinessItems.chargingStandard": ["元/车"],
+         * 	"specificBusinessItems.quantity": ["1"],
+         * 	"specificBusinessItems.total": ["160"],
+         * 	"specificBusinessItems.payoutStatus": ["已支付"],
+         * 	"specificBusinessItems.payTime": ["2022-09-07 20:25:19"],
+         * 	"specificBusinessItems.note": []
+         * }
+         */
+        private FormValuesBO formValues;
+
+        @Data
+        @Accessors(chain = true)
+        public static class FormValuesBO{
+            /**
+             * 业务项 入境车辆核酸检测
+             */
+            private String operationalProject;
+            /**
+             * 作业时间
+             */
+            private String workingTime;
+            /**
+             * 业务费用
+             */
+            private String operatingOutlay;
+            /**
+             * 支付时间
+             */
+            private String paymentTime;
+            /**
+             * 货主
+             */
+            private String cargoOwner;
+            /**
+             * 业务编号
+             */
+            private String operationNo;
+            /**
+             * 录入时间
+             */
+            private String recordingTime;
+            /**
+             * 录入人
+             */
+            private String recorder;
+            /**
+             * 是否支付==>中文
+             */
+            private String isPay;
+            /**
+             * 车辆信息
+             */
+            private VehicleInfoBO vehicleInfo;
+            /**
+             * 业务项
+             */
+            private SpecificBusinessItemsBO  specificBusinessItems;
+
+            @Data
+            @Accessors(chain = true)
+            public static class VehicleInfoBO{
+                //车牌号
+                private List<String>licenseNo;
+                //类型,载重-空车
+                private List<String>type;
+                //载重
+                private List<String>load;
+                //规格
+                private List<String>specifications;
+                //支付状态
+                private List<String>paymentStatus;
+                //车辆状态
+                private List<String>vehicleState;
+                //停车费
+                private List<String>parkingFee;
+                //入场时间
+                private List<String>entryTime;
+                //离场时间
+                private List<String>departureTime;
+                //总计
+                private String amount;
+            }
+
+            @Data
+            @Accessors
+            public static class SpecificBusinessItemsBO{
+                //收费项
+                private List<String> chargingItem;
+                //收费明细
+                private List<String> chargeDetail;
+                //单价
+                private List<String> unitPrice;
+                //计费标准
+                private List<String> chargingStandard;
+                //数量
+                private List<String> quantity;
+                //合计
+                private List<String> total;
+                //支付状态 ==>中文
+                private List<String> payoutStatus;
+                //支付时间
+                private List<String> payTime;
+                //备注
+                private List<String> note;
+
+            }
+        }
+
+
+
+
+
+
+    }
+
+}

+ 22 - 0
sp-server/src/main/java/com/pj/project/oa/bo/ResultBO.java

@@ -0,0 +1,22 @@
+package com.pj.project.oa.bo;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+public class ResultBO implements Serializable {
+    //200表示调用成功,500表示调用失败
+    private int code;
+    private Boolean success;
+    private String message;
+    private DataBO data;
+    @Data
+    @Accessors(chain = true)
+    private static class  DataBO {
+        //主文档的数据库主键值
+        private String fdId;
+    }
+}

+ 12 - 0
sp-server/src/main/java/com/pj/project/tb_business/TbBusiness.java

@@ -50,6 +50,9 @@ public class TbBusiness extends Model<TbBusiness> implements Serializable {
     //其他业务
     public static final String PERMISSION_FLAX_BUSINESS_ADD = "tb-flex-business-add";
     public static final String PERMISSION_FLAX_BUSINESS_EDIT = "tb-flex-business-edit";
+    public static final String TB_SUPPLEMENT_ADD = "tb-supplement-add";
+    public static final String TB_SUPPLEMENT_EDIT = "tb-supplement-edit";
+    public static final String TB_SUPPLEMENT_DEL = "tb-supplement-del";
 
 
 
@@ -241,6 +244,15 @@ public class TbBusiness extends Model<TbBusiness> implements Serializable {
 
 
     private Integer payStep=2;
+    private Integer supplement=0;
+    private Date supplementTime;
+    private String supplementBy;
+    //oa审核状态
+    private Integer oaResult;
+    //oa审核意见
+    private String oaContent;
+    //oa主键
+    private String oaFdId;
 
     private transient String itemJson;
     private transient String peopleJson;

+ 32 - 6
sp-server/src/main/java/com/pj/project/tb_business/TbBusinessController.java

@@ -146,17 +146,17 @@ public class TbBusinessController {
         t.setCars(cars);
         return AjaxJson.getSuccessData(t);
     }
+
     /**
      * 查 - 根据id
      */
     @RequestMapping("checkReport")
     public AjaxJson checkReport(String businessCarId) {
-        List<TbBusiness>businessList= tbBusinessService.findOtherBusinessByCarId(businessCarId);
+        List<TbBusiness> businessList = tbBusinessService.findOtherBusinessByCarId(businessCarId);
         return AjaxJson.getSuccessData(businessList);
     }
 
 
-
     /**
      * 查集合 - 根据条件(参数为空时代表忽略指定条件)
      */
@@ -240,7 +240,6 @@ public class TbBusinessController {
     }
 
 
-
     @RequestMapping("complete")
     public AjaxJson complete(TbBusiness business) {
         if (!StrUtil.equals(StpUserUtil.getCustomerId(), UserTypeEnum.PLATFORM_ADMIN.getCustomerId())) {
@@ -292,8 +291,6 @@ public class TbBusinessController {
     }
 
 
-
-
     @RequestMapping(value = "addOtherBusiness")
     @SaCheckPermission(value = TbBusiness.PERMISSION_FLAX_BUSINESS_ADD)
     public AjaxJson addOtherBusiness(OtherBusinessBO otherBusinessBO) {
@@ -316,7 +313,7 @@ public class TbBusinessController {
 
     @RequestMapping(value = "bindOtherBusinessCar")
     @SaCheckPermission(value = TbBusiness.PERMISSION_FLAX_BUSINESS_EDIT)
-    public AjaxJson bindOtherBusinessCar(OtherBusinessBO otherBusinessBO) {
+    public AjaxJson bindOtherBusinessCar() {
         SoMap soMap = SoMap.getRequestSoMap();
         String businessId = soMap.getString("businessId");
         String businessCarIds = soMap.getString("businessCarIds");
@@ -324,7 +321,36 @@ public class TbBusinessController {
         return AjaxJson.getSuccess();
     }
 
+    /**
+     * 选择的方式添加异常单
+     *
+     * @return
+     */
+    @RequestMapping("selectErrorBusiness")
+    public AjaxJson selectErrorBusiness() {
+        SoMap soMap = SoMap.getRequestSoMap();
+        List<Long> ids = soMap.getListByComma("ids", Long.class);
+        if (ids.isEmpty()){
+            return AjaxJson.getError("请选择业务单");
+        }
 
+        return AjaxJson.getSuccess();
+    }
+
+    /**
+     * 添加异常单
+     * @param otherBusinessBO
+     * @return
+     */
+    @RequestMapping(value = "addErrorBusiness")
+    @SaCheckPermission(value = TbBusiness.PERMISSION_FLAX_BUSINESS_ADD)
+    public AjaxJson addErrorBusiness(OtherBusinessBO otherBusinessBO) {
+        List<TbItem> items = JSONUtil.toList(otherBusinessBO.getItemJson(), TbItem.class);
+        List<TbBusinessCar> cars = JSONUtil.toList(otherBusinessBO.getCarJson(), TbBusinessCar.class);
+        otherBusinessBO.setItems(items).setCars(cars);
+        tbBusinessService.addOtherBusiness(otherBusinessBO);
+        return AjaxJson.getSuccess();
+    }
     // ------------------------- 前端接口 -------------------------
 
 

+ 2 - 0
sp-server/src/main/java/com/pj/project/tb_business/TbBusinessMapper.xml

@@ -32,6 +32,8 @@
             <if test=' this.has("payType") '>and pay_type = #{payType}</if>
             <if test=' this.has("outDayTime") '>and out_day_time = #{outDayTime}</if>
             <if test=' this.has("partMoney") '>and part_money = #{partMoney}</if>
+            <if test=' this.has("supplement") '>and supplement = #{supplement}</if>
+            <if test=' this.has("error") '>and pay_time is null</if>
             <if test=' this.has("partTime") '>and part_time = #{partTime}</if>
             <if test=' this.has("createTime") '>and date_format(create_time,'%Y-%m-%d') = #{createTime}</if>
             <if test=' this.has("businessType") '>and business_type = #{businessType}</if>

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

@@ -6,9 +6,9 @@ spring:
     # 数据源配置
     datasource:
         type: com.alibaba.druid.pool.DruidDataSource
-        url: jdbc:mysql://127.0.0.1:3307/pco0810?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8
+        url: jdbc:mysql://127.0.0.1:3306/pco_system?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8
         username: root
-        password: 1234
+        password: 123456
         # 是否打开sql监控台  (生产环境请务必关闭此选项)
         druid:
             stat-view-servlet:
@@ -89,6 +89,7 @@ ocr-config:
     bash: /opt/ocrpic/tesseract.sh
     analysis: /opt/ocrpic/ocrtxt/PIC_NAME.txt
 pushfee-config:
+    enable: true
     remote-public-key-base6: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCb5yK85EKqwiQU+z1jyjOng6ecssQpEjC6STbCuSWN6KHLkijBxdqrCumXhbIyOVx4lHK9Rg5EjzlQxoaXQTgJdItaGjLC+UTE+NNAnnaFLg0x4jajNpLo473zdZxTYQaT3q/aKnTeXuKHw11PPUe4hmmfxPcdt9yJ0Iqo/XxV3QIDAQAB
     sync-url: http://117.141.148.233:8765/monolithic/uni/v1/sync
     sys-id: "0001"
@@ -98,4 +99,10 @@ pushfee-config:
     start-time: 2022-08-10 00:00:00
     #默认时间间隔为一小时
     time-span: 3600000
+oa:
+    system-code: 0101 #来源编码
+    template-id: 169b437e7e1cd1bd7b6367c4563b24ef #模板id
+    person-no: 00013 #流程发起人
+
+