qzy 1 سال پیش
والد
کامیت
e7a3b45033
26فایلهای تغییر یافته به همراه897 افزوده شده و 546 حذف شده
  1. 1 1
      sp-admin/login.html
  2. 1 0
      sp-admin/sa-frame/menu-list-sp.js
  3. 2 1
      sp-admin/sa-view-sp/sp-admin/admin-add.html
  4. 1 1
      sp-admin/sa-view-sp/sp-admin/admin-list.html
  5. 156 99
      sp-admin/sa-view/tb-costomer/customer-admin-add.html
  6. 344 304
      sp-admin/sa-view/tb-costomer/customer-admin-list.html
  7. 155 100
      sp-admin/sa-view/tb-partner/customer-admin-add.html
  8. 34 0
      sp-admin/sa-view/tb-partner/customer-admin-list.html
  9. 1 1
      sp-admin/sa-view/tb-partner/tb-partner-add.html
  10. 42 6
      sp-server/src/main/java/com/pj/api/jh/service/JhService.java
  11. 2 2
      sp-server/src/main/java/com/pj/api/open/service/OpenService.java
  12. 20 0
      sp-server/src/main/java/com/pj/api/open/web/OpenController.java
  13. 4 0
      sp-server/src/main/java/com/pj/project/sync/HelpService.java
  14. 3 1
      sp-server/src/main/java/com/pj/project/sync/SyncService.java
  15. 1 1
      sp-server/src/main/java/com/pj/project/sync/response/IOrderPriceRes.java
  16. 17 5
      sp-server/src/main/java/com/pj/project/tb_account/AutomaticPay.java
  17. 1 1
      sp-server/src/main/java/com/pj/project/tb_business/TbBusinessService.java
  18. 11 1
      sp-server/src/main/java/com/pj/project/tb_business_item/TbBusinessItemService.java
  19. 25 1
      sp-server/src/main/java/com/pj/project/tb_car_weight/CheckPayStatusTask.java
  20. 1 1
      sp-server/src/main/java/com/pj/project/tb_car_weight/TbCarWeight.java
  21. 7 0
      sp-server/src/main/java/com/pj/project/tb_car_weight/TbCarWeightService.java
  22. 21 0
      sp-server/src/main/java/com/pj/project/tb_deduction_record/ExcelDTO.java
  23. 15 15
      sp-server/src/main/java/com/pj/project/tb_deduction_record/TbDeductionRecord.java
  24. 30 4
      sp-server/src/main/java/com/pj/project/tb_deduction_record/TbDeductionRecordService.java
  25. 1 1
      sp-server/src/main/resources/application-dev.yml
  26. 1 0
      sp-server/src/main/resources/application.yml

+ 1 - 1
sp-admin/login.html

@@ -130,7 +130,7 @@
 						</div>
 					</div>
 					<span style="color: red;margin-left: 70px;" id="notice"></span>
-					<div class="login-button">登录</div>
+					<div class="login-button" @keyup.enter.native="handleAddBook">登录</div>
 				</div>
 			</div>
 			<div class="sk-rotating-plane"></div>

+ 1 - 0
sp-admin/sa-frame/menu-list-sp.js

@@ -86,6 +86,7 @@ window.menuList.unshift({
 	}, {
 		id: 'sys-dict',
 		name: '系统字典',
+			parent: true,
 		icon: 'el-icon-setting',
 		info: '系统字典配置',
 		childList: [{

+ 2 - 1
sp-admin/sa-view-sp/sp-admin/admin-add.html

@@ -86,7 +86,8 @@
                         sa.closeCurrIframe(); // 关闭本页
                     }.bind(this));
                 }.bind(this));
