Przeglądaj źródła

便捷异常单

qzyReal 2 lat temu
rodzic
commit
64e433c2cc

+ 8 - 2
sp-admin/sa-view/tb-business/tb-supplement-add.html

@@ -346,6 +346,8 @@
 						customerId: '', // 客户id 
 						customerName: '', // 客户名称 
 						operateTime: '',
+						payStatus:1,
+						supplementReason:'',
 						no: '', // 编号
 						goodsId: '',
 						goodsName: '', // 商品 
@@ -462,6 +464,7 @@
 							this.car.list = [];
 						}
 						if (oldNo !== declare.declareNo) {
+							this.m.payStatus=1;
 							this.m.declareNo = declare.declareNo;
 							this.m.customerId = declare.customerId;
 							this.m.customerName = declare.customerName;
@@ -544,7 +547,10 @@
 							carType: carType,
 							carSize: carSize,
 							netWeight: netWeight,
-							payType:'未支付'
+							realInTime:form.realInTime,
+							realOutTime:form.realOutTime,
+							payTime:form.payTime,
+							payType:form.payType?form.payType:'未支付'
 						}
 						this.car.list.push(car);
 						this.car.visible = false;
@@ -796,7 +802,7 @@
 							.join("、");
 						m.cardNo = yueCarNo;
 						m.chinaCarNo = chinaCarNo;
-						sa.ajax('/TbBusiness/addOtherBusiness', sa.removeNull(m), function(res) {
+						sa.ajax('/TbBusiness/addErrorBusiness', sa.removeNull(m), function(res) {
 							sa.alert('增加成功', this.clean);
 						}.bind(this));
 					},

+ 820 - 0
sp-admin/sa-view/tb-business/tb-supplement-edit.html

@@ -0,0 +1,820 @@
+<!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;
+
+        }
+    </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>
+                   	</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>
+                   				<div class="c-item">
+                   					<label class="c-label"><span style="color: red;">*</span>补录原因:</label>
+                   					<el-input v-model="m.supplementReason" placeholder="补录原因" clearable>
+                   					</el-input>
+                   				</div>
+                   			</el-col>
+                   			<el-col span=8>
+                   				<div class="c-item">
+                   					<label class="c-label">支付状态:</label>
+                   					<el-select v-model="m.payStatus" placeholder="请选择" >
+                   						<el-option label="未支付" :value="1">
+                   						</el-option>
+                   						<el-option label="已支付" :value="3">
+                   						</el-option>
+                   					</el-select>
+                   				</div>
+                   				
+                   				<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" v-if="m.payStatus===3">
+                   					<label class="c-label">支付时间:</label>
+                   					<el-date-picker type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
+                   						v-model="m.payTime"></el-date-picker>
+                   				</div>
+                   				<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 prop="carNo" label="车牌号" width="90">
+                            </el-table-column>
+                            <el-table-column prop="carSize" label="规格" width="80">
+                            </el-table-column>
+                            <el-table-column prop="carType" label="类型" width="80">
+                            </el-table-column>
+                            <el-table-column prop="netWeight" label="载重" width="80">
+                            </el-table-column>
+                            <el-table-column prop="realInTime" label="入场时间" align="center">
+                            	<template slot-scope="s">
+                            		<el-date-picker class="car-time" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
+                            			v-model="s.row.realInTime"></el-date-picker>
+                            	</template>
+                            </el-table-column>
+                            <el-table-column prop="realOutTime" label="离场时间" align="center" >
+                            	<template slot-scope="s">
+                            		<el-date-picker class="car-time" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
+                            			v-model="s.row.realOutTime"></el-date-picker>
+                            	</template>
+                            </el-table-column>
+                            <el-table-column prop="payType" label="支付" align="center" >
+                            	<template slot-scope="s">
+                            		<el-select class="car-time" v-model="s.row.payType" placeholder="请选择" >
+                            			<el-option label="未支付" value="未支付">
+                            			</el-option>
+                            			<el-option label="已支付" value="已支付">
+                            			</el-option>
+                            			<el-option label="免费" value="免费">
+                            			</el-option>
+                            		</el-select>
+                            	</template>
+                            </el-table-column>
+                            <el-table-column prop="payTime" label="支付时间" align="center" >
+                            	<template slot-scope="s">
+                            		<el-date-picker class="car-time" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" :disabled="s.row.payType!=='已支付'"
+                            			v-model="s.row.payTime"></el-date-picker>
+                            	</template>
+                            </el-table-column>
+                            <el-table-column label="操作" width="120">
+                            	<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&&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="getDeclareList"
+                               :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>
+</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: {
+            m: {
+                id: sa.p('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,
+				mulCar:0
+            },
+            carTypeList: [],
+            intiItems: []
+        },
+        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: {
+            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();
+            },
+            getDeclareList() {
+                let currentCustomerId = this.currentCustomerId;
+                if (currentCustomerId != '1') {
+                    this.declare.p.customerId = this.currentCustomerId;
+                }
+                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.$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;
+                }
+				this.validBefore();
+            },
+            confirmAdd() {
+                let list = this.car.list;
+                let weightCar = list.filter(car => car.carType && car.carType.indexOf('空') == -1).pop();
+                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;
+                if (weightCar) {
+                    if (weightCar.carType == carType &&
+                        carSize == weightCar.carSize &&
+                        netWeight == weightCar.netWeight) {
+                        return;
+                    }
+                }
+
+                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 && 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.ajaxNoLoading('/TbGoods/getList', {
+                    pageNo: 1,
+                    pageSize: 10
+                }, function(resp) {
+                    let list = resp.data;
+                    this.goods = list.filter(goods => goods.id == this.m.goodsId).pop();
+                    this.goodsList = list;
+                    this.getTypeByGoodsId();
+                }.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;
+                    let initItems = this.intiItems;
+                    for (let i in initItems) {
+                        let initItem = initItems[i];
+                        for (let j in list) {
+                            let type = list[j];
+                            if (type.id == initItem.itemTypeId) {
+                                type.num = initItem.num;
+                                type.price = initItem.itemPrice;
+                                type.itemId = initItem.itemId;
+                                type.remark = initItem.remark;
+                            }
+                        }
+                    }
+                    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 m = this.m;
+                if (goods.needDeclare == 1 && !m.declareNo) {
+                    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 carList = this.car.list;
+                let needCarSize = goods.needCarSize;
+                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.itemId) {
+                        let obj = {
+                            typeId: type.id,
+                            typeName: type.name,
+                            id: type.itemId,
+                            num: type.num,
+                            price: type.price,
+                            remark: type.remark
+                        }
+                        selectList.push(obj);
+                    }
+                }
+
+                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;
+                m.cars = null;
+                m.items = null;
+                sa.ajax('/TbBusiness/editOtherBusiness', 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));
+            },
+            getOtherBusinessById() {
+                sa.ajax('/TbBusiness/getOtherBusinessById?id=' + this.m.id, function(resp) {
+                    let data = resp.data;
+                    this.car.list = data.cars;
+                    this.intiItems = data.items;
+                    this.m = resp.data;
+                    this.getGoods();
+                }.bind(this))
+            },
+        },
+        mounted: function() {
+            this.getCurrentCustomer();
+            this.getOtherBusinessById();
+            this.getCustomerList();
+            this.getItemType();
+        }
+    })
+</script>
+</body>
+</html>

