Quellcode durchsuchen

货运模块提交

linbl vor 2 Monaten
Ursprung
Commit
cee87775d7
61 geänderte Dateien mit 13610 neuen und 404 gelöschten Zeilen
  1. 30 25
      sa-frame/com/sa-item.vue
  2. 4 3
      sa-frame/com/sa-td.vue
  3. 162 0
      sa-view/tb-config/tb-config-add.html
  4. 98 0
      sa-view/tb-config/tb-config-info.html
  5. 138 0
      sa-view/tb-config/tb-config-list.html
  6. 163 0
      sa-view/tb-dict/tb-dict-cat-add.html
  7. 95 0
      sa-view/tb-dict/tb-dict-cat-info.html
  8. 145 0
      sa-view/tb-dict/tb-dict-cat-list.html
  9. 178 0
      sa-view/tb-dict/tb-dict-info-add.html
  10. 95 0
      sa-view/tb-dict/tb-dict-info-info.html
  11. 156 0
      sa-view/tb-dict/tb-dict-info-list.html
  12. 215 0
      sa-view/tb-driver-audit/tb-driver-audit-list.html
  13. 231 0
      sa-view/tb-driver-audit/tb-driver-audit.html
  14. 127 78
      sa-view/tb-driver/tb-driver-add.html
  15. 28 32
      sa-view/tb-driver/tb-driver-check.html
  16. 95 59
      sa-view/tb-driver/tb-driver-info.html
  17. 90 32
      sa-view/tb-driver/tb-driver-list.html
  18. 185 0
      sa-view/tb-freight-template/tb-freight-template-add.html
  19. 91 0
      sa-view/tb-freight-template/tb-freight-template-info.html
  20. 155 0
      sa-view/tb-freight-template/tb-freight-template-list.html
  21. 96 0
      sa-view/tb-transport-demand/tb-transport-demand-apply.html
  22. 164 0
      sa-view/tb-transport-demand/tb-transport-demand-info.html
  23. 233 0
      sa-view/tb-transport-demand/tb-transport-demand-list.html
  24. 86 0
      sa-view/tb-transport-demand/tb-transport-demand-process.html
  25. 131 0
      sa-view/tb-transport-fundflow-bill/tb-transport-fundflow-bill-add.html
  26. 134 0
      sa-view/tb-transport-fundflow-bill/tb-transport-fundflow-bill-info.html
  27. 152 0
      sa-view/tb-transport-fundflow-bill/tb-transport-fundflow-bill-list.html
  28. 233 0
      sa-view/tb-transport-order/tb-transport-order-info.html
  29. 199 0
      sa-view/tb-transport-order/tb-transport-order-list.html
  30. 100 0
      sa-view/tb-transport-order/tb-transport-order-process.html
  31. 212 0
      sa-view/tb-transport-order/tb-transport-order-settle-confirm.html
  32. 176 0
      sa-view/tb-transport-order/tb-transport-order-timeout.html
  33. 146 0
      sa-view/tb-transport-refund/tb-transport-refund-add.html
  34. 231 0
      sa-view/tb-transport-refund/tb-transport-refund-deal.html
  35. 183 0
      sa-view/tb-transport-refund/tb-transport-refund-info.html
  36. 202 0
      sa-view/tb-transport-refund/tb-transport-refund-list.html
  37. 86 0
      sa-view/tb-transport-refund/tb-transport-refund-process.html
  38. 172 0
      sa-view/tb-transport-settle/tb-transport-fundflow-bill.html
  39. 166 0
      sa-view/tb-transport-settle/tb-transport-order-info.html
  40. 172 0
      sa-view/tb-transport-settle/tb-transport-order-settle.html
  41. 172 0
      sa-view/tb-transport-settle/tb-transport-trade-bill.html
  42. 143 0
      sa-view/tb-transport-trade-bill/tb-transport-trade-bill-add.html
  43. 156 0
      sa-view/tb-transport-trade-bill/tb-transport-trade-bill-detail-list.html
  44. 147 0
      sa-view/tb-transport-trade-bill/tb-transport-trade-bill-info.html
  45. 160 0
      sa-view/tb-transport-trade-bill/tb-transport-trade-bill-list.html
  46. 193 0
      sa-view/tb-vehicle-audit/tb-vehicle-audit-list.html
  47. 269 0
      sa-view/tb-vehicle-audit/tb-vehicle-audit.html
  48. 167 0
      sa-view/tb-vehicle/tb-driver-bind.html
  49. 222 52
      sa-view/tb-vehicle/tb-vehicle-add.html
  50. 199 93
      sa-view/tb-vehicle/tb-vehicle-info.html
  51. 123 30
      sa-view/tb-vehicle/tb-vehicle-list.html
  52. 155 0
      sa-view/tb-wechat-pay/tb-wechat-pay-info.html
  53. 160 0
      sa-view/tb-wechat-pay/tb-wechat-pay-list.html
  54. 124 0
      sa-view/tb-wechat-refund/tb-wechat-refund-info.html
  55. 175 0
      sa-view/tb-wechat-refund/tb-wechat-refund-list.html
  56. 126 0
      sa-view/tb-wechat-transfer/tb-wechat-transfer-info.html
  57. 116 0
      sa-view/tb-wechat-transfer/tb-wechat-transfer-list.html
  58. 156 0
      sa-view/tb_cooper_entrust_judge/tb_cooper_entrust-do-judge.html
  59. 146 0
      sa-view/tb_cooper_entrust_judge/tb_cooper_entrust-judge.html
  60. 84 0
      static/kj/validator.js
  61. 4662 0
      static/kj/wangEditor.up.js

+ 30 - 25
sa-frame/com/sa-item.vue

@@ -1,7 +1,7 @@
 <template>
 	<!-- 自定义slot -->
 	<div class="c-item" :class="{br: br}" v-if="$slots.default && type != 'fast-btn'">
-		<label class="c-label" :style="{width:width}" v-if="name && name.length > 0">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}" v-if="name && name.length > 0">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<span v-else-if="name === undefined"></span> 
 		<label class="c-label" v-else></label> 
 		<span v-else></span> 
@@ -9,65 +9,65 @@
 	</div>
 	<!-- 普通input -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'text' || type == 'link'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> <!-- <span style="color: red;" v-if="need">*</span> -->
+		<label class="c-label" :style="{width:width}">{{name}}<span class="required" v-if="required">*</span>:</label> <!-- <span style="color: red;" v-if="need">*</span> -->
 		<el-input type="text" :value="value" @input="onInput" :placeholder="'请输入'+name" :disabled="disabled"></el-input>
 	</div>
 	<!-- 数字input -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'num'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> <!-- <span style="color: red;" v-if="need">*</span> -->
+		<label class="c-label" :style="{width:width}">{{name}}<span class="required" v-if="required">*</span>:</label> <!-- <span style="color: red;" v-if="need">*</span> -->
 		<el-input type="number" :value="value" @input="onInput" placeholder="请输入" :disabled="disabled"></el-input>
 	</div>
 	<!-- 密码input -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'password'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<el-input type="password" :value="value" @input="onInput" :placeholder="placeholder" :disabled="disabled"></el-input>
 	</div>
 	<!-- 多行文本域 -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'textarea'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}" v-if="name">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<div style="display: inline-block;">
 			<el-input type="textarea" :autosize="{ minRows: 3, maxRows: 10}" :value="value" @input="onInput" :placeholder="placeholder" :disabled="disabled"></el-input>
 		</div>
 	</div>
 	<!-- 钱 money (单位 元) -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'money'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}" v-if="name">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<el-input type="text" :value="value" @input="onInput" :placeholder="placeholder" :disabled="disabled"></el-input>
 		<span>元</span>
 	</div>
 	<!-- 钱 price-f (单位 分) -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'money-f'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}" v-if="name">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<el-input type="text" v-model="valueReal" @input="$emit('input', $event * 100)" :placeholder="placeholder" :disabled="disabled"></el-input>
 		<span>元</span>
 	</div>
 	<!-- img -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'img'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<img :src="value" class="info-img" @click="sa.showImage(value, '400px', '400px')" v-if="!sa.isNull(value)">
 		<el-link type="primary" @click="sa.uploadImage(src => {$emit('input', src); sa.ok2('上传成功');})">上传</el-link>
 	</div>
 	<!-- audio -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'audio'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<el-link type="info" :href="value" target="_blank" v-if="!sa.isNull(value)">{{value}}</el-link>
 		<el-link type="primary" @click="sa.uploadAudio(src => {$emit('input', src); sa.ok2('上传成功');})">上传</el-link>
 	</div>
 	<!-- video -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'video'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<el-link type="info" :href="value" target="_blank" v-if="!sa.isNull(value)">{{value}}</el-link>
 		<el-link type="primary" @click="sa.uploadVideo(src => {$emit('input', src); sa.ok2('上传成功');})">上传</el-link>
 	</div>
 	<!-- file -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'file'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<el-link type="info" :href="value" target="_blank" v-if="!sa.isNull(value)">{{value}}</el-link>
 		<el-link type="primary" @click="sa.uploadFile(src => {$emit('input', src); sa.ok2('上传成功');})">上传</el-link>
 	</div>
 	<!-- img-list -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'img-list'">
-		<label class="c-label" :style="{width:width}">{{name}}</label> 
+		<label class="c-label" :style="{width:width}" v-if="name">{{name}}<span class="required" v-if="required">*</span></label> 
 		<div class="c-item-mline image-box">
 			<div class="image-box-2" v-for="item in value_arr">
 				<img :src="item" @click="sa.showImage(item, '500px', '400px')" />
@@ -102,7 +102,7 @@
 	</div>
 	<!-- 富文本 richtext f -->
 	<div class="c-item" style="margin-top: 10px;" :class="{br: br}" v-else-if="type == 'richtext' || type == 'f'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}" v-if="name">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<div class="editor-box c-item-mline">
 			<div :id="'editor-' + editor_id"></div>
 		</div>
@@ -110,7 +110,7 @@
 	</div>
 	<!-- enum 枚举 -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'enum' || type == 'j' || type == 'switch'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}" v-if="name" >{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<el-radio-group v-if="jtype == 1 || jtype == 2" :class="{'s-radio-text': jtype == 2}" :value="value" @input="onInput">
 			<el-radio label="" v-if="def">{{def}}</el-radio>
 			<el-radio v-for="j in jvList" :key="j.key" :label="j.key">{{j.value}}</el-radio>
@@ -126,22 +126,22 @@
 	</div>
 	<!-- 日期选择器 -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'date'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<el-date-picker type="date" value-format="yyyy-MM-dd" :value="value" @input="onInput" :placeholder="placeholder" :disabled="disabled"></el-date-picker>
 	</div>
 	<!-- 日期时间选择器 -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'datetime'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<el-date-picker type="datetime" value-format="yyyy-MM-dd HH:mm:ss" :value="value" @input="onInput" :placeholder="placeholder" :disabled="disabled"></el-date-picker>
 	</div>
 	<!-- 时间选择器 -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'time'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<el-time-picker value-format="HH:mm:ss" :value="value" @input="onInput" :placeholder="placeholder" :disabled="disabled"></el-time-picker>
 	</div>
 	<!-- 日期范围选择 -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'date-range'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<el-date-picker
 			type="daterange"
 			range-separator="至"
@@ -156,25 +156,25 @@
 	</div>
 	<!-- 滑块 -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'slider'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<div style="display: inline-block; height: 0px; vertical-align: top; width: 250px;">
 			<el-slider :value="value" @input="onInput" style="position: relative; top: -5px;" :disabled="disabled"></el-slider>
 		</div>
 	</div>
 	<!-- 级联输入 -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'cascader'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<el-cascader :value="value" @input="onInput" :options="options" :props="{expandTrigger: 'hover'}" :placeholder="placeholder" :disabled="disabled"></el-cascader>
 	</div>
 	<!-- 颜色输入 -->
 	<div class="c-item" :class="{br: br}" style="height: 0px;" v-else-if="type == 'color'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<el-color-picker :value="value" @input="onInput" :disabled="disabled"></el-color-picker>
 		<span class="c-remark" style="vertical-align: top;">{{value}}</span>
 	</div>
 	<!-- 评分组件 -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'rate'">
-		<label class="c-label" :style="{width:width}">{{name}}:</label> 
+		<label class="c-label" :style="{width:width}">{{name}}<span class="required" v-if="required">*</span>:</label> 
 		<div style="display: inline-block;">
 			<el-rate :value="value" @input="onInput" show-text :disabled="disabled"></el-rate>
 		</div>
@@ -230,9 +230,9 @@
 				type: Boolean,
 				default: false
 			},
-			need: {
+			required: {
 				type: Boolean,
-				default: true
+				default: false
 			},
 			// 日期范围时的选择字段,调用方需要加 .sync 修饰符 
 			start: {}, end: {},
@@ -427,5 +427,10 @@
 	}
 </script>
 
-<style scoped>
+<style>
+	.required {
+		color: red;
+		font-weight: bold;
+		font-size: 20px;
+	}
 </style>

+ 4 - 3
sa-frame/com/sa-td.vue

@@ -8,7 +8,7 @@
 	<!-- selection框 -->
 	-<el-table-column align='center' v-else-if="type == 'selection'" type="selection" width="45px" :min-width="minWidth"></el-table-column>
 	<!-- 普通td -->
-	-<el-table-column align='center' v-else-if="type == 'text'" :label="name" :width="width" :min-width="minWidth">
+	-<el-table-column  :align='align' v-else-if="type == 'text'" :label="name" :width="width" :min-width="minWidth">
 		<template slot-scope="s">
 			<span v-if="s.row[prop]">{{s.row[prop]}}</span>
 			<span v-else>{{not}}</span>
@@ -88,7 +88,7 @@
 	</el-table-column>
 	
 	<!-- 钱 money (单位 元) -->
-	-<el-table-column align='center' v-else-if="type == 'money'" :label="name" :width="width" :min-width="minWidth">
+	-<el-table-column :align='align' v-else-if="type == 'money'" :label="name" :width="width" :min-width="minWidth">
 		<template slot-scope="s">
 			<b class="c-price" v-if="!sa.isNull(s.row[prop])">¥{{s.row[prop]}}</b>
 			<div v-else>-</div>
@@ -181,7 +181,8 @@
 			// type=menu时,值列表    -- 形如:{1: '正常[green]', 2: '禁用[red]'}  
 			jv: {default: ''},
 			// 空值时显示的文字