-            }
+            },
+			
         },
         mounted: function () {
             // 加载角色

+ 1 - 1
sp-admin/sa-view-sp/sp-admin/admin-list.html

@@ -9,7 +9,7 @@
 		<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="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.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>

+ 156 - 99
sp-admin/sa-view/tb-costomer/customer-admin-add.html

@@ -1,105 +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="../../static/kj/element-ui/theme-chalk/index.css">
-    <link rel="stylesheet" href="../../static/sa.css">
-    <script src="../../static/kj/vue.min.js"></script>
-    <script src="../../static/kj/element-ui/index.js"></script>
-    <script src="../../static/kj/httpVueLoader.js"></script>
-    <script src="../../static/kj/jquery.min.js"></script>
-    <script src="../../static/kj/layer/layer.js"></script>
-    <script src="../../static/sa.js"></script>
-    <script src="../../static/kj/upload-util.js"></script>
-</head>
-<body>
-<div class="vue-box" style="display: none;" :style="'display: block;'">
-    <!-- 参数栏 -->
-    <div class="c-panel">
-        <el-form>
-            <!-- 防止密码框被填充 -->
-            <div style="height: 0px; overflow: hidden;">
-                <el-input></el-input>
-                <el-input type="password"></el-input>
-            </div>
-            <!-- 表单 -->
-            <sa-item type="text" name="用户名" v-model="m.name" placeholder="请输入用户名" br></sa-item>
-            <sa-item type="password" name="密码" v-model="m.password" placeholder="请输入密码" br></sa-item>
-            <sa-item type="password" name="再输一次" v-model="m.againPassword" placeholder="请再输一次密码" br></sa-item>
-            <div class="c-item">
-                <label class="c-label"><span style="color: red;">*</span>角色:</label>
-                <el-select v-model="m.roleIds" multiple>
-                    <el-option label="请选择" :value="0" disabled></el-option>
-                    <el-option v-for="role in roleList" :key="role.id" :label="role.name" :value="role.id"></el-option>
-                </el-select>
-            </div>
-            <sa-item name="" br>
-                <el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
-            </sa-item>
-        </el-form>
-    </div>
-</div>
+	<head>
+		<title>添加管理员</title>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="viewport"
+			content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css & js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css">
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="../../static/kj/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		<style>
+			.error {
+				color: red;
+				font-size: 12px;
+				margin-left: 100px
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<!-- 参数栏 -->
+			<div class="c-panel">
+				<el-form>
+					<!-- 防止密码框被填充 -->
+					<div style="height: 0px; overflow: hidden;">
+						<el-input></el-input>
+						<el-input type="password"></el-input>
+					</div>
+					<!-- 表单 -->
+					<sa-item type="text" name="用户名" v-model="m.name" placeholder="请输入用户名" br></sa-item>
+					<sa-item type="password" name="密码" v-model="m.password" placeholder="请输入密码" @input="newPwdChange"
+						br></sa-item>
+					<div v-if="pwdError" class="error">{{pwdError}}</div>
+					<sa-item type="password" name="再输一次" v-model="m.againPassword" @input="newPwd2Change"
+						placeholder="请再输一次密码" br></sa-item>
+					<div v-if="newPwd2Error" class="error">{{newPwd2Error}}</div>
+					<div class="c-item">
+						<label class="c-label"><span style="color: red;">*</span>角色:</label>
+						<el-select v-model="m.roleIds" multiple>
+							<el-option label="请选择" :value="0" disabled></el-option>
+							<el-option v-for="role in roleList" :key="role.id" :label="role.name"
+								:value="role.id"></el-option>
+						</el-select>
+					</div>
+					<sa-item name="" br>
+						<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+					</sa-item>
+				</el-form>
+			</div>
+		</div>
 
-<script>
+		<script>
+			const numStr = "123456789";
+			const numStrDesc = "987654321";
+			const varStr = "abcdefghijklmnopkrstuvwxyz"
+			const varStrDesc = "zyxwvutsrkpomnlkjihgfedcba"
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					sa: sa, // 超级对象
+					m: {
+						id: 0,
+						customerId: sa.p('customerId', ''),
+						name: '',
+						avatar: '',
+						password: '',
+						againPassword: '',
+						roleIds: []
+					},
+					pwdError: '',
+					newPwd2Error: '',
+					roleList: []
+				},
+				methods: {
+					// 修改
+					ok: function() {
+						// 表单校验
+						let m = this.m;
+						sa.checkNull(m.name, '请输入用户名');
+						sa.checkNull(m.password, '请输入密码');
+						if (this.pwdError || this.newPwd2Error) {
+							return;
+						}
+						if (m.password !== m.againPassword) {
+							sa.error('两次输入密码不一致');
+							return;
+						}
+						if (m.roleIds.length == 0) {
+							sa.error('请选择角色');
+							return;
+						}
+						m.roleId = m.roleIds.join(',')
+						// 添加
+						sa.ajax('/admin/addCustomerAdmin', m, function(res) {
+							sa.alert('增加成功', this.clean);
 
-    var app = new Vue({
-        components: {
-            "sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
-        },
-        el: '.vue-box',
-        data: {
-            sa: sa, 	// 超级对象
-            m: {
-                id: 0,
-                customerId: sa.p('customerId', ''),
-                name: '',
-                avatar: '',
-                password: '',
-                againPassword: '',
-                roleIds: []
-            },
-            roleList: []
-        },
-        methods: {
-            // 修改
-            ok: function () {
-                // 表单校验
-                let m = this.m;
-                sa.checkNull(m.name, '请输入用户名');
-                sa.checkNull(m.password, '请输入密码');
-                if (m.password !== m.againPassword) {
-                    sa.error('两次输入密码不一致');
-                    return;
-                }
-                if (m.roleIds.length == 0) {
-                    sa.error('请选择角色');
-                    return;
-                }
-                m.roleId = m.roleIds.join(',')
-                // 添加
-                sa.ajax('/admin/addCustomerAdmin', m, function (res) {
-                    sa.alert('增加成功', this.clean);
+						}.bind(this));
 
-                }.bind(this));
-
-            },
-            clean() {
-                parent.app.f5();		// 刷新父页面列表
-                sa.closeCurrIframe();	// 关闭本页
-            }
-        },
-        mounted: function () {
-            // 加载角色
-            sa.ajax('/role/getCustomerRoleList', {customerId: this.m.customerId}, function (res) {
-                this.roleList = res.data;	// 数据
-            }.bind(this), {msg: null});
-        }
-    })
-
-</script>
-</body>
+					},
+					clean() {
+						parent.app.f5(); // 刷新父页面列表
+						sa.closeCurrIframe(); // 关闭本页
+					},
+					newPwdChange(v) {
+						let len = v.length;
+						this.pwdError = '';
+						if (!this.checkStong(v)) {
+							this.pwdError = '密码长度8-16位,至少包含一个数字、一个大写字母、一个小写字母以及!@#$%^&*?之一'
+							return;
+						}
+						if (len >= 3) {
+							let s = v.toLowerCase();
+							for (let i = 0; i < len - 2; i++) {
+								let charStr = s.substring(i, i + 3);
+								if (this.checkStr(charStr)) {
+									this.pwdError = '密码不应该采用连续升序或者连续降序'
+									return;
+								}
+							}
+						}
+					},
+					newPwd2Change(v) {
+						let len = v.length;
+						this.newPwd2Error = '';
+						if (this.m.password != v) {
+							this.newPwd2Error = '两次输入密码不一致';
+							return;
+						}
+					},
+					checkStr(charStr) {
+						return numStr.indexOf(charStr) != -1 || varStr.indexOf(charStr) != -1 || numStrDesc.indexOf(
+							charStr) != -1 || varStrDesc.indexOf(charStr) != -1;
+					},
+					checkStong(v) {
+						let pattern = /^.*(?=.{8,16})(?=.*\d)(?=.*[A-Z]{1,})(?=.*[a-z]{1,})(?=.*[!@#$%^&*?\(\)]).*$/;
+						return pattern.test(v);
+					},
+				},
+				mounted: function() {
+					// 加载角色
+					sa.ajax('/role/getCustomerRoleList', {
+						customerId: this.m.customerId
+					}, function(res) {
+						this.roleList = res.data; // 数据
+					}.bind(this), {
+						msg: null
+					});
+				}
+			})
+		</script>
+	</body>
 </html>

+ 344 - 304
sp-admin/sa-view/tb-costomer/customer-admin-list.html

@@ -1,325 +1,365 @@
 <!DOCTYPE html>
 <html>
-<head>
-    <title>管理员列表</title>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-    <meta name="viewport"
-          content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
-    <!-- 所有的 css & js 资源 -->
-    <link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
-    <link rel="stylesheet" href="../../static/sa.css">
-    <script src="../../static/kj/vue.min.js"></script>
-    <script src="../../static/kj/element-ui/index.js"></script>
-    <script src="../../static/kj/httpVueLoader.js"></script>
-    <script src="../../static/kj/jquery.min.js"></script>
-    <script src="../../static/kj/layer/layer.js"></script>
-    <script src="../../static/sa.js"></script>
-    <script src="../../static/kj/upload-util.js"></script>
-    <style type="text/css">
-        .el-radio {
-            margin-right: 10px;
-        }
-    </style>
-</head>
-<body>
-<div class="vue-box" style="display: none;" :style="'display: block;'">
-    <div class="c-panel">
-        <!-- ------------- 检索参数 ------------- -->
-        <h4 class="c-title">检索参数</h4>
-        <el-form>
-            <sa-item type="text" name="用户名" v-model="p.name"></sa-item>
-            <el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
-            <el-button type="primary" icon="el-icon-plus" @click="add()" v-if="sa.isAuth('tb-costomer-user-add')">新增
-            </el-button>
-            <el-button type="info" icon="el-icon-refresh" @click="sa.f5()">重置</el-button>
-        </el-form>
-        <!-- ------------- 快捷按钮 ------------- -->
+	<head>
+		<title>管理员列表</title>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="viewport"
+			content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css & js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css">
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="../../static/kj/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		<style type="text/css">
+			.el-radio {
+				margin-right: 10px;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+				<h4 class="c-title">检索参数</h4>
+				<el-form>
+					<sa-item type="text" name="用户名" v-model="p.name"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button type="primary" icon="el-icon-plus" @click="add()"
+						v-if="sa.isAuth('tb-costomer-user-add')">新增
+					</el-button>
+					<el-button type="info" icon="el-icon-refresh" @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 type="text" name="用户名" prop="name" min-width="120px"></sa-td>
-            <sa-td type="text" name="姓名" prop="nickname" min-width="120px"></sa-td>
-            <sa-td type="datetime" name="创建时间" prop="createTime" width="150px"></sa-td>
-            <sa-td type="datetime" name="最后登录" prop="loginTime" width="150px"></sa-td>
-            <sa-td type="text" name="登录次数" prop="loginCount" not="0" width="100px"></sa-td>
-            <sa-td type="switch" name="账号状态" prop="status" :jv="{1: '正常', 2: '禁用[#ff4949]'}"
-                   @change="s => updateStatus(s.row)" width="120px"></sa-td>
-            <el-table-column label="操作" fixed="right" width="450px">
-                <template slot-scope="s">
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList">
+					<sa-td type="selection"></sa-td>
+					<sa-td type="text" name="用户名" prop="name" min-width="120px"></sa-td>
+					<sa-td type="text" name="姓名" prop="nickname" min-width="120px"></sa-td>
+					<sa-td type="datetime" name="创建时间" prop="createTime" width="150px"></sa-td>
+					<sa-td type="datetime" name="最后登录" prop="loginTime" width="150px"></sa-td>
+					<sa-td type="text" name="登录次数" prop="loginCount" not="0" width="100px"></sa-td>
+					<sa-td type="switch" name="账号状态" prop="status" :jv="{1: '正常', 2: '禁用[#ff4949]'}"
+						@change="s => updateStatus(s.row)" width="120px"></sa-td>
+					<el-table-column label="操作" fixed="right" width="450px">
+						<template slot-scope="s">
 							<span @click="getInfo(s.row)">
 								<el-button type="success" class="c-btn" icon="el-icon-view">查看</el-button>
 							</span>
-                    <span @click="updateName(s.row)" v-if="sa.isAuth('tb-costomer-user-edit')">
+							<span @click="updateName(s.row)" v-if="sa.isAuth('tb-costomer-user-edit')">
 								<el-button type="primary" class="c-btn">改名称</el-button>
 							</span>
-                    <span @click="updateNickname(s.row)" v-if="sa.isAuth('tb-costomer-user-edit')">
+							<span @click="updateNickname(s.row)" v-if="sa.isAuth('tb-costomer-user-edit')">
 								<el-button type="primary" class="c-btn">改姓名</el-button>
 							</span>
-                    <span @click="updateAvatar(s.row)" v-if="sa.isAuth('tb-costomer-user-edit')">
+							<span @click="updateAvatar(s.row)" v-if="sa.isAuth('tb-costomer-user-edit')">
 								<el-button type="primary" class="c-btn">改头像</el-button>
 							</span>
-                    <span @click="updatePassword(s.row)" v-if="sa.isAuth('tb-costomer-user-edit')">
+							<span @click="updatePassword(s.row)" v-if="sa.isAuth('tb-costomer-user-edit')">
 								<el-button type="primary" class="c-btn">改密码</el-button>
 							</span>
-                    <span @click="roleFn(s.row)" v-if="sa.isAuth('tb-costomer-user-edit')">
+							<span @click="roleFn(s.row)" v-if="sa.isAuth('tb-costomer-user-edit')">
 								<el-button type="primary" class="c-btn">角色</el-button>
 							</span>
-                    <span @click="del(s.row)" v-if="sa.isAuth('tb-costomer-user-del')">
+							<span @click="del(s.row)" v-if="sa.isAuth('tb-costomer-user-del')">
 								<el-button type="danger" class="c-btn">删除</el-button>
 							</span>
-                </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="roleDialog.title" :visible.sync="roleDialog.visible" width="60%">
-        <div>
-            <el-checkbox @change="handleCheckAllChange">全选</el-checkbox>
-            <div style="margin: 15px 0;"></div>
-            <el-checkbox-group v-model="roleDialog.form.roleId">
-                <el-checkbox v-for="role in roleList" :label="role.id+''" :key="role.id">{{role.name}}
-                </el-checkbox>
-            </el-checkbox-group>
-        </div>
-        <span slot="footer" class="dialog-footer">
+						</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="roleDialog.title" :visible.sync="roleDialog.visible" width="60%">
+				<div>
+					<el-checkbox @change="handleCheckAllChange">全选</el-checkbox>
+					<div style="margin: 15px 0;"></div>
+					<el-checkbox-group v-model="roleDialog.form.roleId">
+						<el-checkbox v-for="role in roleList" :label="role.id+''" :key="role.id">{{role.name}}
+						</el-checkbox>
+					</el-checkbox-group>
+				</div>
+				<span slot="footer" class="dialog-footer">
 					<el-button @click="roleDialog.visible = false">取 消</el-button>
 					<el-button type="primary" @click="confirmSetRole">确 定</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: {
-            roleDialog: {
-                visible: false,
-                title: '',
-                form: {
-                    id: '',
-                    roleId: [],
-                }
-            },
-            sa: sa, // 超级对象
-            p: { // 查询参数
-                name: '',
-                customerId: sa.p('customerId', ''),
-                sort_type: 0,
-                pageNo: 1,
-                pageSize: 10,
-            },
-            dataCount: 0,
-            dataList: [], // 数据集合
-            roleList: [], // 角色集合
-        },
-        methods: {
-            roleFn(data) {
-                Object.assign(this.roleDialog, {
-                    visible: true,
-                    title: '设置[' + data.name + ']角色属性',
-                    form: {
-                        id: data.id,
-                        roleId: data.roleId.split(',')
-                    }
-                })
-            },
-            handleCheckAllChange() {
-                let roleId = this.roleDialog.form.roleId;
-                let allIds = this.roleList.map(obj => obj.id + '');
-                this.roleDialog.form.roleId = roleId.length != allIds.length ? allIds : [];
-            },
-            confirmSetRole() {
-                let roleId = this.roleDialog.form.roleId;
-                if (roleId.length == 0) {
-                    return sa.msg('请选择一个角色')
-                }
-                let o = {
-                    id: this.roleDialog.form.id,
-                    roleId: this.roleDialog.form.roleId.join(',')
-                }
-                sa.ajax('/admin/setRole', o, function (resp) {
-                    this.f5();
-                    this.roleDialog.visible = false;
-                }.bind(this))
-            },
-            updateNickname(data) {
-                layer.prompt({title: '修改名称'}, function (pass, index) {
-                    layer.close(index);
-                    sa.ajax('/admin/updateNickname', {id: data.id, nickname: pass}, function (res) {
-                        data.nickname = pass;
-                        layer.msg('修改成功');
-                    }.bind(this))
-                });
-            },
-            // 刷新
-            f5: function (isPage) {
-                sa.ajax('/admin/getCustomerAdminList', this.p, function (res) {
-                    this.dataList = res.data; // 数据
-                    this.dataCount = res.dataCount;
-                    sa.f5TableHeight(); // 刷新表格高度
-                }.bind(this));
-            },
-            // 新增
-            add: function () {
-                sa.showIframe('新增用户', 'customer-admin-add.html?customerId=' + this.p.customerId, '550px',
-                    '75%');
-            },
-            // 查看详情
-            getInfo: function (data) {
-                sa.showIframe('账号详情', '../../sa-view-sp/sp-admin/admin-info.html?id=' + data.id, '700px',
-                    '80%');
-                //sa.$page.openAdminInfo(data.id, data.name);
-            },
-            // 查看 - 根据选中的
-            getBySelect: function (data) {
-                var selection = this.$refs['data-table'].selection;
-                if (selection.length == 0) {
-                    return sa.msg('请选择一条数据')
-                }
-                this.getInfo(selection[0]);
-            },
-            // 修改名称
-            updateName: function (data) {
-                layer.prompt({
-                    title: '修改账号名称'
-                }, function (pass, index) {
-                    layer.close(index);
-                    sa.ajax('/admin/update', {
-                        id: data.id,
-                        name: pass
-                    }, function (res) {
-                        data.name = pass;
-                        layer.msg('修改成功');
-                    })
-                });
-            },
-            // 修改头像
-            updateAvatar: function (data) {
-                sa.uploadImage(function (src) {
-                    var p = {
-                        id: data.id,
-                        avatar: src
-                    };
-                    sa.ajax('/admin/updateAvatar', p, function (res) {
-                        sa.msg('上传成功');
-                        data.avatar = src;
-                    }.bind(this));
-                })
-            },
-            // 修改密码
-            updatePassword: function (data) {
-                layer.prompt({
-                    title: '修改密码'
-                }, function (pass, index) {
-                    layer.close(index);
-                    if (pass.length < 4) {
-                        return layer.msg('新密码长度请不要低于4位');
-                    }
-                    sa.ajax('/admin/updatePassword', {
-                        id: data.id,
-                        password: pass
-                    }, function (res) {
-                        layer.msg('修改成功');
-                    })
-                });
-            },
-            // 修改角色
-            updateRoleId: function (data, roleId, roleName) {
-                if (data.id == sa.$sys.getCurrUser().id) {
-                    return sa.alert('不能自己修改自己的角色');
-                }
-                if (data.roleId == roleId) {
-                    return sa.alert('该用户已经是' + roleName + '了');
-                }
-                var str = '将此账号修改为 [' + roleName + '], 请确认?';
-                layer.confirm(str, {
-                    title: '请确认'
-                }, function () {
-                    sa.ajax('/admin/updateRole', {
-                        id: data.id,
-                        roleId: roleId
-                    }, function (res) {
-                        sa.msg('修改成功');
-                        data.roleId = roleId;
-                        data.roleName = roleName;
-                    }.bind(this));
-                }.bind(this));
-            },
-            // 修改用户的状态
-            updateStatus: function (data) {
-                if (data.id == sa.$sys.getCurrUser().id) {
-                    data.status = 3 - data.status;
-                    return sa.alert('不能自己封禁自己');
-                }
-                var is_ok = false; // 记录是否成功
-                var ajax = sa.ajax('/admin/updateStatus', {
-                    adminId: data.id,
-                    status: data.status
-                }, function (res) {
-                    sa.msg('修改成功');
-                    is_ok = true;
-                }.bind(this));
-                // 如果未能修改成功, 则回滚
-                $.when(ajax).done(function () {
-                    if (is_ok == false) {
-                        data.status = 3 - data.status;
-                    }
-                })
-            },
-            // 删除
-            del: function (data) {
-                sa.confirm('是否删除,此操作不可撤销', function () {
-                    sa.ajax('/admin/delete', {
-                        id: data.id
-                    }, function (res) {
-                        sa.arrayDelete(app.dataList, data);
-                        sa.ok('删除成功');
-                        sa.f5TableHeight(); // 刷新表格高度
-                    })
-                });
-            },
-            // 批量删除
-            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('/admin/deleteByIds', {
-                        ids: ids.join(',')
-                    }, function (res) {
-                        sa.arrayDelete(this.dataList, selection);
-                        sa.ok('删除成功');
-                        sa.f5TableHeight(); // 刷新表格高度
-                    }.bind(this))
-                }.bind(this));
-            },
-            getRoleList() {
-                // 加载角色
-                sa.ajax('/role/getCustomerRoleList', {
-                    customerId: this.p.customerId
-                }, function (res) {
-                    this.roleList = res.data; // 数据
-                }.bind(this), {
-                    msg: null
-                });
-            }
-        },
-        created: function () {
-            this.f5();
-            sa.onInputEnter(); // 监听回车执行查询
-            this.getRoleList();
-        }
-    })
-</script>
-</body>
-</html>
+			</el-dialog>
+		</div>
+		<script>
+			const numStr = "123456789";
+			const numStrDesc = "987654321";
+			const varStr = "abcdefghijklmnopkrstuvwxyz"
+			const varStrDesc = "zyxwvutsrkpomnlkjihgfedcba"
+			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: {
+					roleDialog: {
+						visible: false,
+						title: '',
+						form: {
+							id: '',
+							roleId: [],
+						}
+					},
+					sa: sa, // 超级对象
+					p: { // 查询参数
+						name: '',
+						customerId: sa.p('customerId', ''),
+						sort_type: 0,
+						pageNo: 1,
+						pageSize: 10,
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合
+					roleList: [], // 角色集合
+				},
+				methods: {
+					roleFn(data) {
+						Object.assign(this.roleDialog, {
+							visible: true,
+							title: '设置[' + data.name + ']角色属性',
+							form: {
+								id: data.id,
+								roleId: data.roleId.split(',')
+							}
+						})
+					},
+					handleCheckAllChange() {
+						let roleId = this.roleDialog.form.roleId;
+						let allIds = this.roleList.map(obj => obj.id + '');
+						this.roleDialog.form.roleId = roleId.length != allIds.length ? allIds : [];
+					},
+					confirmSetRole() {
+						let roleId = this.roleDialog.form.roleId;
+						if (roleId.length == 0) {
+							return sa.msg('请选择一个角色')
+						}
+						let o = {
+							id: this.roleDialog.form.id,
+							roleId: this.roleDialog.form.roleId.join(',')
+						}
+						sa.ajax('/admin/setRole', o, function(resp) {
+							this.f5();
+							this.roleDialog.visible = false;
+						}.bind(this))
+					},
+					updateNickname(data) {
+						layer.prompt({
+							title: '修改名称'
+						}, function(pass, index) {
+							layer.close(index);
+							sa.ajax('/admin/updateNickname', {
+								id: data.id,
+								nickname: pass
+							}, function(res) {
+								data.nickname = pass;
+								layer.msg('修改成功');
+							}.bind(this))
+						});
+					},
+					// 刷新
+					f5: function(isPage) {
+						sa.ajax('/admin/getCustomerAdminList', this.p, function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount;
+							sa.f5TableHeight(); // 刷新表格高度
+						}.bind(this));
+					},
+					// 新增
+					add: function() {
+						sa.showIframe('新增用户', 'customer-admin-add.html?customerId=' + this.p.customerId, '550px',
+							'75%');
+					},
+					// 查看详情
+					getInfo: function(data) {
+						sa.showIframe('账号详情', '../../sa-view-sp/sp-admin/admin-info.html?id=' + data.id, '700px',
+							'80%');
+						//sa.$page.openAdminInfo(data.id, data.name);
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if (selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.getInfo(selection[0]);
+					},
+					// 修改名称
+					updateName: function(data) {
+						layer.prompt({
+							title: '修改账号名称'
+						}, function(pass, index) {
+							layer.close(index);
+							sa.ajax('/admin/update', {
+								id: data.id,
+								name: pass
+							}, function(res) {
+								data.name = pass;
+								layer.msg('修改成功');
+							})
+						});
+					},
+					// 修改头像
+					updateAvatar: function(data) {
+						sa.uploadImage(function(src) {
+							var p = {
+								id: data.id,
+								avatar: src
+							};
+							sa.ajax('/admin/updateAvatar', p, function(res) {
+								sa.msg('上传成功');
+								data.avatar = src;
+							}.bind(this));
+						})
+					},
+					// 修改密码
+					updatePassword: function(data) {
+						let that = this;
+						layer.prompt({
+							title: '修改密码'
+						}, function(pass, index) {
+							layer.close(index);
+							if (pass.length < 4) {
+								return layer.msg('新密码长度请不要低于4位');
+							}
+							let result = that.newPwdChange(pass);
+							if (!result) {
+								return;
+							}
+							sa.ajax('/admin/updatePassword', {
+								id: data.id,
+								password: pass
+							}, function(res) {
+								layer.msg('修改成功');
+							})
+						});
+					},
+					newPwdChange(v) {
+						let len = v.length;
+						if (!this.checkStong(v)) {
+							layer.msg('密码长度8-16位,至少包含一个数字、一个大写字母、一个小写字母以及!@#$%^&*?之一')
+							return false;
+						}
+						if (len >= 3) {
+							let s = v.toLowerCase();
+							for (let i = 0; i < len - 2; i++) {
+								let charStr = s.substring(i, i + 3);
+								if (this.checkStr(charStr)) {
+									layer.msg('密码不应该采用连续升序或者连续降序');
+									return false;
+								}
+							}
+						}
+					},
+					checkStr(charStr) {
+						return numStr.indexOf(charStr) != -1 || varStr.indexOf(charStr) != -1 || numStrDesc.indexOf(
+							charStr) != -1 || varStrDesc.indexOf(charStr) != -1;
+					},
+					checkStong(v) {
+						let pattern = /^.*(?=.{8,16})(?=.*\d)(?=.*[A-Z]{1,})(?=.*[a-z]{1,})(?=.*[!@#$%^&*?\(\)]).*$/;
+						return pattern.test(v);
+					},
+					// 修改角色
+					updateRoleId: function(data, roleId, roleName) {
+						if (data.id == sa.$sys.getCurrUser().id) {
+							return sa.alert('不能自己修改自己的角色');
+						}
+						if (data.roleId == roleId) {
+							return sa.alert('该用户已经是' + roleName + '了');
+						}
+						var str = '将此账号修改为 [' + roleName + '], 请确认?';
+						layer.confirm(str, {
+							title: '请确认'
+						}, function() {
+							sa.ajax('/admin/updateRole', {
+								id: data.id,
+								roleId: roleId
+							}, function(res) {
+								sa.msg('修改成功');
+								data.roleId = roleId;
+								data.roleName = roleName;
+							}.bind(this));
+						}.bind(this));
+					},
+					// 修改用户的状态
+					updateStatus: function(data) {
+						if (data.id == sa.$sys.getCurrUser().id) {
+							data.status = 3 - data.status;
+							return sa.alert('不能自己封禁自己');
+						}
+						var is_ok = false; // 记录是否成功
+						var ajax = sa.ajax('/admin/updateStatus', {
+							adminId: data.id,
+							status: data.status
+						}, function(res) {
+							sa.msg('修改成功');
+							is_ok = true;
+						}.bind(this));
+						// 如果未能修改成功, 则回滚
+						$.when(ajax).done(function() {
+							if (is_ok == false) {
+								data.status = 3 - data.status;
+							}
+						})
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/admin/delete', {
+								id: data.id
+							}, function(res) {
+								sa.arrayDelete(app.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight(); // 刷新表格高度
+							})
+						});
+					},
+					// 批量删除
+					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('/admin/deleteByIds', {
+								ids: ids.join(',')
+							}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight(); // 刷新表格高度
+							}.bind(this))
+						}.bind(this));
+					},
+					getRoleList() {
+						// 加载角色
+						sa.ajax('/role/getCustomerRoleList', {
+							customerId: this.p.customerId
+						}, function(res) {
+							this.roleList = res.data; // 数据
+						}.bind(this), {
+							msg: null
+						});
+					}
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter(); // 监听回车执行查询
+					this.getRoleList();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 155 - 100
sp-admin/sa-view/tb-partner/customer-admin-add.html