+ 2 - 3
sp-admin/sa-view/tb-business/tb-supplement-list.html

@@ -206,8 +206,7 @@
 					applyFn(data) {
 						sa.confirm('是否确认发起OA审批流程?', function() {
 							sa.ajax('/TbBusiness/applyOA?id=' + data.id, function(res) {
-								sa.ok('发起成功');
-								this.getErrorList();
+								sa.alert('发起成功', this.f5);
 							}.bind(this))
 						}.bind(this));
 					},
@@ -247,7 +246,7 @@
 						sa.showIframe('新增补录单', 'tb-supplement-add.html?id=-1', '1280px', '90%');
 					},
 					update(data) {
-						sa.showIframe('修改补录单', 'tb-car-disincle-edit.html?id=' + data.id, '1080px', '90%');
+						sa.showIframe('修改补录单', 'tb-supplement-edit.html?id=' + data.id, '1280px', '90%');
 					},
 					getPcodeByCurrRid() {
 						sa.ajax('/SpRolePermission/getPcodeByCurrRid', function(resp) {

+ 11 - 39
sp-server/src/main/java/com/pj/project/oa/bo/ParamsBO.java

@@ -52,40 +52,8 @@ public class ParamsBO implements Serializable {
          * 流程发起人 固定值 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;
+
+        private String formValues;
 
         @Data
         @Accessors(chain = true)
@@ -95,17 +63,21 @@ public class ParamsBO implements Serializable {
              */
             private String operationalProject;
             /**
+             * 客户名称
+             */
+            private String customerName;
+            /**
              * 作业时间
              */
             private String workingTime;
             /**
              * 业务费用
              */
-            private BigDecimal operatingOutlay;
+            private String operatingOutlay;
             /**
              * 支付时间
              */
-            private Date paymentTime;
+            private String paymentTime;
             /**
              * 货主
              */
@@ -117,7 +89,7 @@ public class ParamsBO implements Serializable {
             /**
              * 录入时间
              */
-            private Date recordingTime;
+            private String recordingTime;
             /**
              * 录入人
              */
@@ -129,13 +101,13 @@ public class ParamsBO implements Serializable {
             /**
              * 车辆信息
              */
-            private VehicleInfoBO vehicleInfo;
+            private String vehicleInfo;
             //总计
             private BigDecimal amount;
             /**
              * 业务项
              */
-            private SpecificBusinessItemsBO  specificBusinessItems;
+            private String  specificBusinessItems;
 
             @Data
             @Accessors(chain = true)

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

@@ -302,6 +302,17 @@ public class TbBusiness extends Model<TbBusiness> implements Serializable {
 
     @Getter
     @AllArgsConstructor
+    public static enum OAResultEnum{
+        PASS("审批通过","审批通过"),
+        NO_PASS("审批驳回","审批驳回"),
+        JUDGE_ING("审批中","审批中")
+        ;
+        private String code;
+        private String desc;
+    }
+
+    @Getter
+    @AllArgsConstructor
    public static enum PayStatus{
         NO_PAY(1,"未支付"),
         HAS_PAY(2,"已支付"),

+ 17 - 1
sp-server/src/main/java/com/pj/project/tb_business/TbBusinessController.java

@@ -354,11 +354,27 @@ public class TbBusinessController {
         List<TbBusinessCar> cars = JSONUtil.toList(errorBusinessBO.getCarJson(), TbBusinessCar.class);
         errorBusinessBO.setItems(items).setCars(cars);
         errorBusinessBO.setSupplementBy(StpUserUtil.getAdmin().getNickname());
-        tbBusinessService.addErrorBusiness(errorBusinessBO);
+        String currentCustomerId = StpUserUtil.getCustomerId();
+        tbBusinessService.addErrorBusiness(errorBusinessBO,currentCustomerId.equals(UserTypeEnum.PLATFORM_ADMIN.getCustomerId()));
         return AjaxJson.getSuccess();
     }
 
     /**
+     * 编辑异常单
+     * @param errorBusinessBO
+     * @return
+     */
+    @RequestMapping(value = "editErrorBusiness")
+    @SaCheckPermission(value = TbBusiness.TB_SUPPLEMENT_EDIT)
+    public AjaxJson editErrorBusiness(ErrorBusinessBO errorBusinessBO) {
+        List<TbItem> items = JSONUtil.toList(errorBusinessBO.getItemJson(), TbItem.class);
+        List<TbBusinessCar> cars = JSONUtil.toList(errorBusinessBO.getCarJson(), TbBusinessCar.class);
+        errorBusinessBO.setItems(items).setCars(cars);
+        errorBusinessBO.setSupplementBy(StpUserUtil.getAdmin().getNickname());
+        tbBusinessService.editErrorBusiness(errorBusinessBO);
+        return AjaxJson.getSuccess();
+    }
+    /**
      * 发起OA流程
      * @param id
      * @return

+ 232 - 56
sp-server/src/main/java/com/pj/project/tb_business/TbBusinessService.java

@@ -8,6 +8,7 @@ import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.RandomUtil;
@@ -19,6 +20,9 @@ import cn.hutool.log.StaticLog;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
 import com.google.gson.JsonObject;
 import com.pj.api.wx.bo.MsgDataBO;
 import com.pj.api.wx.service.WxService;
@@ -31,6 +35,7 @@ import com.pj.project.relation_business_car.RelationBusinessCar;
 import com.pj.project.relation_business_car.RelationBusinessCarService;
 import com.pj.project.relation_type_item.RelationTypeItemService;
 
+import com.pj.project.tb_account.TbAccount;
 import com.pj.project.tb_business_car.TbBusinessCar;
 import com.pj.project.tb_business_car.TbBusinessCarService;
 import com.pj.project.tb_business_item.TbBusinessItem;
@@ -999,7 +1004,6 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
     }
 
 
-
     /**
      * 选择异常单发送
      *
@@ -1036,29 +1040,30 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
 
     /**
      * 处理车辆支付
+     *
      * @param tbBusinessCar
      */
     private void handlerCarPay(TbBusinessCar tbBusinessCar) {
-            String carNo = tbBusinessCar.getCarNo();
-            String payType = tbBusinessCar.getPayType();
-            Date payTime = tbBusinessCar.getPayTime();
-            Date inTime = tbBusinessCar.getRealInTime();
-            if (inTime == null) {
-                throw new AjaxError(carNo + "入场时间不能为空");
-            }
-            Date outTime = tbBusinessCar.getRealOutTime();
-            if (outTime == null) {
-                throw new AjaxError(carNo + "离场时间不能为空");
-            }
-            if (payType.equals(TbBusinessCar.PayTypeEnum.HAS_PAY_TYPE.getType())) {
-                if (payTime == null) {
-                    throw new AjaxError(carNo + "支付时间不能为空");
-                }
-                outTime = payTime;
+        String carNo = tbBusinessCar.getCarNo();
+        String payType = tbBusinessCar.getPayType();
+        Date payTime = tbBusinessCar.getPayTime();
+        Date inTime = tbBusinessCar.getRealInTime();
+        if (inTime == null) {
+            throw new AjaxError(carNo + "入场时间不能为空");
+        }
+        Date outTime = tbBusinessCar.getRealOutTime();
+        if (outTime == null) {
+            throw new AjaxError(carNo + "离场时间不能为空");
+        }
+        if (payType.equals(TbBusinessCar.PayTypeEnum.HAS_PAY_TYPE.getType())) {
+            if (payTime == null) {
+                throw new AjaxError(carNo + "支付时间不能为空");
             }
-            //计算停车费
-            BigDecimal parkMoney = this.calculationPartMoney(inTime, outTime);
-            tbBusinessCar.setMoney(parkMoney);
+            outTime = payTime;
+        }
+        //计算停车费
+        BigDecimal parkMoney = this.calculationPartMoney(inTime, outTime);
+        tbBusinessCar.setMoney(parkMoney);
     }
 
     /**
@@ -1079,8 +1084,13 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
         log.info("请求返回:{}", resp);
         OAResultBO oaResultBO = JSONUtil.toBean(resp, OAResultBO.class);
         if (oaResultBO.getSuccess() && oaResultBO.getCode() == 200) {
-            tbBusiness.setSendOa(1).setSendTime(new Date()).setSendBy(sendBy)
-                    .setOaFdId(oaResultBO.getData().getFdId());
+            String fdId = oaResultBO.getData().getFdId();
+            if (StrUtil.isEmpty(fdId)) {
+                throw new BusinessException("流程发起失败");
+            }
+            tbBusiness.setSendOa(1).setOaResult(TbBusiness.OAResultEnum.JUDGE_ING.getCode()).setSendTime(new Date()).setSendBy(sendBy)
+                    .setOaFdId(fdId);
+            this.updateById(tbBusiness);
         }
     }
 
@@ -1106,13 +1116,12 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
                 .setOperationalPerson(operator).setOperationalReason(reason)
                 .setDocSubject(project + "补单流程").setFdTemplateId(oaConfig.getTemplateId()).setDocCreator(JSONUtil.toJsonStr(docCreator));
         //基础信息
-        ParamsBO.DataBO.FormValuesBO formValuesBO = buildFormValues(tbBusiness);
+        JSONObject formValues = buildFormValues(tbBusiness);
         //车辆信息
-        ParamsBO.DataBO.FormValuesBO.VehicleInfoBO vehicleInfoBO = buildCarParams(tbBusinessCars);
-        formValuesBO.setVehicleInfo(vehicleInfoBO);
-        ParamsBO.DataBO.FormValuesBO.SpecificBusinessItemsBO specificBusinessItemsBO = buildItemPrams(items);
-        formValuesBO.setSpecificBusinessItems(specificBusinessItemsBO);
-        dataBO.setFormValues(formValuesBO);
+        buildCarParams(tbBusinessCars, formValues);
+        //业务项信息
+        buildItemPrams(items, formValues);
+        dataBO.setFormValues(formValues.toJSONString(0));
         paramsBO.setData(dataBO);
         return paramsBO;
     }
@@ -1123,8 +1132,7 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
      * @param items
      * @return
      */
-    private ParamsBO.DataBO.FormValuesBO.SpecificBusinessItemsBO buildItemPrams(List<TbBusinessItem> items) {
-        ParamsBO.DataBO.FormValuesBO.SpecificBusinessItemsBO specificBusinessItemsBO = new ParamsBO.DataBO.FormValuesBO.SpecificBusinessItemsBO();
+    private void buildItemPrams(List<TbBusinessItem> items, JSONObject formValues) {
         List<String> itemTypeNameList = new ArrayList<>();
         List<String> itemNameList = new ArrayList<>();
         List<String> itemPriceList = new ArrayList<>();
@@ -1133,6 +1141,7 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
         List<String> payStatusList = new ArrayList<>();
         List<String> payTimeList = new ArrayList<>();
         List<String> remarkList = new ArrayList<>();
+        double total = items.stream().collect(Collectors.summarizingDouble(item -> item.getItemPrice().doubleValue())).getSum();
         items.forEach(item -> {
             itemTypeNameList.add(item.getItemTypeName());
             itemNameList.add(item.getItemName());
@@ -1140,13 +1149,19 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
             unitList.add(item.getUnit());
             numList.add(item.getNum());
             payStatusList.add(item.getPayStatus() == 1 ? "已支付" : "未支付");
-            payTimeList.add(item.getPayTime()==null?"-":DateUtil.format(item.getPayTime(), "yyyy-MM-dd HH:mm:ss"));
+            payTimeList.add(item.getPayTime() == null ? "" : DateUtil.format(item.getPayTime(), "yyyy-MM-dd HH:mm:ss"));
             remarkList.add(StrUtil.isEmpty(item.getRemark()) ? "-" : item.getRemark());
         });
-        specificBusinessItemsBO.setChargingItem(itemTypeNameList)
-                .setChargeDetail(itemNameList).setUnitPrice(itemPriceList).setChargingStandard(unitList)
-                .setQuantity(numList).setPayoutStatus(payStatusList).setPayTime(payTimeList).setNote(remarkList);
-        return specificBusinessItemsBO;
+        formValues
+                .set("specificBusinessItems.chargingItem", itemTypeNameList)
+                .set("specificBusinessItems.chargeDetail", itemNameList)
+                .set("specificBusinessItems.unitPrice", itemPriceList)
+                .set("specificBusinessItems.chargingStandard", unitList)
+                .set("specificBusinessItems.quantity", numList)
+                .set("specificBusinessItems.payoutStatus", payStatusList)
+                .set("specificBusinessItems.payTime", payTimeList)
+                .set("specificBusinessItems.total", Collections.singleton(total))
+                .set("specificBusinessItems.note", remarkList);
     }
 
     /**
@@ -1155,15 +1170,15 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
      * @param tbBusiness
      * @return
      */
-    private ParamsBO.DataBO.FormValuesBO buildFormValues(TbBusiness tbBusiness) {
+    private JSONObject buildFormValues(TbBusiness tbBusiness) {
         ParamsBO.DataBO.FormValuesBO formValuesBO = new ParamsBO.DataBO.FormValuesBO();
         String project = tbBusiness.getGoodsName();
-        formValuesBO.setOperationalProject(project).setWorkingTime(tbBusiness.getOperateTime())
-                .setOperatingOutlay(tbBusiness.getItemPrice()).setAmount(tbBusiness.getItemPrice())
-                .setPaymentTime(tbBusiness.getPayTime()).setCargoOwner(tbBusiness.getOwner()).setOperationNo(tbBusiness.getNo())
-                .setRecordingTime(tbBusiness.getCreateTime()).setRecorder(tbBusiness.getCreateBy())
+        formValuesBO.setOperationalProject(project).setWorkingTime(tbBusiness.getOperateTime()).setCustomerName(tbBusiness.getCustomerName())
+                .setOperatingOutlay(tbBusiness.getItemPrice().toString()).setAmount(tbBusiness.getItemPrice())
+                .setPaymentTime(tbBusiness.getPayTime() == null ? "" : DateUtil.format(tbBusiness.getPayTime(), "yyyy-MM-dd HH:mm:ss")).setCargoOwner(tbBusiness.getOwner()).setOperationNo(tbBusiness.getNo())
+                .setRecordingTime(DateUtil.format(tbBusiness.getCreateTime(), "yyyy-MM-dd HH:mm:ss")).setRecorder(tbBusiness.getCreateBy())
                 .setIsPay(TbBusiness.PayStatus.HAS_PAY_CONFIRM.getCode() == tbBusiness.getPayStatus() ? "已支付" : "未支付");
-        return formValuesBO;
+        return JSONUtil.parseObj(formValuesBO);
     }
 
     /**
@@ -1172,8 +1187,7 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
      * @param tbBusinessCars
      * @return
      */
-    private ParamsBO.DataBO.FormValuesBO.VehicleInfoBO buildCarParams(List<TbBusinessCar> tbBusinessCars) {
-        ParamsBO.DataBO.FormValuesBO.VehicleInfoBO vehicleInfoBO = new ParamsBO.DataBO.FormValuesBO.VehicleInfoBO();
+    private void buildCarParams(List<TbBusinessCar> tbBusinessCars, JSONObject jsonObject) {
         List<String> carNoList = new ArrayList<>();
         List<String> typeList = new ArrayList<>();
         List<String> loadList = new ArrayList<>();
@@ -1195,14 +1209,21 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
             inList.add(tbBusinessCar.getRealInTime() == null ? "-" : DateUtil.format(tbBusinessCar.getRealInTime(), "yyyy-MM-dd HH:mm:ss"));
             outList.add(tbBusinessCar.getRealOutTime() == null ? "-" : DateUtil.format(tbBusinessCar.getRealOutTime(), "yyyy-MM-dd HH:mm:ss"));
         });
-        vehicleInfoBO.setLicenseNo(carNoList).setType(typeList).setLoad(loadList).setSpecifications(unitsList)
-                .setPaymentStatus(payStatusList).setVehicleState(carStatusList).setParkingFee(feeList)
-                .setEntryTime(inList).setDepartureTime(outList);
-        return vehicleInfoBO;
+        jsonObject
+                .set("vehicleInfo.licenseNo", carNoList)
+                .set("vehicleInfo.type", typeList)
+                .set("vehicleInfo.load", loadList)
+                .set("vehicleInfo.specifications", unitsList)
+                .set("vehicleInfo.paymentStatus", payStatusList)
+                .set("vehicleInfo.vehicleState", carStatusList)
+                .set("vehicleInfo.parkingFee", feeList)
+                .set("vehicleInfo.entryTime", inList)
+                .set("vehicleInfo.departureTime", outList);
+
     }
 
     //添加异常单
-    public void addErrorBusiness(ErrorBusinessBO errorBusinessBO) {
+    public void addErrorBusiness(ErrorBusinessBO errorBusinessBO, boolean isAdmin) {
         List<TbItem> tbItems = errorBusinessBO.getItems();
         if (tbItems.isEmpty()) {
             throw new BusinessException("请选择明细");
@@ -1215,14 +1236,14 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
         TbGoods tbGoods = tbGoodsService.getById(errorBusinessBO.getGoodsId());
         TbBusiness tbBusiness = new TbBusiness();
         String customerId = errorBusinessBO.getCustomerId();
-        tbBusiness.setCreateBy(StpUserUtil.getAdmin().getNickname());
-        tbBusiness.setPayStep(tbGoods.getPayStep());
+        tbBusiness.setCreateBy(StpUserUtil.getAdmin().getNickname())
+                .setPayStep(tbGoods.getPayStep());
         TbCostomer tbCostomer = tbCostomerService.getById(customerId);
         if (tbCostomer != null) {
             tbBusiness.setCustomerId(customerId).setCustomerName(tbCostomer.getName());
         }
-        boolean businessIsPay=TbBusiness.PayStatus.HAS_PAY_CONFIRM.getCode() == errorBusinessBO.getPayStatus();
-        Date businessPayTime=errorBusinessBO.getPayTime();
+        boolean businessIsPay = TbBusiness.PayStatus.HAS_PAY_CONFIRM.getCode() == errorBusinessBO.getPayStatus();
+        Date businessPayTime = errorBusinessBO.getPayTime();
 
         BigDecimal price = new BigDecimal("0");
         List<TbBusinessItem> itemList = new ArrayList<>();
@@ -1242,7 +1263,7 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
                     .setItemTypeId(typeId).setItemTypeName(tbItemType.getName())
                     .setUnit(db.getUnit()).setTotal(itemTotalPrice).setCreateTime(now);
             price = price.add(itemTotalPrice);
-            if (businessIsPay){
+            if (businessIsPay) {
                 tbBusinessItem.setPayTime(businessPayTime)
                         .setPayStatus(1);
             }
@@ -1254,7 +1275,7 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
                 .setOperator(errorBusinessBO.getOperator()).setOperateTime(errorBusinessBO.getOperateTime())
                 .setNo(no).setGoodsName(tbGoods.getName()).setGoodsId(errorBusinessBO.getGoodsId())
                 .setSupplementReason(errorBusinessBO.getSupplementReason()).setSupplementTime(new Date())
-                .setSupplementBy(errorBusinessBO.getSupplementBy())
+                .setSupplementBy(errorBusinessBO.getSupplementBy()).setSupplement(1)
                 .setPayStep(tbGoods.getPayStep()).setDeclareNo(declareNo).setCardNo(errorBusinessBO.getCardNo());
         tbBusiness.setCreateTime(now).setCreateByCustomerId(StpUserUtil.getCustomerId())
                 .setItemPrice(price).setTotalMoney(price).setOwner(errorBusinessBO.getOwner());
@@ -1273,7 +1294,7 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
             if (StrUtil.isEmpty(carType)) {
                 throw new BusinessException(carNo + "类型不能为空");
             }
-            
+
             car.setCreateTime(now).setNo(carBuseinssNo + RandomUtil.randomNumbers(4));
             if ((TbItem.ItemTypeEnum.EMPTY_TYPE.getType().equals(carType) && chinaCarPay == 0)
                     || (TbItem.ItemTypeEnum.WEIGHT_TYPE.getType().equals(carType) && vietnamCarPay == 0)) {
@@ -1305,11 +1326,14 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
         }
         itemList.forEach(tbBusinessItem -> tbBusinessItem.setBusinessId(tbBusiness.getId()));
         tbBusinessItemService.saveBatch(itemList);
-
+        if (isAdmin) {
+            sendOA(tbBusiness, itemList, cars, errorBusinessBO.getSupplementBy());
+        }
     }
 
     /**
      * 单独发起审批
+     *
      * @param id
      */
     public void applyOA(String id, String sendBy) {
@@ -1319,4 +1343,156 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
         sendOA(tbBusiness, items, tbBusinessCars, sendBy);
         this.updateById(tbBusiness);
     }
+
+
+    /**
+     * 编辑异常单
+     *
+     * @param errorBusinessBO
+     */
+    public void editErrorBusiness(ErrorBusinessBO errorBusinessBO) {
+        String id = errorBusinessBO.getId();
+        TbBusiness dbBusiness = this.getById(id);
+        if (dbBusiness == null) {
+            throw new BusinessException("记录不存在");
+        }
+        if (!(dbBusiness.getSendOa() == 0 || TbBusiness.OAResultEnum.NO_PASS.getCode().equals(dbBusiness.getOaResult()))) {
+            throw new BusinessException("业务单正在审核,无法修改");
+        }
+        List<TbItem> tbItems = errorBusinessBO.getItems();
+        if (tbItems.isEmpty()) {
+            throw new BusinessException("请选择收费明细");
+        }
+        List<TbBusinessCar> cars = errorBusinessBO.getCars();
+        if (cars.isEmpty()) {
+            throw new BusinessException("作业车辆不能为空");
+        }
+
+        Date now = new Date();
+        List<RelationBusinessCar> relationBusinessCars = relationBusinessCarService.findByBusinessId(id);
+        List<String> businessCarIds = cars.stream().filter(tbBusinessCar -> StrUtil.isNotEmpty(tbBusinessCar.getId()))
+                .map(TbBusinessCar::getId).collect(Collectors.toList());
+        List<String> removeIds = relationBusinessCars.stream()
+                .filter(relationBusinessCar -> !businessCarIds.contains(relationBusinessCar.getBusinessCarId()))
+                .map(RelationBusinessCar::getId)
+                .collect(Collectors.toList());
+        if (!removeIds.isEmpty()) {
+            //删除多的关联
+            relationBusinessCarService.removeByIds(removeIds);
+        }
+        TbGoods tbGoods = tbGoodsService.getById(errorBusinessBO.getGoodsId());
+        Integer chinaCarPay = tbGoods.getChinaCarPay();
+        Integer vietnamCarPay = tbGoods.getVietnamCarPay();
+        String carBuseinssNo = DateUtil.format(now, "yyyyMMddHHmm");
+        List<TbBusinessItem> itemList = new ArrayList<>();
+        boolean isPay = TbBusiness.PayStatus.HAS_PAY_CONFIRM.getCode() == errorBusinessBO.getPayStatus();
+        //如果业务单未支付,直接删除掉,重新添加
+        if (TbBusiness.PayStatus.HAS_PAY_CONFIRM.getCode() != dbBusiness.getPayStatus()) {
+            tbBusinessItemService.removeByBusinessId(id);
+            BigDecimal price = new BigDecimal("0");
+            String no = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")) + RandomUtil.randomNumbers(4);
+            int index = 1;
+            for (TbItem tbItem : tbItems) {
+                TbItem db = tbItemService.getById(tbItem.getId());
+                TbBusinessItem item = new TbBusinessItem();
+                int num = tbItem.getNum();
+                TbItemType tbItemType = tbItemTypeService.getById(tbItem.getTypeId());
+                BigDecimal itemTotalPrice = tbItem.getPrice().multiply(new BigDecimal(num));
+                item.setNo(no + "0" + index).setPayTypeName(db.getPayTypeName()).setPayType(db.getPayType())
+                        .setBusinessType(db.getBusinessType()).setTaxRate(NumberUtil.div(db.getTaxRate().doubleValue(), 100D, 2));
+                item.setItemCode(db.getItemCode()).setNum(num + "").setItemId(db.getId()).setBusinessId(dbBusiness.getId())
+                        .setItemName(db.getItemName()).setItemPrice(db.getPrice()).setRemark(tbItem.getRemark())
+                        .setItemTypeId(tbItem.getTypeId()).setItemTypeName(tbItemType.getName()).setPayStatus(1)
+                        .setUnit(db.getUnit()).setTotal(itemTotalPrice).setCreateTime(now);
+                price = price.add(itemTotalPrice);
+                itemList.add(item);
+                index++;
+            }
+            dbBusiness.setItemPrice(price).setTotalMoney(price);
+            tbBusinessItemService.saveBatch(itemList);
+        }
+        for (TbBusinessCar tbBusinessCar : cars) {
+            String businessCarId = tbBusinessCar.getId();
+            String carNo = tbBusinessCar.getCarNo();
+            for (TbBusinessItem item : itemList) {
+                checkOtherBusiness(item.getItemTypeId(), errorBusinessBO.getOperateTime(), dbBusiness.getId(), carNo);
+            }
+            String carType = tbBusinessCar.getCarType();
+            //修改
+            if (StrUtil.isNotEmpty(businessCarId)) {
+                //原来已存在的
+                TbBusinessCar dbBusinessCar = tbBusinessCarService.getById(businessCarId);
+                //如果修改了车牌号
+                String dbCarNo = dbBusinessCar.getCarNo();
+                if (!dbCarNo.equals(carNo)) {
+                    //把关联删除掉,然后添加新的关联
+                    relationBusinessCarService.removeByBusinessIdAndCarId(dbBusiness.getId(), businessCarId);
+                    TbBusinessCar otherCar = tbBusinessCarService.findTheLastRecord(carNo);
+                    if (otherCar == null ||//不存在或者已离场===>新建
+                            (otherCar.getRealInTime() != null && otherCar.getRealOutTime() != null)) {
+                        otherCar = new TbBusinessCar();
+                        otherCar.setCreateTime(now).setPay(0).setNo(carBuseinssNo + RandomUtil.randomNumbers(4))
+                                .setCarNo(carNo).setCarType(tbBusinessCar.getCarType()).setCarSize(tbBusinessCar.getCarSize())
+                                .setNetWeight(tbBusinessCar.getNetWeight()).setCustomerId(dbBusiness.getCustomerId())
+                                .setTimeUpdate(now).setIsLock(0).setCarType(tbBusinessCar.getCarType());
+                        if ((TbItem.ItemTypeEnum.EMPTY_TYPE.getType().equals(carType) && chinaCarPay == 0) || (TbItem.ItemTypeEnum.WEIGHT_TYPE.getType().equals(carType) && vietnamCarPay == 0)) {
+                            otherCar.setPayType(TbBusinessCar.PayTypeEnum.FEE_TYPE.getType());
+                        }
+                        tbBusinessCarService.save(otherCar);
+                    } else {
+                        List<TbBusiness> tbBusinessList = this.findOtherBusinessByCarId(businessCarId);
+                        if (tbBusinessList.size() == 1 && dbBusinessCar.getRealInTime() == null) {
+                            tbBusinessCarService.removeById(businessCarId);
+                        }
+                    }
+                    RelationBusinessCar relationBusinessCar = new RelationBusinessCar();
+                    relationBusinessCar.setBusinessId(dbBusiness.getId()).setBusinessCarId(otherCar.getId());
+                    relationBusinessCarService.save(relationBusinessCar);
+                } else {
+                    dbBusinessCar.setNetWeight(tbBusinessCar.getNetWeight()).setNetWeight(tbBusinessCar.getNetWeight())
+                            .setCarSize(tbBusinessCar.getCarSize()).setCarType(tbBusinessCar.getCarType());
+                    tbBusinessCarService.updateById(dbBusinessCar);
+                }
+            } else {
+                TbBusinessCar checkCar = tbBusinessCarService.findTheLastRecord(carNo);
+                if (checkCar == null ||
+                        (checkCar.getRealInTime() != null && checkCar.getRealOutTime() != null)) {
+                    checkCar = new TbBusinessCar();
+                    checkCar.setCreateTime(now).setPay(0).setNo(carBuseinssNo + RandomUtil.randomNumbers(4));
+                }
+                checkCar.setCarNo(carNo).setCarType(tbBusinessCar.getCarType()).setCarSize(tbBusinessCar.getCarSize())
+                        .setNetWeight(tbBusinessCar.getNetWeight()).setCustomerId(dbBusiness.getCustomerId())
+                        .setTimeUpdate(now).setIsLock(0).setCarType(tbBusinessCar.getCarType());
+                if ((TbItem.ItemTypeEnum.EMPTY_TYPE.getType().equals(carType) && chinaCarPay == 0) || (TbItem.ItemTypeEnum.WEIGHT_TYPE.getType().equals(carType) && vietnamCarPay == 0)) {
+                    checkCar.setPayType(TbBusinessCar.PayTypeEnum.FEE_TYPE.getType());
+                }
+                tbBusinessCarService.saveOrUpdate(checkCar);
+                RelationBusinessCar relationBusinessCar = new RelationBusinessCar();
+                relationBusinessCar.setBusinessId(dbBusiness.getId()).setBusinessCarId(checkCar.getId());
+                relationBusinessCarService.save(relationBusinessCar);
+            }
+        }
+        if (!StrUtil.equals(dbBusiness.getGoodsId(), errorBusinessBO.getGoodsId())) {
+            dbBusiness.setGoodsId(errorBusinessBO.getGoodsId())
+                    .setGoodsName(tbGoods.getName()).setPayStep(tbGoods.getPayStep());
+        }
+        String declareNo = errorBusinessBO.getDeclareNo();
+        if (!StrUtil.equals(declareNo, dbBusiness.getDeclareNo())) {
+            tbDeclareService.rebackDeclareNo(dbBusiness.getDeclareNo());
+            TbDeclare tbDeclare = tbDeclareService.findByDeclareNo(declareNo);
+            tbDeclare.setBusinessId(dbBusiness.getId());
+            tbDeclareService.updateById(tbDeclare);
+        }
+        dbBusiness.setCardSize(errorBusinessBO.getCarSize()).setNetWeight(errorBusinessBO.getNetWeight())
+                .setOperator(errorBusinessBO.getOperator()).setOperateTime(errorBusinessBO.getOperateTime())
+                .setGoodsId(errorBusinessBO.getGoodsId()).setSupplementReason(errorBusinessBO.getSupplementReason())
+                .setOwner(errorBusinessBO.getOwner()).setPayStatus(errorBusinessBO.getPayStatus())
+                .setDeclareNo(declareNo).setCardNo(errorBusinessBO.getCardNo());
+        dbBusiness.setChinaCarNo(errorBusinessBO.getChinaCarNo());
+        if (isPay){
+            dbBusiness.setPayTime(errorBusinessBO.getPayTime());
+        }
+        this.updateById(dbBusiness);
+    }
+
 }

+ 1 - 1
sp-server/src/main/java/com/pj/project/tb_business_item/TbBusinessItem.java

@@ -90,7 +90,7 @@ public class TbBusinessItem extends Model<TbBusinessItem> implements Serializabl
 	private BigDecimal total;
 	private String ticket;
 	//支付状态
-	private Integer payStatus;
+	private Integer payStatus=0;
 	private Date payTime;
 	private Date createTime;
 	private Integer pick;

+ 13 - 1
sp-server/src/main/java/com/pj/utils/sg/NbUtil.java

@@ -14,6 +14,9 @@ import java.util.Random;
 import java.util.regex.Pattern;
 
 import cn.hutool.core.util.IdUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
 
 /**
  * 最nb的工具类
@@ -277,7 +280,16 @@ public class NbUtil {
 		return IdUtil.getSnowflake(1, 1).nextIdStr();
 	}
     
-	
+	public static String valueToString(Object obj){
+		ObjectMapper mapper=new ObjectMapper();
+		mapper.enable(SerializationFeature.CLOSE_CLOSEABLE);
+		try {
+			return 	mapper.writeValueAsString(obj);
+		} catch (JsonProcessingException e) {
+			e.printStackTrace();
+		}
+		return "";
+	}
 	
 	
 }

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

@@ -100,10 +100,10 @@ pushfee-config:
     #默认时间间隔为一小时
     time-span: 3600000
 oa:
-    url:
-    system-code: 0101 #来源编码
-    template-id: 169b437e7e1cd1bd7b6367c4563b24ef #模板id
-    person-no: 00013 #流程发起人
+    url: http://117.141.148.233:18766/bpm/operational/addReview/
+    system-code: "0101" #来源编码
+    template-id: 183212c0a9bec6f20f33cba41ffa4391 #模板id
+    person-no: 66005893 #流程发起人