-			not: {default: '-'}
+			not: {default: '-'},
+			align: {default: 'center'},
 		},
 		data() {
 			return {

+ 162 - 0
sa-view/tb-config/tb-config-add.html

@@ -0,0 +1,162 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/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 .el-input,
+			.c-panel .el-form .el-textarea__inner {
+				width: 250px;
+			}
+			table {
+				font-family: arial, sans-serif;
+				border-collapse: collapse;
+				width: 90%;
+				margin-top: 22px;
+				margin-left: auto;
+				margin-right: auto;
+			}
+			th {
+				border: 1px solid darkgray;
+				text-align: left;
+				height: 22px;
+				padding: 8px;
+				background-color: #dddddd;
+			}
+			td {
+				border: 1px solid darkgray;
+				text-align: left;
+				padding: 8px;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: code}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<div class="c-title" v-if="code == 0">数据添加</div>
+					<div class="c-title" v-else>数据修改</div>
+					<el-form v-if="m">
+						<table>
+							<tr>
+								<th><label style="color: red">*</label>参数标识</th>
+								<td>
+									<el-input type="text" v-model="m.code" placeholder="请输入参数标识" :disabled="code == 0?false:true"></el-input>
+								</td>
+								</tr>
+							<tr>
+								<th><label style="color: red">*</label>参数名称</th>
+								<td>
+									<el-input type="text" v-model="m.name" placeholder="请输入参数名称"></el-input>
+								</td>
+							</tr>
+							<tr>
+								<th><label style="color: red">*</label>参数配置值</th>
+								<td>
+									<el-input type="text" v-model="m.value" placeholder="请输入参数配置值"></el-input>
+								</td>
+								</tr>
+							<tr>
+								<th>备注</th>
+								<td>
+									<el-input type="text" v-model="m.remark" placeholder="请输入备注"></el-input>
+								</td>
+							</tr>
+						</table>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					code: sa.p('code', 0),		// 获取超链接中的id参数(0=添加,非0=修改)
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							code: '',		// 业务标识
+							name: '',		// 业务名称 
+							value: '',		// 业务配置值 
+							remark: '',		// 备注 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.code, '请输入 [参数标识]');
+						sa.checkNull(m.name, '请输入 [参数名称]');
+						sa.checkNull(m.value, '请输入 [参数配置值]');
+						//sa.checkNull(m.remark, '请输入 [备注]');
+				
+						// 开始增加或修改
+						if(this.code <= 0) {	// 添加
+							sa.ajax('/transport-server/TbConfig/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/transport-server/TbConfig/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.code == 0) {
+							this.m = this.createModel();
+							parent.app.f5();		// 刷新父页面列表
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){ console.log("code=" + this.code);
+					// 初始化数据 
+					if(this.code <= 0) {
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/transport-server/TbConfig/getById?code=' + this.code, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 code=' + this.code + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 98 - 0
sa-view/tb-config/tb-config-info.html

@@ -0,0 +1,98 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/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 .c-label{width: 8em;}
+			table {
+			  font-family: arial, sans-serif;
+			  border-collapse: collapse;
+			  width: 90%;
+			  margin-top: 26px ;
+			  margin-left: auto;
+			  margin-right: auto;
+			}
+			th {
+			  border: 1px solid darkgray;
+			  text-align: left;
+			  height: 26px;
+			  padding: 8px;
+			  background-color: #dddddd;
+			}
+			td {
+			  border: 1px solid darkgray;
+			  text-align: left;
+			  padding: 8px;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<table>
+							<tr>
+								<th>业务参数标识</th>
+								<td>{{m.code}}</td>
+									</tr>
+							<tr>
+								<th>业务参数名称</th>
+								<td>{{m.name}}</td>
+							</tr>
+							<tr>
+								<th>业务参数配置值</th>
+								<td>{{m.value}}</td>
+									</tr>
+							<tr>
+								<th>备注</th>
+								<td>{{m.remark}}</td>
+							</tr>
+						</table>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					code: sa.p('code', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/transport-server/TbConfig/getById?code=' + this.code, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.code + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 138 - 0
sa-view/tb-config/tb-config-list.html

@@ -0,0 +1,138 @@
+<!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>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="业务参数标识" v-model="p.code" width="100px"></sa-item>
+					<sa-item type="text" name="业务参数名称" v-model="p.name" width="100px"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-config-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<!--<el-button size="mini" type="danger" @click="deleteByIds()">删除</el-button>-->
+
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+
+					<sa-td name="业务参数标识" prop="code" width="150"></sa-td>
+					<sa-td name="业务参数名称" prop="name" width="150"></sa-td>
+					<sa-td name="参数配置值" prop="value" ></sa-td>
+					<sa-td name="备注" prop="remark" ></sa-td>
+					<sa-td name="更新人" prop="updateBy" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime" width="150"></sa-td>
+					<el-table-column label="操作" fixed="right"  width="200px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
+							<el-button v-if="sa.isAuth('tb-config-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-config-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						code: '',		// 业务标识 
+						name: '',		// 业务名称 
+						value: '',		// 业务配置值 
+						remark: '',		// 备注 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbConfig/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('业务参数详情', 'tb-config-info.html?code=' + data.code, '500px', '400px');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改业务参数', 'tb-config-add.html?code=' + data.code, '500px', '400px');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增业务参数', 'tb-config-add.html?code=0', '500px', '400px');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('确定要删除业务标识为['+ data.code +']的业务参数吗?', function() {
+							sa.ajax('/transport-server/TbConfig/delete?code=' + data.code, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbConfig/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 163 - 0
sa-view/tb-dict/tb-dict-cat-add.html

@@ -0,0 +1,163 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/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 .el-input,
+			.c-panel .el-form .el-textarea__inner {
+				width: 250px;
+			}
+			table {
+				font-family: arial, sans-serif;
+				border-collapse: collapse;
+				width: 90%;
+				margin-top: 22px;
+				margin-left: auto;
+				margin-right: auto;
+			}
+			th {
+				border: 1px solid darkgray;
+				text-align: left;
+				height: 22px;
+				padding: 8px;
+				background-color: #dddddd;
+			}
+			td {
+				border: 1px solid darkgray;
+				text-align: left;
+				padding: 8px;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<div class="c-title" v-if="id == 0">数据添加</div>
+					<div class="c-title" v-else>数据修改</div>
+					<el-form v-if="m">
+						<table>
+							<tr>
+								<th><label style="color: red">*</label>字典类型</th>
+								<td>
+									<el-input size="mini" v-model="m.code" placeholder="请输入字典类型" :disabled="id == 0?false:true"></el-input>
+								</td>
+							</tr>
+							<tr>
+								<th><label style="color: red">*</label>字典名称</th>
+								<td>
+									<el-input size="mini" v-model="m.name" placeholder="请输入字典名称"></el-input>
+								</td>
+							</tr>
+							<tr>
+								<th><label style="color: red">*</label>排序序号</th>
+								<td>
+									<el-input size="mini" v-model="m.seq" placeholder="请输入排序序号"></el-input>
+								</td>
+							</tr>
+							<tr>
+								<th>字典备注</th>
+								<td>
+									<el-input size="mini" v-model="m.remark" placeholder="请输入字典备注"></el-input>
+								</td>
+							</tr>
+						</table>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							code: '',		// 类型标识 
+							name: '',		// 类型名称 
+							remark: '',		// 备注信息 
+							seq: '',		// 排序 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.code, '请输入 [类型标识]');
+						sa.checkNull(m.name, '请输入 [类型名称]');
+						//sa.checkNull(m.remark, '请输入 [备注信息]');
+						sa.checkNull(m.seq, '请输入 [排序]');
+
+						if (isNaN(m.seq)){
+							sa.errorMsg('排序必须是数字类型'); return ;
+						}
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/transport-server/TbDictCat/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/transport-server/TbDictCat/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+							parent.app.f5();		// 刷新父页面列表
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/transport-server/TbDictCat/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 code=' + this.code + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 95 - 0
sa-view/tb-dict/tb-dict-cat-info.html

@@ -0,0 +1,95 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/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 .c-label{width: 8em;}
+			table {
+			  font-family: arial, sans-serif;
+			  border-collapse: collapse;
+			  width: 90%;
+			  margin-top: 26px ;
+			  margin-left: auto;
+			  margin-right: auto;
+			}
+			th {
+			  border: 1px solid darkgray;
+			  text-align: left;
+			  height: 26px;
+			  padding: 8px;
+			  background-color: #dddddd;
+			}
+			td {
+			  border: 1px solid darkgray;
+			  text-align: left;
+			  padding: 8px;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<table>
+							<tr>
+								<th>类目标识</th>
+								<td>{{m.code}}</td>
+							</tr>
+							<tr>
+								<th>类目名称</th>
+								<td>{{m.name}}</td>
+							</tr>
+							<tr>
+								<th>备注信息</th>
+								<td>{{m.remark}}</td>
+							</tr>
+							<tr>
+								<th>排序</th>
+								<td>{{m.seq}}</td>
+							</tr>
+						</table>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/transport-server/TbDictCat/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 145 - 0
sa-view/tb-dict/tb-dict-cat-list.html

@@ -0,0 +1,145 @@
+<!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>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="字典名称" v-model="p.name" width="80px"></sa-item>
+					<sa-item type="text" name="字典类型" v-model="p.code" width="80px"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-dict-cat-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<!--<el-button size="mini" type="danger" @click="deleteByIds()">删除</el-button>-->
+
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+					<sa-td name="序号" prop="seq" ></sa-td>
+					<sa-td name="字典名称" prop="name" ></sa-td>
+					<el-table-column label="字典类型" align="center" :show-overflow-tooltip="true">
+						<template slot-scope="scope">
+							<el-button type="text" @click="handleDictData(scope.row)">{{scope.row.code}}</el-button>
+						</template>
+					</el-table-column>
+
+					<sa-td name="字典备注" prop="remark" ></sa-td>
+					<sa-td name="创建时间" prop="createTime" width="150"></sa-td>
+					<el-table-column label="操作" fixed="right"  width="200px">
+						<template slot-scope="s">
+							<!--<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>-->
+							<el-button v-if="sa.isAuth('tb-dict-cat-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-dict-cat-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						code: '',		// 类型标识 
+						name: '',		// 类型名称 
+						remark: '',		// 备注信息 
+						seq: '',		// 排序 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbDictCat/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-dict-cat-info.html?id=' + data.code, '500px', '400px');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					handleDictData: function (row){
+						sa_admin.showTab({id: 'tb-dict-info-list', name: '字典数据', url: 'sa-view/tb-dict/tb-dict-info-list.html?code=' + row.code});
+
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改字典类型', 'tb-dict-cat-add.html?id=' + data.code, '500px', '400px');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('添加字典类型', 'tb-dict-cat-add.html?id=-1', '500px', '400px');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('确定要删除该字典类型吗?此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbDictCat/delete?id=' + data.code, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbDictCat/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 178 - 0
sa-view/tb-dict/tb-dict-info-add.html

@@ -0,0 +1,178 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/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 .el-input,
+			.c-panel .el-form .el-textarea__inner {width: 250px;}
+			table {
+				font-family: arial, sans-serif;
+				border-collapse: collapse;
+				width: 90%;
+				margin-top: 22px;
+				margin-left: auto;
+				margin-right: auto;
+			}
+			th {
+				border: 1px solid darkgray;
+				text-align: left;
+				height: 22px;
+				padding: 8px;
+				background-color: #dddddd;
+			}
+			td {
+				border: 1px solid darkgray;
+				text-align: left;
+				padding: 8px;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<div class="c-title" v-if="id == 0">添加字典</div>
+					<div class="c-title" v-else>修改字典</div>
+					<el-form v-if="m">
+						<table>
+							<tr>
+								<th><label style="color: red">*</label>字典类型</th>
+								<td>
+									<el-input size="mini" v-model="m.code" disabled="true" placeholder="字典类型" ></el-input>
+								</td>
+							</tr>
+							<tr>
+								<th><label style="color: red">*</label>字典键值</th>
+								<td>
+									<el-input size="mini" v-model="m.dictName" placeholder="请输入字典键值"></el-input>
+								</td>
+							</tr>
+							<tr>
+								<th><label style="color: red">*</label>备注</th>
+								<td>
+									<el-input size="mini" v-model="m.dictValue" placeholder="请输入备注"></el-input>
+								</td>
+							</tr>
+							<tr>
+								<th><label style="color: red">*</label>排序</th>
+								<td>
+									<el-input size="mini" v-model="m.seq" placeholder="请输入排序"></el-input>
+								</td>
+							</tr>
+						</table>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+					catList:[],
+					code: sa.p('code', 0),
+				},
+				methods: {
+					getCatList() {
+						sa.ajax('/transport-server/TbDictCat/getList', {
+							pageSize: 100,
+							pageNo: 1
+						}, function(resp) {
+							let list=resp.data; 
+							console.log(list)
+							this.catList = list;
+						}.bind(this));
+					},
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '',		// ID 
+							code: '',		// 类目标识 
+							dictName: '',		// 配置字典名称 
+							dictValue: '',		// 配置字典值、内容 
+							remark: '',		// 备注信息 
+							seq: '',		// 排序 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.code, '请输入 [字典类型]');
+						sa.checkNull(m.dictName, '请输入 [字典名称]');
+						sa.checkNull(m.dictValue, '请输入 [字典值]');
+						sa.checkNull(m.seq, '请输入 [排序]');
+
+						if (isNaN(m.seq)){
+							sa.errorMsg('排序必须是数字类型');return ;
+						}
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/transport-server/TbDictInfo/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/transport-server/TbDictInfo/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					//this.getCatList();
+
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+						this.m.code = this.code;
+					} else {	
+						sa.ajax('/transport-server/TbDictInfo/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 95 - 0
sa-view/tb-dict/tb-dict-info-info.html

@@ -0,0 +1,95 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/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 .c-label{width: 8em;}
+			table {
+			  font-family: arial, sans-serif;
+			  border-collapse: collapse;
+			  width: 90%;
+			  margin-top: 26px ;
+			  margin-left: auto;
+			  margin-right: auto;
+			}
+			th {
+			  border: 1px solid darkgray;
+			  text-align: left;
+			  height: 26px;
+			  padding: 8px;
+			  background-color: #dddddd;
+			}
+			td {
+			  border: 1px solid darkgray;
+			  text-align: left;
+			  padding: 8px;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<table>
+							<tr>
+								<th>类型标识</th>
+								<td>{{m.code}}</td>
+							</tr>
+							<tr>
+								<th>字典值</th>
+								<td>{{m.dictName}}</td>
+							</tr>
+							<tr>
+								<th>备注</th>
+								<td>{{m.dictValue}}</td>
+							</tr>
+							<tr>
+								<th>排序</th>
+								<td>{{m.seq}}</td>
+							</tr>
+						</table>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/transport-server/TbDictInfo/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 156 - 0
sa-view/tb-dict/tb-dict-info-list.html

@@ -0,0 +1,156 @@
+<!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>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+
+				<el-form ref="form" :model='p' @submit.native.prevent>
+
+					<label class="c-label">字典类型:</label>
+					<el-select  v-model="p.code" placeholder="请选择" filterable size="mini">
+						<el-option v-for="(item,index) in catList" :key="item.code" :label="item.name" :value="item.code"> </el-option>
+					</el-select>
+
+					<!--<sa-item type="text" name="字典标签" v-model="p.dictName" width="150px"></sa-item>-->
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-dict-info-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="danger" @click="deleteByIds()">删除</el-button>
+
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+					<sa-td type="selection"></sa-td>
+					<sa-td name="排序" prop="seq" ></sa-td>
+					<sa-td name="字典值" prop="dictName" ></sa-td>
+					<sa-td name="备注" prop="dictValue" ></sa-td>
+					<!--<sa-td name="备注" prop="remark" ></sa-td>-->
+					<sa-td name="创建时间" prop="createTime" width="150"></sa-td>
+					<el-table-column label="操作" fixed="right"  width="200px">
+						<template slot-scope="s">
+							<!--<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>-->
+							<el-button v-if="sa.isAuth('tb-dict-info-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-dict-info-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						id: '',		// ID 
+						code: sa.p('code', 0),// 字典类型
+						dictName: '',		// 配置字典名称 
+						dictValue: '',		// 配置字典值、内容 
+						remark: '',		// 备注信息 
+						seq: '',		// 排序 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合
+					catList:[],
+				},
+				methods: {
+					getCatList() {
+						sa.ajax('/transport-server/TbDictCat/getList', {
+							pageSize: 100,
+							pageNo: 1
+						}, function(resp) {
+							let list=resp.data;
+							console.log(list)
+							this.catList = list;
+						}.bind(this));
+					},
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbDictInfo/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('字典详情', 'tb-dict-info-info.html?id=' + data.id, '500px', '400px');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改字典', 'tb-dict-info-add.html?id=' + data.id, '500px', '400px');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('添加字典', 'tb-dict-info-add.html?id=-1&code='+ this.p.code, '500px', '400px');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('此操作不可撤销,确认要删除该字典吗?', function() {
+							sa.ajax('/transport-server/TbDictInfo/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbDictInfo/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.getCatList();
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 215 - 0
sa-view/tb-driver-audit/tb-driver-audit-list.html

@@ -0,0 +1,215 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/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>
+
+<body>
+	<div class="vue-box" style="display: none;" :style="'display: block;'">
+		<div class="c-panel">
+
+			<!-- ------------- 检索参数 ------------- -->
+			<!-- <div class="c-title">检索参数</div> -->
+			<el-form ref="form" :model='p' @submit.native.prevent>
+				<sa-item type="text" name="姓名" v-model="p.name" width="50px"></sa-item>
+				<sa-item type="text" name="手机号" v-model="p.phone"></sa-item>
+				<sa-item type="text" name="身份证号" v-model="p.idCard" width="90px"></sa-item>
+				
+				<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+				<el-button icon="el-icon-refresh" type="info" @click="sa.f5()">重置</el-button>
+			</el-form>
+			 <!--<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-driver-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+					<el-button size="mini" type="danger" @click="deleteByIds()">批量删除</el-button>
+					<el-button size="mini" type="primary" @click="importMsg()">导入</el-button>
+					<el-button size="mini" type="success" @click="exportFile()">导出</el-button>
+			 </div> -->
+
+			<!-- ------------- 数据列表 ------------- -->
+			<el-table class="data-table" ref="data-table" :data="dataList">
+				<sa-td type="selection"></sa-td>
+				<sa-td name="姓名" prop="name"></sa-td>				
+				<sa-td name="性别" prop="sex" type="enum" :jv="{1: '男', 2: '女'}"></sa-td>
+				<sa-td name="出生年月" prop="birthday" width="120px"></sa-td>
+				<sa-td name="身份证号" width="170px" prop="idCard"></sa-td>
+				<sa-td name="手机号" width="110px" prop="phone"></sa-td>
+				<!--<sa-td name="联系地址" width="150px" prop="address"></sa-td>
+				
+				 <sa-td name="身份证照片" prop="idCardImg" type="img-list"></sa-td>
+				<sa-td name="驾驶证号" prop="drivingLicenseId"></sa-td>-->
+				<sa-td name="驾照类型" prop="driverType"  type="enum" :jv="{6: 'A2', 7: 'B2', 19: 'C1', 20:'C2'}"></sa-td>
+				<sa-td name="驾驶证照片" prop="drivingLicenseImg" type="img-list"></sa-td>
+				<!-- <sa-td name="车辆行驶证号" prop="vehicleDrivingId" width="120px"></sa-td>
+				<sa-td name="车辆行驶证照片" prop="vehicleDrivingImg" type="img-list"></sa-td>
+				<sa-td name="车辆前脸照" prop="vehicleImg" type="img-list"></sa-td>
+
+				<sa-td name="状态" prop="isLock"></sa-td>-->
+				<sa-td name="注册时间" prop="registerTime" width="150px"></sa-td>
+				<sa-td name="审核状态" prop="auditStatus" type="enum" :jv="{0: '待审核', 3: '审核中', 1: '已审核', 2: '审核不通过'}"></sa-td> 
+				<!--<sa-td name="审核状态" prop="auditStatus"></sa-td>-->
+				<sa-td name="审核时间" prop="auditTime" width="150px"></sa-td>
+				<el-table-column label="操作" fixed="right" width="150px">
+					<template slot-scope="s">
+						
+						<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
+						<el-button class="c-btn" type="danger" icon="el-icon-lock" v-if="s.row.isLock" @click="unlock(s.row)">锁定</el-button>
+						<el-button class="c-btn" type="primary" icon="el-icon-s-check" v-else @click="audit(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>
+		<!-- 上传文件 -->
+		<input ref="fileInput" type="file" style="display: none;" @click="handleFile(event)"></input>
+	</div>
+	<script>
+		var app = new Vue({
+			components: {
+				"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),
+				"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),
+			},
+			el: '.vue-box',
+			data: {
+				p: { // 查询参数
+					name: '',		// 姓名
+					phone: '',		// 手机号
+					idCard: '',		// 身份证号
+					auditStatus: '',    // 审核状态
+					pageNo: 1,		// 当前页
+					pageSize: 10,	// 页大小
+					sortType: 0		// 排序方式
+				},
+				dataCount: 0,
+				dataList: [], // 数据集合
+
+
+			},
+			methods: {
+				handleTabClick(tab, event) {
+					if(tab.name==='all')
+						this.p.auditStatus =null;
+					else
+						this.p.auditStatus = tab.name;
+					this.f5();
+				},
+				// 刷新
+				f5: function () {
+
+					sa.ajax('/transport-server/TbDriver/getWaitAuditList', sa.removeNull(this.p), function (res) {
+						res.data.forEach(element => {
+							element.idCard = element.idCard.toString().replace(/^(.{4})(?:\w+)(.{4})$/,'$1****$2')
+						});
+						this.dataList = res.data; // 数据
+						this.dataCount = res.dataCount; // 数据总数
+						sa.f5TableHeight();		// 刷新表格高度
+					}.bind(this));
+				},
+				// 查看
+				get: function (data) {
+					sa.showIframe('司机详情', '../tb-driver/tb-driver-info.html?id=' + data.id, '1050px', '90%');
+				},
+				// 查看 - 根据选中的
+				getBySelect: function (data) {
+					var selection = this.$refs['data-table'].selection;
+					if (selection.length == 0) {
+						return sa.msg('请选择一条数据')
+					}
+					this.get(selection[0]);
+				},
+				// 修改
+				update: function (data) {
+					sa.showIframe('修改司机', 'tb-driver-add.html?id=' + data.id, '1000px', '90%');
+				},
+				// 新增
+				add: function (data) {
+					sa.showIframe('添加司机', 'tb-driver-add.html?id=-1', '1000px', '90%');
+				},
+				// 删除
+				del: function (data) {
+					sa.confirm('将要删除 ' + data.name + ' 这个司机信息,是否确认删除', function () {
+						sa.ajax('/transport-server/TbDriver/delete?id=' + data.id, function (res) {
+							sa.arrayDelete(this.dataList, data);
+							sa.ok('删除成功');
+							sa.f5TableHeight();		// 刷新表格高度
+						}.bind(this))
+					}.bind(this));
+				},
+				// 批量删除
+				deleteByIds: function () {
+					// 获取选中元素的id列表
+					let selection = this.$refs['data-table'].selection;
+					let ids = sa.getArrayField(selection, 'id');
+					if (selection.length == 0) {
+						return sa.msg('请至少选择一条数据')
+					}
+					// 提交删除
+					sa.confirm('是否批量删除选中数据?此操作不可撤销', function () {
+						sa.ajax('/transport-server/TbDriver/deleteByIds', { ids: ids.join(',') }, function (res) {
+							sa.arrayDelete(this.dataList, selection);
+							sa.ok('删除成功');
+							sa.f5TableHeight();		// 刷新表格高度
+						}.bind(this))
+					}.bind(this));
+				},
+				unlock: function(data){
+					sa.confirm('是否要解锁当前数据',function() {
+						data.isLock=false
+						sa.ok('解锁成功')
+						sa.f5TableHeight();		// 刷新表格高度
+					}.bind(this))
+				},
+				audit: function(data){
+					sa.ajax('/transport-server/TbDriver/startAudit?id='+ data.id, function(res) {
+						sa.showIframe('司机审核', 'tb-driver-audit.html?id=' + data.id, '1000px', '90%');
+					}.bind(this))
+					
+				},
+				exportFile() {
+					sa.ajax('/transport-server/TbDriver/driverOutport', {
+						// keyword: "",
+						// filepath: ""
+					}, function (res) {
+					})
+				},
+				importMsg() {
+					this.$refs.fileInput.click()
+					console.log("导入")
+				},
+				handleFile(event) {
+					console.log(event)
+					const file = event.target.files[0]
+					sa.ajax('/transport-server/TbDriver/driverImport', { file }, function (res) {
+						// sa.ok('导入成功');
+						// sa.f5TableHeight();
+					})
+				},
+			},
+			created: function () {
+				this.f5();
+				sa.onInputEnter();
+			}
+		})
+	</script>
+</body>
+
+</html>

+ 231 - 0
sa-view/tb-driver-audit/tb-driver-audit.html

@@ -0,0 +1,231 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/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>
+	<script src="../../static/kj/citydata.js"></script>
+
+	<style type="text/css">
+		.c-panel .el-form .c-label {
+			width: 7em !important;
+		}
+
+		.c-panel .el-form .el-input,
+		.c-panel .el-form .el-textarea__inner {
+			width: 250px;
+		}
+
+		table {
+			font-family: arial, sans-serif;
+			border-collapse: collapse;
+			width: 100%;
+			margin-top: 22px;
+			margin-bottom: 22px;
+			margin-left: auto;
+			margin-right: auto;
+		}
+
+		th {
+			border: 1px solid darkgray;
+			text-align: left;
+			height: 22px;
+			padding: 8px;
+			background-color: #dddddd;
+			width: 15%;
+		}
+
+		td {
+			border: 1px solid darkgray;
+			text-align: left;
+			padding: 8px;
+		}
+		.image-box{ display: flex;}
+	</style>
+</head>
+
+<body>
+	<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+		<!-- ------- 内容部分 ------- -->
+		<div class="s-body">
+			<div class="c-panel">
+				<div class="c-title" v-if="id == 0">添加司机</div>
+				<div class="c-title" v-else>修改司机</div>
+				<el-form v-if="m">
+					<h3>司机信息</h3> 
+					<table>
+						<tr>
+							<th>司机姓名</th>
+							<td>{{m.name}}</td>
+							<th>司机性别</th>
+							<td>
+								<span v-if="m.sex == 1">男</span>
+								<span v-else-if="m.sex == 2">女</span>
+								<span v-else>-</span>
+							</td>
+						</tr>
+						<tr>
+							<th>身份证号</th>
+							<td>{{m.idCard}}</td>
+							<th>出生年月</th>
+							<td>{{m.birthday || '-'}}</td>
+						</tr>
+						<tr>
+							<th>联系电话</th>
+							<td>{{m.phone}}</td>
+							<th>联系地址</th>
+							<td>{{m.address || '-'}}</td>
+						</tr>
+						<tr>
+							<th>驾照类型</th>
+							<td>{{m.driverTypeName || '-'}}</td>
+							<th>驾驶证号</th>
+							<td>{{m.drivingLicenseId || '-'}}</td>
+						</tr>
+						<tr>
+							<th>注册时间</th>
+							<td>{{m.registerTime || '-'}}</td>
+							<th>更新时间</th>
+							<td>{{m.updateTime || '-'}}</td>
+						</tr>
+						<tr>
+							<th>身份证照片</th>
+							<td colspan="3">
+								<sa-info type="img-list" :value="m.idCardImg"></sa-info>
+							</td>
+						</tr>
+						<tr>
+							<th>驾驶证照片</th>
+							<td colspan="3">
+								<sa-info type="img-list" :value="m.drivingLicenseImg"></sa-info>
+							</td>
+						</tr>
+					</table>
+					<h3>司机注册审核</h3> 
+					<table>
+						<tr>
+							<th><label style="color: red">*</label>审核结果</th>
+							<td colspan="3">
+								<sa-item type="enum" v-model="audit.auditStatus" :jv="{1: '审核通过', 2: '审核不通过'}" jtype="3"></sa-item>
+							</td>
+						</tr>
+						<tr>
+							<th><label style="color: red">*</label>审核意见</th>
+							<td colspan="3">
+								<sa-item v-model="audit.nopassReason" type="textarea" :rows="2" placeholder="请输入审核意见" />
+							</td>
+						</tr>
+					</table>
+					<sa-item name="" class="s-ok" br>
+						<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+					</sa-item>
+				</el-form>
+			</div>
+		</div>
+		<!-- ------- 底部按钮 ------- -->
+		<div class="s-foot">
+			<el-button type="primary" @click="ok()">确定</el-button>
+			<el-button @click="sa.closeCurrIframe()">取消</el-button>
+		</div>
+	</div>
+	<script>
+		var app = new Vue({
+			components: {
+				"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue'),
+				"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+			},
+			el: '.vue-box',
+			data: {
+				id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改)
+				m:null,
+				audit: {
+					id: sa.p('id', 0),
+					auditStatus:'',
+					nopassReason:''
+				},		// 实体对象
+				cityOptions: citydata
+			},
+			methods: {
+				// 创建一个 默认Model
+				createModel: function () {
+					return {
+						name: '',		// 姓名
+						age: '',		// 年龄
+						sex: '',		// 性别性别(1=男,2=女)
+						phone: '',		// 手机号
+						address: '',		// 联系地址
+						// bankCode: '',		// 银行卡号
+						// bankName: '',		// 银行名称
+						idCard: '',		// 身份证号
+						// idCardImg: '',		// 身份证照片
+						drivingLicenseId: '',		// 驾驶证号
+						drivingLicenseImg: '',		// 驾驶证照片
+						vehicleDrivingId: '',		// 车辆行驶证号
+						vehicleDrivingImg: '',		// 车辆行驶证照片
+						vehicleImg: '',		// 车辆前脸照
+						// registerTime: '',		// 注册时间
+						// isLock: '',		// 是否被锁定
+						// deleteStatus: '',		// 删除状态
+						// auditStatus: '',		// 审核状态(0=待审核,1=已通过,2=不通过)
+						// auditBy: '',		// 审核人
+						// auditTime: '',		// 审核时间
+						// nopassReason: '',		// 审核不通过原因
+					}
+				},
+				// 提交数据
+				ok: function () {
+					// 表单校验
+					let m = this.audit;
+
+					sa.checkNull(m.auditStatus, '请选择 [审核结果]');
+					sa.checkNull(m.nopassReason, '请输入 [审核意见]');
+
+					sa.ajax('/transport-server/TbDriver/submitAudit', m, function (res) {
+						sa.alert('审核成功', this.clean);
+					}.bind(this));
+				},
+				// 添加/修改 完成后的动作
+				clean: function () {
+					if (this.id == 0) {
+						this.m = this.createModel();
+					} else {
+						parent.app.f5();		// 刷新父页面列表
+						sa.closeCurrIframe();	// 关闭本页
+					}
+				}
+			},
+			mounted: function () {
+				// 初始化数据
+				if (this.id <= 0) {
+					this.m = this.createModel();
+					this.audit.auditStatus = '';
+					this.audit.nopassReason = '';
+				} else {
+					sa.ajax('/transport-server/TbDriver/getById?id=' + this.id, function (res) {
+						this.m = res.data;
+						this.audit.auditStatus = '';
+						this.audit.nopassReason = '';
+						if (res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			}
+		})
+
+	</script>
+</body>
+
+</html>

+ 127 - 78
sa-view/tb-driver/tb-driver-add.html

@@ -17,6 +17,7 @@
 	<script src="../../static/sa.js"></script>
 	<script src="../../static/kj/upload-util.js"></script>
 	<script src="../../static/kj/citydata.js"></script>
+	<script src="../../static/kj/validator.js"></script>
 
 	<style type="text/css">
 		.c-panel .el-form .c-label {
@@ -27,6 +28,30 @@
 		.c-panel .el-form .el-textarea__inner {
 			width: 250px;
 		}
+
+		table {
+			font-family: arial, sans-serif;
+			border-collapse: collapse;
+			width: 90%;
+			margin-top: 22px;
+			margin-left: auto;
+			margin-right: auto;
+		}
+
+		th {
+			border: 1px solid darkgray;
+			text-align: left;
+			height: 22px;
+			padding: 8px;
+			background-color: #dddddd;
+		}
+
+		td {
+			border: 1px solid darkgray;
+			text-align: left;
+			padding: 8px;
+		}
+		.image-box{ display: flex;}
 	</style>
 </head>
 
@@ -35,64 +60,72 @@
 		<!-- ------- 内容部分 ------- -->
 		<div class="s-body">
 			<div class="c-panel">
-				<div class="c-title" v-if="id == 0">数据添加</div>
-				<div class="c-title" v-else>数据修改</div>
+				<div class="c-title" v-if="id == 0">添加司机</div>
+				<div class="c-title" v-else>修改司机</div>
 				<el-form v-if="m">
-					<el-row :gutter="50">
-						<el-col :span="12">
-							<sa-item type="text" name="姓名" v-model="m.name" br></sa-item>
-						</el-col>
-						<el-col :span="12">
-							<sa-item type="cascader" :options="cityOptions" name="联系地址" v-model="m.address"
-								br></sa-item>
-						</el-col>
-					</el-row>
-
-					<el-row :gutter="50">
-						<el-col :span="12">
-							<sa-item type="text" name="手机号" v-model="m.phone" br></sa-item>
-						</el-col>
-						<el-col :span="12">
-							<sa-item type="text" name="详细地址" v-model="m.detailAddress" br></sa-item>
-						</el-col>
-					</el-row>
-
-					<el-row :gutter="50">
-						<el-col :span="12">
-							<sa-item type="text" name="身份证号" v-model="m.idCard" br></sa-item>
-						</el-col>
-						<el-col :span="12">
-							<sa-item type="enum" name="性别" v-model="m.sex" :jv="{1: '男', 2: '女'}" jtype="3"
-								br></sa-item>
-						</el-col>
-					</el-row>
-
-					<!-- <el-row :gutter="50">
-						<el-col :span="12">
-							<sa-item type="text" name="驾驶证号" v-model="m.drivingLicenseId" br></sa-item>
-						</el-col>
-						<el-col :span="12">
-							<sa-item type="text" name="车辆行驶证号" v-model="m.vehicleDrivingId" br></sa-item>
-						</el-col>
-					</el-row> -->
-
-					<el-row :gutter="50">
-						<el-col :span="12">
-							<sa-item type="img-list" name="身份证" v-model="m.idCardImg" br></sa-item>
-						</el-col>
-						<el-col :span="12">
-							<sa-item type="img-list" name="驾驶证" v-model="m.drivingLicenseImg" br></sa-item>
-						</el-col>
-					</el-row>
-
-					<el-row :gutter="50">
-						<el-col :span="12">
-							<sa-item type="img-list" name="行驶证" v-model="m.vehicleDrivingImg" br></sa-item>
-						</el-col>
-					</el-row>
-
-					<!-- <sa-item type="img-list" name="车辆前脸照" v-model="m.vehicleImg" br></sa-item> -->
-					
+					<table>
+						<tr>
+							<th><label style="color: red">*</label>司机姓名</th>
+							<td>
+								<el-input size="mini" v-model="m.name"></el-input>
+							</td>
+							<th><label style="color: red">*</label>性别</th>
+							<td>
+								<sa-item type="enum" v-model="m.sex" :jv="{1: '男', 2: '女'}" jtype="3"></sa-item>
+							</td>
+						</tr>
+						<tr>
+							<th><label style="color: red">*</label>身份证号</th>
+							<td>
+								<el-input size="mini" v-model="m.idCard"></el-input>
+							</td>
+							<th>出生日期</th>
+							<td>
+								<el-date-picker
+									v-model="m.birthday"
+									type="date"
+									format="yyyy-MM-dd"
+									value-format="yyyy-MM-dd"
+									placeholder="选择日期">
+								</el-date-picker>
+							</td>
+						</tr>
+						<tr>
+							<th><label style="color: red">*</label>手机号码</th>
+							<td>
+								<el-input size="mini" v-model="m.phone"></el-input>
+							</td>
+							<th>联系地址</th>
+							<td>
+								<el-input size="mini" v-model="m.address"></el-input>
+							</td>
+						</tr>
+						<tr>
+							<th><label style="color: red">*</label>驾照类型</th>
+							<td>
+								<el-select v-model="m.driverType" size="mini">
+									<el-option label="A2(重型牵引挂车)" value="6"></el-option>
+									<el-option label="B2(大型货车)" value="7"></el-option>
+									<el-option label="C1(小型汽车)" value="19"></el-option>
+									<el-option label="C2(小型自动挡汽车)" value="20"></el-option>
+								</el-select>
+							</td>
+							<th>驾驶证号</th>
+							<td>
+								<el-input size="mini" v-model="m.drivingLicenseId"></el-input>
+							</td>
+						</tr>
+						<tr>
+							<th><label style="color: red">*</label>身份证照片</th>
+							<td>
+								<sa-item type="img-list" v-model="m.idCardImg" ></sa-item>
+							</td>
+							<th><label style="color: red">*</label>驾驶证照片</th>
+							<td>
+								<sa-item type="img-list" v-model="m.drivingLicenseImg"></sa-item>
+							</td>
+						</tr>
+					</table>
 					<sa-item name="" class="s-ok" br>
 						<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
 					</sa-item>
@@ -148,36 +181,49 @@
 					// 表单校验
 					let m = this.m;
 					sa.checkNull(m.name, '请输入 [姓名]');
-					sa.checkNull(m.age, '请输入 [年龄]');
-					sa.checkNull(m.sex, '请输入 [性别性别]');
+					
+					sa.checkNull(m.sex, '请输入 [性别]');
+					sa.checkNull(m.idCard, '请输入 [身份证号]');
+					//sa.checkNull(m.birthday, '请输入 [出生日期]');
 					sa.checkNull(m.phone, '请输入 [手机号]');
-					sa.checkNull(m.address, '请输入 [联系地址]');
+					//sa.checkNull(m.address, '请输入 [联系地址]');
 					// sa.checkNull(m.bankCode, '请输入 [银行卡号]');
 					// sa.checkNull(m.bankName, '请输入 [银行名称]');
-					sa.checkNull(m.idCard, '请输入 [身份证号]');
-					// sa.checkNull(m.idCardImg, '请上传 [身份证照片]');
-					// sa.checkNull(m.drivingLicenseId, '请输入 [驾驶证号]');
-					// sa.checkNull(m.drivingLicenseImg, '请上传 [驾驶证照片]');
-					// sa.checkNull(m.vehicleDrivingId, '请上传 [车辆行驶证号]');
-					// sa.checkNull(m.vehicleDrivingImg, '请上传 [车辆行驶证照片]');
-					// sa.checkNull(m.vehicleImg, '请上传 [车辆前脸照]');
-					// sa.checkNull(m.registerTime, '请输入 [注册时间]');
-					// // sa.checkNull(m.deleteStatus, '请输入 [删除状态]');
-					// sa.checkNull(m.auditStatus, '请输入 [审核状态]');
-					// sa.checkNull(m.auditBy, '请输入 [审核人]');
-					// sa.checkNull(m.auditTime, '请输入 [审核时间]');
-					// sa.checkNull(m.nopassReason, '请输入 [审核不通过原因]');
+
+					sa.checkNull(m.driverType, '请输入 [驾照类型]');
+					//sa.checkNull(m.drivingLicenseId, '请输入 [驾驶证号]');
+					sa.checkNull(m.idCardImg, '请上传 [身份证照片]');
+					sa.checkNull(m.drivingLicenseImg, '请上传 [驾驶证照片]');
+
+
+					if(validateIDCard(m.idCard)==false){
+						sa.errorMsg('身份证号格式不正确'); return;
+					}
+
+					if(checkBirthMatch(m.idCard, m.birthday)==false){
+						sa.errorMsg('出生日期与身份证信息不一致'); return;
+					}
+
+					if(validatePhone(m.phone)==false){
+						sa.errorMsg('手机号格式不正确'); return;
+					}
+
+					///if(!/^\d{12}$/.test(m.drivingLicenseId)) {
+					//	sa.alert('请输入12位驾驶证号'); return;
+					//}
 
 					// 开始增加或修改
-					// this.m.createTime = undefined;		// 不提交属性:创建时间
-					// this.m.updateTime = undefined;		// 不提交属性:更新时间
+					// this.m.createTime = undefined;		// 不提交属性创建时间
+					// this.m.updateTime = undefined;		// 不提交属性更新时间
 					if (this.id <= 0) {	// 添加
 						sa.ajax('/transport-server/TbDriver/add', m, function (res) {
-							sa.alert('增加成功', this.clean);
+							sa.alert('加成功', this.clean);
 						}.bind(this));
 					} else {	// 修改
-						sa.ajax('/transport-server/TbDriver/update', m, function (res) {
-							sa.alert('修改成功', this.clean);
+						sa.confirm('信息修改后需要重新审核,您确定要修改吗?', function () {
+							sa.ajax('/transport-server/TbDriver/update', m, function (res) {
+								sa.alert('信息已修改,待审核!', this.clean);
+							}.bind(this));
 						}.bind(this));
 					}
 				},
@@ -200,6 +246,9 @@
 						this.m = res.data;
 						if (res.data == null) {
 							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}else if(res.data.auditStatus==3){
+							sa.alert('该司机当前审核中,不能修改');
+							//this.clean();
 						}
 					}.bind(this))
 				}

+ 28 - 32
sa-view/tb-driver/tb-driver-check.html

@@ -14,17 +14,20 @@
 		<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 .c-label{width: 8em;}
-			.c-item .image-box-2{height: 90px;}
-		</style>
+		 <style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+			.c-item .el-input__inner{width: 45%;}
+			/*  普通文本和富文本一起变长  */
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 800px;}
+		 </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">
 						<el-row :gutter="50">
 							<el-col :span="12">
@@ -67,41 +70,32 @@
 								<sa-info type="img-list" name="身份证照片" :value="m.idCardImg" br></sa-info>
 							</el-col>
 							<el-col :span="12">
-								<sa-info name="驾驶证号" br>{{m.drivingLicenseId}}</sa-info>
-							</el-col>
-						</el-row>
-						
-						<el-row :gutter="50">
-							<el-col :span="12">
 								<sa-info type="img-list" name="驾驶证照片" :value="m.drivingLicenseImg" br></sa-info>
 							</el-col>
-							<el-col :span="12">
-								<sa-info name="车辆行驶证号" br>{{m.vehicleDrivingId}}</sa-info>
-							</el-col>
-						</el-row>
-
-						<el-row :gutter="50">
-							<el-col :span="12">
-								<sa-info type="img-list" name="车辆行驶证照片" :value="m.vehicleDrivingImg" br></sa-info>
-							</el-col>
-							<el-col :span="12">
-								<sa-info type="img-list" name="车辆前脸照" :value="m.vehicleImg" br></sa-info>
-							</el-col>
-						</el-row>
+						</el-row> 
 						
 						<!-- <sa-info name="注册时间" br>{{m.registerTime}}</sa-info> -->
 						<!-- <sa-info type="enum" name="审核状态" :value="m.auditStatus" :jv="{0: '待审核,1'}" br></sa-info>
 						<sa-info name="审核人" br>{{m.auditBy}}</sa-info>
 						<sa-info name="审核时间" br>{{m.auditTime}}</sa-info>
-						<sa-info name="审核不通过原因" br>{{m.nopassReason}}</sa-info> -->
+						<sa-info name="审核不通过原因" br>{{m.nopassReason}}</sa-info> --> 
+					</el-form>
+				</div>
+				
+				<div class="c-panel">
+				    <div class="c-title">司机审核处理</div>
+					<el-form>
+						<sa-item name="审核结果" br>
+							<el-select v-model="auditStatus" >
+								<el-option label="请选择" disabled></el-option>
+								<el-option label="通过" :value="1"></el-option>
+								<el-option label="不通过" :value="2"></el-option>
+							</el-select>
+						</sa-item>
+						<sa-item type="textarea" name="备注信息" v-model="auditRemark" br></sa-item>
 					</el-form>
 				</div>
-				<el-row style="margin: 15px 0px;" type="flex" justify="center">
-					<template>
-						<el-radio v-model="auditStatus" label="1">通过</el-radio>
-						<el-radio v-model="auditStatus" label="2">不通过</el-radio>
-					  </template>
-				</el-row>
+				 
 			</div>
 			<!-- ------- 底部按钮 ------- -->
 			<div class="s-foot">
@@ -112,13 +106,15 @@
 		<script>
 			var app = new Vue({
 				components: {
-					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue'),
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
 				},
 				el: '.vue-box',
 				data: {
 					id: sa.p('id', 0),	// 获取数据ID
 					m: null,
 					auditStatus: '',
+					auditRemark:''
 				},
 				methods: {
 					check: function() {

+ 95 - 59
sa-view/tb-driver/tb-driver-info.html

@@ -18,6 +18,30 @@
 		<style type="text/css">
 			.c-panel .c-label{width: 8em;}
 			.c-item .image-box-2{height: 90px;}
+			table {
+			  font-family: arial, sans-serif;
+			  border-collapse: collapse;
+			  width: 100%;
+			  margin-top: 22px ;
+			  margin-bottom: 22px;
+			  margin-left: auto;
+			  margin-right: auto;
+			}
+			th {
+			  border: 1px solid darkgray;
+			  text-align: left;
+			  width: 15%;
+			  height: 22px;
+			  padding: 8px;
+			  background-color: #dddddd;
+			}
+			td {
+			  border: 1px solid darkgray;
+			  text-align: left;
+			  padding: 8px; 
+			  width: 35%;
+			}
+			.image-box{ display: flex;}
 		</style>
 	</head>
 	<body>
@@ -26,69 +50,79 @@
 			<div class="s-body">
 				<div class="c-panel">
 					<el-form v-if="m">
-						<el-row :gutter="50">
-							<el-col :span="12">
-								<sa-info name="姓名" br>{{m.name}}</sa-info>
-							</el-col>
-							<el-col :span="12">
-								<sa-info name="身份证号" br>{{m.idCard}}</sa-info>
-							</el-col>
-						</el-row>
-						
-						<el-row :gutter="50">
-							<el-col :span="12">
-								<sa-info name="审核状态" br>{{m.auditStatus}}</sa-info>
-							</el-col>
-							<el-col :span="12">
-								<sa-info name="审核时间" br>{{m.auditTime}}</sa-info>
-							</el-col>
-						</el-row>
-						
-						<el-row :gutter="50">
-							<el-col :span="12">
-								<sa-info name="注册时间" br>{{m.registerTime}}</sa-info>
-							</el-col>
-							<el-col :span="12">
-								<sa-info name="创建时间" br>{{m.createTime}}</sa-info>
-							</el-col>
-						</el-row>
-						
-						<!-- <el-row :gutter="50">
-							<el-col :span="12">
-								<sa-info type="img-list" name="身份证照片" :value="m.idCardImg" br></sa-info>
-							</el-col>
-							<el-col :span="12">
-								<sa-info name="驾驶证号" br>{{m.drivingLicenseId}}</sa-info>
-							</el-col>
-						</el-row>
-						
-						<el-row :gutter="50">
-							<el-col :span="12">
-								<sa-info type="img-list" name="驾驶证照片" :value="m.drivingLicenseImg" br></sa-info>
-							</el-col>
-							<el-col :span="12">
-								<sa-info name="车辆行驶证号" br>{{m.vehicleDrivingId}}</sa-info>
-							</el-col>
-						</el-row>
+						<h3>司机信息</h3> 
+						<table>
+							<tr>
+								<th>司机姓名</th>
+								<td>{{m.name}}</td>
+								<th>司机性别</th>
+								<td>
+									<span v-if="m.sex == 1">男</span>
+									<span v-else-if="m.sex == 2">女</span>
+									<span v-else>-</span>
+								</td>
+							</tr>
+							<tr>
+								<th>身份证号</th>
+								<td>{{m.idCard}}</td>
+								<th>出生年月</th>
+								<td>{{m.birthday}}</td>
+							</tr>
+							<tr>
+								<th>联系电话</th>
+								<td>{{m.phone}}</td>
+								<th>联系地址</th>
+								<td>{{m.address}}</td>
+							</tr>
+							<tr>
+								<th>驾照类型</th>
+								<td>{{m.driverTypeName}}</td>
+								<th>驾驶证号</th>
+								<td>{{m.drivingLicenseId}}</td>
+							</tr>
+							<tr>
+								<th>注册时间</th>
+								<td>{{m.registerTime}}</td>
+								<th>更新时间</th>
+								<td>{{m.updateTime}}</td>
+							</tr>
+							<tr>
+								<th>身份证照片</th>
+								<td>
+									<sa-info type="img-list" :value="m.idCardImg"></sa-info>
+								</td>
+								<th>驾驶证照片</th>
+								<td>
+									<sa-info type="img-list" :value="m.drivingLicenseImg"></sa-info>
+								</td>
+							</tr>
+						</table>
 
-						<el-row :gutter="50">
-							<el-col :span="12">
-								<sa-info type="img-list" name="车辆行驶证照片" :value="m.vehicleDrivingImg" br></sa-info>
-							</el-col>
-							<el-col :span="12">
-								<sa-info type="img-list" name="车辆前脸照" :value="m.vehicleImg" br></sa-info>
-							</el-col>
-						</el-row> -->
-						
-						
+						<h3>车辆审核信息</h3>
 						
-						<!-- <sa-info name="注册时间" br>{{m.registerTime}}</sa-info> -->
-						<!-- <sa-info type="enum" name="审核状态" :value="m.auditStatus" :jv="{0: '待审核,1'}" br></sa-info>
-						<sa-info name="审核人" br>{{m.auditBy}}</sa-info>
-						<sa-info name="审核时间" br>{{m.auditTime}}</sa-info>
-						<sa-info name="审核不通过原因" br>{{m.nopassReason}}</sa-info> -->
+						<table>
+							<tr>
+								<th>审核状态</th>
+								<td>
+									<b v-if="m.auditStatus == 0">待审核</b>
+									<b v-if="m.auditStatus == 1">审核通过</b>
+									<b v-if="m.auditStatus == 2">审核不通过</b>
+									<b v-if="m.auditStatus == 3">审核中</b>
+								</td>
+								<th>审核意见</th>
+								<td>{{m.nopassReason || '-'}}</td>
+							</tr>
+							<tr>
+								<th>审核人</th>
+								<td>{{m.auditBy || '-'}}</td>
+								<th>审核时间</th>
+								<td>{{m.auditTime || '-'}}</td>
+							</tr>
+						</table>
 					</el-form>
+					
 				</div>
+				
 			</div>
 			<!-- ------- 底部按钮 ------- -->
 			<div class="s-foot">
@@ -105,12 +139,14 @@
 				data: {
 					id: sa.p('id', 0),	// 获取数据ID
 					m: null,
+					am:null,
 				},
 				methods: {
 				},
 				mounted: function() {
 					sa.ajax('/transport-server/TbDriver/getById?id=' + this.id, function(res) {
 						this.m = res.data;
+						this.am= res.data;
 						if(res.data == null) {
 							sa.alert('未能查找到 id=' + this.id + " 详细数据");
 						}

+ 90 - 32
sa-view/tb-driver/tb-driver-list.html

@@ -23,52 +23,75 @@
 <body>
 	<div class="vue-box" style="display: none;" :style="'display: block;'">
 		<div class="c-panel">
+			<el-tabs v-model="activeTab" type="card" @tab-click="handleTabClick">
+				<el-tab-pane
+						:key="item.nodeId"
+						v-for="(item, index) in orderStepTabs"
+						:label="item.nodeName"
+						:name="item.nodeId"
+				>
+					<span slot="label"><i class="el-icon-postcard"></i> {{item.nodeName}} ( {{item.nodeCount}} )</span>
+				</el-tab-pane>
+			</el-tabs>
+
 			<!-- ------------- 检索参数 ------------- -->
 			<!-- <div class="c-title">检索参数</div> -->
 			<el-form ref="form" :model='p' @submit.native.prevent>
-				<sa-item type="text" name="姓名" v-model="p.name"></sa-item>
-				<sa-item type="text" name="手机号码" v-model="p.phone"></sa-item>
-				<sa-item type="text" name="身份证号" v-model="p.idCard"></sa-item>
+				<sa-item type="text" name="姓名" v-model="p.name" width="50px"></sa-item>
+				<sa-item type="text" name="手机号" v-model="p.phone"></sa-item>
+				<sa-item type="text" name="身份证号" v-model="p.idCard" width="80px"></sa-item>
+				<!--<sa-item name="审核状态" width="90px">
+					<el-select v-model="p.auditStatus">
+						<el-option label="全部" value=""></el-option>
+						<el-option label="待审核" value="0"></el-option>
+						<el-option label="审核中" value="3"></el-option>
+						<el-option label="审核通过" value="1"></el-option>
+						<el-option label="审核不通过" value="2"></el-option>
+					</el-select>
+				</sa-item>-->
 				<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
 				<el-button icon="el-icon-refresh" type="info" @click="sa.f5()">重置</el-button>
 			</el-form>
-			<!-- <div class="fast-btn">
+			 <div class="fast-btn">
 					<el-button v-if="sa.isAuth('tb-driver-add')" size="mini" type="primary" @click="add()">新增</el-button>
-					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
-					<el-button size="mini" type="danger" @click="deleteByIds()">批量删除</el-button>
-					<el-button size="mini" type="primary" @click="importMsg()">导入</el-button>
-					<el-button size="mini" type="success" @click="exportFile()">导出</el-button>
-				</div> -->
+				 <!--<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+                 <el-button size="mini" type="danger" @click="deleteByIds()">批量删除</el-button>-->
+                 <!--<el-button size="mini" type="primary" @click="importMsg()">导入</el-button>
+                 <el-button size="mini" type="success" @click="exportFile()">导出</el-button>-->
+				</div> 
 
 			<!-- ------------- 数据列表 ------------- -->
 			<el-table class="data-table" ref="data-table" :data="dataList">
-				<sa-td type="selection"></sa-td>
-				<sa-td name="姓名" prop="name"></sa-td>
-				<sa-td name="年龄" prop="age" type="num"></sa-td>
+				<sa-td name="序号"  align="center" type="index"  :index="indexMethod"></sa-td>
+				<sa-td name="姓名" prop="name"></sa-td>				
 				<sa-td name="性别" prop="sex" type="enum" :jv="{1: '男', 2: '女'}"></sa-td>
-				<sa-td name="手机号" width="110px" prop="phone"></sa-td>
-				<sa-td name="联系地址" width="150px" prop="address"></sa-td>
+				<sa-td name="出生年月" prop="birthday" width="120px"></sa-td>
 				<sa-td name="身份证号" width="170px" prop="idCard"></sa-td>
-				<sa-td name="状态" prop="isLock"></sa-td>
-				<!-- <sa-td name="身份证照片" prop="idCardImg" type="img-list"></sa-td> -->
-				<sa-td name="驾驶证号" prop="drivingLicenseId"></sa-td>
+				<sa-td name="手机号" width="110px" prop="phone"></sa-td>
+                <!-- <sa-td name="联系地址" width="150px" prop="address"></sa-td>
+
+                <sa-td name="身份证照片" prop="idCardImg" type="img-list"></sa-td>
+                <sa-td name="驾驶证号" prop="drivingLicenseId"></sa-td>-->
+				<sa-td name="驾照类型" prop="driverType"  type="enum" :jv="{6: 'A2', 7: 'B2', 19: 'C1', 20:'C2'}"></sa-td>
 				<sa-td name="驾驶证照片" prop="drivingLicenseImg" type="img-list"></sa-td>
-				<sa-td name="车辆行驶证号" prop="vehicleDrivingId" width="120px"></sa-td>
+				<!-- <sa-td name="车辆行驶证号" prop="vehicleDrivingId" width="120px"></sa-td>
 				<sa-td name="车辆行驶证照片" prop="vehicleDrivingImg" type="img-list"></sa-td>
 				<sa-td name="车辆前脸照" prop="vehicleImg" type="img-list"></sa-td>
-				<sa-td name="注册时间" width="100px" prop="registerTime"></sa-td>
-				<!-- <sa-td name="审核状态" prop="auditStatus" type="enum" :jv="{0: '待审核', 1: '已审核'}"></sa-td> -->
-				<sa-td name="审核状态" prop="auditStatus"></sa-td>
-				<sa-td name="审核时间" width="100px" prop="auditTime"></sa-td>
-				<el-table-column label="操作" fixed="right" width="260px">
+				-->
+				<sa-td name="注册时间" width="150px" prop="registerTime"></sa-td>
+				<sa-td name="审核状态" prop="auditStatus" type="enum" :jv="{0: '待审核', 1: '审核通过', 2: '审核不通过', 3:'审核中'}"></sa-td> 
+				<!--<sa-td name="审核状态" prop="auditStatus"></sa-td>-->
+				<sa-td name="审核时间"  prop="auditTime" width="150px"></sa-td>
+				<el-table-column label="操作" fixed="right" width="200px">
 					<template slot-scope="s">
-						<el-button class="c-btn" type="danger" icon="el-icon-lock" v-if="s.row.isLock" @click="unlock(s.row)">锁定</el-button>
-						<el-button class="c-btn" type="success" icon="el-icon-s-check" v-else @click="check(s.row)">审核</el-button>
-						<el-button v-if="sa.isAuth('tb-driver-edit')" class="c-btn" type="primary" icon="el-icon-edit"
-							@click="update(s.row)">修改</el-button>
+						<!--<el-button class="c-btn" type="danger" icon="el-icon-lock" v-if="s.row.isLock" @click="unlock(s.row)">锁定</el-button>
+						<el-button class="c-btn" type="success" icon="el-icon-s-check" v-else @click="check(s.row)">审核</el-button>-->
 						<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
-						<el-button v-if="sa.isAuth('tb-driver-del')" class="c-btn" type="danger" icon="el-icon-delete"
+						<el-button v-if="sa.isAuth('tb-driver-edit') && s.row.auditStatus!=3" class="c-btn" type="primary" icon="el-icon-edit"
+							@click="update(s.row)">修改</el-button>
+						<el-button v-if="sa.isAuth('tb-driver-del') && (s.row.auditStatus==0 || s.row.auditStatus==2)" class="c-btn" type="danger" icon="el-icon-delete"
 							@click="del(s.row)">删除</el-button>
+						
 					</template>
 				</el-table-column>
 			</el-table>
@@ -91,16 +114,32 @@
 					name: '',		// 姓名
 					phone: '',		// 手机号
 					idCard: '',		// 身份证号
+					auditStatus: '',    // 审核状态
+
 					pageNo: 1,		// 当前页
 					pageSize: 10,	// 页大小
 					sortType: 0		// 排序方式
 				},
 				dataCount: 0,
 				dataList: [], // 数据集合
+
+				orderStepTabs: [],
+				activeTab: 'all',
 			},
 			methods: {
+				handleTabClick(tab, event) {
+					if(tab.name==='all')
+						this.p.auditStatus =null;
+					else
+						this.p.auditStatus = tab.name;
+					this.f5();
+				},
 				// 刷新
 				f5: function () {
+					sa.ajax('/transport-server/TbDriver/statDriverGroupByStatus', sa.removeNull(this.p), function(res) {
+						this.orderStepTabs = res.data; // 数据
+					}.bind(this));
+
 					sa.ajax('/transport-server/TbDriver/getList', sa.removeNull(this.p), function (res) {
 						res.data.forEach(element => {
 							element.idCard = element.idCard.toString().replace(/^(.{4})(?:\w+)(.{4})$/,'$1****$2')
@@ -110,9 +149,17 @@
 						sa.f5TableHeight();		// 刷新表格高度
 					}.bind(this));
 				},
+				indexMethod(index){
+					let pageNo = this.p.pageNo - 1;
+					if((pageNo!==-1 && pageNo!==0)){
+						return (index + 1) + (pageNo  * this.p.pageSize);
+					}else{
+						return (index + 1)
+					}
+				},
 				// 查看
 				get: function (data) {
-					sa.showIframe('数据详情', 'tb-driver-info.html?id=' + data.id, '1050px', '90%');
+					sa.showIframe('司机详情', 'tb-driver-info.html?id=' + data.id, '1050px', '90%');
 				},
 				// 查看 - 根据选中的
 				getBySelect: function (data) {
@@ -122,17 +169,28 @@
 					}
 					this.get(selection[0]);
 				},
+				
 				// 修改
 				update: function (data) {
-					sa.showIframe('修改数据', 'tb-driver-add.html?id=' + data.id, '1000px', '90%');
+					sa.ajax('/transport-server/TbDriver/getById?id=' + data.id, function (res) {
+						this.m = res.data;
+						if(res.data.auditStatus==3){
+							sa.alert('该司机当前审核中,不能修改');
+							this.f5();
+						}else{
+							sa.showIframe('修改司机', 'tb-driver-add.html?id=' + data.id, '1000px', '90%');
+						}
+					}.bind(this))
+					
 				},
 				// 新增
 				add: function (data) {
-					sa.showIframe('新增数据', 'tb-driver-add.html?id=-1', '1000px', '90%');
+					sa.showIframe('添加司机', 'tb-driver-add.html?id=-1', '1000px', '90%');
+					
 				},
 				// 删除
 				del: function (data) {
-					sa.confirm('将要删除 ' + data.name + ' 这个司机信息,是否确认删除', function () {
+					sa.confirm('确认要删除司机 [ ' + data.name + ' ] 吗?', function () {
 						sa.ajax('/transport-server/TbDriver/delete?id=' + data.id, function (res) {
 							sa.arrayDelete(this.dataList, data);
 							sa.ok('删除成功');

+ 185 - 0
sa-view/tb-freight-template/tb-freight-template-add.html

@@ -0,0 +1,185 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/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 .el-input,
+			.c-panel .el-form .el-textarea__inner {
+				width: 250px;
+			}
+			table {
+				font-family: arial, sans-serif;
+				border-collapse: collapse;
+				width: 90%;
+				margin-top: 22px;
+				margin-left: auto;
+				margin-right: auto;
+			}
+			th {
+				border: 1px solid darkgray;
+				text-align: left;
+				height: 22px;
+				padding: 8px;
+				background-color: #dddddd;
+			}
+			td {
+				border: 1px solid darkgray;
+				text-align: left;
+				padding: 8px;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<div class="c-title" v-if="id == 0">数据添加</div>
+					<div class="c-title" v-else>数据修改</div>
+					<el-form v-if="m">
+						<table>
+							<tr>
+								<th><label style="color: red">*</label>车型</th>
+								<td>
+									<el-select v-model="m.vechileTypeId" placeholder="请选择" filterable size="mini" :disabled="this.id>0">
+										<el-option v-for="(item,index) in catList" :key="item.id" :label="item.dictName" :value="item.id"> </el-option>
+									</el-select>
+								</td>
+							</tr>
+							<tr>
+								<th><label style="color: red">*</label>每公里单价</th>
+								<td>
+									<el-input size="mini" v-model="m.unitPrice" placeholder="请输入每公里单价"></el-input>
+								</td>
+							</tr>
+							<tr>
+								<th>备注</th>
+								<td>
+									<el-input size="mini" v-model="m.remark" placeholder="请输入备注"></el-input>
+								</td>
+							</tr>
+						</table>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					catList:[],
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '',		// ID 
+							vechileTypeId: '',		// 字典 ID 
+							vechileTypeName: '',		// 车型名称 
+							unitPrice: '',		// 每公里单价 
+							remark: '',		// 备注 
+						}
+					},
+					getVehicleTypeList() {
+						sa.ajax('/transport-server/TbDictInfo/getList', {
+							code:'vehicle_type',
+							pageSize: 100,
+							pageNo: 1
+						}, function(resp) {
+							let list=resp.data; 								
+							this.catList = list;
+							console.log(list);
+						}.bind(this));
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.vechileTypeId, '请选择 [车型]');
+						sa.checkNull(m.unitPrice, '请输入 [每公里单价]');
+						//sa.checkNull(m.remark, '请输入[备注]');
+
+						if (isNaN(m.unitPrice)){
+							sa.alert('单价必须是数字类型');return ;
+						}
+
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/transport-server/TbFreightTemplate/getByVehicleTypeId?vechileTypeId=' + m.vechileTypeId , function(res) {
+								this.m = res.data;
+								if(res.data != null) {
+									sa.alert('该车型已配置!'); return;
+								}
+
+								sa.ajax('/transport-server/TbFreightTemplate/add', m, function(res){
+									sa.alert('增加成功', this.clean);
+								}.bind(this));
+
+							}.bind(this))
+
+						} else {	// 修改
+							sa.ajax('/transport-server/TbFreightTemplate/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+							parent.app.f5();		// 刷新父页面列表
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页
+						}
+					}
+				},
+				mounted: function(){
+					this.getVehicleTypeList();
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/transport-server/TbFreightTemplate/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							this.m.vechileTypeId = res.data.vechileTypeId+'';
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 91 - 0
sa-view/tb-freight-template/tb-freight-template-info.html

@@ -0,0 +1,91 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/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 .c-label{width: 8em;}
+			table {
+			  font-family: arial, sans-serif;
+			  border-collapse: collapse;
+			  width: 90%;
+			  margin-top: 26px ;
+			  margin-left: auto;
+			  margin-right: auto;
+			}
+			th {
+			  border: 1px solid darkgray;
+			  text-align: left;
+			  height: 26px;
+			  padding: 8px;
+			  background-color: #dddddd;
+			}
+			td {
+			  border: 1px solid darkgray;
+			  text-align: left;
+			  padding: 8px;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<table>
+							<tr>
+								<th>车型名称</th>
+								<td>{{m.vechileTypeName}}</td>
+							</tr>
+							<tr>
+								<th>每公里单价</th>
+								<td>{{m.unitPrice}}</td>
+							</tr>
+							<tr>
+								<th>备注</th>
+								<td>{{m.remark}}</td>
+							</tr>
+						</table>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/transport-server/TbFreightTemplate/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 155 - 0
sa-view/tb-freight-template/tb-freight-template-list.html

@@ -0,0 +1,155 @@
+<!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>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+
+				<el-form ref="form" :model='p' @submit.native.prevent>					
+					<sa-item type="text" name="车型" v-model="p.vechileTypeId" width="40" br>
+						<el-select  v-model="p.vechileTypeId" placeholder="请选择" filterable size="mini">
+							<el-option v-for="(item,index) in catList" :key="item.id" :label="item.dictName" :value="item.id"> </el-option>
+						</el-select>
+						<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+						<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+					</sa-item>
+
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-freight-template-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<!--<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>-->
+					
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+
+					<sa-td name="车型" prop="vechileTypeName" ></sa-td>
+					<sa-td name="每公里单价" prop="unitPrice" ></sa-td>					
+					<sa-td name="备注" prop="remark" ></sa-td>
+					<sa-td name="更新人" prop="updateBy" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime" ></sa-td>
+					<el-table-column label="操作" fixed="right"  width="180px">
+						<template slot-scope="s">
+							<!--<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>-->
+							<el-button v-if="sa.isAuth('tb-freight-template-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-freight-template-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						id: '',		// ID 
+						vechileTypeId: '',		// 字典 ID 
+						vechileTypeName: '',		// 车型名称 
+						unitPrice: '',		// 每公里单价 
+						remark: '',		// 备注 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+					catList:[],
+				},
+				methods: {
+					// 车型列表
+					getCatList() {
+						sa.ajax('/transport-server/TbDictInfo/getList', {
+							code:'vehicle_type',
+							pageSize: 100,
+							pageNo: 1
+						}, function(resp) {
+							let list=resp.data; 							
+							this.catList = list;
+						}.bind(this));
+					},
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbFreightTemplate/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('运费模板详情', 'tb-freight-template-info.html?id=' + data.id, '500px', '400px');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改运费模板', 'tb-freight-template-add.html?id=' + data.id, '500px', '400px');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('添加运费模板', 'tb-freight-template-add.html?id=-1', '500px', '400px');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('此操作不可撤销,确定要删除该模板吗?', function() {
+							sa.ajax('/transport-server/TbFreightTemplate/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('此操作不可撤销,是否批量删除选中数据?', function() {
+							sa.ajax('/transport-server/TbFreightTemplate/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.getCatList();
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 96 - 0
sa-view/tb-transport-demand/tb-transport-demand-apply.html

@@ -0,0 +1,96 @@
+<!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>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="司机" v-model="p.driverName" width="80px"></sa-item>
+					<sa-item type="text" name="车牌" v-model="p.plateNo" width="80px"></sa-item>					
+					<sa-item type="enum" name="状态" v-model="p.status" width="80px">
+						<el-select v-model="p.status">
+							<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-option label="司机已取消" value="3"></el-option>
+						</el-select> 						
+					</sa-item>					
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+			
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+					<sa-td name="申请时间" prop="applyTime" ></sa-td>
+					<sa-td name="申请人(司机)" prop="driverName" ></sa-td>
+					<sa-td name="车辆" prop="plateNo" ></sa-td>
+					
+					<sa-td name="确认状态" prop="status" type="enum" :jv="{0: '待货主确认', 1: '货主已确认', 2: '货主已拒绝', 3: '司机已取消'}"></sa-td>
+				    <sa-td name="订单号" prop="orderId" ></sa-td>					
+					<sa-td name="确认时间" prop="dealTime" ></sa-td>
+					
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						demandId: sa.p('demandId', 0),		// 货运需求单唯一标识,自增主键 
+						driverName: '',		// 司机
+						plateNo: '',		// 车牌
+						status: '',		// 申请单状态 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbTransportDemandApply/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('货运需求单详情', 'tb-transport-demand-info.html?demandId=' + data.demandId, '1050px', '90%');
+					}
+					
+					
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 164 - 0
sa-view/tb-transport-demand/tb-transport-demand-info.html

@@ -0,0 +1,164 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/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 .c-label{width: 8em;}
+			.c-item .image-box-2{height: 90px;}
+			table {
+			  font-family: arial, sans-serif;
+			  border-collapse: collapse;
+			  width: 100%;
+			  margin-top: 22px ;
+			  margin-left: auto;
+			  margin-right: auto;
+			}
+			th {
+			  border: 1px solid darkgray;
+			  text-align: left;
+			  width: 15%;
+			  height: 22px;
+			  padding: 8px;
+			  background-color: #dddddd;
+			}
+			td {
+			  border: 1px solid darkgray;
+			  text-align: left;
+			  padding: 8px;
+			    width: 35%;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<table>
+							<tr>
+								<th>需求单号</th>
+								<td>{{m.demandId}}</td>
+								<th>下单时间</th>
+								<td>{{m.createdAt}}</td>
+							</tr>
+							<tr>
+								<th>货主名称</th>
+								<td>{{m.shipperName}}</td>
+								<th>货主用户</th>
+								<td>{{m.appUser.name}} - {{m.appUser.phone}}</td>
+							</tr>
+							<tr>
+								<th>商品名称</th>
+								<td>{{m.itemName}}</td>
+								<th>包装方式</th>
+								<td>{{m.packingMethodName}}</td>
+							</tr>
+							<tr>
+								<th>商品数量</th>
+								<td>{{m.quantity}} 件</td>
+								<th>商品重量</th>
+								<td>{{m.weight}} 千克</td>
+							</tr>
+							<tr>
+								<th>起运地</th>
+								<td>{{m.originAddress}}</td>
+								<th>起运地联系人</th>
+								<td>{{m.originLinkman}} - {{m.originContact}}</td>
+							</tr>
+							<tr>
+								<th>目的地</th>
+								<td>{{m.destAddress}}</td>
+								<th>目的地联系人</th>
+								<td>{{m.destLinkman}} - {{m.destContact}}</td>
+							</tr>
+							<tr>
+								<th>商品容积</th>
+								<td>{{m.volume}} 方</td>
+								<th>需求车辆类型</th>
+								<td>{{m.vehicleTypeName}}</td>
+							</tr>
+							<tr>
+								<th>需求车辆轴数</th>
+								<td>{{m.axleNumber}} 轴</td>
+								<th>需求车辆载重</th>
+								<td>{{m.loadCapacity}} 吨</td>
+							</tr>
+							<tr>
+								<th>装货时间</th>
+								<td>{{m.loadingTime}}</td>
+								<th>发车时间</th>
+								<td>{{m.departureTime}}</td>
+							</tr>
+							<tr>
+								<th>运达时间</th>
+								<td>{{m.arrivalTime}}</td>
+								<th>运费数额</th>
+								<td>{{m.freightAmount}} 元</td>
+							</tr>
+							<tr>
+								<th>服务费</th>
+								<td>{{m.serviceFee}} 元</td>
+								<th>订单金额</th>
+								<td>{{m.amount}} 元</td>
+							</tr>
+							<tr>
+								<th>当前状态</th>
+								<td>
+									<b v-if="m.status == 0">未发布</b>
+									<b v-if="m.status == 1">已发布待接单</b>
+									<b v-if="m.status == 2">已抢单,待确认</b>
+									<b v-if="m.status == 3">已接单,待支付</b>
+									<b v-if="m.status == 4">已完成</b>
+									<b v-if="m.status == 7">已取消</b>
+								</td>
+								<th>更新时间</th>
+								<td>{{m.updatedAt}}</td>
+							</tr>
+						</table>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('demandId', 0),	// 获取数据ID
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/transport-server/TbTransportDemand/getById?demandId=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 233 - 0
sa-view/tb-transport-demand/tb-transport-demand-list.html

@@ -0,0 +1,233 @@
+<!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>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<el-tabs v-model="activeTab" type="card" @tab-click="handleTabClick">
+					<el-tab-pane
+							:key="item.nodeId"
+							v-for="(item, index) in orderStepTabs"
+							:label="item.nodeName"
+							:name="item.nodeId"
+					>
+						<span slot="label"><i class="el-icon-postcard"></i> {{item.nodeName}} ( {{item.nodeCount}} )</span>
+					</el-tab-pane>
+				</el-tabs>
+
+				<!-- ------------- 检索参数 ------------- -->
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="需求单号" v-model="p.demandId" width="80px"></sa-item>
+					<sa-item type="text" name="货主" v-model="p.shipperName"></sa-item>
+					<sa-item type="text" name="商品名称" v-model="p.itemName" width="80px"></sa-item>
+
+					<!--<sa-item type="text" name="目的地" v-model="p.destinationAddress"></sa-item>
+					<sa-item type="text" name="目的地联系人" v-model="p.destinationContact" width="100px"></sa-item>
+					<sa-item type="text" name="车辆类型" v-model="p.vehicleType" width="100px">
+						<el-select v-model="p.vehicleType">
+							<el-option label="集装箱货车" value="1"></el-option>
+							<el-option label="冷藏货车" value="2"></el-option>
+							<el-option label="拖挂货车" value="3"></el-option>
+							<el-option label="多轴货车" value="4"></el-option>
+						</el-select>
+					</sa-item> -->
+					<!--<sa-item type="enum" name="状态" v-model="p.status" >
+						<el-select v-model="p.status">
+							<el-option label="未发布" value="0"></el-option>
+							<el-option label="已发布待接单" value="1"></el-option>
+							<el-option label="已抢单,待确认" value="2"></el-option>
+							<el-option label="锁单中待支付" value="3"></el-option>
+							<el-option label="已完成" value="4"></el-option>
+							<el-option label="已取消" value="7"></el-option>
+						</el-select> 						
+					</sa-item>-->
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+				<!--<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-freight-demand-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+				</div>-->
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+					<!--<sa-td type="selection"></sa-td>-->
+					<sa-td name="需求单号" prop="demandId" width="150px"></sa-td>
+					<sa-td name="货主" prop="shipperName" width="200px"></sa-td>
+					<sa-td name="商品名称" prop="itemName" width="260px" align="left"></sa-td>
+					<!--<sa-td name="包装方式" prop="packingMethod" ></sa-td>
+					<sa-td name="商品数量" prop="quantity" ></sa-td>
+					<sa-td name="商品重量" prop="weight" ></sa-td>
+					<sa-td name="商品容积" prop="volume" ></sa-td>-->
+					<sa-td name="起运地" prop="originAddress" align="left" width="320px"></sa-td>
+					<sa-td name="目的地" prop="destAddress" align="left" width="320px"> </sa-td>
+					<!--<sa-td name="起运地联系人" prop="originContact" width="140px" ></sa-td>
+					<sa-td name="目的地联系人" prop="destinationContact" width="140px"></sa-td>
+					<sa-td name="车辆类型" prop="vehicleType" ></sa-td>
+					<sa-td name="车辆轴数" prop="axleNumber" ></sa-td>
+					<sa-td name="载重上限" prop="loadCapacity" ></sa-td>-->
+					<sa-td name="要求装货时间" prop="loadingTime" type="datetime" width="150px"></sa-td>
+					<!--<sa-td name="要求发车时间" prop="departureTime" type="date" width="140px"></sa-td>-->
+					<sa-td name="要求运达时间" prop="arrivalTime" type="datetime" width="150px"></sa-td>
+					<sa-td name="运费(元)" prop="freightAmount"  width="160px"></sa-td>
+					<sa-td name="状态" prop="status" type="enum" :jv="{0: '暂存', 1: '待接单', 2: '待确认', 3: '待支付', 4:'已完成', 7:'已取消', 9:'已删除'}"  width="120px"></sa-td>
+					<sa-td name="创建时间" prop="createdAt" type="datetime" width="150px"></sa-td>
+					<!--<sa-td name="更新时间" prop="updatedAt" ></sa-td>-->
+					<el-table-column label="操作" fixed="right"  width="180px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">详情</el-button>
+							<el-button class="c-btn" type="primary" icon="el-icon-view" @click="viewApply(s.row)">申请单</el-button>
+							<el-button class="c-btn" type="primary" icon="el-icon-view" @click="viewProcess(s.row)">处理过程</el-button>
+							<el-button v-if="sa.isAuth('tb-transport-demand-cancel') && s.row.status<4" class="c-btn" type="danger" icon="el-icon-delete" @click="cancel(s.row)">取消</el-button>
+							<el-button v-if="sa.isAuth('tb-transport-demand-del')  && s.row.status==7" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						demandId: '',		// 货运需求单唯一标识,自增主键 
+						shipperId: '',		// 货主 ID,关联货主表
+						shipperName: '',		// 货主
+						itemName: '',		// 商品名称 
+						packingMethod: '',		// 商品包装方式 
+						destinationAddress: '',		// 货物目标地址 
+						originContact: '',		// 起运地联系人 
+						destinationContact: '',		// 目的地联系人 
+						vehicleType: '',		// 所需车辆类型 
+						status: '',		// 货运需求单状态 
+						deleteStatus: '1',
+						createdAt: '',		// 货运需求单创建时间 
+						updatedAt: '',		// 货运需求单更新时间 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					orderStepTabs: [],
+					activeTab: 'all',
+
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					handleTabClick(tab, event) {
+						if(tab.name==='all')
+							this.p.status =null;
+						else
+							this.p.status = tab.name;
+
+						this.f5();
+					},
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbTransportDemand/statOrderGroupByStatus', sa.removeNull(this.p), function(res) {
+							this.orderStepTabs = res.data; // 数据
+						}.bind(this));
+
+						sa.ajax('/transport-server/TbTransportDemand/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('货运需求单详情', 'tb-transport-demand-info.html?demandId=' + data.demandId, '1200px', '90%');
+					},
+					viewProcess: function(data){
+						sa.showIframe('需求单处理过程', 'tb-transport-demand-process.html?demandId=' + data.demandId, '500px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					viewApply: function(data){
+						sa.showIframe('货运申请单', 'tb-transport-demand-apply.html?demandId=' + data.demandId, '1050px', '70%');
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-freight-demand-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-freight-demand-add.html?id=-1', '1000px', '90%');
+					},
+					// 取消
+					cancel: function(data) {
+						sa.confirm('确定要取消货运需求单['+ data.demandId +']吗?', function() {
+							sa.ajax('/transport-server/TbTransportDemand/cancel?demandId=' + data.demandId, function(res) {
+								if(res.code==200){
+									sa.ok('取消成功');
+									this.f5();
+								}else{
+									sa.error(res.msg);
+								}
+							}.bind(this))
+						}.bind(this));
+					}, 
+					// 删除
+					del: function(data) {
+						sa.confirm('确定要删除货运需求单['+ data.demandId +']吗?', function() {
+							sa.ajax('/transport-server/TbTransportDemand/delete?demandId=' + data.demandId, function(res) {
+								if(res.code==200) {
+									sa.arrayDelete(this.dataList, data);
+									sa.ok('删除成功');
+									sa.f5TableHeight();		// 刷新表格高度
+								}else{
+									sa.error(res.msg);
+								}
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbTransportDemand/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 86 - 0
sa-view/tb-transport-demand/tb-transport-demand-process.html

@@ -0,0 +1,86 @@
+<!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>
+	<style type="text/css">
+		.c-panel .c-label{width: 8em;}
+		.info-row {
+			display: flex;
+			justify-content: space-between;
+			margin-bottom: 1em;
+		}
+		.info-row .c-label {
+			width: 30%;
+		}
+		.info-row .c-value {
+			width: 70%;
+		}
+	</style>
+</head>
+<body>
+<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+	<!-- ------- 内容部分 ------- -->
+	<div class="s-body">
+		<div class="c-panel">
+			<div>
+				<i class="el-icon-share">&nbsp;&nbsp;处理进程</i><br>
+				<div class="block">
+					<el-timeline>
+						<el-timeline-item
+								v-for="(activity, logId) in activities"
+								:key="logId"
+								type='primary'
+								color='#0bbd87'
+								:timestamp="activity.operationTime"   placement="top">
+							<h4>[ {{activity.operationType}} ]&nbsp;&nbsp;{{activity.remark}}</h4>
+							<h4>by {{activity.operatorName}} </h4>
+						</el-timeline-item>
+					</el-timeline>
+				</div>
+			</div>
+		</div>
+	</div>
+	<!-- ------- 底部按钮 ------- -->
+	<div class="s-foot">
+		<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+		<el-button @click="sa.closeCurrIframe()">取消</el-button>
+	</div>
+</div>
+<script>
+	var app = new Vue({
+		components: {
+			"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+		},
+		el: '.vue-box',
+		data: {
+			demandId: sa.p('demandId', 0),  // 获取数据ID
+			m: null,
+			//处理进程
+			activities:[],
+		},
+		methods: {
+		},
+		mounted: function() {
+			const p = {demandId:this.demandId};
+			sa.ajax('/transport-server/TbTransportDemand/getProcess' , p, function(res) {
+				this.activities = res.data;
+				if(res.data == null) {
+					sa.alert('未能查找到 orderId=' + this.orderId + " 详细数据");
+				}
+			}.bind(this))
+		}
+	})
+</script>
+</body>
+</html>

+ 131 - 0
sa-view/tb-transport-fundflow-bill/tb-transport-fundflow-bill-add.html

@@ -0,0 +1,131 @@
+<!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>
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <div class="c-title" v-if="id == 0">数据添加</div>
+					<div class="c-title" v-else>数据修改</div>
+					<el-form v-if="m">
+						<sa-item type="text" name="账单ID" v-model="m.billId" br></sa-item>
+						<sa-item type="text" name="账单日期" v-model="m.billDate" br></sa-item>
+						<sa-item type="text" name="平台收入笔数" v-model="m.inCountPlatform" br></sa-item>
+						<sa-item type="text" name="平台收入金额" v-model="m.inAmountPlatform" br></sa-item>
+						<sa-item type="text" name="平台支出笔数" v-model="m.outCountPlatform" br></sa-item>
+						<sa-item type="text" name="平台支出金额" v-model="m.outAmountPlatform" br></sa-item>
+						<sa-item type="text" name="微信收入笔数" v-model="m.inCountWechat" br></sa-item>
+						<sa-item type="text" name="微信收入金额" v-model="m.inAmountWechat" br></sa-item>
+						<sa-item type="text" name="微信支出笔数" v-model="m.outCountWechat" br></sa-item>
+						<sa-item type="text" name="微信支出金额" v-model="m.outAmountWechat" br></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							billId: '',		// 账单ID 
+							billDate: '',		// 账单日期 
+							inCountPlatform: '',		// 平台收入笔数 
+							inAmountPlatform: '',		// 平台收入金额 
+							outCountPlatform: '',		// 平台支出笔数 
+							outAmountPlatform: '',		// 平台支出金额 
+							inCountWechat: '',		// 微信收入笔数 
+							inAmountWechat: '',		// 微信收入金额 
+							outCountWechat: '',		// 微信支出笔数 
+							outAmountWechat: '',		// 微信支出金额 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.billId, '请输入 [账单ID]');
+						sa.checkNull(m.billDate, '请输入 [账单日期]');
+						sa.checkNull(m.inCountPlatform, '请输入 [平台收入笔数]');
+						sa.checkNull(m.inAmountPlatform, '请输入 [平台收入金额]');
+						sa.checkNull(m.outCountPlatform, '请输入 [平台支出笔数]');
+						sa.checkNull(m.outAmountPlatform, '请输入 [平台支出金额]');
+						sa.checkNull(m.inCountWechat, '请输入 [微信收入笔数]');
+						sa.checkNull(m.inAmountWechat, '请输入 [微信收入金额]');
+						sa.checkNull(m.outCountWechat, '请输入 [微信支出笔数]');
+						sa.checkNull(m.outAmountWechat, '请输入 [微信支出金额]');
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/TbTransportFundflowBill/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/TbTransportFundflowBill/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/TbTransportFundflowBill/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 134 - 0
sa-view/tb-transport-fundflow-bill/tb-transport-fundflow-bill-info.html

@@ -0,0 +1,134 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+	<link rel="stylesheet" href="../../static/sa.css">
+	<script src="../../static/kj/vue.min.js"></script>
+	<script src="../../static/kj/element-ui/index.js"></script>
+	<script src="../../static/kj/httpVueLoader.js"></script>
+	<script src="../../static/kj/jquery.min.js"></script>
+	<script src="../../static/kj/layer/layer.js"></script>
+	<script src="../../static/sa.js"></script>
+	<style type="text/css">
+		/* 使长度更长点 */
+		/* .c-panel .c-label{width: 10em;} */
+		.vue-box,.c-panel{background-color: #EEE;}
+		.c-panel .c-title{margin-bottom: 20px;}
+		.c-item .c-label{width: 150px;}
+		.c-item .el-input{width: 300px;}
+		/* 链接样式  */
+		.my-link{position: relative; top: -1px; margin-left: 0.5em;}
+		table {
+			font-family: arial, sans-serif;
+			border-collapse: collapse;
+			width: 90%;
+			margin-top: 26px ;
+			margin-left: auto;
+			margin-right: auto;
+		}
+		th {
+			border: 1px solid darkgray;
+			text-align: left;
+			height: 30px;
+			padding: 8px;
+			background-color: #dddddd;
+		}
+		td {
+			border: 1px solid darkgray;
+			text-align: left;
+			padding: 8px;
+		}
+	</style>
+</head>
+<body>
+<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+	<!-- ------- 内容部分 ------- -->
+	<div class="s-body">
+		<div class="c-panel">
+			<el-form v-if="m">
+				<div style="height: 10px;"></div>
+				<table>
+					<tr><th colspan="4" style="text-align:center" >资金对账 [ {{m.billDate}} ]</th></tr>
+					<tr>
+						<th style="text-align:center" >项目</th>
+						<th style="text-align:center" >货运平台</th>
+						<th style="text-align:center" >微信平台</th>
+						<th style="text-align:center" >对账结果</th>
+					</tr>
+
+					<tr>
+						<td style="text-align:center" >收入笔数</td>
+						<td style="text-align:center" >{{m.inCountPlatform}}</td>
+						<td style="text-align:center" >{{m.inCountWechat}}</td>
+						<td style="text-align:center" v-if="m.inCountPlatform==m.inCountWechat">一致</td>
+						<td style="text-align:center" v-else >异常</td>
+					</tr>
+					<tr>
+						<td style="text-align:center" >收入金额</td>
+						<td style="text-align:center" >{{m.inAmountPlatform}}</td>
+						<td style="text-align:center" >{{m.inAmountWechat}}</td>
+						<td style="text-align:center" v-if="m.inAmountPlatform==m.inAmountWechat">一致</td>
+						<td style="text-align:center;text-color:red" v-else >异常</td>
+					</tr>
+					<tr>
+						<td style="text-align:center" >支出笔数</td>
+						<td style="text-align:center" >{{m.outCountPlatform}}</td>
+						<td style="text-align:center" >{{m.outCountWechat}}</td>
+						<td style="text-align:center" v-if="m.outCountPlatform==m.outCountWechat">一致</td>
+						<td style="text-align:center;text-color:red" v-else >异常</td>
+					</tr>
+					<tr>
+						<td style="text-align:center" >支出金额</td>
+						<td style="text-align:center" >{{m.outAmountPlatform}}</td>
+						<td style="text-align:center" >{{m.outAmountWechat}}</td>
+						<td style="text-align:center" v-if="m.outAmountPlatform==m.outAmountWechat">一致</td>
+						<td style="text-align:center;text-color:red" v-else >异常</td>
+					</tr>
+
+				</table>
+
+			</el-form>
+		</div>
+	</div>
+	<!-- ------- 底部按钮 ------- -->
+	<div class="s-foot">
+		<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+		<el-button @click="sa.closeCurrIframe()">取消</el-button>
+	</div>
+
+</div>
+
+<script type="text/javascript">
+	var app = new Vue({
+		components: {
+			"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+		},
+		el: '.vue-box',
+		data: {
+			id: parseInt(sa.p('id', 0)),
+			sa: sa,
+			m: null
+		},
+		methods: {
+			// ok
+			ok: function(pageNo) {
+				sa.closeCurrIframe();
+			},
+		},
+		created: function() {
+			sa.ajax('/transport-server/TbTransportFundflowBill/getById?id=' + this.id, function(res) {
+				this.m = res.data;
+				if(res.data == null) {
+					sa.alert('未能查找到 id=' + this.id + " 详细数据");
+				}
+			}.bind(this))
+		}
+	})
+
+</script>
+</body>
+</html>

+ 152 - 0
sa-view/tb-transport-fundflow-bill/tb-transport-fundflow-bill-list.html

@@ -0,0 +1,152 @@
+<!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>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 -------------
+				<div class="c-title">检索参数</div> -->
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="账单日期" v-model="p.billDate"  width="120px"></sa-item>
+					<sa-item type="text" name="对账结果" v-model="p.status" width="120px">
+						<el-select v-model="p.result">
+							<el-option label="全部" value=""></el-option>
+							<el-option label="对账一致" value="0"></el-option>
+							<el-option label="对账异常" value="1"></el-option>
+						</el-select>
+					</sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+					<sa-td name="账单日期" prop="billDate" ></sa-td>
+
+					<el-table-column label="货运平台" align="center"  >
+						<sa-td name="收入笔数" prop="inCountPlatform" ></sa-td>
+						<sa-td name="收入金额" prop="inAmountPlatform" ></sa-td>
+						<sa-td name="支出笔数" prop="outCountPlatform" ></sa-td>
+						<sa-td name="支出金额" prop="outAmountPlatform" ></sa-td>
+					</el-table-column>
+					<el-table-column label="微信平台" align="center"  >
+						<sa-td name="收入笔数" prop="inCountWechat" ></sa-td>
+						<sa-td name="收入金额" prop="inAmountWechat" ></sa-td>
+						<sa-td name="支出笔数" prop="outCountWechat" ></sa-td>
+						<sa-td name="支出金额" prop="outAmountWechat" ></sa-td>
+					</el-table-column>
+					<sa-td name="对账结果" prop="result" type="enum" :jv="{0: '一致', 1: '不一致'}" ></sa-td>
+					<el-table-column label="操作" fixed="right"  width="80px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						billId: '',		// 账单ID 
+						billDate: '',		// 账单日期 
+						inCountPlatform: '',		// 平台收入笔数 
+						inAmountPlatform: '',		// 平台收入金额 
+						outCountPlatform: '',		// 平台支出笔数 
+						outAmountPlatform: '',		// 平台支出金额 
+						inCountWechat: '',		// 微信收入笔数 
+						inAmountWechat: '',		// 微信收入金额 
+						outCountWechat: '',		// 微信支出笔数 
+						outAmountWechat: '',		// 微信支出金额 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbTransportFundflowBill/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('资金对账详情', 'tb-transport-fundflow-bill-info.html?id=' + data.billId, '800px', '500px');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-transport-fundflow-bill-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-transport-fundflow-bill-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/TbTransportFundflowBill/delete?id=' + data.billId, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/TbTransportFundflowBill/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 233 - 0
sa-view/tb-transport-order/tb-transport-order-info.html

@@ -0,0 +1,233 @@
+<!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="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
+	<link rel="stylesheet" href="../../static/sa.css">
+	<script src="../../static/kj/vue.min.js"></script>
+	<script src="https://unpkg.com/element-ui/lib/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="../../sa-frame/com/upload-util.js"></script>
+	<style type="text/css">
+		.c-panel .c-label{width: 8em;}
+		.info-table {
+			width: 100%;
+			border-collapse: collapse;
+			margin-bottom: 20px;
+		}
+		.info-table th, .info-table td {
+			border: 1px solid #ebeef5;
+			padding: 12px 10px;
+			font-size: 14px;
+			line-height: 1.5;
+		}
+		.info-table th {
+			 border: 1px solid darkgray;
+			  text-align: left;
+			  height: 22px;
+			  padding: 8px;
+			  background-color: #dddddd;
+			width: 15%;
+			min-width: 120px;
+		}
+		.info-table td {
+		  border: 1px solid darkgray;
+			  text-align: left;
+			width: 35%;
+		}
+		h3 {
+			margin: 20px 0 15px 0;
+			color: #303133;
+			font-size: 16px;
+			font-weight: bold;
+		}
+		.c-item .image-box{max-width: 700px; padding-left: 0px; display: flex;}
+		.c-item .image-box-2{width: 90px; height: 125px; cursor: pointer; float: left;}
+	</style>
+</head>
+<body>
+<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+	<!-- ------- 内容部分 ------- -->
+	<div class="s-body">
+		<div class="c-panel">
+			<el-form v-if="m">
+
+				<h3>货运需求信息</h3>
+				<table class="info-table">
+					<tr>
+						<th>需求单号</th>
+						<td>{{m.demandId}}</td>
+						<th>货主</th>
+						<td>{{m.shipperName}}</td>
+					</tr>
+					<tr>
+						<th>商品名称</th>
+						<td>{{m.itemName}}</td>
+						<th>包装方式</th>
+						<td>{{m.packingMethodName}}</td>
+					</tr>
+					<tr>
+						<th>商品数量</th>
+						<td>{{m.quantity}}件</td>
+						<th>商品信息</th>
+						<td>重{{m.weight}}kg、容积{{m.volume}}平米</td>
+					</tr>
+					<tr>
+						<th>起运地</th>
+						<td>{{m.originAddress}}</td>
+						<th>起运地联系人</th>
+						<td>{{m.originLinkman}}-{{m.originContact}}</td>
+					</tr>
+					<tr>
+						<th>目的地</th>
+						<td>{{m.destAddress}}</td>
+						<th>目的地联系人</th>
+						<td>{{m.destLinkman}}-{{m.destContact}}</td>
+					</tr>
+					<tr>
+						<th>运输里程</th>
+						<td>{{m.distance}}公里</td>
+						<th>运输单价</th>
+						<td>{{m.unitPrice}}元/公里</td>
+					</tr>
+					<tr>
+						<th>所需车型</th>
+						<td>{{m.vehicleTypeName}}</td>
+						<th>载重上限</th>
+						<td>{{m.loadCapacity}}</td>
+					</tr>
+					<tr>
+						<th>要求运输时限</th>
+						<td>{{m.transportLimit}} 小时</td>
+						<th>要求装货时间</th>
+						<td>{{m.loadingTime}}</td>
+					</tr>
+					<tr>
+						<th>要求发车时间</th>
+						<td>{{m.departureTime}}</td>
+						<th>要求运达时间</th>
+						<td>{{m.arrivalTime}}</td>
+					</tr>
+				</table>
+
+				<h3>货运订单信息</h3>
+				<table class="info-table">
+					<tr>
+						<th>货运单号</th>
+						<td>{{m.orderId}}</td>
+						<th>订单状态</th>
+						<td>
+							<span v-if="m.status === 0">待进场</span>
+							<span v-else-if="m.status === 1">待装货</span>
+							<span v-else-if="m.status === 2">已装货</span>
+							<span v-else-if="m.status === 3">运输中</span>
+							<span v-else-if="m.status === 4">待卸货</span>
+							<span v-else-if="m.status === 5">卸货中</span>
+							<span v-else-if="m.status === 6">已卸货</span>
+							<span v-else-if="m.status === 7">已结算</span>
+							<span v-else-if="m.status === 11">退款中</span>
+							<span v-else-if="m.status === 12">已退款</span>
+						</td>
+					</tr>
+					<tr>
+						<th>接单司机</th>
+						<td>{{m.driverName}}</td>
+						<th>接单车辆</th>
+						<td>{{m.plateNo}}</td>
+					</tr>
+					<tr>
+						<th>本次运费</th>
+						<td>{{m.freightAmount}}</td>
+						<th>本次服务费</th>
+						<td>{{m.serviceFee}}</td>
+					</tr>
+					<tr>
+						<th>应收金额</th>
+						<td>{{m.receivableAmount}}</td>
+						<th>实收金额</th>
+						<td>{{m.receivedAmount}}</td>
+					</tr>
+					<tr>
+						<th>创建时间</th>
+						<td>{{m.createdAt}}</td>
+						<th>装货时间</th>
+						<td>{{m.realLoadingTime}}</td>
+					</tr>
+					<tr>
+						<th>发车时间</th>
+						<td>{{m.realDepartureTime}}</td>
+						<th>运达时间</th>
+						<td>{{m.realArrivalTime}}</td>
+					</tr>
+					<tr>
+						<th>完成时间</th>
+						<td>{{m.finishTime}}</td>
+						<th>结算时间</th>
+						<td>{{m.settleTime}}</td>
+					</tr>
+				</table>
+
+				<h3>照片信息</h3>
+				<table class="info-table">
+					<tr>
+						<th style="width: 15%;">入场照片</th>
+						<td style="width: 35%;">
+							<sa-info type="img-list" :value="m.entrancePhotoList && m.entrancePhotoList.length > 0 ? m.entrancePhotoList.join(',') : null"></sa-info>
+						</td>
+						<th style="width: 15%;">装货照片</th>
+						<td style="width: 35%;">
+							<sa-info type="img-list" :value="m.loadingPhotoList && m.loadingPhotoList.length > 0 ? m.loadingPhotoList.join(',') : null"></sa-info>
+						</td>
+					</tr>
+					<tr>
+						<th>到货照片</th>
+						<td>
+							<sa-info type="img-list" :value="m.arrivalPhotoList && m.arrivalPhotoList.length > 0 ? m.arrivalPhotoList.join(',') : ''"></sa-info>
+						</td>
+						<th>卸货照片</th>
+						<td  >
+							<sa-info type="img-list" :value="m.unloadingPhotoList && m.unloadingPhotoList.length > 0 ? m.unloadingPhotoList.join(',') : ''"></sa-info>
+						</td>
+					</tr>
+				</table>
+
+			</el-form>
+		</div>
+	</div>
+	<!-- ------- 底部按钮 ------- -->
+	<div class="s-foot">
+		<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+		<el-button @click="sa.closeCurrIframe()">取消</el-button>
+	</div>
+</div>
+<script>
+	var app = new Vue({
+		components: {
+			"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+		},
+		el: '.vue-box',
+		data: {
+			orderId: sa.p('orderId', 0),  // 获取数据ID
+			m: null
+		},
+		methods: {
+		},
+		mounted: function() {
+			sa.ajax('/transport-server/TbTransportOrder/getById?orderId=' + this.orderId, function(res) {
+				this.m = res.data;
+				if(res.data == null) {
+					sa.alert('未能查找到 orderId=' + this.orderId + " 详细数据");
+				}
+			}.bind(this))
+		}
+	})
+</script>
+</body>
+</html>
+

+ 199 - 0
sa-view/tb-transport-order/tb-transport-order-list.html

@@ -0,0 +1,199 @@
+<!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>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<el-tabs v-model="activeTab" type="card" @tab-click="handleTabClick">
+					<el-tab-pane
+							:key="item.nodeId"
+							v-for="(item, index) in orderStepTabs"
+							:label="item.nodeName"
+							:name="item.nodeId"
+					>
+						<span slot="label"><i class="el-icon-postcard"></i> {{item.nodeName}} ( {{item.nodeCount}} )</span>
+					</el-tab-pane>
+				</el-tabs>
+
+				<!-- ------------- 检索参数 ------------- -->
+
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="货运单号" v-model="p.orderId" width="80px"></sa-item>
+					<sa-item type="text" name="需求单号" v-model="p.demandId" width="80px"></sa-item>
+					<sa-item type="text" name="货主" v-model="p.shipperName"></sa-item>
+					<sa-item type="text" name="接单司机" v-model="p.driverName" width="80px"></sa-item>
+					<sa-item type="text" name="接单车辆" v-model="p.plateNo" width="80px"></sa-item>
+					<!--<sa-item type="text" name="货运单状态" v-model="p.status" width="120px">
+						<el-select v-model="p.status">
+							<el-option label="待进场" value="0"></el-option>
+							<el-option label="待装货" value="1"></el-option>
+							<el-option label="已装货" value="2"></el-option>
+							<el-option label="运输中" value="3"></el-option>
+							<el-option label="待卸货" value="4"></el-option>
+							<el-option label="卸货中" value="5"></el-option>
+							<el-option label="已卸货" value="6"></el-option>
+							<el-option label="已结算" value="7"></el-option>
+							<el-option label="退款中" value="11"></el-option>
+							<el-option label="已退款" value="12"></el-option>
+						</el-select> 	
+					</sa-item>
+					<sa-item type="text" name="订单时间" v-model="p.createdAt" width="120px"></sa-item>-->
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+				
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+
+					<sa-td name="货运单号" prop="orderId" width="150px"></sa-td>
+					<sa-td name="需求单号" prop="demandId" width="150px"></sa-td>
+					<sa-td name="货主" prop="shipperName" width="180px"></sa-td>
+					<sa-td name="商品名称" prop="itemName" width="180px"></sa-td>
+					<!--<sa-td name="商品数量" prop="quantity" ></sa-td>
+					<sa-td name="商品重量(kg)" prop="weight" width="120px"></sa-td>-->
+					<sa-td name="起运地" prop="originAddress" width="220px"></sa-td>
+					<sa-td name="目的地" prop="destAddress" width="220px"></sa-td>
+					<sa-td name="里程(km)" prop="distance" ></sa-td>
+					<!--<sa-td name="要求发车时间" prop="departureTime"  width="120px" type="datetime"></sa-td>
+					<sa-td name="要求运达时间" prop="arrivalTime"  width="120px" type="datetime"></sa-td>-->
+					<sa-td name="接单司机" prop="driverName" ></sa-td>
+					<sa-td name="接单车辆" prop="plateNo" ></sa-td>
+					<sa-td name="订单状态" prop="status" type="enum" :jv="{0: '待进场', 1: '待装货', 2: '已装货', 3:'运输中', 4:'待卸货', 5:'卸货中', 6:'已卸货', 7:'已结算', 11:'退款中', 12:'已退款'}"></sa-td>
+					<sa-td name="装货时间" prop="realLoadingTime" width="150px" type="datetime"></sa-td>
+					<sa-td name="发车时间" prop="realDepartureTime" width="150px" type="datetime"></sa-td>
+					<sa-td name="运达时间" prop="realArrivalTime" type="datetime" width="150px"></sa-td>
+					<sa-td name="完成时间" prop="finishTime" type="datetime" width="150px"></sa-td>
+					
+					<el-table-column label="操作" fixed="right"  width="200px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看详情</el-button>
+							<el-button class="c-btn" type="primary" icon="el-icon-view" @click="viewProcess(s.row)">处理过程</el-button>
+							<el-button v-if="sa.isAuth('tb-transport-order-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-transport-order-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						orderId: '',		// 货运订单号 
+						demandId: '',		// 需求单号 
+						shipperName: '',	// 货主名称
+						driverName: '',		// 司机姓名 
+						plateNo: '',		// 接单车辆 
+						status: '',		   // 货运订单状态 
+						createdAt: '',		// 货运订单创建时间 
+						refundStatus: '',		// 退款状态,0未退款,1退款申请,2同意退款,3退款关闭 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合
+
+					orderStepTabs: [],
+					activeTab: 'all',
+				},
+				methods: {
+					handleTabClick(tab, event) {
+						if(tab.name==='all')
+							this.p.status =null;
+						else
+							this.p.status = tab.name;
+						this.f5();
+					},
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbTransportOrder/statOrderGroupByStatus', sa.removeNull(this.p), function(res) {
+							this.orderStepTabs = res.data; // 数据
+						}.bind(this));
+
+						sa.ajax('/transport-server/TbTransportOrder/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('货运单详情', 'tb-transport-order-info.html?orderId=' + data.orderId, '1050px', '90%');
+					},
+					viewProcess: function(data){
+						sa.showIframe('货运单处理过程', 'tb-transport-order-process.html?orderId=' + data.orderId, '680px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-transport-order-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-transport-order-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbTransportOrder/delete?id=' + data.orderId, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbTransportOrder/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 100 - 0
sa-view/tb-transport-order/tb-transport-order-process.html

@@ -0,0 +1,100 @@
+<!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>
+	<style type="text/css">
+		.c-panel .c-label{width: 8em;}
+		.info-row {
+			display: flex;
+			justify-content: space-between;
+			margin-bottom: 1em;
+		}
+		.info-row .c-label {
+			width: 30%;
+		}
+		.info-row .c-value {
+			width: 70%;
+		}
+		.image-box {
+			display: flex;
+		}
+	</style>
+</head>
+<body>
+<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+	<!-- ------- 内容部分 ------- -->
+	<div class="s-body">
+		<div class="c-panel">
+			<div>
+				<i class="el-icon-share">&nbsp;&nbsp;处理进程</i><br>
+				<div class="block">
+					<el-timeline>
+						<el-timeline-item
+								v-for="(activity, id) in activities"
+								:key="id"
+								type='primary'
+								color='#0bbd87'
+								:timestamp="activity.createTime"   placement="top">
+							<h4>[ {{activity.stepType}} ]&nbsp;&nbsp;{{activity.remark}}</h4>
+							<h4>by {{activity.operatorName}} </h4>
+							<div class="image-box">
+								<sa-info type="img-list" :value="activity.attFile"></sa-info>
+							</div>
+						</el-timeline-item>
+					</el-timeline>
+				</div>
+			</div>
+		</div>
+	</div>
+	<!-- ------- 底部按钮 ------- -->
+	<div class="s-foot">
+		<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+		<el-button @click="sa.closeCurrIframe()">取消</el-button>
+	</div>
+</div>
+<script>
+	var app = new Vue({
+		components: {
+			"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+		},
+		el: '.vue-box',
+		data: {
+			orderId: sa.p('orderId', 0),  // 获取数据ID
+			m: null,
+			//处理进程
+			activities:[],
+		},
+		methods: {
+		},
+		mounted: function() {
+			const p = {orderId:this.orderId};
+			sa.ajax('/transport-server/TbTransportOrderLog/getList' , p, function(res) {
+				this.activities = res.data;
+				if (this.activities.length > 0) {
+					let newActivities = [];
+					this.activities.forEach(function(item) {
+						let imgList = item.attFile?JSON.parse(item.attFile):[];
+						console.log(imgList);
+						item.attFile = imgList.join(',');
+						newActivities.push(item);
+					});
+					this.activities = newActivities;
+				}
+				
+			}.bind(this));
+		}
+	})
+</script>
+</body>
+</html>

+ 212 - 0
sa-view/tb-transport-order/tb-transport-order-settle-confirm.html

@@ -0,0 +1,212 @@
+<!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>
+	<style type="text/css">
+		.c-panel .c-label{width: 8em;}
+		.info-table {
+			width: 100%;
+			border-collapse: collapse;
+			margin-bottom: 20px;
+		}
+		.info-table th, .info-table td {
+			border: 1px solid #ebeef5;
+			padding: 12px 10px;
+			font-size: 14px;
+			line-height: 1.5;
+		}
+		.info-table th {
+			border: 1px solid darkgray;
+			text-align: left;
+			height: 22px;
+			padding: 8px;
+			background-color: #dddddd;
+			width: 15%;
+			min-width: 120px;
+		}
+		.info-table td {
+			border: 1px solid darkgray;
+			text-align: left;
+			width: 35%;
+		}
+		h3 {
+			margin: 20px 0 15px 0;
+			color: #303133;
+			font-size: 16px;
+			font-weight: bold;
+		}
+		.c-item .image-box{max-width: 700px; padding-left: 0px; display: flex;}
+		.c-item .image-box-2{width: 90px; height: 125px; cursor: pointer; float: left;}
+	</style>
+</head>
+<body>
+<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+	<!-- ------- 内容部分 ------- -->
+	<div class="s-body">
+		<div class="c-panel">
+			<el-form v-if="m">
+				<h3>货运订单信息</h3>
+				<table class="info-table">
+					<tr>
+						<th>货运单号</th>
+						<td>{{m.orderId}}</td>
+						<th>订单状态</th>
+						<td>
+							<span v-if="m.status === 0">待进场</span>
+							<span v-else-if="m.status === 1">待装货</span>
+							<span v-else-if="m.status === 2">已装货</span>
+							<span v-else-if="m.status === 3">运输中</span>
+							<span v-else-if="m.status === 4">待卸货</span>
+							<span v-else-if="m.status === 5">卸货中</span>
+							<span v-else-if="m.status === 6">已卸货</span>
+							<span v-else-if="m.status === 7">已结算</span>
+							<span v-else-if="m.status === 11">退款中</span>
+							<span v-else-if="m.status === 12">已退款</span>
+						</td>
+					</tr>
+					<tr>
+						<th>货主</th>
+						<td>{{m.shipperName}}</td>
+						<th>商品名称</th>
+						<td>{{m.itemName}}</td>
+					</tr>
+					<tr>
+						<th>接单司机</th>
+						<td>{{m.driverName}}</td>
+						<th>接单车辆</th>
+						<td>{{m.plateNo}}</td>
+					</tr>
+					<tr>
+						<th>起运地</th>
+						<td>{{m.originAddress}}</td>
+						<th>目的地</th>
+						<td>{{m.destAddress}}</td>
+					</tr>
+					<tr>
+						<th>运输里程</th>
+						<td>{{m.distance}}公里</td>
+						<th>运输单价</th>
+						<td>{{m.unitPrice}}元/公里</td>
+					</tr>
+					<tr>
+						<th>本次运费</th>
+						<td>{{m.freightAmount}}元</td>
+						<th>本次服务费</th>
+						<td>{{m.serviceFee}}元</td>
+					</tr>
+					<tr>
+						<th>要求运达时间</th>
+						<td>{{m.arrivalTime}}</td>
+						<th>实际运达时间</th>
+						<td>{{m.realArrivalTime}}</td>
+					</tr>
+				</table>
+
+				<h3>照片信息</h3>
+				<table class="info-table">
+					<tr>
+						<th style="width: 15%;">入场照片</th>
+						<td style="width: 35%;">
+							<sa-info type="img-list" :value="m.entrancePhotoList && m.entrancePhotoList.length > 0 ? m.entrancePhotoList.join(',') : null"></sa-info>
+						</td>
+						<th style="width: 15%;">装货照片</th>
+						<td style="width: 35%;">
+							<sa-info type="img-list" :value="m.loadingPhotoList && m.loadingPhotoList.length > 0 ? m.loadingPhotoList.join(',') : null"></sa-info>
+						</td>
+					</tr>
+					<tr>
+						<th>到货照片</th>
+						<td>
+							<sa-info type="img-list" :value="m.arrivalPhotoList && m.arrivalPhotoList.length > 0 ? m.arrivalPhotoList.join(',') : ''"></sa-info>
+						</td>
+						<th>卸货照片</th>
+						<td  >
+							<sa-info type="img-list" :value="m.unloadingPhotoList && m.unloadingPhotoList.length > 0 ? m.unloadingPhotoList.join(',') : ''"></sa-info>
+						</td>
+					</tr>
+				</table>
+
+				<h3>结算确认信息</h3>
+				<table class="info-table">
+					<tr>
+						<th style="width: 15%;">运费结算确认</th>
+						<td colspan="3" style="width: 85%;">
+							<el-radio-group v-model="settleConfirm">
+								<el-radio :label="1">同意结算运费</el-radio>
+								<el-radio :label="2">暂不结算运费</el-radio>
+							</el-radio-group>
+						</td>
+					</tr>
+				</table>
+
+			</el-form>
+		</div>
+	</div>
+	<!-- ------- 底部按钮 ------- -->
+	<div class="s-foot">
+		<el-button type="primary" @click="ok()">确认结算</el-button>
+		<el-button @click="sa.closeCurrIframe()">取消</el-button>
+	</div>
+</div>
+<script>
+	var app = new Vue({
+		components: {
+			"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue'),
+			"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+		},
+		el: '.vue-box',
+		data: {
+			orderId: sa.p('orderId', 0),  // 获取数据ID
+			m: null,
+			finishTime:null,
+			settleConfirm: null,
+		},
+		methods: {
+			// 提交数据
+			ok: function(){
+				// 表单校验
+
+				sa.checkNull(this.settleConfirm, '请确认是否给司机结算运费');
+
+				if( this.settleConfirm==1 ){
+					if(this.finishTime==null)
+						sa.alert('请选择 [订单完成时间]');
+					else{
+						const order = {"orderId":this.orderId};  //,"finishTime":this.finishTime
+						sa.confirm('确定订单已完成并结算'+this.m.freightAmount+'元给司机['+this.m.driverName+']吗?', function () {
+							sa.ajax('/transport-server/TbTransportOrder/confirmSettle', order, function (res) {
+								if(res.code==200)
+									sa.alert("运费结算成功",this.clean);
+								else
+									sa.alert('运费结算失败', this.clean);
+							}.bind(this));
+						}.bind(this));
+					}
+				}
+
+			}
+		},
+		mounted: function() {
+			sa.ajax('/transport-server/TbTransportOrder/getById?orderId=' + this.orderId, function(res) {
+				this.m = res.data;
+				this.finishTime = this.m.realArrivalTime;
+				if(res.data == null) {
+					sa.alert('未能查找到 orderId=' + this.orderId + " 详细数据");
+				}
+			}.bind(this))
+		}
+	})
+</script>
+</body>
+</html>

+ 176 - 0
sa-view/tb-transport-order/tb-transport-order-timeout.html

@@ -0,0 +1,176 @@
+<!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>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="货运单号" v-model="p.orderId" width="80px"></sa-item>
+					<sa-item type="text" name="需求单号" v-model="p.demandId" width="80px"></sa-item>
+					<sa-item type="text" name="货主" v-model="p.shipperName"></sa-item>
+					<sa-item type="text" name="接单司机" v-model="p.driverName" width="80px"></sa-item>
+					<sa-item type="text" name="接单车辆" v-model="p.plateNo" width="80px"></sa-item>
+					<!--<sa-item type="text" name="货运单状态" v-model="p.status" width="120px">
+						<el-select v-model="p.status">
+							<el-option label="待进场" value="0"></el-option>
+							<el-option label="待装货" value="1"></el-option>
+							<el-option label="已装货" value="2"></el-option>
+							<el-option label="运输中" value="3"></el-option>
+							<el-option label="待卸货" value="4"></el-option>
+							<el-option label="卸货中" value="5"></el-option>
+							<el-option label="已卸货" value="6"></el-option>
+							<el-option label="已结算" value="7"></el-option>
+							<el-option label="退款中" value="11"></el-option>
+							<el-option label="已退款" value="12"></el-option>
+						</el-select>
+					</sa-item>
+					<sa-item type="text" name="订单时间" v-model="p.createdAt" width="120px"></sa-item>-->
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+				<!--<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-transport-order-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+				</div>-->
+
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+					<sa-td name="货运单号" prop="orderId" width="150px"></sa-td>
+					<sa-td name="需求单号" prop="demandId" width="150px"></sa-td>
+					<sa-td name="货主" prop="shipperName" width="180px"></sa-td>
+					<sa-td name="商品名称" prop="itemName" width="180px"></sa-td>
+					<!--<sa-td name="商品数量" prop="quantity" ></sa-td>
+					<sa-td name="商品重量(kg)" prop="weight" width="120px"></sa-td>-->
+					<sa-td name="起运地" prop="originAddress" width="220px"></sa-td>
+					<sa-td name="目的地" prop="destAddress" width="220px"></sa-td>
+					<sa-td name="里程(km)" prop="distance" ></sa-td>
+					<!--<sa-td name="要求发车时间" prop="departureTime"  width="120px" type="datetime"></sa-td>
+					<sa-td name="要求运达时间" prop="arrivalTime"  width="120px" type="datetime"></sa-td>-->
+					<sa-td name="接单司机" prop="driverName" ></sa-td>
+					<sa-td name="接单车辆" prop="plateNo" ></sa-td>
+					<sa-td name="订单状态" prop="status" type="enum" :jv="{0: '待进场', 1: '待装货', 2: '已装货', 3:'运输中', 4:'待卸货', 5:'卸货中', 6:'已卸货', 7:'已结算', 11:'退款中', 12:'已退款'}"></sa-td>
+					<sa-td name="装货时间" prop="realLoadingTime" width="150px" type="datetime"></sa-td>
+					<sa-td name="发车时间" prop="realDepartureTime" width="150px" type="datetime"></sa-td>
+					<sa-td name="运达时间" prop="realArrivalTime" type="datetime" width="150px"></sa-td>
+					<sa-td name="完成时间" prop="finishTime" type="datetime" width="150px"></sa-td>
+					
+					<el-table-column label="操作" fixed="right"  width="210px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看详情</el-button>
+							<el-button class="c-btn" type="primary" icon="el-icon-view" @click="viewProcess(s.row)">查看处理过程</el-button>
+
+							<el-button v-if="sa.isAuth('tb-transport-order-settle-confirm')" class="c-btn" type="danger" icon="el-icon-edit" @click="handleSettleConfirm(s.row)">超时结算处理</el-button>
+
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						orderId: '',		// 货运订单号 
+						demandId: '',		// 需求单号 
+						shipperName: '',	// 货主名称
+						driverName: '',		// 司机姓名 
+						plateNo: '',		// 接单车辆 
+						status: '',		   // 货运订单状态 
+						createdAt: '',		// 货运订单创建时间 
+						refundStatus: '',		// 退款状态,0未退款,1退款申请,2同意退款,3退款关闭 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbTransportOrder/getConfirmTimeoutList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('货运单详情', 'tb-transport-order-info.html?orderId=' + data.orderId, '1050px', '90%');
+					},
+					viewProcess: function(data){
+						sa.showIframe('货运单处理过程', 'tb-transport-order-process.html?orderId=' + data.orderId, '500px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 超时结算确认
+					handleSettleConfirm: function(data) {
+						sa.showIframe('超时结算确认', 'tb-transport-order-settle-confirm.html?orderId=' + data.orderId, '1050px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-transport-order-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbTransportOrder/delete?id=' + data.orderId, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbTransportOrder/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 146 - 0
sa-view/tb-transport-refund/tb-transport-refund-add.html

@@ -0,0 +1,146 @@
+<!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>
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <div class="c-title" v-if="id == 0">数据添加</div>
+					<div class="c-title" v-else>数据修改</div>
+					<el-form v-if="m">
+						<sa-item type="text" name="ID" v-model="m.refundId" br></sa-item>
+						<sa-item type="text" name="货运订单号" v-model="m.orderId" br></sa-item>
+						<sa-item type="text" name="司机" v-model="m.driverId" br></sa-item>
+						<sa-item type="text" name="司机名称" v-model="m.driverName" br></sa-item>
+						<sa-item type="text" name="货主ID" v-model="m.shipperId" br></sa-item>
+						<sa-item type="text" name="货主名称" v-model="m.shipperName" br></sa-item>
+						<sa-item type="text" name="商品名称" v-model="m.itemName" br></sa-item>
+						<sa-item type="text" name="申请理由" v-model="m.reason" br></sa-item>
+						<sa-item type="text" name="申请说明" v-model="m.reasonMemo" br></sa-item>
+						<sa-item type="text" name="申请时间" v-model="m.applyTime" br></sa-item>
+						<sa-item type="text" name="司机同意,0,未处理,1同意,2拒绝" v-model="m.driverAgree" br></sa-item>
+						<sa-item type="text" name="货主同意,0,未处理,1同意,2拒绝" v-model="m.shipperAgree" br></sa-item>
+						<sa-item type="text" name="处理状态:0未处理,1已同意,2拒绝" v-model="m.dealStatus" br></sa-item>
+						<sa-item type="text" name="退款处理时间" v-model="m.dealTime" br></sa-item>
+						<sa-item type="text" name="处理备注" v-model="m.dealMemo" br></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							refundId: '',		// ID 
+							orderId: '',		// 货运订单号 
+							driverId: '',		// 司机 
+							driverName: '',		// 司机名称 
+							shipperId: '',		// 货主 ID 
+							shipperName: '',		// 货主名称 
+							itemName: '',		// 商品名称 
+							reason: '',		// 申请理由 
+							reasonMemo: '',		// 申请说明 
+							applyTime: '',		// 申请时间 
+							driverAgree: '',		// 司机同意,0,未处理,1同意,2拒绝 
+							shipperAgree: '',		// 货主同意,0,未处理,1同意,2拒绝 
+							dealStatus: '',		// 处理状态:0未处理,1已同意,2拒绝 
+							dealTime: '',		// 退款处理时间 
+							dealMemo: '',		// 处理备注 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.refundId, '请输入 [ID]');
+						sa.checkNull(m.orderId, '请输入 [货运订单号]');
+						sa.checkNull(m.driverId, '请输入 [司机]');
+						sa.checkNull(m.driverName, '请输入 [司机名称]');
+						sa.checkNull(m.shipperId, '请输入 [货主ID]');
+						sa.checkNull(m.shipperName, '请输入 [货主名称]');
+						sa.checkNull(m.itemName, '请输入 [商品名称]');
+						sa.checkNull(m.reason, '请输入 [申请理由]');
+						sa.checkNull(m.reasonMemo, '请输入 [申请说明]');
+						sa.checkNull(m.applyTime, '请输入 [申请时间]');
+						sa.checkNull(m.driverAgree, '请输入 [司机同意,0,未处理,1同意,2拒绝]');
+						sa.checkNull(m.shipperAgree, '请输入 [货主同意,0,未处理,1同意,2拒绝]');
+						sa.checkNull(m.dealStatus, '请输入 [处理状态:0未处理,1已同意,2拒绝]');
+						sa.checkNull(m.dealTime, '请输入 [退款处理时间]');
+						sa.checkNull(m.dealMemo, '请输入 [处理备注]');
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/TbTransportRefund/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/TbTransportRefund/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/TbTransportRefund/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 231 - 0
sa-view/tb-transport-refund/tb-transport-refund-deal.html

@@ -0,0 +1,231 @@
+<!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>
+	<style type="text/css">
+			.c-panel .c-label {
+				width: 8em;
+			}
+			.c-panel .el-form .el-input{
+				width: 250px;
+			} 
+			.c-panel .el-form  .el-textarea {
+				width: 600px;
+			}
+			.info-table {
+				width: 100%;
+				border-collapse: collapse;
+				margin-bottom: 20px;
+			}
+			.info-table th, .info-table td {
+				border: 1px solid #ebeef5;
+				padding: 12px 10px;
+				font-size: 14px;
+				line-height: 1.5;
+			}
+			.info-table th {
+				 border: 1px solid darkgray;
+				  text-align: left;
+				  height: 22px;
+				  padding: 8px;
+				  background-color: #dddddd;
+				width: 15%;
+				min-width: 120px;
+			}
+			.info-table td {
+			  border: 1px solid darkgray;
+				  text-align: left;
+				width: 35%;
+			}
+			h3 {
+				margin: 20px 0 15px 0;
+				color: #303133;
+				font-size: 16px;
+				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">
+				<el-form v-if="m">
+					<h3>货运单信息</h3>
+					<table class="info-table">
+						<tr>
+							<th>货运单号</th>
+							<td>{{m.orderId}}</td>
+							<th>订单状态</th>
+							<td>
+								<span v-if="m.order.status === 0">待进场</span>
+								<span v-else-if="m.order.status === 1">待装货</span>
+								<span v-else-if="m.order.status === 2">已装货</span>
+								<span v-else-if="m.order.status === 3">运输中</span>
+								<span v-else-if="m.order.status === 4">待卸货</span>
+								<span v-else-if="m.order.status === 5">卸货中</span>
+								<span v-else-if="m.order.status === 6">已卸货</span>
+								<span v-else-if="m.order.status === 7">已结算</span>
+								<span v-else-if="m.order.status === 11">退款中</span>
+								<span v-else-if="m.order.status === 12">已退款</span>
+							</td>
+						</tr>
+						<tr>
+							<th>货主</th>
+							<td>{{m.shipperName}}</td>
+							<th>商品名称</th>
+							<td>{{m.order.itemName}}</td>
+						</tr>
+						<tr>
+							<th>起运地</th>
+							<td>{{m.order.originAddress}}</td>
+							<th>目的地</th>
+							<td>{{m.order.destAddress}}</td>
+						</tr>
+						<tr>
+							<th>接单司机</th>
+							<td>{{m.order.driverName}}</td>
+							<th>接单车辆</th>
+							<td>{{m.order.plateNo}}</td>
+						</tr>
+						<tr>
+							<th>运输里程</th>
+							<td>{{m.order.distance}}公里</td>
+							<th>运输单价</th>
+							<td>{{m.order.unitPrice}}元/公里</td>
+						</tr>
+						<tr>
+							<th>应收金额</th>
+							<td>{{m.receivableAmount}}元</td>
+							<th>实收金额</th>
+							<td>{{m.receivedAmount}}元</td>
+						</tr>
+					</table>
+
+					<h3>退款申请信息</h3>
+					<table class="info-table">
+						<tr>
+							<th>申请理由</th>
+							<td>{{m.reason}}</td>
+							<th>申请说明</th>
+							<td>{{m.reasonMemo}}</td>
+						</tr>
+						<tr>
+							<th>货主意见</th>
+							<td>
+								<span v-if="m.shipperAgree === 0">未确认</span>
+								<span v-else-if="m.shipperAgree === 1">同意</span>
+								<span v-else-if="m.shipperAgree === 2">拒绝</span>
+							</td>
+							<th>司机意见</th>
+							<td>
+								<span v-if="m.driverAgree === 0">未确认</span>
+								<span v-else-if="m.driverAgree === 1">同意</span>
+								<span v-else-if="m.driverAgree === 2">拒绝</span>
+							</td>
+						</tr>
+						<tr>
+							<th>申请时间</th>
+							<td>{{m.applyTime}}</td>
+							<th>处理状态</th>
+							<td>
+								<span v-if="m.dealStatus === 0">未处理</span>
+								<span v-else>已处理</span>
+							</td>
+						</tr>
+					</table>
+
+					<h3>退款处理</h3>
+					<template v-if="m.dealStatus == 0">
+						<table class="info-table">
+							<tr>
+								<th><span style="color: red;">*</span>处理结果</th>
+								<td colspan="3">
+									<el-select v-model="dealInfo.dealStatus" style="width: 100%;">
+										<el-option label="确认退款:费用返还货主" value="1"></el-option>
+										<el-option label="关闭退款:订单继续" value="2"></el-option>
+									</el-select>
+								</td>
+							</tr>
+							<tr>
+								<th>处理备注</th>
+								<td colspan="3">
+									<el-input v-model="dealInfo.dealMemo" type="textarea" :rows="2" placeholder="请输入处理备注" />
+								</td>
+							</tr>
+						</table>
+					</template>
+					<template v-else>
+						<table class="info-table">
+							<tr>
+								<th>处理时间</th>
+								<td>{{m.dealTime}}</td>
+								<th>处理备注</th>
+								<td>{{m.dealMemo}}</td>
+							</tr>
+						</table>
+					</template>
+				</el-form>
+			</div>
+		</div>
+		<!-- ------- 底部按钮 ------- -->
+		<div class="s-foot">
+			<el-button type="success" @click="doDeal()">确定处理</el-button>
+			<el-button @click="sa.closeCurrIframe()">取消</el-button>
+		</div>
+	</div>
+	<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+			el: '.vue-box',
+			data: {
+				refundNo: sa.p('refundNo', 0),	// 获取数据ID
+				m: null,
+				dealInfo: {
+					refundNo: sa.p('refundNo', 0),
+					dealStatus: '',
+					dealMemo: ''
+				}
+			},
+			methods: {
+				doDeal() {
+					let m = this.dealInfo;
+					sa.checkNull(m.dealStatus, '请选择 [处理结果]');
+					sa.checkNull(m.dealMemo, '请输入 [处理备注]');
+
+					sa.ajax('/transport-server/TbTransportRefund/dealRefund', m, function (res) {
+						sa.alert('处理成功');
+						sa.closeCurrIframe();
+					}.bind(this));
+				}
+			},
+			mounted: function () {
+				sa.ajax('/transport-server/TbTransportRefund/getById?refundNo=' + this.refundNo, function (res) {
+					this.m = res.data;
+					if (res.data == null) {
+						sa.alert('未能查找到 refundNo=' + this.refundNo + " 详细数据");
+					}
+				}.bind(this))
+			}
+		})
+
+	</script>
+</body>
+
+</html>

+ 183 - 0
sa-view/tb-transport-refund/tb-transport-refund-info.html

@@ -0,0 +1,183 @@
+<!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>
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+			.info-table {
+				width: 100%;
+				border-collapse: collapse;
+				margin-bottom: 20px;
+			}
+			.info-table th, .info-table td {
+				border: 1px solid #ebeef5;
+				padding: 12px 10px;
+				font-size: 14px;
+				line-height: 1.5;
+			}
+			.info-table th {
+				 border: 1px solid darkgray;
+				  text-align: left;
+				  height: 22px;
+				  padding: 8px;
+				  background-color: #dddddd;
+				width: 15%;
+				min-width: 120px;
+			}
+			.info-table td {
+			  border: 1px solid darkgray;
+				  text-align: left;
+				width: 35%;
+			}
+			h3 {
+				margin: 20px 0 15px 0;
+				color: #303133;
+				font-size: 16px;
+				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">
+				<el-form v-if="m">
+					<h3>货运单信息</h3>
+					<table class="info-table">
+						<tr>
+							<th>货运单号</th>
+							<td>{{m.orderId}}</td>
+							<th>订单状态</th>
+							<td>
+								<span v-if="m.order.status === 0">待进场</span>
+								<span v-else-if="m.order.status === 1">待装货</span>
+								<span v-else-if="m.order.status === 2">已装货</span>
+								<span v-else-if="m.order.status === 3">运输中</span>
+								<span v-else-if="m.order.status === 4">待卸货</span>
+								<span v-else-if="m.order.status === 5">卸货中</span>
+								<span v-else-if="m.order.status === 6">已卸货</span>
+								<span v-else-if="m.order.status === 7">已结算</span>
+								<span v-else-if="m.order.status === 11">退款中</span>
+								<span v-else-if="m.order.status === 12">已退款</span>
+							</td>
+						</tr>
+						<tr>
+							<th>货主</th>
+							<td>{{m.shipperName}}</td>
+							<th>商品名称</th>
+							<td>{{m.order.itemName}}</td>
+						</tr>
+						<tr>
+							<th>起运地</th>
+							<td>{{m.order.originAddress}}</td>
+							<th>目的地</th>
+							<td>{{m.order.destAddress}}</td>
+						</tr>
+						<tr>
+							<th>接单司机</th>
+							<td>{{m.order.driverName}}</td>
+							<th>接单车辆</th>
+							<td>{{m.order.plateNo}}</td>
+						</tr>
+						<tr>
+							<th>运输里程</th>
+							<td>{{m.order.distance}}公里</td>
+							<th>运输单价</th>
+							<td>{{m.order.unitPrice}}元/公里</td>
+						</tr>
+						<tr>
+							<th>发车时间</th>
+							<td>{{m.order.realDepartureTime}}</td>
+							<th>运达时间</th>
+							<td>{{m.order.realArrivalTime}}</td>
+						</tr>
+						<tr>
+							<th>应收金额</th>
+							<td>{{m.receivableAmount}}元</td>
+							<th>实收金额</th>
+							<td>{{m.receivedAmount}}元</td>
+						</tr>
+					</table>
+
+					<h3>退款申请信息</h3>
+					<table class="info-table">
+						<tr>
+							<th>申请理由</th>
+							<td>{{m.reason}}</td>
+							<th>申请说明</th>
+							<td>{{m.reasonMemo}}</td>
+						</tr>
+						<tr>
+							<th>货主意见</th>
+							<td>
+								<span v-if="m.shipperAgree === 0">未确认</span>
+								<span v-else-if="m.shipperAgree === 1">同意</span>
+								<span v-else-if="m.shipperAgree === 2">拒绝</span>
+							</td>
+							<th>司机意见</th>
+							<td>
+								<span v-if="m.driverAgree === 0">未确认</span>
+								<span v-else-if="m.driverAgree === 1">同意</span>
+								<span v-else-if="m.driverAgree === 2">拒绝</span>
+							</td>
+						</tr>
+						<tr>
+							<th>申请时间</th>
+							<td>{{m.applyTime}}</td>
+							<th>处理状态</th>
+							<td>
+								<span v-if="m.dealStatus === 0">待处理</span>
+								<span v-else-if="m.dealStatus === 1">确认退款</span>
+								<span v-else-if="m.dealStatus === 2">关闭退款</span>
+							</td>
+						</tr>
+						<tr>
+							<th>处理时间</th>
+							<td>{{m.dealTime}}</td>
+							<th>处理备注</th>
+							<td>{{m.dealMemo}}</td>
+						</tr>
+					</table>
+				</el-form>
+			</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				el: '.vue-box',
+				data: {
+					refundNo: sa.p('refundNo', 0),	// 获取数据ID
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/transport-server/TbTransportRefund/getById?refundNo=' + this.refundNo, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 refundNo=' + this.refundNo + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 202 - 0
sa-view/tb-transport-refund/tb-transport-refund-list.html

@@ -0,0 +1,202 @@
+<!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>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+
+				<el-tabs v-model="activeTab" type="card" @tab-click="handleTabClick">
+					<el-tab-pane
+							:key="item.nodeId"
+							v-for="(item, index) in orderStepTabs"
+							:label="item.nodeName"
+							:name="item.nodeId"
+					>
+						<span slot="label"><i class="el-icon-postcard"></i> {{item.nodeName}} ( {{item.nodeCount}} )</span>
+					</el-tab-pane>
+				</el-tabs>
+
+				<!-- ------------- 检索参数 ------------- -->
+
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="货运单号" v-model="p.orderId" width="80px"></sa-item>
+					<sa-item type="text" name="商品名称" v-model="p.itemName" width="80px"></sa-item>
+					<sa-item type="text" name="货主" v-model="p.shipperName" width="80px"></sa-item>
+					<sa-item type="text" name="接单司机" v-model="p.driverName" width="80px"></sa-item>
+
+					<!--<sa-item type="text" name="申请时间" v-model="p.applyTime" width="120px"></sa-item>
+					<sa-item type="text" name="处理状态" v-model="p.dealStatus" width="120px">
+						<el-select v-model="p.dealStatus">
+							<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>
+					</sa-item>-->
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+
+				<!-- ------------- 数据列表 0,未处理,1同意,2拒绝------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+
+					<sa-td name="货运单号" prop="orderId" width="150px"></sa-td>
+
+					<sa-td name="商品名称" prop="itemName" width="180px"></sa-td>
+					<sa-td name="货主" prop="shipperName" width="180px"></sa-td>
+					<sa-td name="接单司机" prop="driverName" ></sa-td>
+					<sa-td name="申请理由" prop="reason" width="180px"></sa-td>
+					<!--<sa-td name="申请说明" prop="reasonMemo" ></sa-td>-->
+					<sa-td name="申请时间" prop="applyTime" width="150px"></sa-td>
+					<sa-td name="司机意见" prop="driverAgree" type="enum" :jv="{0: '未确认', 1: '同意', 2: '拒绝'}"></sa-td>
+					<sa-td name="货主意见" prop="shipperAgree" type="enum" :jv="{0: '未确认', 1: '同意', 2: '拒绝'}"></sa-td>
+					<sa-td name="处理状态" prop="dealStatus" type="enum" :jv="{0: '待处理', 1: '确认退款', 2: '关闭退款'}" ></sa-td>
+					<!--<sa-td name="处理时间" prop="dealTime" ></sa-td>
+					<sa-td name="处理备注" prop="dealMemo" ></sa-td>-->
+					<el-table-column label="操作" fixed="right"  width="200px">
+						<template slot-scope="s">
+							<el-button v-if=" s.row.dealStatus == 0 &&   sa.isAuth('tb-transport-refund-deal')" class="c-btn" type="primary" icon="el-icon-view" @click="dealRefund(s.row)">退款处理</el-button>
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看详情</el-button>
+							<!--<el-button class="c-btn" type="success" icon="el-icon-view" @click="viewProcess(s.row)">处理过程</el-button>
+							<el-button v-if="sa.isAuth('tb-transport-refund-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-transport-refund-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+							-->
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+
+
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						refundNo: '',		// ID 
+						orderId: '',		// 货运订单号 
+						driverId: '',		// 司机 
+						driverName: '',		// 司机名称 
+						shipperId: '',		// 货主 ID 
+						shipperName: '',		// 货主名称 
+						itemName: '',		// 商品名称 
+						reason: '',		// 申请理由 
+						reasonMemo: '',		// 申请说明 
+						applyTime: '',		// 申请时间 
+						driverAgree: '',		// 司机同意,0,未处理,1同意,2拒绝 
+						shipperAgree: '',		// 货主同意,0,未处理,1同意,2拒绝 
+						dealStatus: '',		// 处理状态:0未处理,1已同意,2拒绝 
+						dealTime: '',		// 退款处理时间 
+						dealMemo: '',		// 处理备注 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合
+
+					orderStepTabs: [],
+					activeTab: 'all',
+				},
+				methods: {
+					handleTabClick(tab, event) {
+						if(tab.name==='all')
+							this.p.dealStatus =null;
+						else
+							this.p.dealStatus = tab.name;
+						this.f5();
+					},
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbTransportRefund/statRefundGroupByStatus', sa.removeNull(this.p), function(res) {
+							this.orderStepTabs = res.data; // 数据
+						}.bind(this));
+
+						sa.ajax('/transport-server/TbTransportRefund/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					//处理退款
+					dealRefund(data){
+						sa.showIframe('退款处理', 'tb-transport-refund-deal.html?refundNo=' + data.refundNo, '1050px', '85%');
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('退款详情', 'tb-transport-refund-info.html?refundNo=' + data.refundNo, '1050px', '90%');
+					},
+					viewProcess: function(data){
+						sa.showIframe('退款处理过程', 'tb-transport-refund-process.html?refundNo=' + data.refundNo, '500px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-transport-refund-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-transport-refund-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbTransportRefund/delete?id=' + data.refundNo, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbTransportRefund/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 86 - 0
sa-view/tb-transport-refund/tb-transport-refund-process.html

@@ -0,0 +1,86 @@
+<!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>
+	<style type="text/css">
+		.c-panel .c-label{width: 8em;}
+		.info-row {
+			display: flex;
+			justify-content: space-between;
+			margin-bottom: 1em;
+		}
+		.info-row .c-label {
+			width: 30%;
+		}
+		.info-row .c-value {
+			width: 70%;
+		}
+	</style>
+</head>
+<body>
+<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+	<!-- ------- 内容部分 ------- -->
+	<div class="s-body">
+		<div class="c-panel">
+			<div>
+				<i class="el-icon-share">&nbsp;&nbsp;处理进程</i><br>
+				<div class="block">
+					<el-timeline>
+						<el-timeline-item
+								v-for="(activity, id) in activities"
+								:key="id"
+								type='primary'
+								color='#0bbd87'
+								:timestamp="activity.operationTime"   placement="top">
+							<h4>[ {{activity.operationType}} ]&nbsp;&nbsp;{{activity.remark}}</h4>
+							<h4>by {{activity.operatorName}} </h4>
+						</el-timeline-item>
+					</el-timeline>
+				</div>
+			</div>
+		</div>
+	</div>
+	<!-- ------- 底部按钮 ------- -->
+	<div class="s-foot">
+		<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+		<el-button @click="sa.closeCurrIframe()">取消</el-button>
+	</div>
+</div>
+<script>
+	var app = new Vue({
+		components: {
+			"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+		},
+		el: '.vue-box',
+		data: {
+			refundNo: sa.p('refundNo', 0),  // 获取数据ID
+			m: null,
+			//处理进程
+			activities:[],
+		},
+		methods: {
+		},
+		mounted: function() {
+			const p = {refundNo:this.refundNo};
+			sa.ajax('/transport-server/TbTransportRefund/getProcess' , p, function(res) {
+				this.activities = res.data;
+				if(res.data == null) {
+					sa.alert('未能查找到 refundNo=' + this.refundNo + " 详细数据");
+				}
+			}.bind(this))
+		}
+	})
+</script>
+</body>
+</html>

+ 172 - 0
sa-view/tb-transport-settle/tb-transport-fundflow-bill.html

@@ -0,0 +1,172 @@
+<!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>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+				<div class="c-title">检索参数</div>
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="货运单号" v-model="p.orderId" width="120px"></sa-item>
+					<sa-item type="text" name="货主" v-model="p.shipperName"></sa-item>
+					<sa-item type="text" name="司机" v-model="p.driverName"></sa-item>
+					<sa-item type="text" name="接单车辆" v-model="p.plateNo" width="120px"></sa-item>
+					<!--<sa-item type="text" name="货运单状态" v-model="p.status" width="120px">
+						<el-select v-model="p.status">
+							<el-option label="待进场" value="0"></el-option>
+							<el-option label="待装货" value="1"></el-option>
+							<el-option label="已装货" value="2"></el-option>
+							<el-option label="运输中" value="3"></el-option>
+							<el-option label="待卸货" value="4"></el-option>
+							<el-option label="卸货中" value="5"></el-option>
+							<el-option label="已卸货" value="6"></el-option>
+							<el-option label="已结算" value="7"></el-option>
+							<el-option label="退款中" value="11"></el-option>
+							<el-option label="已退款" value="12"></el-option>
+						</el-select>
+					</sa-item>-->
+					<sa-item type="text" name="订单时间" v-model="p.createdAt" width="120px"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+				<!--<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-transport-order-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+				</div>-->
+
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+					<sa-td type="selection"></sa-td>					
+					<sa-td name="货运单号" prop="orderId" ></sa-td>
+					<sa-td name="货主" prop="shipperName" ></sa-td>
+					<sa-td name="商品" prop="itemName" ></sa-td>
+					<sa-td name="起运地" prop="originAddress" ></sa-td>
+					<sa-td name="目的地" prop="destAddress" ></sa-td>
+					<sa-td name="里程(km)" prop="distance" ></sa-td>
+					<sa-td name="接单司机" prop="driverName" ></sa-td>
+					<sa-td name="接单车辆" prop="plateNo"  ></sa-td>
+					<sa-td name="发车时间" prop="realDepartureTime" width="120px" type="datetime"></sa-td>
+					<sa-td name="运达时间" prop="realArrivalTime" type="datetime"></sa-td>
+					<sa-td name="结算时间" prop="settleTime" type="datetime"></sa-td>
+					<sa-td name="订单状态" prop="status" type="enum" :jv="{0: '待进场', 1: '待装货', 2: '已装货', 3:'运输中', 4:'待卸货', 5:'卸货中', 6:'已卸货', 7:'已结算', 11:'退款中', 12:'已退款'}"></sa-td>
+					<sa-td name="退款状态" prop="refundStatus" type="enum" :jv="{0: '未退款', 1: '退款申请中', 2: '同意退款', 3:'退款关闭'}" br></sa-td>
+					<sa-td name="货主应付" prop="receivableAmount" ></sa-td>
+					<sa-td name="货主实付" prop="receivedAmount" ></sa-td>
+					<sa-td name="司机运费" prop="freightAmount" ></sa-td>
+					<sa-td name="平台服务费" prop="serviceFee" ></sa-td>
+					
+					<el-table-column label="操作" fixed="right"  width="120px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">详情</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						orderId: '',		// 货运订单号 
+						demandId: '',		// 需求单号 
+						shipperName: '',	// 货主名称
+						driverName: '',		// 司机姓名 
+						plateNo: '',		// 接单车辆 
+						status: '',		   // 货运订单状态 
+						createdAt: '',		// 货运订单创建时间 
+						refundStatus: '',		// 退款状态,0未退款,1退款申请,2同意退款,3退款关闭 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbTransportOrder/getSettledOrderList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('货运单详情', 'tb-transport-order-info.html?orderId=' + data.orderId, '1050px', '90%');
+					},
+					viewProcess: function(data){
+						sa.showIframe('货运单处理过程', 'tb-transport-order-process.html?orderId=' + data.orderId, '500px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 超时结算确认
+					handleSettleConfirm: function(data) {
+						sa.showIframe('超时结算确认', 'tb-transport-order-settle-confirm.html?orderId=' + data.orderId, '1050px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-transport-order-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbTransportOrder/delete?id=' + data.orderId, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbTransportOrder/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 166 - 0
sa-view/tb-transport-settle/tb-transport-order-info.html

@@ -0,0 +1,166 @@
+<!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>
+	<style type="text/css">
+		.c-panel .c-label{width: 8em;}
+		.info-row {
+			display: flex;
+			justify-content: space-between;
+			margin-bottom: 1em;
+		}
+		.info-row .c-label {
+			width: 30%;
+		}
+		.info-row .c-value {
+			width: 70%;
+		}
+	</style>
+</head>
+<body>
+<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+	<!-- ------- 内容部分 ------- -->
+	<div class="s-body">
+		<div class="c-panel">
+			<el-form v-if="m">
+				<el-divider content-position="center">货运订单</el-divider>
+				<el-row :gutter="50">
+					<el-col :span="12">
+						<sa-info name="货运单号" br>{{m.orderId}}</sa-info>
+					</el-col>
+					<el-col :span="12">
+						<sa-info type="enum"  name="订单状态" :value="m.status" :jv="{0: '待进场', 1: '待装货', 2: '已装货', 3:'运输中', 4:'待卸货', 5:'卸货中', 6:'已卸货', 7:'已结算', 11:'退款中', 12:'已退款'}" br></sa-info>
+					</el-col>
+				</el-row>
+
+				<el-row :gutter="50">
+					<el-col :span="12">
+						<sa-info name="货      主" br>{{m.shipperName}}</sa-info>
+					</el-col>
+					<el-col :span="12">
+						<sa-info name="商品名称" br>{{m.itemName}}</sa-info>
+					</el-col>
+				</el-row>
+				<el-row :gutter="50">
+					<el-col :span="12">
+						<sa-info name="起运地" br>{{m.originAddress}}</sa-info>
+					</el-col>
+					<el-col :span="12">
+						<sa-info name="目的地" br>{{m.destAddress}}</sa-info>
+					</el-col>
+				</el-row>
+
+				<el-row :gutter="50">
+					<el-col :span="12">
+						<sa-info name="接单司机" br>{{m.driverName}}</sa-info>
+					</el-col>
+					<el-col :span="12">
+						<sa-info name="接单车辆" br>{{m.plateNo}}</sa-info>
+					</el-col>
+				</el-row>
+				<el-row :gutter="50">
+					<el-col :span="12">
+						<sa-info name="运输里程" br>{{m.distance}}公里</sa-info>
+					</el-col>
+					<el-col :span="12">
+						<sa-info name="运输单价" br>{{m.unitPrice}}元/公里</sa-info>
+					</el-col>
+				</el-row>
+				<el-row :gutter="50">
+					<el-col :span="12">
+						<sa-info name="发车时间" br>{{m.realDepartureTime}}</sa-info>
+					</el-col>
+					<el-col :span="12">
+						<sa-info name="运达时间" br>{{m.realArrivalTime}}</sa-info>
+					</el-col>
+				</el-row>
+
+
+
+				<el-divider content-position="center">货运结算</el-divider>
+				<el-row :gutter="50">
+					<el-col :span="12">
+						<sa-info name="应收金额" br>{{m.receivableAmount}}元</sa-info>
+					</el-col>
+					<el-col :span="12">
+						<sa-info name="实收金额" br>{{m.receivedAmount}}元</sa-info>
+					</el-col>
+				</el-row>
+
+				<el-row :gutter="50">
+					<el-col :span="12">
+						<sa-info name="本次运费" br>{{m.freightAmount}}元</sa-info>
+					</el-col>
+					<el-col :span="12">
+						<sa-info name="本次服务费" br>{{m.serviceFee}}元</sa-info>
+					</el-col>
+				</el-row>
+
+
+				<el-row :gutter="50">
+					<el-col :span="12">
+						<sa-info name="结算时间" br>{{m.settleTime}}</sa-info>
+					</el-col>
+					<el-col :span="12">
+						<sa-info type="enum"  name="退款状态" :value="m.refundStatus" :jv="{0: '未退款', 1: '退款申请中', 2: '同意退款', 3:'退款关闭'}" br></sa-info>
+					</el-col>
+				</el-row>
+
+
+				<!--<el-row :gutter="50">
+					<el-col :span="8">
+						<sa-info type="img-list" name="装货照片" :value="m.loadingPhoto" br></sa-info>
+					</el-col>
+					<el-col :span="8">
+						<sa-info type="img-list" name="到货照片" :value="m.arrivalPhoto" br></sa-info>
+					</el-col>
+					<el-col :span="8">
+						<sa-info type="img-list" name="卸货照片" :value="m.unloadingPhoto" br></sa-info>
+					</el-col>
+				</el-row>-->
+
+
+			</el-form>
+		</div>
+	</div>
+	<!-- ------- 底部按钮 ------- -->
+	<div class="s-foot">
+		<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+		<el-button @click="sa.closeCurrIframe()">取消</el-button>
+	</div>
+</div>
+<script>
+	var app = new Vue({
+		components: {
+			"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+		},
+		el: '.vue-box',
+		data: {
+			orderId: sa.p('orderId', 0),  // 获取数据ID
+			m: null
+		},
+		methods: {
+		},
+		mounted: function() {
+			sa.ajax('/transport-server/TbTransportOrder/getById?orderId=' + this.orderId, function(res) {
+				this.m = res.data;
+				if(res.data == null) {
+					sa.alert('未能查找到 orderId=' + this.orderId + " 详细数据");
+				}
+			}.bind(this))
+		}
+	})
+</script>
+</body>
+</html>

+ 172 - 0
sa-view/tb-transport-settle/tb-transport-order-settle.html

@@ -0,0 +1,172 @@
+<!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>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="货运单号" v-model="p.orderId" width="80px"></sa-item>
+					<sa-item type="text" name="货主" v-model="p.shipperName"></sa-item>
+					<sa-item type="text" name="接单司机" v-model="p.driverName" width="80px"></sa-item>
+					<sa-item type="text" name="接单车辆" v-model="p.plateNo" width="80px"></sa-item>
+					<!--<sa-item type="text" name="货运单状态" v-model="p.status" width="120px">
+						<el-select v-model="p.status">
+							<el-option label="待进场" value="0"></el-option>
+							<el-option label="待装货" value="1"></el-option>
+							<el-option label="已装货" value="2"></el-option>
+							<el-option label="运输中" value="3"></el-option>
+							<el-option label="待卸货" value="4"></el-option>
+							<el-option label="卸货中" value="5"></el-option>
+							<el-option label="已卸货" value="6"></el-option>
+							<el-option label="已结算" value="7"></el-option>
+							<el-option label="退款中" value="11"></el-option>
+							<el-option label="已退款" value="12"></el-option>
+						</el-select>
+					</sa-item>
+					<sa-item type="text" name="订单时间" v-model="p.createdAt" width="120px"></sa-item>-->
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+				<!--<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-transport-order-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+				</div>-->
+
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+					<sa-td type="selection"></sa-td>					
+					<sa-td name="货运单号" prop="orderId" width="150px"></sa-td>
+					<sa-td name="货主" prop="shipperName" width="180px"></sa-td>
+					<sa-td name="商品" prop="itemName" width="180px"></sa-td>
+					<sa-td name="起运地" prop="originAddress" width="220px"></sa-td>
+					<sa-td name="目的地" prop="destAddress" width="220px"></sa-td>
+					<sa-td name="里程(km)" prop="distance" ></sa-td>
+					<sa-td name="接单司机" prop="driverName" ></sa-td>
+					<sa-td name="接单车辆" prop="plateNo"  ></sa-td>
+					<sa-td name="发车时间" prop="realDepartureTime" width="150px" type="datetime"></sa-td>
+					<sa-td name="运达时间" prop="realArrivalTime" type="datetime" width="150px" ></sa-td>
+					<sa-td name="结算时间" prop="settleTime" type="datetime" width="150px" ></sa-td>
+					<sa-td name="订单状态" prop="status" type="enum" :jv="{0: '待进场', 1: '待装货', 2: '已装货', 3:'运输中', 4:'待卸货', 5:'卸货中', 6:'已卸货', 7:'已结算', 11:'退款中', 12:'已退款'}"></sa-td>
+					<sa-td name="退款状态" prop="refundStatus" type="enum" :jv="{0: '未退款', 1: '退款申请中', 2: '同意退款', 3:'退款关闭'}" br></sa-td>
+					<sa-td name="货主应付" prop="receivableAmount" ></sa-td>
+					<sa-td name="货主实付" prop="receivedAmount" ></sa-td>
+					<sa-td name="司机运费" prop="freightAmount" ></sa-td>
+					<sa-td name="平台服务费" prop="serviceFee" ></sa-td>
+					
+					<el-table-column label="操作" fixed="right"  width="80px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">详情</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						orderId: '',		// 货运订单号 
+						demandId: '',		// 需求单号 
+						shipperName: '',	// 货主名称
+						driverName: '',		// 司机姓名 
+						plateNo: '',		// 接单车辆 
+						status: '',		   // 货运订单状态 
+						createdAt: '',		// 货运订单创建时间 
+						refundStatus: '',		// 退款状态,0未退款,1退款申请,2同意退款,3退款关闭 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbTransportOrder/getSettledOrderList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('货运单详情', 'tb-transport-order-info.html?orderId=' + data.orderId, '1050px', '90%');
+					},
+					viewProcess: function(data){
+						sa.showIframe('货运单处理过程', 'tb-transport-order-process.html?orderId=' + data.orderId, '500px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 超时结算确认
+					handleSettleConfirm: function(data) {
+						sa.showIframe('超时结算确认', 'tb-transport-order-settle-confirm.html?orderId=' + data.orderId, '1050px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-transport-order-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbTransportOrder/delete?id=' + data.orderId, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbTransportOrder/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 172 - 0
sa-view/tb-transport-settle/tb-transport-trade-bill.html

@@ -0,0 +1,172 @@
+<!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>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+				<div class="c-title">检索参数</div>
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="货运单号" v-model="p.orderId" width="120px"></sa-item>
+					<sa-item type="text" name="货主" v-model="p.shipperName"></sa-item>
+					<sa-item type="text" name="司机" v-model="p.driverName"></sa-item>
+					<sa-item type="text" name="接单车辆" v-model="p.plateNo" width="120px"></sa-item>
+					<!--<sa-item type="text" name="货运单状态" v-model="p.status" width="120px">
+						<el-select v-model="p.status">
+							<el-option label="待进场" value="0"></el-option>
+							<el-option label="待装货" value="1"></el-option>
+							<el-option label="已装货" value="2"></el-option>
+							<el-option label="运输中" value="3"></el-option>
+							<el-option label="待卸货" value="4"></el-option>
+							<el-option label="卸货中" value="5"></el-option>
+							<el-option label="已卸货" value="6"></el-option>
+							<el-option label="已结算" value="7"></el-option>
+							<el-option label="退款中" value="11"></el-option>
+							<el-option label="已退款" value="12"></el-option>
+						</el-select>
+					</sa-item>-->
+					<sa-item type="text" name="订单时间" v-model="p.createdAt" width="120px"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+				<!--<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-transport-order-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+				</div>-->
+
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+					<sa-td type="selection"></sa-td>					
+					<sa-td name="货运单号" prop="orderId" ></sa-td>
+					<sa-td name="货主" prop="shipperName" ></sa-td>
+					<sa-td name="商品" prop="itemName" ></sa-td>
+					<sa-td name="起运地" prop="originAddress" ></sa-td>
+					<sa-td name="目的地" prop="destAddress" ></sa-td>
+					<sa-td name="里程(km)" prop="distance" ></sa-td>
+					<sa-td name="接单司机" prop="driverName" ></sa-td>
+					<sa-td name="接单车辆" prop="plateNo"  ></sa-td>
+					<sa-td name="发车时间" prop="realDepartureTime" width="120px" type="datetime"></sa-td>
+					<sa-td name="运达时间" prop="realArrivalTime" type="datetime"></sa-td>
+					<sa-td name="结算时间" prop="settleTime" type="datetime"></sa-td>
+					<sa-td name="订单状态" prop="status" type="enum" :jv="{0: '待进场', 1: '待装货', 2: '已装货', 3:'运输中', 4:'待卸货', 5:'卸货中', 6:'已卸货', 7:'已结算', 11:'退款中', 12:'已退款'}"></sa-td>
+					<sa-td name="退款状态" prop="refundStatus" type="enum" :jv="{0: '未退款', 1: '退款申请中', 2: '同意退款', 3:'退款关闭'}" br></sa-td>
+					<sa-td name="货主应付" prop="receivableAmount" ></sa-td>
+					<sa-td name="货主实付" prop="receivedAmount" ></sa-td>
+					<sa-td name="司机运费" prop="freightAmount" ></sa-td>
+					<sa-td name="平台服务费" prop="serviceFee" ></sa-td>
+					
+					<el-table-column label="操作" fixed="right"  width="120px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">详情</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						orderId: '',		// 货运订单号 
+						demandId: '',		// 需求单号 
+						shipperName: '',	// 货主名称
+						driverName: '',		// 司机姓名 
+						plateNo: '',		// 接单车辆 
+						status: '',		   // 货运订单状态 
+						createdAt: '',		// 货运订单创建时间 
+						refundStatus: '',		// 退款状态,0未退款,1退款申请,2同意退款,3退款关闭 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbTransportOrder/getSettledOrderList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('货运单详情', 'tb-transport-order-info.html?orderId=' + data.orderId, '1050px', '90%');
+					},
+					viewProcess: function(data){
+						sa.showIframe('货运单处理过程', 'tb-transport-order-process.html?orderId=' + data.orderId, '500px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 超时结算确认
+					handleSettleConfirm: function(data) {
+						sa.showIframe('超时结算确认', 'tb-transport-order-settle-confirm.html?orderId=' + data.orderId, '1050px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-transport-order-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbTransportOrder/delete?id=' + data.orderId, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbTransportOrder/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 143 - 0
sa-view/tb-transport-trade-bill/tb-transport-trade-bill-add.html

@@ -0,0 +1,143 @@
+<!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>
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <div class="c-title" v-if="id == 0">数据添加</div>
+					<div class="c-title" v-else>数据修改</div>
+					<el-form v-if="m">
+						<sa-item type="text" name="账单ID" v-model="m.billId" br></sa-item>
+						<sa-item type="text" name="账单日期" v-model="m.billDate" br></sa-item>
+						<sa-item type="text" name="平台收款笔数" v-model="m.receiveCountPlatform" br></sa-item>
+						<sa-item type="text" name="平台收款金额" v-model="m.receiveAmountPlatform" br></sa-item>
+						<sa-item type="text" name="平台转账笔数" v-model="m.transferCountPlatform" br></sa-item>
+						<sa-item type="text" name="平台转账金额" v-model="m.transferAmountPlatform" br></sa-item>
+						<sa-item type="text" name="平台退款笔数" v-model="m.refundCountPlatform" br></sa-item>
+						<sa-item type="text" name="平台退款金额" v-model="m.refundAmountPlatform" br></sa-item>
+						<sa-item type="text" name="微信收款笔数" v-model="m.receiveCountWechat" br></sa-item>
+						<sa-item type="text" name="微信收款金额" v-model="m.receiveAmountWechat" br></sa-item>
+						<sa-item type="text" name="微信转账笔数" v-model="m.transferCountWechat" br></sa-item>
+						<sa-item type="text" name="微信转账金额" v-model="m.transferAmountWechat" br></sa-item>
+						<sa-item type="text" name="微信退款笔数" v-model="m.refundCountWechat" br></sa-item>
+						<sa-item type="text" name="微信退款金额" v-model="m.refundAmountWechat" br></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							billId: '',		// 账单ID 
+							billDate: '',		// 账单日期 
+							receiveCountPlatform: '',		// 平台收款笔数 
+							receiveAmountPlatform: '',		// 平台收款金额 
+							transferCountPlatform: '',		// 平台转账笔数 
+							transferAmountPlatform: '',		// 平台转账金额 
+							refundCountPlatform: '',		// 平台退款笔数 
+							refundAmountPlatform: '',		// 平台退款金额 
+							receiveCountWechat: '',		// 微信收款笔数 
+							receiveAmountWechat: '',		// 微信收款金额 
+							transferCountWechat: '',		// 微信转账笔数 
+							transferAmountWechat: '',		// 微信转账金额 
+							refundCountWechat: '',		// 微信退款笔数 
+							refundAmountWechat: '',		// 微信退款金额 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.billId, '请输入 [账单ID]');
+						sa.checkNull(m.billDate, '请输入 [账单日期]');
+						sa.checkNull(m.receiveCountPlatform, '请输入 [平台收款笔数]');
+						sa.checkNull(m.receiveAmountPlatform, '请输入 [平台收款金额]');
+						sa.checkNull(m.transferCountPlatform, '请输入 [平台转账笔数]');
+						sa.checkNull(m.transferAmountPlatform, '请输入 [平台转账金额]');
+						sa.checkNull(m.refundCountPlatform, '请输入 [平台退款笔数]');
+						sa.checkNull(m.refundAmountPlatform, '请输入 [平台退款金额]');
+						sa.checkNull(m.receiveCountWechat, '请输入 [微信收款笔数]');
+						sa.checkNull(m.receiveAmountWechat, '请输入 [微信收款金额]');
+						sa.checkNull(m.transferCountWechat, '请输入 [微信转账笔数]');
+						sa.checkNull(m.transferAmountWechat, '请输入 [微信转账金额]');
+						sa.checkNull(m.refundCountWechat, '请输入 [微信退款笔数]');
+						sa.checkNull(m.refundAmountWechat, '请输入 [微信退款金额]');
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/TbTransportTradeBill/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/TbTransportTradeBill/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/TbTransportTradeBill/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 156 - 0
sa-view/tb-transport-trade-bill/tb-transport-trade-bill-detail-list.html

@@ -0,0 +1,156 @@
+<!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>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+				<div class="c-title">检索参数</div>
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="货运单号" v-model="p.orderId" width="100px"></sa-item>
+					<sa-item type="text" name="交易单号" v-model="p.tradeNo" width="100px"></sa-item>
+					<sa-item type="text" name="业务类型" v-model="p.busiType" width="100px">
+						<el-select v-model="p.busiType">
+							<el-option label="付款" value="0"></el-option>
+							<el-option label="转账" value="1"></el-option>
+							<el-option label="退款" value="2"></el-option>
+						</el-select>
+					</sa-item>
+					<sa-item type="text" name="交易时间" v-model="p.tradeTime" width="100px"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+					<el-table-column label="货运平台" align="center"  >
+						<sa-td name="交易单号" prop="tradeNo" ></sa-td>
+						<sa-td name="货运单号" prop="orderId" ></sa-td>
+						<sa-td name="商品名称" prop="goodsName" ></sa-td>
+						<sa-td name="业务类型" prop="busiType"  type="enum" :jv="{0: '付款', 1: '转账', 2: '退款'}"></sa-td>
+						<sa-td name="交易金额" prop="tradeAmount" ></sa-td>
+						<sa-td name="交易时间" prop="tradeTime" ></sa-td>
+					</el-table-column>
+					<el-table-column label="微信平台" align="center" >JSAPI、NATIVE、APP、MICROPAY、MWEB、FACEPAY
+						<sa-td name="支付单号" prop="wxTradeId" style="background-color: #8cc5ff" ></sa-td>
+						<sa-td name="交易类型" prop="wxTradeType" type="enum" :jv="{'JSAPI': '小程序支付', 'NATIVE': 'Native支付', 'APP': 'APP支付', 'MICROPAY': '付款码支付', 'MWEB': 'H5支付', 'FACEPAY': '刷脸支付'}"></sa-td>
+						<sa-td name="交易状态" prop="wxTradeState" type="enum" :jv="{'SUCCESS': '支付成功', 'REFUND': '转入退款', 'NOTPAY': '未支付', 'CLOSED': '已关闭', 'REVOKED': '已撤销','PAYERROR':'付款失败'}"></sa-td>
+						<sa-td name="支付方式" prop="wxBankType" ></sa-td>
+						<sa-td name="交易金额" prop="wxAmount" ></sa-td>
+						<sa-td name="用户标识" prop="wxUserId" ></sa-td>
+					</el-table-column>
+
+					<sa-td name="对账结果"  ></sa-td>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						tradeId: '',		// 交易ID 
+						tradeNo: '',		// 交易单号 
+						orderId: '',		// 货运单号 
+						goodsName: '',		// 商品名称 
+						busiType: '',		// 业务类型:0支付、1转账、2退款 
+						tradeAmount: '',		// 平台交易金额 
+						wxTradeId: '',		// 微信交易单号 
+						wxTradeType: '',		// 交易类型:JSAPI、NATIVE、APP、MICROPAY、MWEB、FACEPAY 
+						wxTradeState: '',		// 微信交易状态 
+						wxBankType: '',		// 支付方式 
+						wxAmount: '',		// 微信交易金额 
+						wxUserId: '',		// 用户标识 
+						tradeTime: '',		// 交易时间 
+						createTime: '',		// 创建时间 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbTransportTradeBillDetail/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-transport-trade-bill-detail-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-transport-trade-bill-detail-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-transport-trade-bill-detail-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/TbTransportTradeBillDetail/delete?id=' + data.tradeId, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/TbTransportTradeBillDetail/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 147 - 0
sa-view/tb-transport-trade-bill/tb-transport-trade-bill-info.html

@@ -0,0 +1,147 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+	<link rel="stylesheet" href="../../static/sa.css">
+	<script src="../../static/kj/vue.min.js"></script>
+	<script src="../../static/kj/element-ui/index.js"></script>
+	<script src="../../static/kj/httpVueLoader.js"></script>
+	<script src="../../static/kj/jquery.min.js"></script>
+	<script src="../../static/kj/layer/layer.js"></script>
+	<script src="../../static/sa.js"></script>
+	<style type="text/css">
+		/* 使长度更长点 */
+		/* .c-panel .c-label{width: 10em;} */
+		.vue-box,.c-panel{background-color: #EEE;}
+		.c-panel .c-title{margin-bottom: 20px;}
+		.c-item .c-label{width: 150px;}
+		.c-item .el-input{width: 300px;}
+		/* 链接样式  */
+		.my-link{position: relative; top: -1px; margin-left: 0.5em;}
+		table {
+			font-family: arial, sans-serif;
+			border-collapse: collapse;
+			width: 90%;
+			margin-top: 26px ;
+			margin-left: auto;
+			margin-right: auto;
+		}
+		th {
+			border: 1px solid darkgray;
+			text-align: left;
+			height: 30px;
+			padding: 8px;
+			background-color: #dddddd;
+		}
+		td {
+			border: 1px solid darkgray;
+			text-align: left;
+			padding: 8px;
+		}
+	</style>
+</head>
+<body>
+<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+	<!-- ------- 内容部分 ------- -->
+	<div class="s-body">
+		<div class="c-panel">
+			<el-form v-if="m">
+				<div style="height: 10px;"></div>
+				<table>
+					<tr><th colspan="4" style="text-align:center" >交易对账 [ {{m.billDate}} ]</th></tr>
+					<tr>
+						<th style="text-align:center" >项目</th>
+						<th style="text-align:center" >货运平台</th>
+						<th style="text-align:center" >微信平台</th>
+						<th style="text-align:center" >对账结果</th>
+					</tr>
+
+					<tr>
+						<td style="text-align:center" >收款笔数</td>
+						<td style="text-align:center" >{{m.receiveCountPlatform}}</td>
+						<td style="text-align:center" >{{m.receiveCountWechat}}</td>
+						<td style="text-align:center" v-if="m.receiveCountPlatform==m.receiveCountWechat">一致</td>
+						<td style="text-align:center" v-else >异常</td>
+					</tr>
+					<tr>
+						<td style="text-align:center" >收款金额</td>
+						<td style="text-align:center" >{{m.receiveAmountPlatform}}</td>
+						<td style="text-align:center" >{{m.receiveAmountWechat}}</td>
+						<td style="text-align:center" v-if="m.receiveAmountPlatform==m.receiveAmountWechat">一致</td>
+						<td style="text-align:center;text-color:red" v-else >异常</td>
+					</tr>
+					<tr>
+						<td style="text-align:center" >转账笔数</td>
+						<td style="text-align:center" >{{m.transferCountPlatform}}</td>
+						<td style="text-align:center" >{{m.transferCountWechat}}</td>
+						<td style="text-align:center" v-if="m.transferCountPlatform==m.transferCountWechat">一致</td>
+						<td style="text-align:center;text-color:red" v-else >异常</td>
+					</tr>
+					<tr>
+						<td style="text-align:center" >转账金额</td>
+						<td style="text-align:center" >{{m.transferAmountPlatform}}</td>
+						<td style="text-align:center" >{{m.transferAmountWechat}}</td>
+						<td style="text-align:center" v-if="m.transferAmountPlatform==m.transferAmountWechat">一致</td>
+						<td style="text-align:center;text-color:red" v-else >异常</td>
+					</tr>
+					<tr>
+						<td style="text-align:center" >退款笔数</td>
+						<td style="text-align:center" >{{m.refundCountPlatform}}</td>
+						<td style="text-align:center" >{{m.refundCountWechat}}</td>
+						<td style="text-align:center" v-if="m.refundCountPlatform==m.refundCountWechat">一致</td>
+						<td style="text-align:center;text-color:red" v-else >异常</td>
+					</tr>
+					<tr>
+						<td style="text-align:center" >退款金额</td>
+						<td style="text-align:center" >{{m.refundAmountPlatform}}</td>
+						<td style="text-align:center" >{{m.refundAmountWechat}}</td>
+						<td style="text-align:center" v-if="m.refundAmountPlatform==m.refundAmountWechat">一致</td>
+						<td style="text-align:center;text-color:red" v-else >异常</td>
+					</tr>
+				</table>
+
+			</el-form>
+		</div>
+	</div>
+	<!-- ------- 底部按钮 ------- -->
+	<div class="s-foot">
+		<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+		<el-button @click="sa.closeCurrIframe()">取消</el-button>
+	</div>
+
+</div>
+
+<script type="text/javascript">
+	var app = new Vue({
+		components: {
+			"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+		},
+		el: '.vue-box',
+		data: {
+			id: parseInt(sa.p('id', 0)),
+			sa: sa,
+			m: null
+		},
+		methods: {
+			// ok
+			ok: function(pageNo) {
+				sa.closeCurrIframe();
+			},
+		},
+		created: function() {
+			sa.ajax('/transport-server/TbTransportTradeBill/getById?id=' + this.id, function(res) {
+				this.m = res.data;
+				if(res.data == null) {
+					sa.alert('未能查找到 id=' + this.id + " 详细数据");
+				}
+			}.bind(this))
+		}
+	})
+
+</script>
+</body>
+</html>

+ 160 - 0
sa-view/tb-transport-trade-bill/tb-transport-trade-bill-list.html

@@ -0,0 +1,160 @@
+<!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>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 -------------
+				<div class="c-title">检索参数</div>-->
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="账单日期" v-model="p.billDate" width="120px"></sa-item>
+					<sa-item type="text" name="对账结果" v-model="p.status" width="120px">
+						<el-select v-model="p.result">
+							<el-option label="全部" value=""></el-option>
+							<el-option label="对账一致" value="0"></el-option>
+							<el-option label="对账异常" value="1"></el-option>
+						</el-select>
+					</sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+
+					<sa-td name="账单日期" prop="billDate" style="background-color:#dddddd" ></sa-td>
+					<el-table-column label="货运平台" align="center"  >
+						<sa-td name="收款笔数" prop="receiveCountPlatform" ></sa-td>
+						<sa-td name="收款金额" prop="receiveAmountPlatform" ></sa-td>
+						<sa-td name="转账笔数" prop="transferCountPlatform" ></sa-td>
+						<sa-td name="转账金额" prop="transferAmountPlatform" ></sa-td>
+						<sa-td name="退款笔数" prop="refundCountPlatform" ></sa-td>
+						<sa-td name="退款金额" prop="refundAmountPlatform" ></sa-td>
+					</el-table-column>
+					<el-table-column label="微信平台"  align="center" style="background-color:#dddddd">
+						<sa-td name="收款笔数" prop="receiveCountWechat" ></sa-td>
+						<sa-td name="收款金额" prop="receiveAmountWechat" ></sa-td>
+						<sa-td name="转账笔数" prop="transferCountWechat" ></sa-td>
+						<sa-td name="转账金额" prop="transferAmountWechat" ></sa-td>
+						<sa-td name="退款笔数" prop="refundCountWechat" ></sa-td>
+						<sa-td name="退款金额" prop="refundAmountWechat" ></sa-td>
+					</el-table-column>
+					<sa-td name="对账结果" prop="result" type="enum" :jv="{0: '一致', 1: '不一致'}" ></sa-td>
+					<el-table-column label="操作" fixed="right"  width="80px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						billId: '',		// 账单ID 
+						billDate: '',		// 账单日期 
+						receiveCountPlatform: '',		// 平台收款笔数 
+						receiveAmountPlatform: '',		// 平台收款金额 
+						transferCountPlatform: '',		// 平台转账笔数 
+						transferAmountPlatform: '',		// 平台转账金额 
+						refundCountPlatform: '',		// 平台退款笔数 
+						refundAmountPlatform: '',		// 平台退款金额 
+						receiveCountWechat: '',		// 微信收款笔数 
+						receiveAmountWechat: '',		// 微信收款金额 
+						transferCountWechat: '',		// 微信转账笔数 
+						transferAmountWechat: '',		// 微信转账金额 
+						refundCountWechat: '',		// 微信退款笔数 
+						refundAmountWechat: '',		// 微信退款金额 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbTransportTradeBill/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('交易对账详情', 'tb-transport-trade-bill-info.html?id=' + data.billId, '900px', '600px');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-transport-trade-bill-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-transport-trade-bill-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/TbTransportTradeBill/delete?id=' + data.billId, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/TbTransportTradeBill/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 193 - 0
sa-view/tb-vehicle-audit/tb-vehicle-audit-list.html

@@ -0,0 +1,193 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/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>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+
+				<!-- ------------- 检索参数 ------------- -->
+				<!-- <div class="c-title">检索参数</div> -->
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="车牌" v-model="p.vehiclePlate" width="80"></sa-item>
+					<sa-item type="text" name="品牌型号" v-model="p.vehicleModel" width="80"></sa-item>
+					<sa-item type="text" name="所有人" v-model="p.owner"></sa-item>
+					<!--<sa-item type="text" name="车辆类型" v-model="p.vehicleType" width="90px">
+						<el-select v-model="p.vehicleType">
+							<el-option label="微型货车" value="0"></el-option>
+							<el-option label="轻型货车" value="1"></el-option>
+							<el-option label="中型货车" value="2"></el-option>
+							<el-option label="重型货车" value="3"></el-option>
+						</el-select> 
+					</sa-item>-->
+					
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button icon="el-icon-refresh" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+				<!--<div class="fast-btn">
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+					<el-button size="mini" type="danger" @click="deleteByIds()">批量审核</el-button>
+					<el-button size="mini" type="success" @click="exportFile()">导出</el-button>
+				</div>-->
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+					<sa-td type="selection"></sa-td>
+					<sa-td name="车牌" prop="vehiclePlate" ></sa-td>
+					<sa-td  name="所属" prop="ownership" type="enum" :jv="{'self': '自有', 'affiliated': '挂靠'}"></sa-td>
+					<sa-td name="所有人" prop="owner" width="180px"></sa-td>
+					<sa-td name="品牌型号" prop="vehicleModel" width="150px"></sa-td>
+					<sa-td name="车辆类型" prop="vehicleTypeName" ></sa-td>
+					<sa-td name="年检有效期" prop="validityPeriod"  width="120px"></sa-td>
+					<sa-td name="颜色" prop="color" ></sa-td>
+					<sa-td name="轴数" prop="axle" ></sa-td>
+					<sa-td name="载重(t)" prop="vehicleLoad" ></sa-td>
+					<!--<sa-td name="容积" prop="volume" ></sa-td>-->
+
+					<sa-td name="注册时间" width="150px" prop="createTime"></sa-td>
+					<sa-td name="审核状态" prop="auditStatus" type="enum" :jv="{0: '待审核', 3: '审核中', 1: '已审核', 2: '审核不通过'}"></sa-td>					
+					<sa-td name="审核时间" width="150px" prop="auditTime"></sa-td>
+					<el-table-column label="操作" fixed="right"  width="150px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
+							<el-button v-if="sa.isAuth('tb-vehicle-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="audit(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>
+			<!-- 上传文件 -->
+			<input ref="fileInput" type="file" style="display: none;" @click="handleFile(event)"></input>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数
+						// id: '',		// 主键
+						vehiclePlate: '',		// 车牌
+						owner: '',		// 所有人
+						vehicleType: '',		// 车辆类型
+						parentId: '',		// 类型父id
+						vehicleSize: '',		// 车辆尺寸
+						vehicleModel: '',		// 车辆品牌型号
+						auditStatus:'',		    // 审核状态
+						//vehicleLoad: '',		// 核定载质量
+						//vehicleWeight: '',		// 车辆自重
+						// createBy: '',		// 创建者id
+						// createName: '',		// 创建者姓名
+						// updateBy: '',		// 更新者id
+						// updateName: '',		// 更新者名称
+						// auditStatus: '',		// 审核状态(0=待审核,1=已通过,2=不通过)
+						// auditBy: '',		// 审核人
+						// nopassReason: '',		// 审核不通过原因
+						// auditTime: '',		// 审核时间
+						pageNo: 1,		// 当前页
+						pageSize: 10,	// 页大小
+						sortType: 0		// 排序方式
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合
+
+
+				},
+				methods: {
+
+					// 刷新
+					f5: function() {
+
+						sa.ajax('/transport-server/TbVehicle/getWaitAuditList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数
+							sa.f5TableHeight();		// 刷新表格高度
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('车辆详情', '../tb-vehicle/tb-vehicle-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 审核
+					audit: function(data) {
+						sa.ajax('/transport-server/TbVehicle/startAudit?id='+data.id, function(res) {
+							sa.showIframe('车辆审核', 'tb-vehicle-audit.html?id=' + data.id, '1000px', '90%');
+						}.bind(this))
+						
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('添加车辆', 'tb-vehicle-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbVehicle/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbVehicle/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度
+							}.bind(this))
+						}.bind(this));
+					},
+					exportFile(){
+						sa.ajax('/transport-server/TbVehicle/vehicleOutport', {}, function(res){})
+					},
+					importMsg(){
+						this.$refs.fileInput.click()
+						console.log("导入")
+					},
+					handleFile(event){
+						// console.log(event)
+						const file = event.target.files[0]
+						sa.ajax('/transport-server/TbVehicle/vehicleImport', {file}, function(res){})
+					}
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 269 - 0
sa-view/tb-vehicle-audit/tb-vehicle-audit.html

@@ -0,0 +1,269 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/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 .el-input,
+			.c-panel .el-form .el-textarea__inner {
+				width: 250px;
+			}
+
+			table {
+				font-family: arial, sans-serif;
+				border-collapse: collapse;
+				width: 100%;
+				margin-top: 22px;
+				margin-bottom: 22px;
+				margin-left: auto;
+				margin-right: auto;
+			}
+
+			th {
+				border: 1px solid darkgray;
+				text-align: left;
+				width: 15%;
+				height: 22px;
+				padding: 8px;
+				background-color: #dddddd;
+			}
+
+			td {
+				border: 1px solid darkgray;
+				text-align: left; 
+				padding: 8px;
+			}
+
+			.image-box {
+				display: flex;
+			}
+		</style>
+	</head>
+
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<div class="c-title">车辆审核</div>
+					<el-form v-if="m">
+						<h3>车辆基本信息</h3>
+						<table>
+							<tr>
+								<th>车牌号</th>
+								<td>{{m.vehiclePlate || '-'}}</td>
+								<th>车辆颜色</th>
+								<td>{{m.color || '-'}}</td>
+							</tr>
+							<tr>
+								<th>车架号</th>
+								<td>{{m.vin || '-'}}</td>
+								<th>发动机号</th>
+								<td>{{m.engineNo || '-'}}</td>
+							</tr>
+							<tr>
+								<th>品牌型号</th>
+								<td>{{m.vehicleModel || '-'}}</td>
+								<th>车辆类型</th>
+								<td>{{m.vehicleTypeName || '-'}}</td>
+							</tr>
+							<tr>
+								<th>车辆轴数</th>
+								<td>{{m.axle || '-'}}</td>
+								<th>车辆载重</th>
+								<td>{{m.vehicleLoad || '-'}}</td>
+							</tr>
+							<tr>
+								<th>车辆尺寸</th>
+								<td>{{m.vehicleSize || '-'}}</td>
+								<th>车厢容积</th>
+								<td>{{m.volume || '-'}}</td>
+							</tr>
+							<tr>
+								<th>年检有效期至</th>
+								<td>{{m.validityPeriod || '-'}}</td>
+								<th>更新时间</th>
+								<td>{{m.updateTime || '-'}}</td>
+							</tr>
+							<tr>
+								<th>车辆正面照</th>
+								<td>
+									<sa-info type="img-list" :value="m.carImg"></sa-info>
+								</td>
+								<th>行驶证照</th>
+								<td>
+									<sa-info type="img-list" :value="m.licenseImg"></sa-info>
+								</td>
+							</tr>
+							<tr>
+								<th>年检证照</th>
+								<td colspan="3">
+									<sa-info type="img-list" :value="m.inspectionImg"></sa-info>
+								</td>
+							</tr>
+						</table>
+
+						<h3>车辆所有人信息</h3>
+						<table>
+							<tr>
+								<th>车辆所属</th>
+								<td>
+									<span v-if="m.ownership == 'self'">自有</span>
+									<span v-else-if="m.ownership == 'affiliated'">挂靠</span>
+									<span v-else>-</span>
+								</td>
+								<th><span v-if="m.ownership=='affiliated'">公司名称</span><span v-else>车主姓名</span></th>
+								<td>{{m.owner || '-'}}</td>
+							</tr>
+							<tr v-if="m.ownership=='affiliated'">
+								<th>公司法人</th>
+								<td>{{m.legalPerson || '-'}}</td>
+								<th>联系方式</th>
+								<td>{{m.ownerPhone || '-'}}</td>
+							</tr>
+							<tr v-if="m.ownership=='affiliated'">
+								<th>统一社会征信码</th>
+								<td>{{m.ownerCert || '-'}}</td>
+								<th>营业执照</th>
+								<td>
+									<sa-info type="img-list" :value="m.ownerLicense"></sa-info>
+								</td>
+							</tr>
+							<tr v-if="m.ownership=='self'">
+								<th>联系方式</th>
+								<td>{{m.ownerPhone || '-'}}</td>
+								<th>身份证号</th>
+								<td>{{m.ownerCert || '-'}}</td>
+							</tr>
+						</table>
+
+						<h3>车辆注册审核</h3>
+						<table>
+							<tr>
+								<th><label style="color: red">*</label>审核结果</th>
+								<td colspan="3">
+									<el-select v-model="audit.auditStatus" placeholder="请选择审核结果" size="mini">
+										<el-option label="审核通过" value="1"></el-option>
+										<el-option label="审核不通过" value="2"></el-option>
+									</el-select>
+								</td>
+							</tr>
+							<tr>
+								<th><label style="color: red">*</label>审核意见</th>
+								<td  colspan="3">
+									<el-input v-model="audit.nopassReason" type="textarea" :rows="2"
+										placeholder="请输入审核意见" size="mini"></el-input>
+								</td>
+							</tr>
+						</table>
+
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue'),
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0), // 获取超链接中的id参数(0=添加,非0=修改)
+					m: null,
+					audit: {
+						id: sa.p('id', 0),
+						auditStatus: '',
+						nopassReason: ''
+					}, // 实体对象
+				},
+				methods: {
+					// 创建一个 默认Model
+					createModel: function() {
+						return {
+							vehiclePlate: '', // 车牌
+							owner: '', // 所有人
+							vehicleType: '', // 车辆类型
+							// parentId: '',		// 类型父id
+							vehicleSize: '', // 车辆尺寸
+							vehicleModel: '', // 车辆品牌型号
+							vehicleLoad: '', // 核定载质量
+							vehicleWeight: '', // 车辆自重
+							auditStatus: '', // 审核状态(0=待审核,1=已通过,2=不通过)
+							// auditBy: '',		// 审核人
+							nopassReason: '', // 审核不通过原因
+							// auditTime: '',		// 审核时间
+						}
+					},
+					// 提交数据
+					ok: function() {
+						// 表单校验
+						let m = this.audit;
+
+
+						sa.checkNull(m.auditStatus, '请选择 [审核结果]');
+						sa.checkNull(m.nopassReason, '请输入 [审核意见]');
+
+
+						sa.ajax('/transport-server/TbVehicle/submitAudit', m, function(res) {
+							sa.alert('审核成功', this.clean);
+							//parent.app.f5();		// 刷新父页面列表
+						}.bind(this));
+
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if (this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5(); // 刷新父页面列表
+							sa.closeCurrIframe(); // 关闭本页
+						}
+					}
+				},
+				mounted: function() {
+					// 初始化数据
+					if (this.id <= 0) {
+						this.m = this.createModel();
+						this.audit.auditStatus = '';
+						this.audit.nopassReason = '';
+					} else {
+						sa.ajax('/transport-server/TbVehicle/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							this.m.vehicleType = res.data.vehicleType + '';
+							this.audit.auditStatus = '';
+							this.audit.nopassReason = '';
+							if (res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+		</script>
+	</body>
+
+</html>

+ 167 - 0
sa-view/tb-vehicle/tb-driver-bind.html

@@ -0,0 +1,167 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/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>
+
+<body>
+	<div class="vue-box" style="display: none;" :style="'display: block;'">
+		<div class="c-panel">
+			<!-- ------------- 检索参数 ------------- -->
+			<!-- <div class="c-title">检索参数</div> -->
+			<el-form ref="form" :model='p' @submit.native.prevent>
+				<sa-item type="text" name="姓名" v-model="p.name"></sa-item>
+				<sa-item type="text" name="手机号" v-model="p.phone"></sa-item>
+				<sa-item type="text" name="身份证号" v-model="p.idCard" width="90px"></sa-item>
+				<sa-item name="审核状态" width="90px">
+					<el-select v-model="p.auditStatus">
+						<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>
+				</sa-item>
+				<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+				<el-button icon="el-icon-refresh" type="info" @click="sa.f5()">重置</el-button>
+			</el-form>
+	
+
+			<!-- ------------- 数据列表 ------------- -->
+			<el-table class="data-table" ref="data-table" :data="dataList">
+				
+				<sa-td name="姓名" prop="name"></sa-td>				
+				<sa-td name="性别" prop="sex" type="enum" :jv="{1: '男', 2: '女'}"></sa-td>
+				<sa-td name="出生年月" width="100px" prop="birthday" ></sa-td>
+				<sa-td name="身份证号" width="170px" prop="idCard"></sa-td>
+				<sa-td name="手机号" width="110px" prop="phone"></sa-td>
+				<sa-td name="联系地址" width="150px" prop="address"></sa-td>				
+				
+				<!-- <sa-td name="身份证照片" prop="idCardImg" type="img-list"></sa-td> 
+				<sa-td name="驾驶证号" prop="drivingLicenseId"></sa-td>-->
+				<sa-td name="驾照类型" prop="driverTypeName"  ></sa-td> 
+				<sa-td name="驾驶证照片" prop="drivingLicenseImg" type="img-list"></sa-td>
+				<!-- <sa-td name="车辆行驶证号" prop="vehicleDrivingId" width="120px"></sa-td>
+				<sa-td name="车辆行驶证照片" prop="vehicleDrivingImg" type="img-list"></sa-td>
+				<sa-td name="车辆前脸照" prop="vehicleImg" type="img-list"></sa-td>
+				-->
+				<sa-td name="注册时间" width="140px" prop="registerTime"></sa-td>
+				<sa-td name="审核状态" prop="auditStatus" type="enum" :jv="{0: '待审核', 1: '已审核', 2: '审核不通过'}"></sa-td> 
+				<!--<sa-td name="审核状态" prop="auditStatus"></sa-td>-->
+				<sa-td name="审核时间" width="140px" prop="auditTime"></sa-td>
+				<el-table-column label="操作" fixed="right" width="80px">
+					<template slot-scope="s">
+						
+						<el-button v-if="sa.isAuth('tb-driver-edit')" class="c-btn" type="primary" icon="el-icon-edit"
+							@click="handleBind(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>
+		<!-- 上传文件 -->
+		<input ref="fileInput" type="file" style="display: none;" @click="handleFile(event)"></input>
+	</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: {
+				vehicleId: sa.p('id', 0),	// 获取车辆ID
+				p: { // 查询参数
+					name: '',		// 姓名
+					phone: '',		// 手机号
+					idCard: '',		// 身份证号
+					pageNo: 1,		// 当前页
+					pageSize: 10,	// 页大小
+					sortType: 0		// 排序方式
+				},
+				dataCount: 0,
+				dataList: [], // 数据集合
+			},
+			methods: {
+				// 刷新
+				f5: function () {
+					sa.ajax('/transport-server/TbDriver/getNotBindCarDriverList', sa.removeNull(this.p), function (res) {
+						res.data.forEach(element => {
+							element.idCard = element.idCard.toString().replace(/^(.{4})(?:\w+)(.{4})$/,'$1****$2')
+						});
+						this.dataList = res.data; // 数据
+						this.dataCount = res.dataCount; // 数据总数
+						sa.f5TableHeight();		// 刷新表格高度
+					}.bind(this));
+				},
+				// 查看
+				get: function (data) {
+					sa.showIframe('司机详情', 'tb-driver-info.html?id=' + data.id, '1050px', '90%');
+				},
+				// 查看 - 根据选中的
+				getBySelect: function (data) {
+					var selection = this.$refs['data-table'].selection;
+					if (selection.length == 0) {
+						return sa.msg('请选择一条数据')
+					}
+					this.get(selection[0]);
+				},
+				// 执行绑定
+				handleBind: function (data) { 
+					let param = {"id": this.vehicleId, "driverId":data.id};
+					sa.confirm('确定要绑定该司机吗?', function() {
+						sa.ajax('/transport-server/TbVehicle/bindDriver' ,  param, function(res) {
+							//sa.arrayDelete(this.dataList, data);
+							sa.ok('绑定成功', this.clean);
+							sa.alert('绑定成功', this.clean);
+							//sa.f5TableHeight();		// 刷新表格高度
+						}.bind(this))
+					}.bind(this));
+				},
+			
+				// 添完成后的动作
+				clean: function() {
+					if(this.id == 0) {
+						this.m = this.createModel();
+					} else {
+						parent.app.f5();		// 刷新父页面列表
+						sa.closeCurrIframe();	// 关闭本页
+					}
+				},
+				
+				handleFile(event) {
+					console.log(event)
+					const file = event.target.files[0]
+					sa.ajax('/transport-server/TbDriver/driverImport', { file }, function (res) {
+						// sa.ok('导入成功');
+						// sa.f5TableHeight();
+					})
+				},
+			},
+			created: function () {
+				this.f5();
+				sa.onInputEnter();
+			}
+		})
+	</script>
+</body>
+
+</html>

+ 222 - 52
sa-view/tb-vehicle/tb-vehicle-add.html

@@ -14,10 +14,37 @@
 		<script src="../../static/kj/layer/layer.js"></script>
 		<script src="../../static/sa.js"></script>
 		<script src="../../static/kj/upload-util.js"></script>
+		<script src="../../static/kj/validator.js"></script>
 
 		<style type="text/css">
-			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .c-label{width: 9em !important;}
 			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+
+			table {
+				font-family: arial, sans-serif;
+				border-collapse: collapse;
+				width: 100%;
+				margin-top: 22px;
+				margin-bottom: 22px;
+				margin-left: auto;
+				margin-right: auto;
+			}
+
+			th {
+				border: 1px solid darkgray;
+				text-align: left;
+				height: 22px;
+				padding: 8px;
+				background-color: #dddddd;
+			}
+
+			td {
+				border: 1px solid darkgray;
+				text-align: left;
+				padding: 8px;
+			}
+			.image-box{ display: flex;}
+			
 		</style>
 	</head>
 	<body>
@@ -28,38 +55,133 @@
                     <div class="c-title" v-if="id == 0">数据添加</div>
 					<div class="c-title" v-else>数据修改</div>
 					<el-form v-if="m">
-						<el-row :gutter="50">
-							<el-col :span="12">
-								<sa-item type="text" name="车牌" v-model="m.vehiclePlate" br></sa-item>
-							</el-col>
-							<el-col :span="12">
-								<sa-item type="text" name="所有人" v-model="m.owner" br></sa-item>
-							</el-col>
-						</el-row>
-
-						<el-row :gutter="50">
-							<el-col :span="12">
-								<sa-item type="text" name="车辆类型" v-model="m.vehicleType" br></sa-item>
-							</el-col>
-							<el-col :span="12">
-								<sa-item type="text" name="车辆尺寸" v-model="m.vehicleSize" br></sa-item>
-							</el-col>
-						</el-row>
-
-						<el-row :gutter="50">
-							<el-col :span="12">
-								<sa-item type="text" name="车辆品牌型号" v-model="m.vehicleModel" br></sa-item>
-							</el-col>
-							<el-col :span="12">
-								<sa-item type="text" name="核定载质量" v-model="m.vehicleLoad" br></sa-item>
-							</el-col>
-						</el-row>
-
-						<el-row :gutter="50">
-							<el-col :span="12">
-								<sa-item type="text" name="车辆自重" v-model="m.vehicleWeight" br></sa-item>
-							</el-col>
-						</el-row>
+						<h3>车辆基本信息</h3> 
+						<table>
+							<tr>
+								<th><label style="color: red">*</label>车牌号</th>
+								<td>
+									<el-input size="mini" v-model="m.vehiclePlate"></el-input>
+								</td>
+								<th>颜色</th>
+								<td>
+									<el-input size="mini" v-model="m.color"></el-input>
+								</td>
+							</tr>
+							<tr>
+								<th><label style="color: red">*</label>车架号</th>
+								<td>
+									<el-input size="mini" v-model="m.vin"></el-input>
+								</td>
+								<th><label style="color: red">*</label>发动机号</th>
+								<td>
+									<el-input size="mini" v-model="m.engineNo"></el-input>
+								</td>
+							</tr>
+							<tr>
+								<th><label style="color: red">*</label>品牌型号</th>
+								<td>
+									<el-input size="mini" v-model="m.vehicleModel"></el-input>
+								</td>
+								<th><label style="color: red">*</label>车辆类型</th>
+								<td>
+									<el-select v-model="m.vehicleType" placeholder="请选择" filterable size="mini">
+										<el-option v-for="(item,index) in catList" :key="item.id" :label="item.dictName" :value="item.id"> </el-option>
+									</el-select>
+								</td>
+							</tr>
+							<tr>
+								<th><label style="color: red">*</label>轴数</th>
+								<td>
+									<el-input size="mini" v-model="m.axle"></el-input>
+								</td>
+								<th><label style="color: red">*</label>载重(t)</th>
+								<td>
+									<el-input size="mini" v-model="m.vehicleLoad"></el-input>
+								</td>
+							</tr>
+							<tr>
+								<th><label style="color: red">*</label>尺寸(m)</th>
+								<td>
+									<el-input size="mini" v-model="m.vehicleSize"></el-input>
+								</td>
+								<th><label style="color: red">*</label>容积</th>
+								<td>
+									<el-input size="mini" v-model="m.volume"></el-input>
+								</td>
+							</tr>
+							<tr>
+								<th><label style="color: red">*</label>年检有效期至</th>
+								<td colspan="3">
+									<el-date-picker
+										v-model="m.validityPeriod"
+										type="date"
+										format="yyyy-MM-dd"
+										value-format="yyyy-MM-dd"
+										placeholder="请选择日期" >
+									</el-date-picker>
+								</td>
+							</tr>
+							<tr>
+								<th><label style="color: red">*</label>车辆正面照</th>
+								<td>
+									<sa-item type="img-list" v-model="m.carImg"></sa-item>
+								</td>
+								<th><label style="color: red">*</label>行驶证照</th>
+								<td>
+									<sa-item type="img-list" v-model="m.licenseImg"></sa-item>
+								</td>
+							</tr>
+							<tr>
+								<th><label style="color: red">*</label>年检证照</th>
+								<td colspan="3">
+									<sa-item type="img-list" v-model="m.inspectionImg"></sa-item>
+								</td>
+							</tr>
+						</table>
+
+						<h3>车辆所有人信息</h3> 
+						<table>
+							<tr>
+								<th><label style="color: red">*</label>所属</th>
+								<td>
+									<sa-item type="enum" v-model="m.ownership" :jv="{'self': '自有', 'affiliated': '挂靠'}" jtype="3"></sa-item>
+								</td>
+								<th><label style="color: red">*</label><span v-if="m.ownership=='affiliated'">公司名称</span><span v-else>车主姓名</span></th>
+								<td>
+									<el-input size="mini" v-model="m.owner"></el-input>
+								</td>
+							</tr>
+							<tr v-if="m.ownership=='affiliated'">
+								<th><label style="color: red">*</label>公司法人</th>
+								<td>
+									<el-input size="mini" v-model="m.legalPerson"></el-input>
+								</td>
+								<th><label style="color: red">*</label>联系电话</th>
+								<td>
+									<el-input size="mini" v-model="m.ownerPhone"></el-input>
+								</td>
+							</tr>
+							<tr v-if="m.ownership=='affiliated'">
+								<th><label style="color: red">*</label>统一社会征信码</th>
+								<td>
+									<el-input size="mini" v-model="m.ownerCert"></el-input>
+								</td>
+								<th><label style="color: red">*</label>营业执照</th>
+								<td>
+									<sa-item type="img-list" v-model="m.ownerLicense"></sa-item>
+								</td>
+							</tr>
+							<tr v-if="m.ownership=='self'">
+								<th><label style="color: red">*</label>联系电话</th>
+								<td>
+									<el-input size="mini" v-model="m.ownerPhone"></el-input>
+								</td>
+								<th><label style="color: red">*</label>身份证号</th>
+								<td>
+									<el-input size="mini" v-model="m.ownerCert"></el-input>
+								</td>
+							</tr>
+						</table>
 
 						<!-- <sa-item type="text" name="类型父id" v-model="m.parentId" br></sa-item> -->
 					
@@ -89,6 +211,7 @@
 				data: {
 					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改)
 					m: null,		// 实体对象
+					catList: [], //车型
 				},
 				methods: {
 					// 创建一个 默认Model
@@ -98,45 +221,90 @@
 							owner: '',		// 所有人
 							vehicleType: '',		// 车辆类型
 							// parentId: '',		// 类型父id
+							axle: '',		// 轴数
 							vehicleSize: '',		// 车辆尺寸
 							vehicleModel: '',		// 车辆品牌型号
 							vehicleLoad: '',		// 核定载质量
 							vehicleWeight: '',		// 车辆自重
+							volume: '',		// 容积
 							// auditStatus: '',		// 审核状态(0=待审核,1=已通过,2=不通过)
 							// auditBy: '',		// 审核人
 							// nopassReason: '',		// 审核不通过原因
 							// auditTime: '',		// 审核时间
 						}
 					},
+					// 车型列表
+					getCatList() {
+						sa.ajax('/transport-server/TbDictInfo/getList', {
+							code:'vehicle_type',
+							pageSize: 100,
+							pageNo: 1
+						}, function(resp) {
+							let list=resp.data;
+							this.catList = list;
+						}.bind(this));
+					},
 					// 提交数据
 					ok: function(){
 						// 表单校验
 						let m = this.m;
-						sa.checkNull(m.vehiclePlate, '请输入 [车牌]');
-						sa.checkNull(m.owner, '请输入 [所有人]');
-						sa.checkNull(m.vehicleType, '请输入 [车辆类型]');
-						// sa.checkNull(m.parentId, '请输入 [类型父id]');
-						sa.checkNull(m.vehicleSize, '请输入 [车辆尺寸]');
-						sa.checkNull(m.vehicleModel, '请输入 [车辆品牌型号]');
-						sa.checkNull(m.vehicleLoad, '请输入 [核定载质量]');
-						sa.checkNull(m.vehicleWeight, '请输入 [车辆自重]');
-						// sa.checkNull(m.deleteStatus, '请输入 [删除状态]');
-						// sa.checkNull(m.auditStatus, '请输入 [审核状态]');
-						// sa.checkNull(m.auditBy, '请输入 [审核人]');
-						// sa.checkNull(m.nopassReason, '请输入 [审核不通过原因]');
-						// sa.checkNull(m.auditTime, '请输入 [审核时间]');
-
-						// 开始增加或修改
-						this.m.createTime = undefined;		// 不提交属性:创建时间
-						this.m.updateTime = undefined;		// 不提交属性:更新时间
+						sa.checkNull(m.vehiclePlate, '请输入 [车牌号]');
+
+						if(!validatePlate(m.vehiclePlate)){
+							sa.errorMsg('请输入正确的车牌号');
+							return;
+						}
+
+						sa.checkNull(m.vin, '请输入 [车架号]');
+						sa.checkNull(m.engineNo, '请输入 [发动机号]');
+
+						sa.checkNull(m.vehicleModel, '请输入 [品牌型号]');
+						sa.checkNull(m.vehicleType, '请选择 [车辆类型]');
+						sa.checkInt(m.axle, '请输入正确的 [轴数],轴数必须是正整数'); 
+						sa.checkPositive(m.vehicleLoad, '请输入 [载重],载重必须是正数');
+						sa.checkPositive(m.vehicleSize, '请输入正确的 [尺寸],尺寸必须是正数');
+						sa.checkPositive(m.volume, '请输入正确的 [容积],容积必须是正数');
+
+						sa.checkNull(m.validityPeriod, '请填写 [年检有效期]');
+
+						sa.checkNull(m.carImg, '请上传 [车辆正面照]');
+						sa.checkNull(m.licenseImg, '请上传 [行驶证照]');
+						sa.checkNull(m.inspectionImg, '请上传 [年检证照]');
+
+						sa.checkNull(m.ownership, '请选择车辆所属[自有还是挂靠]');
+
+						sa.checkNull(m.ownerPhone, '请输入 [联系电话]');
+						if(validatePhone(m.ownerPhone)==false){
+							sa.errorMsg('联系电话格式不正确'); return;
+						}
+
+						if(m.ownership=='self'){
+							sa.checkNull(m.owner, '请输入 [车主姓名]');
+							sa.checkNull(m.ownerCert, '请输入 [身份证号]');
+
+							if(validateIDCard(m.ownerCert)==false){
+								sa.errorMsg('身份证号格式不正确'); return;
+							}
+						}else {
+							sa.checkNull(m.owner, '请输入 [公司名称]');
+							sa.checkNull(m.legalPerson, '请输入 [公司法人]');
+							sa.checkNull(m.ownerCert, '请输入 [统一社会征信码]');
+							sa.checkNull(m.ownerLicense, '请上传 [营业执照]');
+						}
+
+
 						if(this.id <= 0) {	// 添加
 							sa.ajax('/transport-server/TbVehicle/add', m, function(res){
 								sa.alert('增加成功', this.clean);
 							}.bind(this));
 						} else {	// 修改
-							sa.ajax('/transport-server/TbVehicle/update', m, function(res){
-								sa.alert('修改成功', this.clean);
+							sa.confirm('信息修改后需要重新审核,您确定要修改吗?', function () {
+								sa.ajax('/transport-server/TbVehicle/update', m, function(res){
+									sa.alert('信息已修改,待审核', this.clean);
+								}.bind(this));
+
 							}.bind(this));
+
 						}
 					},
 					// 添加/修改 完成后的动作
@@ -150,12 +318,14 @@
 					}
 				},
 				mounted: function(){
+					this.getCatList();
 					// 初始化数据
 					if(this.id <= 0) {
 						this.m = this.createModel();
 					} else {
 						sa.ajax('/transport-server/TbVehicle/getById?id=' + this.id, function(res) {
 							this.m = res.data;
+							this.m.vehicleType = res.data.vehicleType+'';
 							if(res.data == null) {
 								sa.alert('未能查找到 id=' + this.id + " 详细数据");
 							}

+ 199 - 93
sa-view/tb-vehicle/tb-vehicle-info.html

@@ -1,102 +1,208 @@
 <!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="https://unpkg.com/element-ui@2.13.0/lib/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 .c-label{width: 8em;}
-		</style>
-	</head>
-	<body>
-		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
-			<!-- ------- 内容部分 ------- -->
-			<div class="s-body">
-				<div class="c-panel">
-					<el-form v-if="m">
+<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="https://unpkg.com/element-ui@2.13.0/lib/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>
 
-						<el-row :gutter="50">
-							<el-col :span="12">
-								<sa-info name="车牌" br>{{m.vehiclePlate}}</sa-info>
-							</el-col>
-							<el-col :span="12">
-								<sa-info name="所有人" br>{{m.owner}}</sa-info>
-							</el-col>
-						</el-row>
+	<style type="text/css">
+		.c-panel .c-label {
+			width: 8em;
+		}
 
-						<el-row :gutter="50">
-							<el-col :span="12">
-								<sa-info name="车辆类型" br>{{m.vehicleType}}</sa-info>
-							</el-col>
-							<el-col :span="12">
-								<sa-info name="车辆尺寸" br>{{m.vehicleSize}}</sa-info>
-							</el-col>
-						</el-row>
-						
-						<!-- <sa-info name="类型父id" br>{{m.parentId}}</sa-info> -->
+		table {
+			font-family: arial, sans-serif;
+			border-collapse: collapse;
+			width: 100%;
+			margin-top: 22px;
+			margin-bottom: 22px;
+			margin-left: auto;
+			margin-right: auto;
+		}
 
-						<el-row :gutter="50">
-							<el-col :span="12">
-								<sa-info name="车辆品牌型号" br>{{m.vehicleModel}}</sa-info>
-							</el-col>
-							<el-col :span="12">
-								<sa-info name="核定载质量" br>{{m.vehicleLoad}}</sa-info>
-							</el-col>
-						</el-row>
-						
-						<el-row :gutter="50">
-							<el-col :span="12">
-								<sa-info name="车辆自重" br>{{m.vehicleWeight}}</sa-info>
-							</el-col>
-						</el-row>
-						
-						<!-- <sa-info type="enum" name="审核状态" :value="m.auditStatus" :jv="{0: '待审核,1'}" br></sa-info>
-						<sa-info name="审核人" br>{{m.auditBy}}</sa-info>
-						<sa-info name="审核不通过原因" br>{{m.nopassReason}}</sa-info>
-						<sa-info name="审核时间" br>{{m.auditTime}}</sa-info> -->
-					</el-form>
-				</div>
-			</div>
-			<!-- ------- 底部按钮 ------- -->
-			<div class="s-foot">
-				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
-				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+		th {
+			border: 1px solid darkgray;
+			text-align: left;
+			width: 15%;
+			height: 22px;
+			padding: 8px;
+			background-color: #dddddd;
+		}
+
+		td {
+			border: 1px solid darkgray;
+			text-align: left;
+			width: 35%;
+			padding: 8px;
+		}
+
+		.image-box {
+			display: flex;
+		}
+	</style>
+</head>
+
+<body>
+	<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+		<!-- ------- 内容部分 ------- -->
+		<div class="s-body">
+			<div class="c-panel">
+				<el-form v-if="m">
+					<h3>车辆基本信息</h3>
+					<table>
+						<tr>
+							<th>车牌号</th>
+							<td>{{m.vehiclePlate || '-'}}</td>
+							<th>车辆颜色</th>
+							<td>{{m.color || '-'}}</td>
+						</tr>
+						<tr>
+							<th>车架号</th>
+							<td>{{m.vin || '-'}}</td>
+							<th>发动机号</th>
+							<td>{{m.engineNo || '-'}}</td>
+						</tr>
+						<tr>
+							<th>品牌型号</th>
+							<td>{{m.vehicleModel || '-'}}</td>
+							<th>车辆类型</th>
+							<td>{{m.vehicleTypeName || '-'}}</td>
+						</tr>
+						<tr>
+							<th>车辆轴数</th>
+							<td>{{m.axle || '-'}}</td>
+							<th>车辆载重</th>
+							<td>{{m.vehicleLoad || '-'}}</td>
+						</tr>
+						<tr>
+							<th>车辆尺寸</th>
+							<td>{{m.vehicleSize || '-'}}</td>
+							<th>车厢容积</th>
+							<td>{{m.volume || '-'}}</td>
+						</tr>
+						<tr>
+							<th>年检有效期至</th>
+							<td>{{m.validityPeriod || '-'}}</td>
+							<th>注册时间</th>
+							<td>{{m.createTime || '-'}}</td>
+						</tr>
+						<tr>
+							<th>车辆正面照</th>
+							<td colspan="3">
+								<sa-info type="img-list" :value="m.carImg"></sa-info>
+							</td>
+						</tr>
+						<tr>
+							<th>行驶证照</th>
+							<td>
+								<sa-info type="img-list" :value="m.licenseImg"></sa-info>
+							</td>
+							<th>年检证照</th>
+							<td>
+								<sa-info type="img-list" :value="m.inspectionImg"></sa-info>
+							</td>
+						</tr>
+					</table>
+
+					<h3>车辆所有人信息</h3>
+					<table>
+						<tr>
+							<th>车辆所属</th>
+							<td>
+								<span v-if="m.ownership == 'self'">自有</span>
+								<span v-else-if="m.ownership == 'affiliated'">挂靠</span>
+								<span v-else>-</span>
+							</td>
+							<th><span v-if="m.ownership=='affiliated'">公司名称</span><span v-else>车主姓名</span></th>
+							<td>{{m.owner || '-'}}</td>
+						</tr>
+						<tr v-if="m.ownership=='affiliated'">
+							<th>公司法人</th>
+							<td>{{m.legalPerson || '-'}}</td>
+							<th>联系方式</th>
+							<td>{{m.ownerPhone || '-'}}</td>
+						</tr>
+						<tr v-if="m.ownership=='affiliated'">
+							<th>统一社会征信码</th>
+							<td>{{m.ownerCert || '-'}}</td>
+							<th>营业执照</th>
+							<td>
+								<sa-info type="img-list" :value="m.ownerLicense"></sa-info>
+							</td>
+						</tr>
+						<tr v-if="m.ownership=='self'">
+							<th>联系方式</th>
+							<td>{{m.ownerPhone || '-'}}</td>
+							<th>身份证号</th>
+							<td>{{m.ownerCert || '-'}}</td>
+						</tr>
+					</table>
+
+					<h3>车辆审核信息</h3>
+					<table>
+						<tr>
+							<th>审核状态</th>
+							<td>
+								<span v-if="m.auditStatus == 0">待审核</span>
+								<span v-else-if="m.auditStatus == 1">审核通过</span>
+								<span v-else-if="m.auditStatus == 2">审核不通过</span>
+								<span v-else-if="m.auditStatus == 3">审核中</span>
+								<span v-else>-</span>
+							</td>
+							<th>审核意见</th>
+							<td>{{m.nopassReason || '-'}}</td>
+						</tr>
+						<tr>
+							<th>审核人</th>
+							<td>{{m.auditBy || '-'}}</td>
+							<th>审核时间</th>
+							<td>{{m.auditTime || '-'}}</td>
+						</tr>
+					</table>
+				</el-form>
 			</div>
 		</div>
-		<script>
-			var app = new Vue({
-				components: {
-					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
-				},
-				el: '.vue-box',
-				data: {
-					id: sa.p('id', 0),	// 获取数据ID
-					m: null
-				},
-				methods: {
-				},
-				mounted: function() {
-					sa.ajax('/transport-server/TbVehicle/getById?id=' + this.id, function(res) {
-						this.m = res.data;
-						console.log(res.data)
-						if(res.data == null) {
-							sa.alert('未能查找到 id=' + this.id + " 详细数据");
-						}
-					}.bind(this))
-				}
-			})
+		<!-- ------- 底部按钮 ------- -->
+		<div class="s-foot">
+			<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+			<el-button @click="sa.closeCurrIframe()">取消</el-button>
+		</div>
+	</div>
+	<script>
+		var app = new Vue({
+			components: {
+				"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+			},
+			el: '.vue-box',
+			data: {
+				id: sa.p('id', 0),	// 获取数据ID
+				m: null
+			},
+			methods: {
+			},
+			mounted: function () {
+				sa.ajax('/transport-server/TbVehicle/getById?id=' + this.id, function (res) {
+					this.m = res.data;
+					console.log(res.data)
+					if (res.data == null) {
+						sa.alert('未能查找到 id=' + this.id + " 详细数据");
+					}
+				}.bind(this))
+			}
+		})
+
+	</script>
+</body>
 
-		</script>
-	</body>
-</html>
+</html>

+ 123 - 30
sa-view/tb-vehicle/tb-vehicle-list.html

@@ -19,43 +19,77 @@
 	<body>
 		<div class="vue-box" style="display: none;" :style="'display: block;'">
 			<div class="c-panel">
+				<el-tabs v-model="activeTab" type="card" @tab-click="handleTabClick">
+					<el-tab-pane
+							:key="item.nodeId"
+							v-for="(item, index) in orderStepTabs"
+							:label="item.nodeName"
+							:name="item.nodeId"
+					>
+						<span slot="label"><i class="el-icon-postcard"></i> {{item.nodeName}} ( {{item.nodeCount}} )</span>
+					</el-tab-pane>
+				</el-tabs>
+
 				<!-- ------------- 检索参数 ------------- -->
 				<!-- <div class="c-title">检索参数</div> -->
 				<el-form ref="form" :model='p' @submit.native.prevent>
-					<sa-item type="text" name="车牌" v-model="p.vehiclePlate"></sa-item>
+					<sa-item type="text" name="车牌" v-model="p.vehiclePlate" width="50px"></sa-item>
+					<sa-item type="text" name="品牌型号" v-model="p.vehicleModel" width="80"></sa-item>
 					<sa-item type="text" name="所有人" v-model="p.owner"></sa-item>
-					<sa-item type="text" name="车辆类型" v-model="p.vehicleType"></sa-item>
+					<!--<sa-item type="text" name="车辆类型" v-model="p.vehicleType" width="90px">
+						<el-select  v-model="p.vehicleType" placeholder="请选择" filterable size="mini">
+							<el-option v-for="(item,index) in catList" :key="item.id" :label="item.dictName" :value="item.id"> </el-option>
+						</el-select>
+					</sa-item>
+					<sa-item name="审核状态" width="90px">
+						<el-select v-model="p.auditStatus">
+							<el-option label="全部" value=""></el-option>
+							<el-option label="待审核" value="0"></el-option>
+							<el-option label="审核中" value="3"></el-option>
+							<el-option label="审核通过" value="1"></el-option>
+							<el-option label="审核不通过" value="2"></el-option>
+						</el-select>
+					</sa-item>-->
 					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
 					<el-button icon="el-icon-refresh" type="info" @click="sa.f5()">重置</el-button>
 				</el-form>
 				<div class="fast-btn">
 					<el-button v-if="sa.isAuth('tb-vehicle-add')" size="mini" type="primary" @click="add()">新增</el-button>
-					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
-					<!-- <el-button size="mini" type="info" @click="sa.f5()">重置</el-button> -->
-					<el-button size="mini" type="danger" @click="deleteByIds()">批量删除</el-button>
-					<el-button size="mini" type="primary" @click="importMsg()">导入</el-button>
+					<!-- <el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
 					<el-button size="mini" type="success" @click="exportFile()">导出</el-button>
+					<el-button size="mini" type="danger" @click="deleteByIds()">批量删除</el-button>-->
+					
 				</div>
 				<!-- ------------- 数据列表 ------------- -->
 				<el-table class="data-table" ref="data-table" :data="dataList" >
-					<sa-td type="selection"></sa-td>
+
+					<sa-td name="序号"  align="center" type="index"  :index="indexMethod"></sa-td>
+
 					<sa-td name="车牌" prop="vehiclePlate" ></sa-td>
-					<sa-td name="所有人" prop="owner" ></sa-td>
-					<sa-td name="车辆类型" prop="vehicleType" ></sa-td>
-					<!-- <sa-td name="类型父id" prop="parentId" ></sa-td> -->
-					<sa-td name="车辆尺寸" prop="vehicleSize" ></sa-td>
-					<sa-td name="车辆品牌型号" prop="vehicleModel" ></sa-td>
-					<sa-td name="核定载质量" prop="vehicleLoad" ></sa-td>
-					<sa-td name="车辆自重" prop="vehicleWeight" ></sa-td>
-					<!-- <sa-td name="审核状态" prop="auditStatus" type="enum" :jv="{0: '待审核,1'}"></sa-td>
-					<sa-td name="审核人" prop="auditBy" ></sa-td>
-					<sa-td name="审核不通过原因" prop="nopassReason" ></sa-td>
-					<sa-td name="审核时间" prop="auditTime" ></sa-td> -->
-					<el-table-column label="操作" fixed="right"  width="240px">
+					<sa-td  name="所属" prop="ownership" type="enum" :jv="{'self': '自有', 'affiliated': '挂靠'}"></sa-td>
+					<sa-td name="所有人" prop="owner" width="180px"></sa-td>
+					<sa-td name="司机" prop="driverName" ></sa-td>					
+					<sa-td name="品牌型号" prop="vehicleModel" width="150px"></sa-td>
+					<sa-td name="车辆类型" prop="vehicleTypeName" ></sa-td>
+					<sa-td name="年检有效期" prop="validityPeriod" width="120px"></sa-td>
+					<sa-td name="颜色" prop="color" ></sa-td>
+					<sa-td name="轴数" prop="axle" ></sa-td>
+					<sa-td name="载重(t)" prop="vehicleLoad" ></sa-td>
+					<!--<sa-td name="容积" prop="volume" ></sa-td>-->
+
+					<sa-td name="注册时间" width="150px" prop="createTime"></sa-td>
+					<sa-td name="审核状态" prop="auditStatus" type="enum" :jv="{0: '待审核', 1: '审核通过', 2: '审核不通过', 3:'审核中'}"></sa-td> 					
+					<sa-td name="审核时间" prop="auditTime" width="150px"></sa-td>
+					<el-table-column label="操作" fixed="right"  width="200px">
 						<template slot-scope="s">
 							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
-							<el-button v-if="sa.isAuth('tb-vehicle-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
-							<el-button v-if="sa.isAuth('tb-vehicle-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+							<el-button v-if="sa.isAuth('tb-vehicle-edit') && (s.row.auditStatus==0 || s.row.auditStatus==1 || s.row.auditStatus==2)" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-vehicle-del') && (s.row.auditStatus==0 || s.row.auditStatus==2)" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+							<el-button v-if="sa.isAuth('tb-vehicle-edit') && s.row.driverId ==null" class="c-btn" type="primary" icon="el-icon-edit"
+							 	@click="bind(s.row)">绑定司机</el-button>
+							<el-button v-if="sa.isAuth('tb-vehicle-edit') && s.row.driverId !=null" class="c-btn" type="primary" icon="el-icon-edit"
+							 	@click="unbind(s.row)">解绑司机</el-button>	
 						</template>
 					</el-table-column>
 				</el-table>
@@ -76,13 +110,16 @@
 					p: { // 查询参数
 						// id: '',		// 主键
 						vehiclePlate: '',		// 车牌
+						vehicleModel: '', //品牌型号
 						owner: '',		// 所有人
 						vehicleType: '',		// 车辆类型
-						parentId: '',		// 类型父id
-						vehicleSize: '',		// 车辆尺寸
-						vehicleModel: '',		// 车辆品牌型号
-						vehicleLoad: '',		// 核定载质量
-						vehicleWeight: '',		// 车辆自重
+						auditStatus:'',		    // 审核状态
+						catList:[], // 车型
+						//parentId: '',		// 类型父id
+						//vehicleSize: '',		// 车辆尺寸
+						//vehicleModel: '',		// 车辆品牌型号
+						//vehicleLoad: '',		// 核定载质量
+						//vehicleWeight: '',		// 车辆自重
 						// createBy: '',		// 创建者id
 						// createName: '',		// 创建者姓名
 						// updateBy: '',		// 更新者id
@@ -97,10 +134,43 @@
 					},
 					dataCount: 0,
 					dataList: [], // 数据集合
+
+					orderStepTabs: [],
+					activeTab: 'all',
 				},
 				methods: {
+					handleTabClick(tab, event) {
+						if(tab.name==='all')
+							this.p.auditStatus =null;
+						else
+							this.p.auditStatus = tab.name;
+						this.f5();
+					},
+					indexMethod(index){
+						let pageNo = this.p.pageNo - 1;
+						if((pageNo!==-1 && pageNo!==0)){
+							return (index + 1) + (pageNo  * this.p.pageSize);
+						}else{
+							return (index + 1)
+						}
+					},
+					// 车型列表
+					getCatList() {
+						sa.ajax('/transport-server/TbDictInfo/getList', {
+							code:'vehicle_type',
+							pageSize: 100,
+							pageNo: 1
+						}, function(resp) {
+							let list=resp.data;
+							this.catList = list;
+						}.bind(this));
+					},
 					// 刷新
 					f5: function() {
+						sa.ajax('/transport-server/TbVehicle/statVehicleGroupByStatus', sa.removeNull(this.p), function(res) {
+							this.orderStepTabs = res.data; // 数据
+						}.bind(this));
+
 						sa.ajax('/transport-server/TbVehicle/getList', sa.removeNull(this.p), function(res) {
 							this.dataList = res.data; // 数据
 							this.dataCount = res.dataCount; // 数据总数
@@ -109,7 +179,7 @@
 					},
 					// 查看
 					get: function(data) {
-						sa.showIframe('数据详情', 'tb-vehicle-info.html?id=' + data.id, '1050px', '90%');
+						sa.showIframe('车辆详情', 'tb-vehicle-info.html?id=' + data.id, '1050px', '90%');
 					},
 					// 查看 - 根据选中的
 					getBySelect: function(data) {
@@ -121,15 +191,36 @@
 					},
 					// 修改
 					update: function(data) {
-						sa.showIframe('修改数据', 'tb-vehicle-add.html?id=' + data.id, '1000px', '90%');
+						sa.ajax('/transport-server/TbVehicle/getById?id=' + data.id, function (res) {
+							this.m = res.data;
+							if(res.data.auditStatus==3){
+								sa.ok('该车辆当前审核中,不能修改');
+								//this.f5();
+							}else{
+								sa.showIframe('修改车辆', 'tb-vehicle-add.html?id=' + data.id, '1000px', '90%');
+							}
+						}.bind(this))
+						
+					},
+					// 绑定司机
+					bind: function(data) {
+						sa.showIframe('绑定司机', 'tb-driver-bind.html?id=' + data.id, '1000px', '90%');
+					},
+					unbind: function(data) {
+						sa.confirm('确认要解绑吗?', function() {
+							sa.ajax('/transport-server/TbVehicle/unbindDriver?id=' + data.id, function(res) {								
+								sa.ok('解绑成功');
+								this.f5();
+							}.bind(this))
+						}.bind(this));
 					},
 					// 新增
 					add: function(data) {
-						sa.showIframe('新增数据', 'tb-vehicle-add.html?id=-1', '1000px', '90%');
+						sa.showIframe('添加车辆', 'tb-vehicle-add.html?id=-1', '1000px', '90%');
 					},
 					// 删除
 					del: function(data) {
-						sa.confirm('是否删除,此操作不可撤销', function() {
+						sa.confirm('确认要删除车辆 [ ' + data.vehiclePlate + ' ] 吗?', function() {
 							sa.ajax('/transport-server/TbVehicle/delete?id=' + data.id, function(res) {
 								sa.arrayDelete(this.dataList, data);
 								sa.ok('删除成功');
@@ -168,7 +259,9 @@
 					}
 				},
 				created: function() {
+					//this.getCatList();
 					this.f5();
+
 					sa.onInputEnter();
 				}
 			})

+ 155 - 0
sa-view/tb-wechat-pay/tb-wechat-pay-info.html

@@ -0,0 +1,155 @@
+<!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>
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+			.info-table {
+				width: 100%;
+				border-collapse: collapse;
+				margin-bottom: 20px;
+			}
+			.info-table th, .info-table td {
+				border: 1px solid #ebeef5;
+				padding: 12px 10px;
+				font-size: 14px;
+				line-height: 1.5;
+			}
+			.info-table th {
+				border: 1px solid darkgray;
+				text-align: left;
+				height: 22px;
+				padding: 8px;
+				background-color: #dddddd;
+				width: 15%;
+				min-width: 120px;
+			}
+			.info-table td {
+				border: 1px solid darkgray;
+				text-align: left;
+				width: 35%;
+			}
+			.info-table td[colspan="3"] {
+				width: 85%;
+			}
+			h3 {
+				margin: 20px 0 15px 0;
+				color: #303133;
+				font-size: 16px;
+				font-weight: bold;
+			}
+			.c-panel .el-form .el-textarea {
+				width: 100%;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+				<el-form v-if="m">
+					<h3>微信支付信息</h3>
+					<table class="info-table">
+						<tr>
+							<th>微信预支付ID</th>
+							<td>{{m.prepayid}}</td>
+							<th>业务订单号</th>
+							<td>{{m.tradeNo}}</td>
+						</tr>
+						<tr>
+							<th>订单商品名称</th>
+							<td>{{m.goodsName}}</td>
+							<th>应支付金额(分)</th>
+							<td>{{m.amount}}</td>
+						</tr>
+						<tr>
+							<th>预支付时间</th>
+							<td>{{m.tradeTime}}</td>
+							<th>创建时间</th>
+							<td>{{m.createTime}}</td>
+						</tr>
+						<tr>
+							<th>微信订单标识</th>
+							<td>{{m.transactionId}}</td>
+							<th>是否已支付</th>
+							<td>{{m.isPaid?'已支付':'未支付'}}</td>
+						</tr>
+						<tr>
+							<th>交易状态</th>
+							<td>{{m.tradeState}}</td>
+							<th>交易状态说明</th>
+							<td>{{m.tradeStateDesc}}</td>
+						</tr>
+						<tr>
+							<th>支付成功时间</th>
+							<td>{{m.successTime}}</td>
+							<th>支付者信息</th>
+							<td>{{m.payerOpenId}}</td>
+						</tr>
+						<tr>
+							<th>实付金额(分)</th>
+							<td colspan="3">{{m.payAmount}}</td>
+						</tr>
+					</table>
+
+					<h3>数据详情</h3>
+					<table class="info-table">
+						<tr>
+							<th>提交数据</th>
+							<td colspan="3">
+								<el-input v-model="m.reqData" type="textarea" :rows="4" readonly />
+							</td>
+						</tr>
+						<tr>
+							<th>返回的数据</th>
+							<td colspan="3">
+								<el-input v-model="m.respData" type="textarea" :rows="4" readonly />
+							</td>
+						</tr>
+					</table>
+				</el-form>
+			</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					prepayid: sa.p('prepayid', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/transport-server/TbWechatPay/getById?prepayid=' + this.prepayid, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 160 - 0
sa-view/tb-wechat-pay/tb-wechat-pay-list.html

@@ -0,0 +1,160 @@
+<!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>
+		<style type="text/css">
+			.c-panel .c-label {
+				width: 8em;
+			}
+			.c-panel .el-form .el-input{
+				width: 250px;
+			} 
+			.c-panel .el-form  .el-textarea {
+				width: 600px;
+			}
+			
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" width="100px" name="业务订单号" v-model="p.tradeNo"></sa-item>
+					<sa-item type="text" width="100px" name="商品名称" v-model="p.goodsName"></sa-item>
+					<sa-item type="text" width="100px" name="微信订单标识" v-model="p.transactionId"></sa-item>
+					<sa-item type="text" width="100px" name="是否已支付" v-model="p.isPaid">
+						<el-select v-model="p.isPaid">
+							<el-option label="全部" value=""></el-option>
+							<el-option label="已支付" value="1"></el-option>
+							<el-option label="未支付" value="0"></el-option>
+						</el-select>
+					</sa-item>
+					<sa-item type="text" width="100px"  name="交易状态" v-model="p.tradeState">
+						<el-select v-model="p.isPaid">
+							<el-option label="全部" value=""></el-option>
+							<el-option label="支付成功" value="SUCCESS"></el-option>
+							<el-option label="转入退款" value="REFUND"></el-option>
+							<el-option label="未支付" value="NOTPAY"></el-option>
+							<el-option label="已关闭" value="CLOSED"></el-option>
+							<el-option label="已撤销" value="REVOKED"></el-option>
+							<el-option label="用户支付中" value="USERPAYING"></el-option>
+							<el-option label="支付失败" value="PAYERROR"></el-option>
+						</el-select> 
+					</sa-item>  
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+				<div class="fast-btn">
+				 
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+					<sa-td type="selection"></sa-td>
+					<sa-td name="业务订单号" prop="tradeNo" width="180px"></sa-td>
+					<sa-td name="订单商品名称" prop="goodsName" align="left"></sa-td>
+					<sa-td name="应付金额(分)" prop="amount" width="120px"></sa-td>
+					<sa-td name="创建时间" prop="createTime" width="150px"></sa-td>
+					<sa-td name="微信订单标识" prop="transactionId" width="150px"></sa-td>
+					<sa-td name="是否已支付" prop="isPaid" type="enum" :jv="{0: '未支付', 1: '已支付'}" width="120px">
+						
+					</sa-td>
+					<sa-td name="交易状态" prop="tradeState" width="120px" ></sa-td> 
+					<sa-td name="完成时间" prop="successTime" width="150px"></sa-td>
+					<sa-td name="实付金额(分)" prop="payAmount" width="120px"></sa-td>
+
+					<sa-td label="操作" fixed="right"  width="150px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
+							<el-button class="c-btn" type="primary" icon="el-icon-edit" @click="syn(s.row)">同步</el-button>
+						</template>
+					</sa-td>
+
+
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						prepayid: '',		// 微信预支付 ID 
+						tradeNo: '',		// 业务订单号 
+						goodsName: '',		// 订单商品名称 
+						amount: '',		// 订单支付金额 
+						tradeTime: '',		// 预支付时间 
+						createTime: '',		// 本地创建时间 
+						reqData: '',		// 提交数据 
+						respData: '',		// 返回的数据 
+						transactionId: '',		// 微信支付侧订单的唯一标识,回调时回填 
+						isPaid: '',		// 是否已支付,微信回调支付成功=1 
+						tradeType: '',		// 订单的交易类型 
+						tradeState: '',		// 交易状态 
+						tradeStateDesc: '',		// 交易状态的详细说明 
+						successTime: '',		// 完成订单支付的时间 
+						payerOpenId: '',		//  订单的支付者信息 
+						payAmount: '',		// 实付金额(分) 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbWechatPay/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-wechat-pay-info.html?prepayid=' + data.prepayid, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					syn: function(data) {
+						sa.ajax('/transport-server/TbWechatPay/syn?tradeNo=' + data.tradeNo, function(res) {
+							sa.arrayDelete(this.dataList, data);
+							sa.ok('同步刷新成功');
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this))
+						
+					}, 
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 124 - 0
sa-view/tb-wechat-refund/tb-wechat-refund-info.html

@@ -0,0 +1,124 @@
+<!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>
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+			.info-table {
+				width: 100%;
+				border-collapse: collapse;
+				margin-bottom: 20px;
+			}
+			.info-table th, .info-table td {
+				border: 1px solid #ebeef5;
+				padding: 12px 10px;
+				font-size: 14px;
+				line-height: 1.5;
+			}
+			.info-table th {
+				 border: 1px solid darkgray;
+				  text-align: left;
+				  height: 22px;
+				  padding: 8px;
+				  background-color: #dddddd;
+				width: 15%;
+				min-width: 120px;
+			}
+			.info-table td {
+			  border: 1px solid darkgray;
+				  text-align: left;
+				width: 35%;
+			}
+			h3 {
+				margin: 20px 0 15px 0;
+				color: #303133;
+				font-size: 16px;
+				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">
+				<el-form v-if="m">
+					<h3>微信退款信息</h3>
+					<table class="info-table">
+						<tr>
+							<th>退款单号</th>
+							<td>{{m.refundId}}</td>
+							<th>退款业务编号</th>
+							<td>{{m.refundNo}}</td>
+						</tr>
+						<tr>
+							<th>微信支付订单号</th>
+							<td>{{m.transactionId}}</td>
+							<th>业务订单号</th>
+							<td>{{m.outTradeNo}}</td>
+						</tr>
+						<tr>
+							<th>订单金额(分)</th>
+							<td>{{m.tradeAmount}}</td>
+							<th>退款金额(分)</th>
+							<td>{{m.refundAmount}}</td>
+						</tr>
+						<tr>
+							<th>退款理由</th>
+							<td>{{m.refundReason}}</td>
+							<th>退款创建时间</th>
+							<td>{{m.createTime}}</td>
+						</tr>
+						<tr>
+							<th>是否已退款</th>
+							<td>{{m.isRefunded}}</td>
+							<th>退款状态</th>
+							<td>{{m.refundStatus}}</td>
+						</tr>
+						<tr>
+							<th>退款成功时间</th>
+							<td colspan="3">{{m.successTime}}</td>
+						</tr>
+					</table>
+				</el-form>
+			</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				el: '.vue-box',
+				data: {
+					refundId: sa.p('refundId', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/transport-server/TbWechatRefund/getById?refundId=' + this.refundId, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 refundId=' + this.refundId + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 175 - 0
sa-view/tb-wechat-refund/tb-wechat-refund-list.html

@@ -0,0 +1,175 @@
+<!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>
+		<style type="text/css">
+			.c-panel .c-label {
+				width: 8em;
+			}
+			.c-panel .el-form .el-input{
+				width: 250px;
+			} 
+			.c-panel .el-form  .el-textarea {
+				width: 600px;
+			}
+			
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" width="100px" name="退款编号" v-model="p.refundNo"></sa-item>
+					<sa-item type="text" width="100px"  name="微信标识号" v-model="p.transactionId"></sa-item>
+					<sa-item type="text" width="100px"  name="业务订单号" v-model="p.outTradeNo"></sa-item>  
+					<sa-item type="text" width="100px"  name="是否已退款" v-model="p.isRefunded">
+						<el-select v-model="p.isRefunded">
+							<el-option label="全部" value=""></el-option>
+							<el-option label="已退款" value="1"></el-option>
+							<el-option label="未退款" value="0"></el-option>
+						</el-select>
+					</sa-item>
+					<sa-item type="text" width="100px"  name="退款状态" v-model="p.refundStatus">
+						<el-select v-model="p.refundStatus">
+							<el-option label="全部" value=""></el-option>
+							<el-option label="退款成功" value="SUCCESS"></el-option>
+							<el-option label="退款关闭" value="CLOSED"></el-option>
+							<el-option label="退款处理中" value="PROCESSING"></el-option>
+							<el-option label="退款异常" value="ABNORMAL"></el-option> 
+						</el-select> 
+					</sa-item> 
+					
+				</el-form>
+				<div class="fast-btn" style="margin-left: 110px;">
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+					<sa-td type="selection"></sa-td>
+					<sa-td name="微信退款单号" prop="refundId" ></sa-td>
+					<sa-td name="退款业务编号" prop="refundNo" ></sa-td>
+					<sa-td name="微信订单号" prop="transactionId" ></sa-td>
+					<sa-td name="业务订单号" prop="outTradeNo" ></sa-td>
+					<sa-td name="订单金额" prop="tradeAmount" ></sa-td>
+					<sa-td name="退款金额" prop="refundAmount" ></sa-td>
+					<sa-td name="退款原因" prop="refundReason" ></sa-td>
+					<sa-td name="创建时间" prop="createTime" ></sa-td>
+					<sa-td name="是否已退款" prop="isRefunded" type="enum" :jv="{0: '未退款', 1: '已退款'}"></sa-td>
+					<sa-td name="退款状态" prop="refundStatus" type="enum"  :jv="{'': '未完成退款', 'SUCCESS':'退款成功', 'CLOSED':'退款关闭', 'PROCESSING':'退款处理中', 'ABNORMAL':'退款异常'}"></sa-td>
+					<sa-td name="退款成功时间" prop="successTime" ></sa-td>
+					<sa-td label="操作" fixed="right" >
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
+						</template>
+					</sa-td>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						refundId: '',		// 微信支付退款单号 
+						refundNo: '',		// 退款业务编号 
+						transactionId: '',		// 微信支付订单号 
+						outTradeNo: '',		// 业务订单号 
+						tradeAmount: '',		//  
+						refundAmount: '',		//  
+						refundReason: '',		//  
+						createTime: '',		// 退款创建时间 
+						isRefunded: '',		// 是否已退款 
+						refundStatus: '',		// 退款状态 
+						successTime: '',		// 退款成功时间 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbWechatRefund/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-wechat-refund-info.html?refundId=' + data.refundId, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-wechat-refund-add.html?refundId=' + data.refundId, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-wechat-refund-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbWechatRefund/delete?id=' + data.refundId, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbWechatRefund/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 126 - 0
sa-view/tb-wechat-transfer/tb-wechat-transfer-info.html

@@ -0,0 +1,126 @@
+<!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>
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+			.info-table {
+				width: 100%;
+				border-collapse: collapse;
+				margin-bottom: 20px;
+			}
+			.info-table th, .info-table td {
+				border: 1px solid #ebeef5;
+				padding: 12px 10px;
+				font-size: 14px;
+				line-height: 1.5;
+			}
+			.info-table th {
+				 border: 1px solid darkgray;
+				  text-align: left;
+				  height: 22px;
+				  padding: 8px;
+				  background-color: #dddddd;
+				width: 15%;
+				min-width: 120px;
+			}
+			.info-table td {
+			  border: 1px solid darkgray;
+				  text-align: left;
+				width: 35%;
+			}
+			h3 {
+				margin: 20px 0 15px 0;
+				color: #303133;
+				font-size: 16px;
+				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">
+					<el-form v-if="m">
+						<h3>微信转账信息</h3>
+						<table class="info-table">
+							<tr>
+								<th>转账单号</th>
+								<td>{{m.transferId}}</td>
+								<th>业务订单号</th>
+								<td>{{m.outTradeNo}}</td>
+							</tr>
+							<tr>
+								<th>用户微信openid</th>
+								<td>{{m.openId}}</td>
+								<th>用户姓名</th>
+								<td>{{m.userName}}</td>
+							</tr>
+							<tr>
+								<th>转账场景</th>
+								<td>{{m.transferSceneId}}</td>
+								<th>转账金额(分)</th>
+								<td>{{m.transferAmount}}</td>
+							</tr>
+							<tr>
+								<th>转账备注</th>
+								<td>{{m.transferRemark}}</td>
+								<th>创建时间</th>
+								<td>{{m.createTime}}</td>
+							</tr>
+							<tr>
+								<th>微信业务单号</th>
+								<td>{{m.transferBillNo}}</td>
+								<th>状态</th>
+								<td>{{m.state}}</td>
+							</tr>
+							<tr>
+								<th>转账状态</th>
+								<td>{{m.isTransfer == 1 ? '成功' : '失败'}}</td>
+								<th>更新时间</th>
+								<td>{{m.updateTime}}</td>
+							</tr>
+						</table>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				el: '.vue-box',
+				data: {
+					transferId: sa.p('transferId', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/transport-server/TbWechatTransfer/getById?transferId=' + this.transferId, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 transferId=' + this.transferId + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 116 - 0
sa-view/tb-wechat-transfer/tb-wechat-transfer-list.html

@@ -0,0 +1,116 @@
+<!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>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+				<div class="c-title">检索参数</div>
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text"  width="100px"name="转账单号" v-model="p.transferId"></sa-item>
+					<sa-item type="text"  width="100px" name="业务订单号" v-model="p.outTradeNo"></sa-item>
+					<sa-item type="text" width="100px" name="微信openid" v-model="p.openId"></sa-item>
+					<sa-item type="text" width="100px" name="用户姓名" v-model="p.userName"></sa-item>
+					<sa-item type="text" width="100px"name="微信业务单号" v-model="p.transferBillNo"></sa-item>
+					<sa-item type="text" width="100px" name="状态" v-model="p.state"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</el-form>
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+					<sa-td type="selection"></sa-td>
+					<sa-td name="转账单号" prop="transferId" ></sa-td>
+					<sa-td name="业务订单号" prop="outTradeNo" ></sa-td>
+					<sa-td name="微信openid" prop="openId" ></sa-td>
+					<sa-td name="用户姓名" prop="userName" ></sa-td>
+					<sa-td name="转账金额(分)" prop="transferAmount" ></sa-td>
+					<sa-td name="微信业务单号" prop="transferBillNo" ></sa-td>
+					<sa-td name="状态" prop="state" ></sa-td>
+					<sa-td name="转账状态" prop="isTransfer" ></sa-td>
+					<sa-td name="创建时间" prop="createTime" ></sa-td>
+					<el-table-column label="操作" fixed="right"  width="180px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button> 
+							<el-button class="c-btn" type="primary" icon="el-icon-edit" @click="syn(s.row)">同步</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						transferId: '',		// 转账单号 
+						outTradeNo: '',		// 业务订单号 
+						openId: '',		// 用户微信openid 
+						userName: '',		// 用户姓名 
+						transferAmount: '',		// 转账金额(分) 
+						transferBillNo: '',		// 微信业务单号 
+						state: '',		// 状态 
+						isTransfer: '',		// 转账状态 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbWechatTransfer/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-wechat-transfer-info.html?transferId=' + data.transferId, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					}, 
+					syn: function(data) {
+						sa.ajax('/transport-server/TbWechatTransfer/syn?tradeNo=' + data.outTradeNo, function(res) {
+							sa.arrayDelete(this.dataList, data);
+							sa.ok('同步刷新成功');
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this))
+						
+					}, 
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 156 - 0
sa-view/tb_cooper_entrust_judge/tb_cooper_entrust-do-judge.html

@@ -0,0 +1,156 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/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 .c-label {
+				width: 8em;
+			}
+			.c-item .image-box-2 {
+				height: 90px;
+			}
+			.el-row{
+				border-bottom: 1px solid #eeeeee;
+			}
+			table {
+			  font-family: arial, sans-serif;
+			  border-collapse: collapse;
+			  width: 90%;
+			  margin-top: 22px ;
+			  margin-left: auto;
+			  margin-right: auto;
+			}
+			th {
+			  border: 1px solid darkgray;
+			  text-align: left;
+			  height: 22px;
+			  padding: 8px;
+			  background-color: #dddddd;
+			}
+			td {
+			  border: 1px solid darkgray;
+			  text-align: left;
+			  padding: 8px;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<el-alert show-icon title="审核驳回" :description="m.judgeContent" type="error" v-if="m.judgeStatus==2"></el-alert>
+						<table>
+							<tr>
+								<th>企业名称</th>
+								<td>{{m.name}}</td>
+								<th>法人</th>
+								<td>{{m.legalPerson}}</td>
+							</tr>
+							<tr>
+								<th>身份证号</th>
+								<td>{{m.idCard}}</td>
+								<th>手机号码</th>
+								<td>{{m.contact}}</td>
+							</tr>
+							<tr>
+								<th>税号</th>
+								<td>{{m.dutyParagraph}}</td>
+								<th>营业执照</th>
+								<td>
+									<sa-info type="img-list" :value="m.businessLicense"></sa-info>
+								</td>
+							</tr>
+							<tr>
+								<th>银行账号</th>
+								<td>{{m.bankAccount}}</td>
+								<th>银行名称</th>
+								<td>{{m.bankName}}</td>
+							</tr>
+							<tr>
+								<th>地址</th>
+								<td>{{m.address}}</td>
+								<th>提交时间</th>
+								<td>{{sa.forDate(m.createTime, 2)}}</td>
+							</tr>
+						</table>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot" v-if="sa.isAuth('tb-purchaser-judge')">
+				<el-button type="warning" @click="judgeBack">审核驳回</el-button>
+				<el-button type="success" @click="judgePass">审核通过</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0), // 获取数据ID
+					m: null
+				},
+				methods: {
+					judgeBack() {
+						let id = this.m.id;
+						layer.prompt({
+							title: '输入审核意见'
+						}, function(content, index) {
+							layer.close(index);
+							sa.ajax('/level-two-server/TbPurchaser/audit', {
+								id: id,
+								judgeContent: content,
+								judgeStatus: 2
+							}, function(res) {
+								layer.msg('审核已驳回');
+								setTimeout(() => {
+									parent.app.f5(); // 刷新父页面列表
+									sa.closeCurrIframe(); // 关闭本页
+								}, 800)
+							})
+						});
+					},
+					judgePass() {
+						sa.ajax('/level-two-server/TbPurchaser/audit', {
+							id: this.m.id,
+							judgeContent: '审核通过',
+							judgeStatus: 1
+						}, function(res) {
+							layer.msg('审核通过');
+							setTimeout(() => {
+								parent.app.f5(); // 刷新父页面列表
+								sa.closeCurrIframe(); // 关闭本页
+							}, 800)
+						})
+					},
+				},
+				mounted: function() {
+					sa.ajax('/level-two-server/TbPurchaser/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if (res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+		</script>
+	</body>
+</html>

+ 146 - 0
sa-view/tb_cooper_entrust_judge/tb_cooper_entrust-judge.html

@@ -0,0 +1,146 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/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>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+				<div class="c-title">检索参数</div>
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="订单号" v-model="p.tradeNo" width="80px"></sa-item>
+					<sa-item type="text" name="买家" v-model="p.buyUserName"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button type="info" icon="el-icon-refresh" @click="sa.f5()">重置</el-button>
+					<el-button v-if="sa.isAuth('tb-purchaser-judge')" class="c-btn" type="success"
+						icon="el-icon-s-check" @click="judgeBySelect">批量审核</el-button>
+				</el-form>
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList">
+					<sa-td type="selection" name="序号"></sa-td>
+					<sa-td name="订单号" prop="tradeNo" width="180"></sa-td>
+					<sa-td name="买家" prop="buyUserName" ></sa-td>
+					<sa-td name="商品名称" prop="goodsNames" ></sa-td>
+					<sa-td name="总重量" prop="totalWeight" ></sa-td>
+					<sa-td name="总金额" prop="totalPrice" ></sa-td>
+					<sa-td name="车牌号" prop="veNo" ></sa-td>
+					
+					<sa-td name="互助委托协议" prop="businessLicense" type="img-list"></sa-td>
+					<sa-td name="审核状态" prop="judgeStatus">
+						<template slot-scope="scope">
+							<el-tag type="danger" v-if="scope.row.judgeStatus==0">未审核</el-tag>
+							<el-tag type="primary" v-if="scope.row.judgeStatus==1">审核通过</el-tag>
+							<el-tag type="danger" v-if="scope.row.judgeStatus==2">审核驳回</el-tag>
+						</template>
+					</sa-td>
+					<sa-td name="审核时间" width="160px" prop="judgeTime"></sa-td>
+					
+					<el-table-column label="操作" fixed="right" width="100px">
+						<template slot-scope="s">
+							<el-button v-if="sa.isAuth('tb-purchaser-judge')" class="c-btn" type="success"
+								icon="el-icon-s-check" @click="get(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>
+			<el-dialog title="批量审核" :visible.sync="modal.visible" width="400px">
+				<el-form>
+					<sa-item type="text" name="审核意见" v-model="modal.form.judgeContent" width="80px" br></sa-item>
+					<sa-item type="enum" name="审核结果" v-model="modal.form.judgeStatus" width="80px" :jv="{1: '通过', 2: '驳回'}" jtype="3" br></sa-item>
+				</el-form>
+				<span slot="footer" class="dialog-footer">
+					<el-button @click="modal.visible = false">取 消</el-button>
+					<el-button type="primary" @click="doJudge">确 定</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: {
+					modal: {
+						visible: false,
+						form: {
+							ids: '',
+							judgeStatus: 1,
+							judgeContent: '',
+						}
+					},
+					p: { // 查询参数
+						id: '', //
+						name: '', // 名称
+						nationality: '', // 国别
+						judgeList: 1,
+						pageNo: 1, // 当前页
+						pageSize: 20, // 页大小
+						sortType: 0 // 排序方式
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合
+				},
+				methods: {
+					doJudge() {
+						let form = this.modal.form;
+						if (!form.judgeContent) {
+							return sa.msg('请输入审核意见');
+						}
+						sa.ajax('/level-two-server/TbPurchaser/auditBatch', form, function(res) {
+							sa.alert('审核成功');
+							this.modal.visible = false;
+							this.f5()
+						}.bind(this));
+					},
+					// 刷新
+					f5: function() {
+						sa.ajax('/level-two-server/TbPurchaser/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数
+							sa.f5TableHeight(); // 刷新表格高度
+						}.bind(this));
+					},
+					judgeBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if (selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.modal.form.ids = selection.map(obj => obj.id).join(',');
+						this.modal.visible = true;
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('商户资料审核', 'tb-purchaser-do-judge.html?id=' + data.id, '950px', '80%');
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-purchaser-add.html?id=' + data.id, '1000px', '90%');
+					},
+
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 84 - 0
static/kj/validator.js

@@ -0,0 +1,84 @@
+
+// 地区码对照表
+const cityCodes = {
+    11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",
+    21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",
+    33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",
+    41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",
+    46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",
+    54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",
+    65:"新疆",71:"台湾",81:"香港",82:"澳门"
+};
+
+// 加权因子
+const factor = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
+// 校验位对应值
+const parity = [1,0,'X',9,8,7,6,5,4,3,2];
+
+function validateIDCard(id) {
+    // 基础格式校验
+    if(!/^\d{17}[\dXx]$/.test(id)) return false;
+
+    // 校验地区码
+    if(!cityCodes[id.substr(0,2)]) return false;
+
+    // 校验生日
+    const birthDate = id.substr(6,8);
+    const year = birthDate.substr(0,4);
+    const month = birthDate.substr(4,2);
+    const day = birthDate.substr(6,2);
+    const date = new Date(year, month-1, day);
+    if(date.getFullYear() != year ||
+        (date.getMonth()+1) != month ||
+        date.getDate() != day) {
+        return false;
+    }
+
+    // 校验码校验
+    let sum = 0;
+    for(let i=0; i<17; i++) {
+        sum += parseInt(id.charAt(i)) * factor[i];
+    }
+    const lastChar = id.charAt(17).toUpperCase();
+    return parity[sum%11] == lastChar;
+}
+
+
+/***************校验手机号***************/
+function validatePhone(phone) {
+    return /^(?:(?:\+|00)86)?1(?:3[\d]|4[5-79]|5[0-35-9]|6[5-7]|7[0-8]|8[\d]|9[189])\d{8}$/.test(phone);
+}
+
+/***************校验出生日期与身份证号是否一致***************/
+function getBirthFromID(id) {
+    if(id.length === 18) {
+        return id.substr(6,4) + '-' + id.substr(10,2) + '-' + id.substr(12,2);
+    } else if(id.length === 15) {
+        return '19' + id.substr(6,2) + '-' + id.substr(8,2) + '-' + id.substr(10,2);
+    }
+    return null;
+}
+function validateDate(dateStr) {
+    const date = new Date(dateStr.replace(/-/g, '/'));
+    return !isNaN(date.getTime());
+}
+function checkBirthMatch(idCard, inputDate) {
+    const idBirth = getBirthFromID(idCard);   console.log("idBirth="+idBirth) ;
+    if(!idBirth || !validateDate(idBirth)) return false;
+
+    // 标准化日期格式比较
+    /*const formatDate = (d) => new Date(d).toISOString().split('T');
+
+    console.log("idBirth1="+formatDate(idBirth)) ;
+    console.log("idBirth2="+formatDate(inputDate)) ;
+    return formatDate(idBirth) === formatDate(inputDate);*/
+    return idBirth === inputDate;
+}
+
+/*********************校验车牌************************/
+function validatePlate(plateNumber) {
+    const regularPlate = /^[\u4e00-\u9fa5][A-NP-Z][A-NP-Z0-9]{5}$/;     //普通车牌
+    const newEnergyPlate = /^[\u4e00-\u9fa5][A-NP-Z]D[A-NP-Z0-9]{6}$/;  //新能源车牌
+
+    return regularPlate.test(plateNumber) ||  newEnergyPlate.test(plateNumber);
+}

Datei-Diff unterdrückt, da er zu groß ist
+ 4662 - 0
static/kj/wangEditor.up.js


Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.