@@ -1,105 +1,160 @@
 <!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="https://unpkg.com/http-vue-loader@1.4.2/src/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">
-        <el-form>
-            <!-- 防止密码框被填充 -->
-            <div style="height: 0px; overflow: hidden;">
-                <el-input></el-input>
-                <el-input type="password"></el-input>
-            </div>
-            <!-- 表单 -->
-            <sa-item type="text" name="用户名" v-model="m.name" placeholder="请输入用户名" br></sa-item>
-            <sa-item type="password" name="密码" v-model="m.password" placeholder="请输入密码" br></sa-item>
-            <sa-item type="password" name="再输一次" v-model="m.againPassword" placeholder="请再输一次密码" br></sa-item>
-            <div class="c-item">
-                <label class="c-label"><span style="color: red;">*</span>角色:</label>
-                <el-select v-model="m.roleIds" multiple>
-                    <el-option label="请选择" :value="0" disabled></el-option>
-                    <el-option v-for="role in roleList" :key="role.id" :label="role.name" :value="role.id">
-                    </el-option>
-                </el-select>
-            </div>
-            <sa-item name="" br>
-                <el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
-            </sa-item>
-        </el-form>
-    </div>
-</div>
+	<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="https://unpkg.com/http-vue-loader@1.4.2/src/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>
+			.error {
+				color: red;
+				font-size: 12px;
+				margin-left: 100px
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<!-- 参数栏 -->
+			<div class="c-panel">
+				<el-form>
+					<!-- 防止密码框被填充 -->
+					<div style="height: 0px; overflow: hidden;">
+						<el-input></el-input>
+						<el-input type="password"></el-input>
+					</div>
+					<!-- 表单 -->
+					<sa-item type="text" name="用户名" v-model="m.name" placeholder="请输入用户名" br></sa-item>
+					<sa-item type="password" name="密码" v-model="m.password" placeholder="请输入密码" @input="newPwdChange"
+						br></sa-item>
+					<div v-if="pwdError" class="error">{{pwdError}}</div>
+					<sa-item type="password" name="再输一次" v-model="m.againPassword" @input="newPwd2Change"
+						placeholder="请再输一次密码" br></sa-item>
+					<div v-if="newPwd2Error" class="error">{{newPwd2Error}}</div>
 
-<script>
-    var app = new Vue({
-        components: {
-            "sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
-        },
-        el: '.vue-box',
-        data: {
-            sa: sa, // 超级对象
-            m: {
-                id: 0,
-                customerId: sa.p('customerId', ''),
-                name: '',
-                avatar: '',
-                password: '',
-                againPassword: '',
-                roleIds: []
-            },
-            roleList: []
-        },
-        methods: {
-            // 修改
-            ok: function () {
-                console.log(this.m)
-                // 表单校验
-                let m = this.m;
-                sa.checkNull(m.name, '请输入用户名');
-                sa.checkNull(m.password, '请输入密码');
-                if (m.password !== m.againPassword) {
-                    sa.error('两次输入密码不一致');
-                    return;
-                }
-                m.roleId = m.roleIds.join(',')
-                // 添加
-                sa.ajax('/admin/addPartnerAdmin', m, function (res) {
-                    sa.alert('增加成功', this.clean);
+					<div class="c-item">
+						<label class="c-label"><span style="color: red;">*</span>角色:</label>
+						<el-select v-model="m.roleIds" multiple>
+							<el-option label="请选择" :value="0" disabled></el-option>
+							<el-option v-for="role in roleList" :key="role.id" :label="role.name" :value="role.id">
+							</el-option>
+						</el-select>
+					</div>
+					<sa-item name="" br>
+						<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+					</sa-item>
+				</el-form>
+			</div>
+		</div>
 
-                }.bind(this));
+		<script>
+			const numStr = "123456789";
+			const numStrDesc = "987654321";
+			const varStr = "abcdefghijklmnopkrstuvwxyz"
+			const varStrDesc = "zyxwvutsrkpomnlkjihgfedcba"
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					sa: sa, // 超级对象
+					m: {
+						id: 0,
+						customerId: sa.p('customerId', ''),
+						name: '',
+						avatar: '',
+						password: '',
+						againPassword: '',
+						roleIds: []
+					},
+					pwdError: '',
+					newPwd2Error: '',
+					roleList: []
+				},
+				methods: {
+					// 修改
+					ok: function() {
+						// 表单校验
+						let m = this.m;
+						sa.checkNull(m.name, '请输入用户名');
+						sa.checkNull(m.password, '请输入密码');
+						if (m.password !== m.againPassword) {
+							sa.error('两次输入密码不一致');
+							return;
+						}
+						if (this.pwdError || this.newPwd2Error) {
+							return;
+						}
+						m.roleId = m.roleIds.join(',')
+						// 添加
+						sa.ajax('/admin/addPartnerAdmin', m, function(res) {
+							sa.alert('增加成功', this.clean);
 
-            },
-            clean() {
-                parent.app.f5(); // 刷新父页面列表
-                sa.closeCurrIframe(); // 关闭本页
-            }
-        },
-        mounted: function () {
-            // 加载角色
-            sa.ajax('/role/getCustomerRoleList', {
-                customerId: this.m.customerId
-            }, function (res) {
-                this.roleList = res.data; // 数据
-            }.bind(this), {
-                msg: null
-            });
-        }
-    })
-</script>
-</body>
-</html>
+						}.bind(this));
+
+					},
+					clean() {
+						parent.app.f5(); // 刷新父页面列表
+						sa.closeCurrIframe(); // 关闭本页
+					},
+
+					newPwdChange(v) {
+						let len = v.length;
+						this.pwdError = '';
+						if (!this.checkStong(v)) {
+							this.pwdError = '密码长度8-16位,至少包含一个数字、一个大写字母、一个小写字母以及!@#$%^&*?之一'
+							return;
+						}
+						if (len >= 3) {
+							let s = v.toLowerCase();
+							for (let i = 0; i < len - 2; i++) {
+								let charStr = s.substring(i, i + 3);
+								if (this.checkStr(charStr)) {
+									this.pwdError = '密码不应该采用连续升序或者连续降序'
+									return;
+								}
+							}
+						}
+					},
+					newPwd2Change(v) {
+						let len = v.length;
+						this.newPwd2Error = '';
+						if (this.m.password != v) {
+							this.newPwd2Error = '两次输入密码不一致';
+							return;
+						}
+					},
+					checkStr(charStr) {
+						return numStr.indexOf(charStr) != -1 || varStr.indexOf(charStr) != -1 || numStrDesc.indexOf(
+							charStr) != -1 || varStrDesc.indexOf(charStr) != -1;
+					},
+					checkStong(v) {
+						let pattern = /^.*(?=.{8,16})(?=.*\d)(?=.*[A-Z]{1,})(?=.*[a-z]{1,})(?=.*[!@#$%^&*?\(\)]).*$/;
+						return pattern.test(v);
+					},
+				},
+				mounted: function() {
+					// 加载角色
+					sa.ajax('/role/getCustomerRoleList', {
+						customerId: this.m.customerId
+					}, function(res) {
+						this.roleList = res.data; // 数据
+					}.bind(this), {
+						msg: null
+					});
+				}
+			})
+		</script>
+	</body>
+</html>

+ 34 - 0
sp-admin/sa-view/tb-partner/customer-admin-list.html

@@ -90,6 +90,10 @@
     </el-dialog>
 </div>
 <script>
+	const numStr = "123456789";
+	const numStrDesc = "987654321";
+	const varStr = "abcdefghijklmnopkrstuvwxyz"
+	const varStrDesc = "zyxwvutsrkpomnlkjihgfedcba"
     var app = new Vue({
         components: {
             "sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),
@@ -203,16 +207,46 @@
             },
             // 修改密码
             updatePassword: function (data) {
+				let that=this;
                 layer.prompt({title: '修改密码'}, function (pass, index) {
                     layer.close(index);
                     if (pass.length < 4) {
                         return layer.msg('新密码长度请不要低于4位');
                     }
+					let result = that.newPwdChange(pass);
+					if (!result) {
+						return;
+					}
                     sa.ajax('/admin/updatePassword', {id: data.id, password: pass}, function (res) {
                         layer.msg('修改成功');
                     })
                 });
             },
+			newPwdChange(v) {
+				let len = v.length;
+				if (!this.checkStong(v)) {
+					layer.msg('密码长度8-16位,至少包含一个数字、一个大写字母、一个小写字母以及!@#$%^&*?之一')
+					return false;
+				}
+				if (len >= 3) {
+					let s = v.toLowerCase();
+					for (let i = 0; i < len - 2; i++) {
+						let charStr = s.substring(i, i + 3);
+						if (this.checkStr(charStr)) {
+							layer.msg('密码不应该采用连续升序或者连续降序');
+							return false;
+						}
+					}
+				}
+			},
+			checkStr(charStr) {
+				return numStr.indexOf(charStr) != -1 || varStr.indexOf(charStr) != -1 || numStrDesc.indexOf(
+					charStr) != -1 || varStrDesc.indexOf(charStr) != -1;
+			},
+			checkStong(v) {
+				let pattern = /^.*(?=.{8,16})(?=.*\d)(?=.*[A-Z]{1,})(?=.*[a-z]{1,})(?=.*[!@#$%^&*?\(\)]).*$/;
+				return pattern.test(v);
+			},
             // 修改角色
             updateRoleId: function (data, roleId, roleName) {
                 if (data.id == sa.$sys.getCurrUser().id) {

+ 1 - 1
sp-admin/sa-view/tb-partner/tb-partner-add.html

@@ -91,7 +91,7 @@
         },
         methods: {
             getGoodsList() {
-                sa.ajax('/TbGoods/getList', function (resp) {
+                sa.ajax('/TbGoods/getList',{pageNo:1,pageSize:50}, function (resp) {
                     this.goodsList = resp.data;
                 }.bind(this));
             },

+ 42 - 6
sp-server/src/main/java/com/pj/api/jh/service/JhService.java

@@ -19,8 +19,14 @@ import com.pj.current.config.MyConfig;
 import com.pj.current.config.PartConfig;
 import com.pj.current.config.WxConfig;
 import com.pj.current.task.TaskService;
+import com.pj.project.tb_business.TbBusiness;
+import com.pj.project.tb_business.TbBusinessService;
 import com.pj.project.tb_business_car.TbBusinessCar;
 import com.pj.project.tb_business_car.TbBusinessCarService;
+import com.pj.project.tb_business_item.TbBusinessItem;
+import com.pj.project.tb_business_item.TbBusinessItemService;
+import com.pj.project.tb_car_weight.TbCarWeight;
+import com.pj.project.tb_car_weight.TbCarWeightService;
 import com.pj.project.tb_order.TbOrder;
 import com.pj.project.tb_order.TbOrderService;
 import com.pj.project4sp.global.BusinessException;
@@ -37,10 +43,8 @@ import java.nio.charset.Charset;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @Auther: lzm
@@ -70,6 +74,12 @@ public class JhService {
     @Resource
     @Lazy
     private TbBusinessCarService tbBusinessCarService;
+    @Resource
+    private TbBusinessService tbbusinessservice;
+    @Resource
+    private TbBusinessItemService tbBusinessItemService;
+    @Resource
+    private TbCarWeightService tbCarWeightService;
 
 
     public Map<String, ?> initPay(HttpServletRequest request) throws Exception {
@@ -82,6 +92,32 @@ public class JhService {
         }
         String openid = request.getParameter("openid");
         String businessCarId = request.getParameter("businessCarId");
+        List<TbBusiness> businesses = tbbusinessservice.findOtherBusinessByCarId(businessCarId);
+        long current = System.currentTimeMillis() / 1000;
+        if (businesses.isEmpty()) {
+            TbBusinessCar db = tbBusinessCarService.getById(businessCarId);
+            if (db != null && db.getPay() == 1 && current - db.getPayTime().getTime() / 1000 < 1800) {
+                throw new BusinessException("订单信息有变化,请重新扫码");
+            }
+        } else {
+            List<String> busienssIdList = businesses.stream().map(TbBusiness::getId).collect(Collectors.toList());
+            List<TbBusinessItem> items = tbBusinessItemService.findByBusinessIdList(busienssIdList);
+            if (!items.isEmpty()) {
+                Optional<TbBusinessItem> optionalTbBusinessItem = items.stream().filter(item -> item.getPayStatus()==1&&(current - item.getPayTime().getTime() / 1000 < 120)).findAny();
+                if (optionalTbBusinessItem.isPresent()) {
+                    throw new BusinessException("订单信息有变化,请重新扫码");
+                }
+            }
+        }
+        List<TbCarWeight> weights = tbCarWeightService.findByBusinessCarId(businessCarId);
+        if (!weights.isEmpty()){
+            Optional<TbCarWeight> optional = weights.stream()
+                    .filter(item -> item.getPayStatus()==1&&(current - item.getPayTime().getTime() / 1000 < 120)).findAny();
+            if (optional.isPresent()) {
+                throw new BusinessException("订单信息有变化,请重新扫码");
+            }
+        }
+
         String calculateId = request.getParameter("calculateId");
         String desc = handlerDesc(request.getParameter("desc"));
         String b = request.getParameter("b");
@@ -142,8 +178,8 @@ public class JhService {
                     .setOutTradeNo(out_trade_no).setPrice(money);
             tbOrderService.save(tbOrder);
             // taskService.addTask(new CheckPayStatusTask(RandomUtil.randomNumbers(12), 2000, out_trade_no));
-            TbBusinessCar last=tbBusinessCarService.getById(businessCarId);
-            log.info("last11111------>{}",JSONUtil.toJsonStr(last));
+            TbBusinessCar last = tbBusinessCarService.getById(businessCarId);
+            log.info("last11111------>{}", JSONUtil.toJsonStr(last));
             return BeanUtil.beanToMap(object);
         }
         throw new AjaxError("生成订单失败");

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

@@ -69,7 +69,7 @@ import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 @Service
-@Transactional
+@Transactional(rollbackFor = Exception.class)
 @Slf4j
 public class OpenService {
     @Resource
@@ -359,7 +359,7 @@ public class OpenService {
         }
         if (total.doubleValue() > 0) {
             String desc = "请缴" + total + "费用";
-            boolean flag = automaticPay.payBusinessAndPartMoney(businessList, tbBusinessCar, partMoneyRes, businessRes, carWeights);
+            boolean flag = automaticPay.payBusinessAndPartMoney(businessList, tbBusinessCar, partMoneyRes, businessMoney, carWeights);
             if (flag) {
                 log.info("预存款扣款成功,返回:{},放行", carNo);
                 freeOut(tbBusinessCar, now, channel, image);

+ 20 - 0
sp-server/src/main/java/com/pj/api/open/web/OpenController.java

@@ -7,12 +7,15 @@ import com.pj.api.open.ResultJson;
 import com.pj.api.open.bo.CheckCarNumberBO;
 import com.pj.api.open.bo.InRecordBO;
 import com.pj.api.open.service.OpenService;
+import com.pj.project.sync.HelpService;
+import com.pj.project.sync.response.IOrderPriceRes;
 import com.pj.project.tb_deduction_bind.TbDeductionBindService;
 import com.pj.project.tb_deduction_record.TbDeductionRecordService;
 import com.pj.utils.sg.AjaxJson;
 import lombok.extern.slf4j.Slf4j;
 import org.aspectj.weaver.loadtime.Aj;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
@@ -92,4 +95,21 @@ public class OpenController {
         return AjaxJson.getSuccess();
     }
 
+    @PostMapping("calculateMoney")
+    public AjaxJson doMoney(@RequestPart MultipartFile file) {
+        tbDeductionRecordService.calculateMoney(file);
+        return AjaxJson.getSuccess();
+    }
+    @Resource
+    private HelpService helpService;
+
+    @PostMapping("deCrypte")
+    public AjaxJson deCrypte(@RequestBody String data) {
+        data="{\"request\":{\"sysId\":\"0110\",\"encrypted\":\"cMh0qJnmEpoGeeQ5Le7AD4+hQp3+EQIIG3ndeTSOioNR7Fj9qO0Ho68g0T9KfMVYmrni0cS8gdCRN6pQJdLyETTzU6yr/t5TIKZWr5+8yGvlgzzkflWm/BJh3f1NFKn6JMtT/KbT4lY7+A6oo+eyQKfnbMGp9hsEq9LpZX/nr2zmcXy0KuoxM9+zFulvpDvnO6cllGcxycA0aj9j/7aTEDxNtzN+w9k1GEEyDcKU/7npJeHQGlX3MjQtv3MnnTn7ixQL69toNdN+mUiSP9BJolK4/QGNR5dB43P93meWrjVArdU2coh+GOvp22gQSZ8bmG51SNN6dRWv61sBbZuYh8tp07Nt6F1eHrZydz9MFg5RRJELSE4ZTImS1KmnefcDLLbN0xZyDLtqzCJRhp/itPHWBXYTHZG754Xf36i/G4c=\",\"keyEncrypted\":\"aixnEIN3wgv2cMNQpHABsFYhwmVBIHpsE4Lr91fxd/sa5CGA72NDmn6MedAr7U7cKrCqQonqrhcoUwd6Yn7AJGaCcPpHIR43DTFUenS3c9Xp+TcYjwXgGYqFRV8y2ZcBbQPqxRSgYnTDu+wGBSUYScxcHH/bqTLGzONL3wPs16w=\",\"timeStamp\":\"20240526220927\",\"apiName\":\"REQ_005\"},\"signature\":\"32492db1c5b76fff6439561dde1a5004\"}";
+        return AjaxJson.getSuccessData(helpService.deCrypte(data,IOrderPriceRes.class));
+    }
+
+
+
+
 }

+ 4 - 0
sp-server/src/main/java/com/pj/project/sync/HelpService.java

@@ -14,6 +14,7 @@ import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.pj.current.config.PushfeeConfig;
 import com.pj.project.sync.bo.SyncResultBO;
+import com.pj.project.sync.response.IOrderPriceRes;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.formula.functions.T;
 import org.springframework.stereotype.Component;
@@ -67,4 +68,7 @@ public class HelpService {
         ParsedMessage parsedMessage = ServerRoleBuilder.builder().operation(operation).build().processRequestBody(content, clientApiKey);
         return parsedMessage.getBean(clazz);
     }
+
+
+
 }

+ 3 - 1
sp-server/src/main/java/com/pj/project/sync/SyncService.java

@@ -103,7 +103,9 @@ public class SyncService {
         iOrderPriceReq.setSysId(pushfeeConfig.getSysId()).setExpenses(expenses).setOrderNum(1);
         SyncResultBO resultBO = helpService.req("/price/external/order/calc", iOrderPriceReq);
         if (resultBO.getCode() == 200) {
-            return  helpService.deCrypte(resultBO.getData(), IOrderPriceRes.class);
+            IOrderPriceRes iOrderPriceRes=  helpService.deCrypte(resultBO.getData(), IOrderPriceRes.class);
+            log.info("resp iOrderPriceRes:{}", JSONUtil.toJsonStr(iOrderPriceRes));
+            return  iOrderPriceRes;
         }
         throw new AjaxError(resultBO.getMsg());
     }

+ 1 - 1
sp-server/src/main/java/com/pj/project/sync/response/IOrderPriceRes.java

@@ -24,7 +24,7 @@ public class IOrderPriceRes implements Serializable {
     /**
      * 订单应支付的总金额
      */
-    private BigDecimal totalOrderPrice=BigDecimal.valueOf(0);
+    private BigDecimal totalOrderPrice=new BigDecimal("0");
 
     /**
      * 单价命中结果

+ 17 - 5
sp-server/src/main/java/com/pj/project/tb_account/AutomaticPay.java

@@ -44,6 +44,7 @@ import com.pj.project.tb_item.TbItemService;
 import com.pj.utils.AesUtil;
 import com.pj.utils.cache.RedisUtil;
 import com.pj.utils.sg.NbUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
@@ -63,7 +64,8 @@ import java.util.stream.Collectors;
  * 预充值自动缴费
  */
 @Component
-@Transactional
+@Transactional(rollbackFor = Exception.class)
+@Slf4j
 public class AutomaticPay {
 
     @Resource
@@ -130,7 +132,7 @@ public class AutomaticPay {
      */
     public boolean payBusinessAndPartMoney(List<TbBusiness> businessList,
                                            TbBusinessCar tbBusinessCar,
-                                           IOrderPriceRes partMoneyRes, IOrderPriceRes businessRes, List<TbCarWeight> carWeights) {
+                                           IOrderPriceRes partMoneyRes, BigDecimal businessMoney, List<TbCarWeight> carWeights) {
         Date now = new Date();
         String customerId = tbBusinessCar.getCustomerId();
         if (StrUtil.isEmpty(customerId)) {
@@ -140,10 +142,13 @@ public class AutomaticPay {
         //原金额
         BigDecimal originalMoney = tbAccount.getTotalMoney();
 
+
         //停车费扣除
         BigDecimal partMoney = partMoneyRes.getTotalOrderPrice();
+
         //业务费用
-        BigDecimal businessMoney = businessRes.getTotalOrderPrice();
+//        BigDecimal businessMoney = businessRes.getTotalOrderPrice();
+
         //过磅费
         BigDecimal weightMoney = BigDecimal.ZERO;
         for (TbCarWeight carWeight : carWeights) {
@@ -154,9 +159,15 @@ public class AutomaticPay {
         if (totalMoney.compareTo(originalMoney) > 0) {
             return false;//不够交
         }
+        log.info("payment============:{}",partMoney);
+        log.info("businessMoney=========:{}",businessMoney);
+        log.info("totalMoney==========:{}",totalMoney);
         //余额
         BigDecimal balance = originalMoney.subtract(totalMoney);
+        log.info("Balance: " + balance);
         tbAccount.setTotalMoney(balance);
+        //更新账户余额
+        tbAccountService.updateById(tbAccount);
         TbCostomer tbCostomer = tbCostomerService.getById(customerId);
         String customerName = tbCostomer.getName();
         //地磅费统计
@@ -235,11 +246,13 @@ public class AutomaticPay {
                     int feeType = item.getPayType();
                     FeeTypeEnum feeTypeEnum = FeeTypeEnum.getEnum(feeType);
                     TbFeeDetails details = tbFeeDetailsService.savePrePayDetails(res, item, tbBusinessCar, tbBusiness, tbBusiness.getCustomerName(), tbBusiness.getPickCustomerName(), feeTypeEnum);
+                    log.info("originalMoney:{}",originalMoney);
                     TbDeductionRecord record = createTbDeductionRecord(details, originalMoney, BigDecimal.ZERO, customerId, tbBusiness.getCustomerName(),
                             tbBusinessCar.getCarNo(), tbBusinessCar.getId(), feeTypeEnum);
                     invoiceOrderService.addInvoiceOrder(tbBusiness.getGoodsName(), tbBusiness.getNo(), tbBusiness.getCarNoStr(), tbBusiness.getId(),
                             tbBusiness.getCustomerId(), tbBusiness.getCustomerName(), tbBusiness.getCustomerName(), res.getTotalOrderPrice(), details, record);
                      originalMoney=originalMoney.subtract(details.getItemPrice());
+                    log.info("after originalMoney:{}",originalMoney);
                 } else {
                     tbBusiness.setPayMoney(tbBusiness.getPayMoney().add(partMoney)).setItemPrice(BigDecimal.ZERO);
                 }
@@ -265,8 +278,7 @@ public class AutomaticPay {
         }
         //todo 构造统计数据
         tbFeeStatisticsService.addOrUpdateStatistic(now, PayEnum.PayType.PER_PAY.getCode());//更新当前日期的日统计
-        //更新账户余额
-        tbAccountService.updateById(tbAccount);
+
         return true;
     }
 }

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

@@ -1113,7 +1113,7 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
             } else {
 
                 //不存在或者已经离场的
-                if (checkCar == null) {
+                if (checkCar == null||checkCar.getRealOutTime()!=null) {
                     throw new AjaxError("车辆【" + carNo + "】未入场");
                 }
                 checkCar.setCarNo(carNo).setCarType(tbBusinessCar.getCarType()).setCarSize(tbBusinessCar.getCarSize())

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

@@ -33,6 +33,8 @@ import com.pj.project.tb_item_fac.TbItemFac;
 import com.pj.project.tb_item_fac.TbItemFacService;
 import com.pj.project.tb_item_type.TbItemType;
 import com.pj.project.tb_item_type.TbItemTypeService;
+import com.pj.project.tb_mild_car.TbMildCar;
+import com.pj.project.tb_mild_car.TbMildCarService;
 import com.pj.project4sp.admin.SpAdmin;
 import com.pj.project4sp.admin.SpAdminService;
 import com.pj.project4sp.global.BusinessException;
@@ -100,7 +102,7 @@ public class TbBusinessItemService extends ServiceImpl<TbBusinessItemMapper, TbB
     private TbItemTypeService tbItemTypeService;
 
     @Resource
-    private TbBusinessCarService tbBusinessCarService;
+    private TbMildCarService tbMildCarService;
 
 
     /**
@@ -411,7 +413,13 @@ public class TbBusinessItemService extends ServiceImpl<TbBusinessItemMapper, TbB
         }
         orderItem.setUniqExpenseId(uniqExpenseId).setExpenseNum(hour+"");
     }
+    public void buildPartItem(TbBusinessItem item,String carNo, IOrderItem iOrderItem) {
+       TbMildCar tbMildCar= tbMildCarService.findByCarNo(carNo);
+       if (tbMildCar==null) {
 
+       }
+
+    }
     public TbBusinessItem findTheLastRecordByCabinetNo(String cabinetNo) {
         QueryWrapper<TbBusinessItem> ew = new QueryWrapper<>();
         ew.lambda().eq(TbBusinessItem::getCabinetNo, cabinetNo)
@@ -437,4 +445,6 @@ public class TbBusinessItemService extends ServiceImpl<TbBusinessItemMapper, TbB
        items.parallelStream().forEach(tbBusinessItem ->   tbBusinessItem.setConfirm(1).setConfirmTime(new Date()));
        this.updateBatchById(items);
     }
+
+
 }

+ 25 - 1
sp-server/src/main/java/com/pj/project/tb_car_weight/CheckPayStatusTask.java

@@ -1,2 +1,26 @@
-package com.pj.project.tb_car_weight;public class CheckPayStatusTask {
+package com.pj.project.tb_car_weight;
+
+
+import cn.hutool.json.JSONUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Component
+@Slf4j
+public class CheckPayStatusTask {
+    @Resource
+    private TbCarWeightService tbCarWeightService;
+
+//    @Scheduled(fixedDelay = 1000)
+   public void check(){
+     List<TbCarWeight>list= tbCarWeightService.findErrorList();
+     list.forEach(tbCarWeight -> tbCarWeight.setPayStatus(1));
+     tbCarWeightService.updateBatchById(list);
+
+   }
+
 }

+ 1 - 1
sp-server/src/main/java/com/pj/project/tb_car_weight/TbCarWeight.java

@@ -127,7 +127,7 @@ public class TbCarWeight extends Model<TbCarWeight> implements Serializable {
 	 */
 	private String calculateId;
 
-	private int payStatus=0;
+	private int payStatus;
 	private int payType;
 	private Date payTime;
 

+ 7 - 0
sp-server/src/main/java/com/pj/project/tb_car_weight/TbCarWeightService.java

@@ -44,4 +44,11 @@ public class TbCarWeightService extends ServiceImpl<TbCarWeightMapper, TbCarWeig
 		List<TbCarWeight>list=list(ew);
 		return	list.stream().map(TbCarWeight::getCompanyName).distinct().collect(Collectors.toList());
 	}
+
+	public  List<TbCarWeight> findErrorList() {
+		QueryWrapper<TbCarWeight>ew=new QueryWrapper<>();
+		ew.lambda().eq(TbCarWeight::getPayStatus,0)
+				.isNotNull(TbCarWeight::getPayTime);
+		return list(ew);
+	}
 }

+ 21 - 0
sp-server/src/main/java/com/pj/project/tb_deduction_record/ExcelDTO.java

@@ -0,0 +1,21 @@
+package com.pj.project.tb_deduction_record;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class ExcelDTO implements Serializable {
+    private String id;
+    public BigDecimal originalMoney;
+    /**
+     * 订单金额
+     */
+    private BigDecimal deductMoney;
+    /**
+     * 余额
+     */
+    public BigDecimal totalMoney;
+}

+ 15 - 15
sp-server/src/main/java/com/pj/project/tb_deduction_record/TbDeductionRecord.java

@@ -45,7 +45,7 @@ public class TbDeductionRecord extends Model<TbDeductionRecord> implements Seria
     /**
      * 主键
      */
-    @ExcelIgnore
+    @ExcelProperty(index = 0,value = "编号")
     public String id;
 
     /**
@@ -57,7 +57,7 @@ public class TbDeductionRecord extends Model<TbDeductionRecord> implements Seria
     /**
      * 客户名称
      */
-    @ExcelProperty(index = 0,value = "企业名称")
+    @ExcelProperty(index = 1,value = "企业名称")
     public String customerName;
 
 
@@ -68,13 +68,13 @@ public class TbDeductionRecord extends Model<TbDeductionRecord> implements Seria
     /**
      * 业务单号
      */
-    @ExcelProperty(index = 1,value = "业务单号")
+    @ExcelProperty(index = 2,value = "业务单号")
     private String businessNo;
 
     /**
      * 车牌号
      */
-    @ExcelProperty(index =2,value = "车牌号")
+    @ExcelProperty(index =3,value = "车牌号")
     private String carNo;
 
     /**
@@ -95,7 +95,7 @@ public class TbDeductionRecord extends Model<TbDeductionRecord> implements Seria
     /**
      * 业务类型
      */
-    @ExcelProperty(index = 3,value = "业务类型")
+    @ExcelProperty(index = 4,value = "业务类型")
     private String itemTypeName;
 
     /**
@@ -107,7 +107,7 @@ public class TbDeductionRecord extends Model<TbDeductionRecord> implements Seria
     /**
      * 业务项
      */
-    @ExcelProperty(index =4,value = "车型")
+    @ExcelProperty(index =5,value = "车型")
     private String itemName;
 
     /**
@@ -122,7 +122,7 @@ public class TbDeductionRecord extends Model<TbDeductionRecord> implements Seria
     @ExcelIgnore
     private String payDay;
 
-    @ExcelProperty(index = 5,value = "扣款时间")
+    @ExcelProperty(index = 6,value = "扣款时间")
     private String payTime;
 
     /**
@@ -162,19 +162,19 @@ public class TbDeductionRecord extends Model<TbDeductionRecord> implements Seria
     /**
      * 不含税款
      */
-    @ExcelProperty(index =6,value = "不含税金额")
+    @ExcelProperty(index =7,value = "不含税金额")
     private BigDecimal noTaxPrice = new BigDecimal(0);
 
     /**
      * 税款
      */
-    @ExcelProperty(index = 7,value = "税额")
+    @ExcelProperty(index = 8,value = "税额")
     private BigDecimal taxPrice = new BigDecimal(0);
 
     /**
      * 税率
      */
-    @ExcelProperty(index = 8,value = "税率")
+    @ExcelProperty(index = 9,value = "税率")
     private BigDecimal taxRate = new BigDecimal(0);
 
 
@@ -257,13 +257,13 @@ public class TbDeductionRecord extends Model<TbDeductionRecord> implements Seria
     /**
      * 复核人员
      */
-    @ExcelProperty(index = 9,value = "复核员")
+    @ExcelProperty(index = 10,value = "复核员")
     public String reviewBy;
 
     /**
      * 复核时间
      */
-    @ExcelProperty(index = 10,value = "复核时间")
+    @ExcelProperty(index = 11,value = "复核时间")
     public Date reviewTime;
 
     /**
@@ -275,17 +275,17 @@ public class TbDeductionRecord extends Model<TbDeductionRecord> implements Seria
     /**
      * 原金额
      */
-    @ExcelProperty(index = 11,value = "原金额")
+    @ExcelProperty(index = 12,value = "原金额")
     public BigDecimal originalMoney;
     /**
      * 订单金额
      */
-    @ExcelProperty(index = 12,value = "扣款金额")
+    @ExcelProperty(index = 13,value = "扣款金额")
     private BigDecimal deductMoney;
     /**
      * 余额
      */
-    @ExcelProperty(index = 13,value = "余额")
+    @ExcelProperty(index = 14,value = "余额")
     public BigDecimal totalMoney;
 
     /**

+ 30 - 4
sp-server/src/main/java/com/pj/project/tb_deduction_record/TbDeductionRecordService.java

@@ -1,5 +1,6 @@
 package com.pj.project.tb_deduction_record;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.ObjectUtil;
@@ -9,6 +10,8 @@ import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONUtil;
 import cn.hutool.log.StaticLog;
+import cn.hutool.poi.excel.ExcelReader;
+import cn.hutool.poi.excel.ExcelUtil;
 import com.alibaba.excel.EasyExcel;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -37,6 +40,7 @@ import com.pj.project.tb_invoice_order.TbInvoiceOrderService;
 import com.pj.project.tb_mild_car.TbMildCar;
 import com.pj.project.tb_refund_record.TbRefundRecord;
 import com.pj.project.tb_refund_record.TbRefundRecordService;
+import com.pj.project4sp.global.BusinessException;
 import com.pj.project4sp.uploadfile.UploadConfig;
 import com.pj.utils.sg.AjaxError;
 import com.pj.utils.so.SoMap;
@@ -44,9 +48,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -312,8 +319,8 @@ public class TbDeductionRecordService extends ServiceImpl<TbDeductionRecordMappe
             //要么是算错,要么是退款
             if (after.originalMoney.compareTo(before.getOriginalMoney()) == 0) {
                 StaticLog.info("same ===========:{},{},{}", before.getBusinessNo(), before.getPayDay(), before.getOriginalMoney());
-                if (refundRecond != null&&refundRecond.getRefundTime().before(after.getCreateTime())) {
-                    before=after;
+                if (refundRecond != null && refundRecond.getRefundTime().before(after.getCreateTime())) {
+                    before = after;
                     //无需处理,这是退款单
                     refundRecond = null;
                     continue;
@@ -322,7 +329,7 @@ public class TbDeductionRecordService extends ServiceImpl<TbDeductionRecordMappe
 
             }
             //充值的
-            if (after.getOriginalMoney().subtract(before.getTotalMoney()).intValue()>500) {
+            if (after.getOriginalMoney().subtract(before.getTotalMoney()).intValue() > 500) {
                 after.setOriginalMoney(before.getTotalMoney().add(new BigDecimal(5000)));
                 //充值的
                 before = after;
@@ -330,10 +337,29 @@ public class TbDeductionRecordService extends ServiceImpl<TbDeductionRecordMappe
                 continue;
             }
             after.setOriginalMoney(before.getTotalMoney()).setTotalMoney(before.getTotalMoney().subtract(after.getDeductMoney()));
-             System.out.println(after.getOriginalMoney() + " | " + after.getDeductMoney() + " | " + after.getTotalMoney());
+            System.out.println(after.getOriginalMoney() + " | " + after.getDeductMoney() + " | " + after.getTotalMoney());
             before = after;
         }
         this.updateBatchById(list);
     }
 
+    public void calculateMoney(MultipartFile file) {
+        try (InputStream is = file.getInputStream()) {
+            ExcelReader excelReader = ExcelUtil.getReader(is, 0);
+            List<ExcelDTO> list = excelReader.readAll(ExcelDTO.class);
+            list.parallelStream().forEach(excelDTO -> {
+                TbDeductionRecord tbDeductionRecord = getById(excelDTO.getId());
+                if (tbDeductionRecord!=null){
+                    tbDeductionRecord.setOriginalMoney(excelDTO.getOriginalMoney())
+                                    .setDeductMoney(excelDTO.getDeductMoney())
+                                            .setTotalMoney(excelDTO.getTotalMoney());
+                    tbDeductionRecordMapper.updateById(tbDeductionRecord);
+                }
+
+            });
+        } catch (Exception e) {
+            throw new BusinessException("导入失败");
+        }
+
+    }
 }

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

@@ -6,7 +6,7 @@ spring:
     # 数据源配置
     datasource:
         type: com.alibaba.druid.pool.DruidDataSource
-        url: jdbc:mysql://127.0.0.1:3306/pco_pro?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8
+        url: jdbc:mysql://127.0.0.1:3306/pco?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8
         username: root
         password: 123456
         # 是否打开sql监控台  (生产环境请务必关闭此选项)

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

@@ -60,6 +60,7 @@ mybatis-plus:
     configuration:
         # 是否开启下划线转驼峰 
         map-underscore-to-camel-case: true
+        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
         # 即使属性为null, 也要映射 
         call-setters-on-nulls: true
 server: