Browse Source

业务管理

qzyReal 3 years ago
parent
commit
082b0831ab
30 changed files with 1234 additions and 234 deletions
  1. 2 2
      sp-admin/sa-frame/com/sa-td.vue
  2. 2 2
      sp-admin/sa-frame/menu-list.js
  3. 126 69
      sp-admin/sa-view/tb-business/tb-business-add.html
  4. 67 27
      sp-admin/sa-view/tb-business/tb-business-info.html
  5. 140 13
      sp-admin/sa-view/tb-business/tb-business-list.html
  6. 16 12
      sp-admin/sa-view/tb-costomer/tb-costomer-info.html
  7. 233 0
      sp-admin/sa-view/tb-costomer/tb-costomer-judge.html
  8. 12 3
      sp-admin/sa-view/tb-costomer/tb-costomer-list.html
  9. 10 4
      sp-server/src/main/java/com/pj/constants/RoleEnum.java
  10. 3 3
      sp-server/src/main/java/com/pj/constants/UserTypeEnum.java
  11. 2 1
      sp-server/src/main/java/com/pj/current/satoken/StpInterfaceImpl.java
  12. 29 10
      sp-server/src/main/java/com/pj/project/tb_business/TbBusiness.java
  13. 60 6
      sp-server/src/main/java/com/pj/project/tb_business/TbBusinessController.java
  14. 100 8
      sp-server/src/main/java/com/pj/project/tb_business/TbBusinessService.java
  15. 8 2
      sp-server/src/main/java/com/pj/project/tb_business_item/TbBusinessItem.java
  16. 1 7
      sp-server/src/main/java/com/pj/project/tb_business_item/TbBusinessItemController.java
  17. 1 6
      sp-server/src/main/java/com/pj/project/tb_business_item/TbBusinessItemMapper.java
  18. 1 5
      sp-server/src/main/java/com/pj/project/tb_business_item/TbBusinessItemMapper.xml
  19. 17 6
      sp-server/src/main/java/com/pj/project/tb_business_item/TbBusinessItemService.java
  20. 1 1
      sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomer.java
  21. 18 19
      sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomerController.java
  22. 8 6
      sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomerService.java
  23. 8 11
      sp-server/src/main/java/com/pj/project/tb_item/TbItem.java
  24. 3 10
      sp-server/src/main/java/com/pj/project/tb_item/TbItemMapper.xml
  25. 3 1
      sp-server/src/main/java/com/pj/project/tb_item/TbItemService.java
  26. 72 0
      sp-server/src/main/java/com/pj/project/tb_item_type/TbItemType.java
  27. 105 0
      sp-server/src/main/java/com/pj/project/tb_item_type/TbItemTypeController.java
  28. 56 0
      sp-server/src/main/java/com/pj/project/tb_item_type/TbItemTypeMapper.java
  29. 80 0
      sp-server/src/main/java/com/pj/project/tb_item_type/TbItemTypeMapper.xml
  30. 50 0
      sp-server/src/main/java/com/pj/project/tb_item_type/TbItemTypeService.java

+ 2 - 2
sp-admin/sa-frame/com/sa-td.vue

@@ -47,7 +47,7 @@
 		<template slot-scope="s">
 			<div @click="sa.showImageList(value_to_arr(s.row[prop]))" style="cursor: pointer;" v-if="s.row[prop]">
 				<img :src="value_to_arr(s.row[prop])[0]" class="td-img" />
-				<span style="color: #999; padding-left: 0.5em;">点击预览</span>
+				<span style="color: #999; padding-left: 0.5em;">预览</span>
 			</div>
 			<div v-else>{{not}}</div>
 		</template>
@@ -170,7 +170,7 @@
 			// type=menu时,值列表    -- 形如:{1: '正常[green]', 2: '禁用[red]'}  
 			jv: {default: ''},
 			// 空值时显示的文字
-			not: {default: ''}
+			not: {default: '-'}
 		},
 		data() {
 			return {

+ 2 - 2
sp-admin/sa-frame/menu-list.js

@@ -22,8 +22,8 @@ var menuList =	[
 		icon: 'el-icon-folder-opened',
 		info: '客户管理表数据的维护',
 		childList: [
-			{id: 'tb-costomer-list', name: '客户管理-列表', url: 'sa-view/tb-costomer/tb-costomer-list.html'},
-			{id: 'tb-costomer-add', name: '客户管理-添加', url: 'sa-view/tb-costomer/tb-costomer-add.html'},
+			{id: 'tb-costomer-list', name: '客户列表', url: 'sa-view/tb-costomer/tb-costomer-list.html'},
+			{id: 'tb-costomer-judge', name: '客户审核', url: 'sa-view/tb-costomer/tb-costomer-judge.html'},
 		]
 	},
 	{

+ 126 - 69
sp-admin/sa-view/tb-business/tb-business-add.html

@@ -16,7 +16,7 @@
 		<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;}
+			.c-panel .el-form .c-panel .el-form {width: 180px;}
 		</style>
 	</head>
 	<body>
@@ -26,44 +26,71 @@
 				<div class="c-panel">
                     <div class="c-title" v-if="id == 0">数据添加</div>
 					<div class="c-title" v-else>数据修改</div>
-					<el-form v-if="m">
+					<el-form v-if="m"  label-position="left">
 						<el-row>
-							<el-col span=12>	
-							<div class="c-item">
-								<label class="c-label">客户名称:</label> 
-								<el-autocomplete
-								  v-model="m.customerName"
-								  @select="handleSelectCustomer"
-								  value-key='name'
-								  :fetch-suggestions="queryCustomerAsync">
-								  </el-autocomplete>
-							</div>
-							<div class="c-item">
-								<label class="c-label">车牌号:</label> 
-								<el-autocomplete
-								  v-model="m.cardNo"
-								  @select="handleSelectCar"
-								  value-key='cardNo'
-								  :fetch-suggestions="queryCarAsync">
-								  </el-autocomplete>
-							</div>
-								<sa-item type="text" name="车规格" v-model="m.cardSize" br></sa-item>
-								<sa-item type="num" name="载重(kg)" v-model="m.netWeight" br></sa-item>
-								<sa-item type="text" name="运输货品" v-model="m.goodsName" br></sa-item>
+							<el-col span=10>
+								<el-card class="box-card">
+								  <div slot="header" class="clearfix">
+								    <span>基本资料</span>
+								  </div>
+								  <div>
+								  <div class="c-item" v-show="currentCustomerId==1">
+								  	<label class="c-label">客户:</label> 
+								  	<el-select v-model="m.customerId" placeholder="请选择">
+								  	    <el-option
+								  	      v-for="item in customerList"
+								  	      :key="item.id"
+								  	      :label="item.name"
+								  	      :value="item.id">
+								  	    </el-option>
+								  	</el-select>
+								  </div>
+								  <div class="c-item">
+								  	<label class="c-label">车牌号:</label> 
+								  	<el-autocomplete
+								  	  v-model="m.cardNo"
+								  	  @select="handleSelectCar"
+								  	  value-key='cardNo'
+								  	  :fetch-suggestions="queryCarAsync">
+								  	  </el-autocomplete>
+								  </div>
+								  	<sa-item type="text" name="车规格" v-model="m.cardSize" br></sa-item>
+									<sa-item type="text" name="运输货品" v-model="m.goodsName" br></sa-item>
+								  	<sa-item type="num" name="载重(kg)" v-model="m.netWeight" br></sa-item>
+								  	<div class="c-item">
+								  		<label class="c-label">司机身份证:</label> 
+								  		<el-autocomplete
+								  		  v-model="m.driverIdCard"
+								  		  @select="handleSelectDriver"
+								  		  value-key='idCard'
+								  		  :fetch-suggestions="queryDriverAsync">
+								  		  </el-autocomplete>
+								  	</div>
+								  	<sa-item type="text" name="司机名称" v-model="m.driverName" br></sa-item>
+								  	<sa-item type="text" name="司机联系号码" v-model="m.driverPhone" br></sa-item>
+								  </div>
+								</el-card>
 							</el-col>
-							<el-col span=12>
-								<div class="c-item">
-									<label class="c-label">司机身份证:</label> 
-									<el-autocomplete
-									  v-model="m.driverIdCard"
-									  @select="handleSelectDriver"
-									  value-key='idCard'
-									  :fetch-suggestions="queryDriverAsync">
-									  </el-autocomplete>
-								</div>
-								<sa-item type="text" name="司机名称" v-model="m.driverName" br></sa-item>
-								<sa-item type="text" name="司机联系号码" v-model="m.driverPhone" br></sa-item>
-								<sa-item type="date" name="预计入境日期" v-model="m.expectInDay" br></sa-item>
+							
+							<el-col span=14>
+							<el-card class="box-card">
+							  <div slot="header" class="clearfix">
+							    <span>业务项</span>
+							  </div>
+							  <div>
+								  <el-form-item v-for="(type,index) in itemTypeList" :label="type.name">
+									 <el-select v-model="type.itemId" style="width: 120px;"  placeholder="请选择">
+										  <el-option
+											v-for="item in type.items"
+											:key="item.id"
+											:label="item.itemName"
+											:value="item.id">
+										  </el-option>
+									 </el-select>
+									 <el-input-number style="width: 180px;margin-left: 80px;" v-model="type.num" :min="1" :max="10" size="mini"></el-input-number>
+									</el-form-item>
+							  </div>
+							</el-card>
 							</el-col>
 						</el-row>
 						<sa-item name="" class="s-ok" br>
@@ -96,27 +123,43 @@
 						cardSize: '',		// 车规格 
 						netWeight: '',		// 载重(kg) 
 						goodsName: '',		// 商品 
-						goodsCode: '',		// 商品编号 
 						driverName: '',		// 司机名称 
-						driverId: '',		// 司机id 
 						driverPhone: '',		// 司机联系号码 
 						driverIdCard: '',		// 司机身份证 
 						payTicket: '',		// 支付凭证 
-						expectInDay: '',		// 预计进边境日期 
-						realInDay: '',		// 实际进边境日期 
-						realInTime: '',		// 实际进境时间 
-						payStatus: '',		// 支付状态(1=未支付,2=已支付) 
-						payTime: '',		// 支付时间 
-						payType: '',		// 支付方式(1=线下支付,2现金支付,3=第三方支付) 
-						outDayTime: '',		// 离境时间 
-						partMoney: '',		// 停车费用 
-						partTime: '',		// 停车时常(分) 
 						},		// 实体对象 
 					customerList:[],
 					cardList:[],
-					driverList:[]
+					driverList:[],
+					currentCustomerId:1,
+					itemTypeList:[]
 				},
 				methods: {
+					getItemTypeList(){
+						sa.ajax('/TbItemType/getList',function(resp){
+							let typeList=resp.data;
+							// 初始化数据
+							if(this.id > 0) {		
+								sa.ajax('/TbBusiness/getById?id=' + this.id, function(res) {
+								let m=res.data;
+								let items=m.items;
+								console.log(items);
+								for(let i in items){
+									let item=items[i];
+									for(let j in typeList){
+										let type=typeList[j];
+										if(item.itemTypeId==type.id){
+											type.itemId=item.itemId;
+											type.num=item.num;
+										}
+									}
+								}
+								this.m = m;
+								}.bind(this))
+							}
+							this.itemTypeList=typeList;
+						}.bind(this))
+					},
 					getCardList(){
 						sa.ajax('/TbCar/getList', {pageNo:1,pageSize:100}, function(resp) {
 							this.cardList=resp.data;
@@ -152,20 +195,42 @@
 							this.customerList=resp.data;
 						}.bind(this));
 					},
-					queryCustomerAsync(queryString, cb){
-						let list=this.customerList;
-						let filterList=	list.filter(obj=>obj.name.indexOf(queryString)!==-1);
-						cb(filterList)
-					},
-					handleSelectCustomer(item){
-						this.m.customerName=item.name;
-						this.m.customerId=item.id;
+					getCustomer(){
+					sa.ajax('/TbCostomer/getCurrentCustomerId', function(resp) {
+						let id=resp.data;
+						if(id==1){
+							this.getCustomerList();
+						}else{
+							this.m.customerId=id;
+						}
+						this.currentCustomerId=id;
+					}.bind(this));
 					},
 					// 提交数据 
 					ok: function(){
+						let itemList=this.itemTypeList.filter(obj=>obj.itemId);
+						let list=[];
+						for(let i in itemList){
+							let item=itemList[i];
+							if(!item.num||item.num<=0){
+								this.$message({
+									  message: '请填写【'+item.name+'】数量',
+									  type: 'error'
+									});
+								return;
+							}
+							list.push({
+								itemId:item.itemId,
+								num:item.num
+							})
+						}
 						// 表单校验 
 						let m = this.m;
-						sa.checkNull(m.customerName, '请输入 [客户名称]');
+						m.itemJson=JSON.stringify(list);
+						m.items=[];
+						if(this.currentCustomerId==1){
+							sa.checkNull(m.customerId, '请选择 [客户名称]');
+						}
 						sa.checkNull(m.cardNo, '请输入 [车牌号]');
 						sa.checkNull(m.cardSize, '请输入 [车规格]');
 						sa.checkNull(m.netWeight, '请输入 [载重]');
@@ -173,7 +238,6 @@
 						sa.checkNull(m.driverName, '请输入 [司机名称]');
 						sa.checkNull(m.driverPhone, '请输入 [司机联系号码]');
 						sa.checkNull(m.driverIdCard, '请输入 [司机身份证]');
-						sa.checkNull(m.expectInDay, '请输入 [预计进边境日期]');
 						if(this.id <= 0) {	// 添加
 							sa.ajax('/TbBusiness/add', m, function(res){
 								sa.alert('增加成功', this.clean); 
@@ -195,18 +259,11 @@
 					}
 				},
 				mounted: function(){
-					// 初始化数据 
-					if(this.id > 0) {		
-						sa.ajax('/TbBusiness/getById?id=' + this.id, function(res) {
-							this.m = res.data;
-							if(res.data == null) {
-								sa.alert('未能查找到 id=' + this.id + " 详细数据");
-							}
-						}.bind(this))
-					}
-					this.getCustomerList();
+					
+					this.getCustomer();
 					this.getCardList();
 					this.getDriverList();
+					this.getItemTypeList();
 				}
 			})
 			

+ 67 - 27
sp-admin/sa-view/tb-business/tb-business-info.html

@@ -23,29 +23,70 @@
 			<div class="s-body">
 				<div class="c-panel">
 					<el-form v-if="m">
-						<sa-info type="num" name="主键" :value="m.id" br></sa-info>
-						<sa-info name="客户id" br>{{m.customerId}}</sa-info>
-						<sa-info name="客户名称" br>{{m.customerName}}</sa-info>
-						<sa-info name="编号" br>{{m.no}}</sa-info>
-						<sa-info name="车牌号" br>{{m.cardNo}}</sa-info>
-						<sa-info name="车规格" br>{{m.cardSize}}</sa-info>
-						<sa-info name="载重" br>{{m.netWeight}}</sa-info>
-						<sa-info name="商品" br>{{m.goodsName}}</sa-info>
-						<sa-info name="商品编号" br>{{m.goodsCode}}</sa-info>
-						<sa-info name="司机名称" br>{{m.driverName}}</sa-info>
-						<sa-info name="司机id" br>{{m.driverId}}</sa-info>
-						<sa-info name="司机联系号码" br>{{m.driverPhone}}</sa-info>
-						<sa-info name="司机身份证" br>{{m.driverIdCard}}</sa-info>
-						<sa-info type="img" name="支付凭证" :value="m.payTicket" br></sa-info>
-						<sa-info name="预计进边境日期" br>{{m.expectInDay}}</sa-info>
-						<sa-info name="实际进边境日期" br>{{m.realInDay}}</sa-info>
-						<sa-info name="实际进境时间" br>{{m.realInTime}}</sa-info>
-						<sa-info type="enum" name="支付状态" :value="m.payStatus" :jv="{1: '未支付', 2: '已支付'}" br></sa-info>
-						<sa-info name="支付时间" br>{{m.payTime}}</sa-info>
-						<sa-info type="enum" name="支付方式" :value="m.payType" :jv="{1: '线下支付', 3: '第三方支付'}" br></sa-info>
-						<sa-info name="离境时间" br>{{m.outDayTime}}</sa-info>
-						<sa-info name="停车费用" br>{{m.partMoney}}</sa-info>
-						<sa-info name="停车时常" br>{{m.partTime}}</sa-info>
+						<el-row>
+							<el-col span="12">
+								<sa-info name="客户名称" br>{{m.customerName}}</sa-info>
+								<sa-info name="业务编号" br>{{m.no}}</sa-info>
+								<sa-info name="车牌号" br>{{m.cardNo}}</sa-info>
+								<sa-info name="车辆规格" br>{{m.cardSize}}</sa-info>
+								<sa-info name="载重(kg)" br>{{m.netWeight}}</sa-info>
+								<sa-info name="货物" br>{{m.goodsName}}</sa-info>
+								<sa-info name="司机名称" br>{{m.driverName}}</sa-info>
+								<sa-info name="司机联系号码" br>{{m.driverPhone}}</sa-info>
+								<sa-info name="录入时间" br>{{m.createTime}}</sa-info>
+								<sa-info name="录入人" br>{{m.createBy}}</sa-info>
+								<sa-info name="确认时间" br>{{m.confirmInputTime}}</sa-info>
+								<sa-info name="确认人" br>{{m.confirmInputBy}}</sa-info>
+							</el-col>
+							<el-col span="12">
+								<sa-info name="入场时间" br>{{m.realInDay}} {{m.realInTime}}</sa-info>
+								<sa-info name="出场时间" br>{{m.outDayTime}}</sa-info>
+								<sa-info name="停车时常(分)" br>{{m.partTime}}</sa-info>
+								<sa-info name="停车费用(元)" br>{{m.partMoney}}</sa-info>
+								<sa-info name="业务费用(元)" br>{{m.itemPrice}}</sa-info>
+								<sa-info name="合计费用(元)" br>{{m.totalMoney}}</sa-info>
+								<sa-info type="enum" name="支付状态" :value="m.payStatus" :jv="{1: '未支付', 2: '已支付未确认', 3: '已支付已确认'}" br></sa-info>
+								<sa-info name="支付人" br>{{m.payBy}}</sa-info>
+								<sa-info name="支付时间" br>{{m.payTime}}</sa-info>
+								<sa-info type="img-list" name="支付凭证" :value="m.payTicket" br></sa-info>
+							</el-col>
+						</el-row>
+						<el-row>
+							<el-collapse value='1'>
+							  <el-collapse-item title="具体业务项" name="1">
+								   <el-table
+									  :data="tableData"
+									  style="width: 100%">
+									  <el-table-column
+										prop="itemTypeName"
+										label="业务分类"
+										width="180">
+									  </el-table-column>
+									  <el-table-column
+										prop="itemName"
+										label="具体"
+										width="180">
+									  </el-table-column>
+									  <el-table-column
+									  		prop="itemPrice"
+									  		label="单价">
+									  </el-table-column>
+									  <el-table-column
+										prop="unit"
+										label="计费标准">
+									  </el-table-column>
+									  <el-table-column
+									  		prop="num"
+									  		label="数量">
+									  </el-table-column>
+									  <el-table-column
+									  		prop="total"
+									  		label="合计">
+									  </el-table-column>
+									</el-table>
+							  </el-collapse-item>
+							</el-collapse>
+						</el-row>
 					</el-form>
 				</div>
 			</div>
@@ -63,16 +104,15 @@
 				el: '.vue-box',
 				data: {
 					id: sa.p('id', 0),	// 获取数据ID 
-					m: null
+					m: null,
+					tableData:[]
 				},
 				methods: {
 				},
 				mounted: function() {
 					sa.ajax('/TbBusiness/getById?id=' + this.id, function(res) {
 						this.m = res.data;
-						if(res.data == null) {
-							sa.alert('未能查找到 id=' + this.id + " 详细数据");
-						}
+						this.tableData=res.data.items;
 					}.bind(this))
 				}
 			})

+ 140 - 13
sp-admin/sa-view/tb-business/tb-business-list.html

@@ -13,6 +13,7 @@
 		<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;'">
@@ -23,40 +24,78 @@
 					<sa-item type="text" name="客户名称" v-model="p.customerName"></sa-item>
 					<sa-item type="text" name="车牌号" v-model="p.cardNo"></sa-item>
 					<sa-item type="text" name="司机名称" v-model="p.driverName"></sa-item>
-					<sa-item type="text" name="司机身份证" v-model="p.driverIdCard"></sa-item>
 					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
 					<br />
 				</el-form>
 				<!-- ------------- 快捷按钮 ------------- -->
-				<sa-item type="fast-btn" show="add,get,delete,reset"></sa-item>
+				<div class="fast-btn">
+					<el-button size="mini" type="primary" v-if="perCode.indexOf('tb-business-add')!=-1||adminId=='1'"  @click="add()">新增</el-button>
+					<el-button size="mini" type="primary" v-if="perCode.indexOf('tb-business-confirm')!=-1||adminId=='1'"  @click="confirmBatch()">确认</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="warning" icon="el-icon-download" @click="sa.exportExcel()">导出</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="customerName" ></sa-td>
 					<sa-td name="车牌号" prop="cardNo" ></sa-td>
-					<sa-td name="车规格" prop="cardSize" ></sa-td>
 					<sa-td name="载重" prop="netWeight" ></sa-td>
-					<sa-td name="商品" prop="goodsName" ></sa-td>
 					<sa-td name="司机名称" prop="driverName" ></sa-td>
 					<sa-td name="司机联系" prop="driverPhone" ></sa-td>
-					<sa-td name="司机身份证" prop="driverIdCard" ></sa-td>
-					<sa-td name="支付凭证" prop="payTicket" type="img"></sa-td>
-					<sa-td  name="支付状态" prop="payStatus" type="enum" :jv="{1: '未支付[#ff0000]', 2: '已支付[#005500]'}"></sa-td>
-					<sa-td name="支付时间" prop="payTime" ></sa-td>
-					<sa-td name="离境时间" prop="outDayTime" ></sa-td>
-					<sa-td name="停车费用" prop="partMoney" ></sa-td>
+					<sa-td name="支付凭证" prop="payTicket" type="img-list"></sa-td>
+					<sa-td name="业务费(元)" prop="itemPrice" ></sa-td>
 					<sa-td width="120" name="停车时长(分)" prop="partTime" ></sa-td>
+					<sa-td name="停车费用" prop="partMoney" ></sa-td>
+					<sa-td width="130" name="支付状态" prop="payStatus" type="enum" :jv="{1: '未支付[#ff0000]', 2: '已支付未确认[#ffaa00]', 3: '已支付已确认[#005500]'}"></sa-td>
+					<sa-td width="160" name="支付时间" prop="payTime" ></sa-td>
+					<sa-td width="160" name="录入时间" prop="createTime" ></sa-td>
+					<sa-td  name="确认" prop="confirmInput" type="enum" :jv="{0: '未确认[#ff0000]', 1: '已确认[#005500]'}"></sa-td>
 					<el-table-column label="操作" fixed="right"  width="240px">
 						<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="update(s.row)">修改</el-button>
-							<el-button class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+							<el-button class="c-btn" type="primary" v-if="s.row.confirmInput==0&&(perCode.indexOf('tb-business-confirm')!=-1||adminId=='1')"  @click="confirmFn(s.row)">确认</el-button>
+							<el-button class="c-btn" type="success" v-if="s.row.confirmInput==1&&(perCode.indexOf('tb-business-pay')!=-1||(adminId=='1'&&s.row.payStatus==1))" @click="payFn(s.row)">支付</el-button>
+									<el-button class="c-btn" type="success" v-if="adminId=='1'&&s.row.payStatus==2" @click="adminSurePayFn(s.row)">确认支付</el-button>
+							<el-button class="c-btn" type="success"  @click="get(s.row)">查看</el-button>
+							<el-button class="c-btn" type="primary" v-if="s.row.confirmInput==0"  @click="update(s.row)">修改</el-button>
+							<el-button class="c-btn" type="danger"  v-if="s.row.payStatus==1" @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>
+			<el-dialog
+			  title="支付业务"
+			  :visible.sync="modal.visible"
+			  width="400px">
+			  <sa-item type="img-list" name="支付凭据" v-model="modal.form.payTicket" br></sa-item>
+			  <span slot="footer" class="dialog-footer">
+			    <el-button @click="modal.visible=false">取 消</el-button>
+			    <el-button type="primary" @click="surePayFn">确 定</el-button>
+			  </span>
+			</el-dialog>
+			<el-dialog
+			  title="业务确认"
+			  :visible.sync="confirm.visible"
+			  width="30%">
+			  <span>是否确认所选业务?</span>
+			  <span slot="footer" class="dialog-footer">
+			    <el-button @click="confirm.visible = false">取 消</el-button>
+			    <el-button type="primary" @click="sureConfirmFn">确 认</el-button>
+			  </span>
+			</el-dialog>
+			<el-dialog
+			  title="支付确认"
+			  :visible.sync="pay.visible"
+			  width="30%">
+			  <span>是否确认所选业务的支付?</span>
+			  <span slot="footer" class="dialog-footer">
+			    <el-button @click="pay.visible = false">取 消</el-button>
+			    <el-button type="primary" @click="surePayirmFn">确 认</el-button>
+			  </span>
+			</el-dialog>
 		</div>
 		<script>
 			var app = new Vue({
@@ -66,6 +105,25 @@
 				},
 				el: '.vue-box',
 				data: {
+					confirm:{
+						visible:false,
+						form:{
+							ids:''
+						}
+					},
+					pay:{
+						visible:false,
+						form:{
+							ids:''
+						}
+					},
+					modal:{
+						visible:false,
+						form:{
+							id:'',
+							payTicket:''
+						}
+					},
 					p: { // 查询参数  
 						id: '',		// 主键 
 						customerId: '',		// 客户id 
@@ -95,8 +153,76 @@
 					},
 					dataCount: 0,
 					dataList: [], // 数据集合 
+					perCode:[],
+					adminId:'0'
 				},
 				methods: {
+					adminSurePayFn(data){
+						Object.assign(this.pay,{
+							visible:true,
+							form:{
+								ids:data.id
+							}
+						})
+					},
+					surePayirmFn (){
+						sa.ajax('/TbBusiness/adminConfirmPay',this.pay.form,function(resp){
+							this.pay.visible=false;
+							this.f5();
+						})
+					},
+					confirmBatch(){
+						// 获取选中元素的id列表
+						let selection = this.$refs['data-table'].selection;
+						selection=selection.filter(obj=>obj.confirmInput==0)
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('至少选择一条未确认数据')
+						}
+					},
+					getCustomer(){
+						sa.ajax('/TbCostomer/getCurrentCustomerId', function(resp) {
+							let id=resp.data;
+							if(id!=='1'){
+								this.getPcodeByCurrRid();
+							}
+							this.adminId=id;
+						}.bind(this));
+					},
+					getPcodeByCurrRid(){
+						sa.ajax('/SpRolePermission/getPcodeByCurrRid',function(resp){
+							this.perCode=resp.data;
+						}.bind(this))
+					},
+					confirmFn(data){
+						Object.assign(this.confirm,{
+							visible:true,
+							form:{
+								ids:data.id
+							}
+						})
+					},
+					sureConfirmFn(){
+						sa.ajax('/TbBusiness/confirm',{ids:this.confirm.form.ids},function(resp){
+							this.confirm.visible=false;
+							this.f5();
+						}.bind(this))
+					},
+					payFn(data){
+						Object.assign(this.modal,{
+							visible:true,
+							form:{
+								id:data.id,
+								payTicket:data.payTicket
+							}
+						})
+					},
+					surePayFn(){
+						sa.ajax('/TbBusiness/pay',this.modal.form,function(resp){
+							this.f5();
+							this.modal.visible=false;
+						}.bind(this))
+					},
 					// 刷新
 					f5: function() {
 						sa.ajax('/TbBusiness/getList', sa.removeNull(this.p), function(res) {
@@ -156,6 +282,7 @@
 				created: function() {
 					this.f5();
 					sa.onInputEnter();
+					this.getCustomer();
 				}
 			})
 		</script>

+ 16 - 12
sp-admin/sa-view/tb-costomer/tb-costomer-info.html

@@ -23,18 +23,22 @@
 			<div class="s-body">
 				<div class="c-panel">
 					<el-form v-if="m">
-						<sa-info type="num" name="主键" :value="m.id" br></sa-info>
-						<sa-info name="名称" br>{{m.name}}</sa-info>
-						<sa-info name="联系号码" br>{{m.phone}}</sa-info>
-						<sa-info name="负责人" br>{{m.dutyPeople}}</sa-info>
-						<sa-info name="地址id" br>{{m.addressIds}}</sa-info>
-						<sa-info name="地址" br>{{m.addressStr}}</sa-info>
-						<sa-info type="img" name="营业执照" :value="m.businessLicence" br></sa-info>
-						<sa-info type="enum" name="状态" :value="m.status" :jv="{0: '否', 1: '是'}" br></sa-info>
-						<sa-info name="创建时间" br>{{m.creareTime}}</sa-info>
-						<sa-info type="enum" name="审核状态" :value="m.judgeStatus" :jv="{1: '未审核'}" br></sa-info>
-						<sa-info name="审核时间" br>{{m.judgeTime}}</sa-info>
-						<sa-info name="审核意见" br>{{m.judgeContent}}</sa-info>
+						<el-row>
+							<el-col span="12">
+								<sa-info name="名称" br>{{m.name}}</sa-info>
+								<sa-info name="联系号码" br>{{m.phone}}</sa-info>
+								<sa-info name="负责人" br>{{m.dutyPeople}}</sa-info>
+								<sa-info name="地址" br>{{m.addressStr}}</sa-info>
+								<sa-info type="img" name="营业执照" :value="m.businessLicence" br></sa-info>
+							</el-col>
+							<el-col span="12">
+								<sa-info type="enum" name="状态" :value="m.status" :jv="{0: '否', 1: '是'}" br></sa-info>
+								<sa-info name="创建时间" br>{{m.creareTime}}</sa-info>
+								<sa-info type="enum" name="审核状态" :value="m.judgeStatus" :jv="{1: '未审核'}" br></sa-info>
+								<sa-info name="审核时间" br>{{m.judgeTime}}</sa-info>
+								<sa-info name="审核意见" br>{{m.judgeContent}}</sa-info>
+							</el-col>
+						</el-row>
 					</el-form>
 				</div>
 			</div>

+ 233 - 0
sp-admin/sa-view/tb-costomer/tb-costomer-judge.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">
+				<!-- ------------- 检索参数 ------------- -->
+				<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.dutyPeople"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<br />
+					<sa-item name="综合排序">
+						<el-radio-group v-model="p.sortType" class="s-radio-text">
+							<el-radio :label="0">默认</el-radio>
+							<el-radio :label="2">名称</el-radio>
+							<el-radio :label="8">创建时间</el-radio>
+						</el-radio-group>
+					</sa-item>
+				</el-form>
+				<el-button type="success" icon="el-icon-view" @click="getBySelect()" >查看</el-button>
+				<el-button type="info"  icon="el-icon-refresh"  @click="sa.f5()">重置</el-button>
+				<!-- ------------- 数据列表 ------------- -->
+				<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="phone" ></sa-td>
+					<sa-td name="负责人" prop="dutyPeople" ></sa-td>
+					<sa-td name="结算类型" prop="payType" type="enum" :jv="{1: '现结', 2: '月结'}"></sa-td>
+					<sa-td name="地址" prop="addressStr" ></sa-td>
+					<sa-td name="营业执照" prop="businessLicence" type="img"></sa-td>
+					<sa-td name="创建时间" prop="creareTime" ></sa-td>
+					<sa-td name="审核状态" prop="judgeStatus" type="enum" :jv="{1: '未审核', 2: '已通过', 3: '不通过'}"></sa-td>
+					<el-table-column label="操作" fixed="right"  width="280px">
+						<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="success" icon="el-icon-view" @click="judgeFn(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="modal.visible" width="500px">
+				<el-form size="mini">
+					<div class="c-item br">
+						<label class="c-label"><label style="color: red">*</label>审核意见:</label>
+						<el-input placeholder="请输入审核意见" v-model="modal.form.judgeContent"></el-input>
+					</div>
+				</el-form>
+				<span slot="footer" class="dialog-footer">
+					<el-button  @click="closeFn">关闭</el-button>
+					<el-button type="danger" @click="sureJudge(3)">不通过</el-button>
+					<el-button type="primary" @click="sureJudge(2)">通过</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:{
+							id:'',
+							judgeContent:'审核通过'
+						}
+					},
+					p: { // 查询参数  
+						id: '',		// 主键 
+						name: '',		// 名称 
+						phone: '',		// 联系号码 
+						dutyPeople: '',		// 负责人 
+						addressIds: '',		// 地址id 
+						addressStr: '',		// 地址 
+						status: '',		// 状态(0=否,1=是) 
+						creareTime: '',		// 创建时间 
+						judgeStatus: '',		// 审核状态(1=未审核,2审核通过,3审核不通过) 
+						judgeTime: '',		// 审核时间 
+						judgeContent: '',		// 审核意见 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+					currentCustomerId:'1',
+				},
+				methods: {
+					closeFn(){
+						this.modal.visible=false;
+					},
+					judgeFn(data){
+						Object.assign(this.modal,{
+							visible:true,
+							form:{
+								id:data.id,
+								judgeContent:data.judgeContent,
+								judgeStatus:data.judgeStatus
+							}
+						})
+					},
+					sureJudge(status){
+						console.log(this.modal.form)
+						if(this.modal.form.judgeStatus==2){
+							sa.error('已审核通过,无需再审核')
+							return;
+						}
+						let content="审核通过";
+						if(status==3){
+							if(!this.modal.form.judgeContent){
+								sa.error('请输入审核意见');
+								return;
+							}
+						}else{
+						this.modal.form.judgeContent=content;
+						}
+						this.modal.form.judgeStatus=status;
+						sa.ajax('/TbCostomer/judge',this.modal.form,function(resp){
+							this.modal.visible=false;
+							this.f5();
+						}.bind(this))
+					},
+					getCustomer(){
+						sa.ajax('/TbCostomer/getCurrentCustomerId', function(resp) {
+							this.currentCustomerId=resp.data;
+						}.bind(this));
+					},
+					userFn(data){
+							sa.showIframe('企业用户', 'customer-admin-list.html?customerId=' + data.id, '1050px', '90%');
+					},
+					// 刷新
+					f5: function() {
+						sa.ajax('/TbCostomer/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-costomer-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-costomer-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-costomer-add.html?id=-1', '550px', '80%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/TbCostomer/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('/TbCostomer/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 改 - 状态(0=否,1=是)
+					updateStatus: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.status;
+						var ajax = sa.ajax('/TbCostomer/updateStatus', {id: data.id, value: data.status}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+				},
+				created: function() {
+					this.f5();
+					this.getCustomer();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 12 - 3
sp-admin/sa-view/tb-costomer/tb-costomer-list.html

@@ -33,8 +33,10 @@
 						</el-radio-group>
 					</sa-item>
 				</el-form>
-				<!-- ------------- 快捷按钮 ------------- -->
-				<sa-item type="fast-btn" show="add,get,delete,reset"></sa-item>
+				<el-button type="primary" icon="el-icon-plus" @click="add()" v-if="currentCustomerId=='1'">新增</el-button>
+				<el-button type="success" icon="el-icon-view" @click="getBySelect()" >查看</el-button>
+				<el-button type="danger" icon="el-icon-delete" @click="deleteByIds()" v-if="currentCustomerId=='1'">删除</el-button>
+				<el-button type="info"  icon="el-icon-refresh"  @click="sa.f5()">重置</el-button>
 				<!-- ------------- 数据列表 ------------- -->
 				<el-table class="data-table" ref="data-table" :data="dataList" >
 					<sa-td type="selection"></sa-td>
@@ -51,7 +53,7 @@
 							<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="update(s.row)">修改</el-button>
 							<el-button class="c-btn" type="primary" icon="el-icon-user-solid" @click="userFn(s.row)">用户</el-button>
-							<el-button class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+							<el-button v=if="currentCustomerId==1" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
 						</template>
 					</el-table-column>
 				</el-table>
@@ -85,8 +87,14 @@
 					},
 					dataCount: 0,
 					dataList: [], // 数据集合 
+					currentCustomerId:'1',
 				},
 				methods: {
+					getCustomer(){
+						sa.ajax('/TbCostomer/getCurrentCustomerId', function(resp) {
+							this.currentCustomerId=resp.data;
+						}.bind(this));
+					},
 					userFn(data){
 							sa.showIframe('企业用户', 'customer-admin-list.html?customerId=' + data.id, '1050px', '90%');
 					},
@@ -164,6 +172,7 @@
 				},
 				created: function() {
 					this.f5();
+					this.getCustomer();
 					sa.onInputEnter();
 				}
 			})

+ 10 - 4
sp-server/src/main/java/com/pj/constants/RoleEnum.java

@@ -1,5 +1,8 @@
 package com.pj.constants;
 
+import com.pj.current.satoken.AuthConst;
+import com.pj.project.tb_business.TbBusiness;
+import com.pj.project.tb_costomer.TbCostomer;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import org.apache.ibatis.annotations.Param;
@@ -7,14 +10,17 @@ import org.apache.ibatis.annotations.Param;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.stream.Collectors;
+
 
 @Getter
 @AllArgsConstructor
 public enum RoleEnum {
-    INPUT_ROLE("input","业务录入",Arrays.asList("tb-business","tb-business-list","tb-business-add")),
-    CONFIRM_ROLE("confirm","业务确认",Arrays.asList("tb-business","tb-business-list","tb-business-confirm")),
-    PAY_ROLE("pay","业务支付",Arrays.asList("tb-business","tb-business-list","tb-business-pay")),
+    INPUT_ROLE("input","业务录入",
+            Arrays.asList(AuthConst.ADMIN_LIST, TbCostomer.PERMISSION_CODE, TbBusiness.PERMISSION_CODE,TbBusiness.PERMISSION_INPUT)),
+    CONFIRM_ROLE("confirm","业务确认",
+            Arrays.asList(AuthConst.ADMIN_LIST,TbCostomer.PERMISSION_CODE,TbBusiness.PERMISSION_CODE,TbBusiness.PERMISSION_CONFIRM)),
+    PAY_ROLE("pay","业务支付",
+            Arrays.asList(AuthConst.ADMIN_LIST,TbCostomer.PERMISSION_CODE,TbBusiness.PERMISSION_CODE,TbBusiness.PERMISSION_PAY)),
     ADMIN_ROLE("admin","管理员", Collections.emptyList()),
     SUPER_ROLE("super","超级管理员", Collections.emptyList());
     private String type;

+ 3 - 3
sp-server/src/main/java/com/pj/constants/UserTypeEnum.java

@@ -7,8 +7,8 @@ import lombok.Getter;
 @Getter
 @AllArgsConstructor
 public enum  UserTypeEnum {
-    SUPER_ADMIN(-1,"超级管理员"),
-    PLATFORM_ADMIN(1,"平台管理员");
-    private int code;
+    SUPER_ADMIN("-1","超级管理员"),
+    PLATFORM_ADMIN("1","平台管理员");
+    private String customerId;
     private String desc;
 }

+ 2 - 1
sp-server/src/main/java/com/pj/current/satoken/StpInterfaceImpl.java

@@ -33,7 +33,8 @@ public class StpInterfaceImpl implements StpInterface {
 		if(loginType.equals(StpUtil.TYPE)) {
 		SpAdmin spAdmin= spAdminMapper.getById(Long.valueOf( loginId.toString()));
 		String roleIds=spAdmin.getRoleId();
-		return 	spRolePermissionService.getPcodeByRid(roleIds);
+		List<String>list=spRolePermissionService.getPcodeByRid(roleIds);
+		return 	list;
 		}
 		return null;
 	}

+ 29 - 10
sp-server/src/main/java/com/pj/project/tb_business/TbBusiness.java

@@ -2,10 +2,13 @@ package com.pj.project.tb_business;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.pj.project.tb_business_item.TbBusinessItem;
 import lombok.EqualsAndHashCode;
 
 import lombok.Data;
@@ -34,6 +37,10 @@ public class TbBusiness extends Model<TbBusiness> implements Serializable {
 	 * 此模块对应的权限码 
 	 */
 	public static final String PERMISSION_CODE = "tb-business";	
+	public static final String PERMISSION_CONFIRM = "tb-business-confirm";
+	public static final String PERMISSION_PAY = "tb-business-pay";
+	public static final String PERMISSION_INPUT = "tb-business-add";
+
 
 
 	// ---------- 表中字段 ----------
@@ -90,7 +97,7 @@ public class TbBusiness extends Model<TbBusiness> implements Serializable {
 	/**
 	 * 司机id 
 	 */
-	private Long driverId;	
+	private String driverId;
 
 	/**
 	 * 司机联系号码 
@@ -110,37 +117,38 @@ public class TbBusiness extends Model<TbBusiness> implements Serializable {
 	/**
 	 * 预计进边境日期 
 	 */
-	private String expectInDay;	
+	private String expectInDay;
 
 	/**
 	 * 实际进边境日期 
 	 */
-	private String realInDay;	
+	private Date realInDay;
 
 	/**
 	 * 实际进境时间 
 	 */
-	private String realInTime;	
+	private Date realInTime;
 
 	/**
-	 * 支付状态(1=未支付,2=已支付) 
+	 * 支付状态(1=未支付,2=已支付,3=运营人员确认支付)
 	 */
-	private String payStatus;	
+	private Integer payStatus=1;
 
 	/**
 	 * 支付时间 
 	 */
-	private String payTime;	
+	private Date payTime;
 
 	/**
 	 * 支付方式(1=线下支付,2现金支付,3=第三方支付) 
 	 */
-	private String payType;	
+	private Integer payType=1;
+	private String payBy;
 
 	/**
 	 * 离境时间 
 	 */
-	private String outDayTime;
+	private Date outDayTime;
 
 
 	/**
@@ -152,11 +160,22 @@ public class TbBusiness extends Model<TbBusiness> implements Serializable {
 	 * 停车时常(分) 
 	 */
 	private Integer partTime;
+	private BigDecimal itemPrice;
 	private BigDecimal totalMoney;
 	private Date createTime;
-	private String businessType;
+	private String createBy;
+	private Integer confirmInput;
+	private Date confirmInputTime;
+	private String confirmInputBy;
+
 
+	private Integer adminConfirmPay;
+	private Date adminConfirmPayTime;
+	private String adminConfirmPayBy;
 
+	private transient String itemJson;
+	@TableField(exist = false)
+	private List<TbBusinessItem>items=new ArrayList<>();
 
 
 

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

@@ -2,6 +2,11 @@ package com.pj.project.tb_business;
 
 import java.util.List;
 
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.util.StrUtil;
+import com.pj.constants.UserTypeEnum;
+import com.pj.project.tb_business_item.TbBusinessItem;
+import com.pj.project.tb_business_item.TbBusinessItemService;
 import com.pj.utils.so.SoMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -13,6 +18,8 @@ import com.pj.project4sp.SP;
 import com.pj.current.satoken.StpUserUtil;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 
+import javax.annotation.Resource;
+
 
 /**
  * Controller: tb_business -- 入境登记
@@ -25,13 +32,15 @@ public class TbBusinessController {
 	/** 底层 Service 对象 */
 	@Autowired
 	TbBusinessService tbBusinessService;
+	@Resource
+	private TbBusinessItemService tbBusinessItemService;
 
 	/** 增 */  
 	@RequestMapping("add")
 	@SaCheckPermission(TbBusiness.PERMISSION_CODE)
 	@Transactional(rollbackFor = Exception.class)
 	public AjaxJson add(TbBusiness t){
-		tbBusinessService.add(t);
+		tbBusinessService.addOrUpdate(t);
 		t = tbBusinessService.getById(SP.publicMapper.getPrimarykey());
 		return AjaxJson.getSuccessData(t);
 	}
@@ -39,8 +48,9 @@ public class TbBusinessController {
 	/** 删 */  
 	@RequestMapping("delete")
 	@SaCheckPermission(TbBusiness.PERMISSION_CODE)
-	public AjaxJson delete(Long id){
+	public AjaxJson delete(String id){
 		tbBusinessService.removeById(id);
+		tbBusinessItemService.removeByBusinessId(id);
 		return AjaxJson.getSuccess();
 	}
 	
@@ -49,6 +59,9 @@ public class TbBusinessController {
 	@SaCheckPermission(TbBusiness.PERMISSION_CODE)
 	public AjaxJson deleteByIds(){
 		List<Long> ids = SoMap.getRequestSoMap().getListByComma("ids", long.class);
+		ids.forEach(id->{
+			tbBusinessItemService.removeByBusinessId(id+"");
+		});
 		int line = SP.publicMapper.deleteByIds(TbBusiness.TABLE_NAME, ids);
 		return AjaxJson.getByLine(line);
 	}
@@ -57,14 +70,39 @@ public class TbBusinessController {
 	@RequestMapping("update")
 	@SaCheckPermission(TbBusiness.PERMISSION_CODE)
 	public AjaxJson update(TbBusiness t){
-		tbBusinessService.updateById(t);
+		tbBusinessService.addOrUpdate(t);
+		return AjaxJson.getSuccess();
+	}
+	/** 确认业务 */
+	@RequestMapping("confirm")
+	public AjaxJson confirm(){
+		if (!StpUtil.hasPermissionAnd(TbBusiness.PERMISSION_CONFIRM)&&!
+				StrUtil.equals(StpUserUtil.getCustomerId(), UserTypeEnum.PLATFORM_ADMIN.getCustomerId())) {
+			return AjaxJson.getError("无确认业务权限");
+		}
+		SoMap so = SoMap.getRequestSoMap();
+		List<String>ids=so.getListByComma("ids",String.class);
+		tbBusinessService.confirm(ids);
+		return AjaxJson.getSuccess();
+	}
+	/** 确认业务 */
+	@RequestMapping("adminConfirmPay")
+	public AjaxJson adminConfirmPay(){
+		if (!StrUtil.equals(StpUserUtil.getCustomerId(), UserTypeEnum.PLATFORM_ADMIN.getCustomerId())) {
+			return AjaxJson.getError("无确认支付权限");
+		}
+		SoMap so = SoMap.getRequestSoMap();
+		List<String>ids=so.getListByComma("ids",String.class);
+		tbBusinessService.adminConfirmPay(ids);
 		return AjaxJson.getSuccess();
 	}
 
 	/** 查 - 根据id */  
 	@RequestMapping("getById")
-	public AjaxJson getById(Long id){
+	public AjaxJson getById(String id){
 		TbBusiness t = tbBusinessService.getById(id);
+		List<TbBusinessItem>items=tbBusinessItemService.findByBusinessId(id);
+		t.setItems(items);
 		return AjaxJson.getSuccessData(t);
 	}
 
@@ -72,11 +110,27 @@ public class TbBusinessController {
 	@RequestMapping("getList")
 	public AjaxJson getList() { 
 		SoMap so = SoMap.getRequestSoMap();
+		String currentCustomerId=StpUserUtil.getCustomerId();
+		if (!currentCustomerId.equals(UserTypeEnum.PLATFORM_ADMIN.getCustomerId())) {
+			so.put("customerId",currentCustomerId);
+		}
 		List<TbBusiness> list = tbBusinessService.getList(so.startPage());
 		return AjaxJson.getPageData(so.getDataCount(), list);
 	}
-	
-	
+
+	/** 改 */
+	@RequestMapping("pay")
+	public AjaxJson pay(){
+		if (!StpUtil.hasPermissionAnd("tb-business-pay")&&!
+		StrUtil.equals(StpUserUtil.getCustomerId(), UserTypeEnum.PLATFORM_ADMIN.getCustomerId())) {
+			return AjaxJson.getError("无支付权限");
+		}
+		SoMap so = SoMap.getRequestSoMap();
+		String id=so.getString("id");
+		String payTicket=so.getString("payTicket");
+		tbBusinessService.pay(id,payTicket);
+		return AjaxJson.getSuccess();
+	}
 	
 	
 	// ------------------------- 前端接口 -------------------------

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

@@ -1,14 +1,32 @@
 package com.pj.project.tb_business;
 
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.Date;
 import java.util.List;
 
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pj.constants.UserTypeEnum;
+import com.pj.current.satoken.StpUserUtil;
+import com.pj.project.tb_business_item.TbBusinessItem;
+import com.pj.project.tb_business_item.TbBusinessItemService;
 import com.pj.project.tb_car.TbCar;
 import com.pj.project.tb_car.TbCarService;
+import com.pj.project.tb_costomer.TbCostomer;
+import com.pj.project.tb_costomer.TbCostomerService;
 import com.pj.project.tb_driver.TbDriver;
 import com.pj.project.tb_driver.TbDriverService;
+import com.pj.project.tb_item.TbItem;
+import com.pj.project.tb_item.TbItemService;
+import com.pj.project.tb_item_type.TbItemType;
+import com.pj.project.tb_item_type.TbItemTypeService;
+import com.pj.project4sp.admin.SpAdmin;
 import com.pj.utils.so.SoMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -34,33 +52,77 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
     private TbCarService tbCarService;
     @Resource
     private TbDriverService tbDriverService;
+    @Resource
+    private TbCostomerService tbCostomerService;
+
+    @Resource
+    private TbItemService tbItemService;
+    @Resource
+    private TbItemTypeService tbItemTypeService;
+    @Resource
+    private TbBusinessItemService tbBusinessItemService;
 
     /**
      * 增
      */
-    void add(TbBusiness t) {
+  public   void addOrUpdate(TbBusiness t) {
+       t.setCreateBy(StpUserUtil.getAdmin().getName());
         createCar(t.getCardNo(), t.getCardSize(), t.getGoodsName());
-        createDriver(t.getDriverIdCard(),t.getDriverName(),t.getDriverPhone());
-        save(t);
+        TbDriver tbDriver=  createDriver(t.getDriverIdCard(),t.getDriverName(),t.getDriverPhone());
+        t.setDriverId(tbDriver.getId());
+        String customerId=t.getCustomerId();
+        if (!StrUtil.equals(customerId, UserTypeEnum.PLATFORM_ADMIN.getCustomerId())) {
+          TbCostomer tbCostomer= tbCostomerService.getById(customerId);
+          t.setCustomerName(tbCostomer.getName());
+        }else {
+            t.setConfirmInputBy(StpUserUtil.getAdmin().getName()).setConfirmInput(1).setConfirmInputTime(new Date());
+        }
+      if (StrUtil.isEmpty(t.getNo())) {
+          t.setNo(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm"))+RandomUtil.randomNumbers(4));
+      }
+      List<TbBusinessItem>items=  JSONUtil.toList(t.getItemJson(), TbBusinessItem.class);
+      if(StrUtil.isEmpty(t.getId())){
+          t.setCreateTime(new Date());
+      }
+      saveOrUpdate(t);
+      tbBusinessItemService.removeByBusinessId(t.getId());
+      BigDecimal price=new BigDecimal(0);
+      for (TbBusinessItem item : items) {
+          Integer num = item.getNum();
+          TbItem tbItem = tbItemService.getById(item.getItemId());
+          price = price.add(NumberUtil.mul(num, tbItem.getPrice()));
+          TbItemType tbItemType = tbItemTypeService.getById(tbItem.getTypeId());
+          item.setBusinessId(t.getId()).setItemCode(tbItem.getItemCode())
+                  .setItemName(tbItem.getItemName()).setItemPrice(tbItem.getPrice())
+                  .setItemTypeId(tbItem.getTypeId()).setItemTypeName(tbItemType.getName())
+                  .setUnit(tbItem.getUnit()).setTotal(NumberUtil.mul(num,tbItem.getPrice()));
+      }
+      t.setItemPrice(price);
+      this.saveOrUpdate(t);
+      tbBusinessItemService.saveBatch(items);
     }
 
-    private void createDriver(String idCardNo,String name,String phone) {
+
+
+    private TbDriver createDriver(String idCardNo,String name,String phone) {
         TbDriver tbDriver=tbDriverService.findByIdCardNo(idCardNo);
         if (tbDriver==null){
             tbDriver=new TbDriver();
             tbDriver.setCreateTime(new Date()).setIdCard(idCardNo).setName(name).setPhone(phone);
             tbDriverService.save(tbDriver);
         }
+        return  tbDriver;
 
     }
 
-    private void createCar(String cardNo, String carSize, String goodsName) {
+    private TbCar createCar(String cardNo, String carSize, String goodsName) {
         TbCar tbCar = tbCarService.findByCardNo(cardNo);
         if (tbCar == null) {
-            TbCar car = new TbCar();
-            car.setCardNo(cardNo).setCardSize(carSize).setLastGoodsName(goodsName);
-            tbCarService.save(car);
+             tbCar = new TbCar();
         }
+        tbCar.setCardNo(cardNo).setCardSize(carSize).setLastGoodsName(goodsName);
+        tbCarService.saveOrUpdate(tbCar);
+        return tbCar;
     }
 
 
@@ -72,4 +134,34 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
     }
 
 
+    public void pay(String id, String payTicket) {
+        TbBusiness tbBusiness=  this.getById(id);
+        SpAdmin admin=StpUserUtil.getAdmin();
+        tbBusiness.setPayStatus(2).setPayBy(admin.getName())
+                .setPayBy(StpUserUtil.getAdmin().getName())
+                .setPayTicket(payTicket)
+                .setPayTime(new Date());
+        if (StrUtil.equals(admin.getCustomerId(), UserTypeEnum.PLATFORM_ADMIN.getCustomerId())) {
+            tbBusiness.setAdminConfirmPay(1).setPayStatus(3)
+                    .setAdminConfirmPayBy(admin.getName()).setAdminConfirmPayTime(new Date());
+        }
+        this.updateById(tbBusiness);
+    }
+
+    public void confirm(List<String> ids) {
+        ids.forEach(id->{
+            TbBusiness business=this.getById(id);
+            business.setConfirmInput(1).setConfirmInputTime(new Date()).setConfirmInputBy(StpUserUtil.getAdmin().getName());
+            this.updateById(business);
+        });
+    }
+
+    public void adminConfirmPay(List<String> ids) {
+        ids.forEach(id->{
+            TbBusiness business=this.getById(id);
+             business.setAdminConfirmPayTime(new Date()).setAdminConfirmPay(1).setAdminConfirmPayBy(StpUserUtil.getAdmin().getName())
+                 .setPayStatus(3);
+            this.updateById(business);
+        });
+    }
 }

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

@@ -45,12 +45,13 @@ public class TbBusinessItem extends Model<TbBusinessItem> implements Serializabl
 	/**
 	 * 等级表id 
 	 */
-	private Long businessId;	
+	private String businessId;
 
 	/**
 	 * 项目编号 
 	 */
-	private String itemCode;	
+	private String itemCode;
+	private String itemId;
 
 	/**
 	 * 项目金额(元) 
@@ -72,6 +73,10 @@ public class TbBusinessItem extends Model<TbBusinessItem> implements Serializabl
 	 */
 	private Date operateTime;
 
+	private String itemTypeId;
+
+	private String itemTypeName;
+
 	/**
 	 * 操作人员 
 	 */
@@ -81,6 +86,7 @@ public class TbBusinessItem extends Model<TbBusinessItem> implements Serializabl
 	 */
 	private Integer num;
 	private String unit;
+	private BigDecimal total;
 
 
 

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

@@ -35,13 +35,7 @@ public class TbBusinessItemController {
 		return AjaxJson.getSuccess();
 	}
 
-	/** 删 */  
-	@RequestMapping("delete")
-	@SaCheckPermission(TbBusinessItem.PERMISSION_CODE)
-	public AjaxJson delete(String id){
-		int line = tbBusinessItemService.delete(id);
-		return AjaxJson.getByLine(line);
-	}
+
 	
 	/** 删 - 根据id列表 */  
 	@RequestMapping("deleteByIds")

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

@@ -24,12 +24,7 @@ public interface TbBusinessItemMapper extends BaseMapper <TbBusinessItem> {
 	 */
 	int add(TbBusinessItem t);
 
-	/**
-	 * 删  
-	 * @param id 要删除的数据id  
-	 * @return 受影响行数 
-	 */
-	int delete(String id);	 
+
 
 	/** 
 	 * 改  

+ 1 - 5
sp-server/src/main/java/com/pj/project/tb_business_item/TbBusinessItemMapper.xml

@@ -9,11 +9,7 @@
 		values (#{id}, #{businessId}, #{itemCode}, #{itemPrice}, #{itemName}, #{status}, #{operateTime}, #{operaror}) 
 	</insert>
 
-	<!-- 删 -->
-	<delete id="delete">
-		delete from tb_business_item 
-		where id = #{id}
-	</delete>
+
 
 	<!-- 改 [G] -->
 	<update id="update">

+ 17 - 6
sp-server/src/main/java/com/pj/project/tb_business_item/TbBusinessItemService.java

@@ -2,6 +2,9 @@ package com.pj.project.tb_business_item;
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.pj.utils.so.SoMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -13,7 +16,7 @@ import com.pj.utils.sg.*;
  * @author qzy 
  */
 @Service
-public class TbBusinessItemService {
+public class TbBusinessItemService extends ServiceImpl<TbBusinessItemMapper,TbBusinessItem> implements IService<TbBusinessItem> {
 
 	/** 底层 Mapper 对象 */
 	@Autowired
@@ -24,10 +27,7 @@ public class TbBusinessItemService {
 		return tbBusinessItemMapper.add(t);
 	}
 
-	/** 删 */
-	int delete(String id){
-		return tbBusinessItemMapper.delete(id);
-	}
+
 
 	/** 改 */
 	int update(TbBusinessItem t){
@@ -43,6 +43,17 @@ public class TbBusinessItemService {
 	List<TbBusinessItem> getList(SoMap so) {
 		return tbBusinessItemMapper.getList(so);	
 	}
-	
 
+
+	public void removeByBusinessId(String businessId) {
+		QueryWrapper<TbBusinessItem>ew=new QueryWrapper<>();
+		ew.eq("business_id",businessId);
+		this.remove(ew);
+	}
+
+    public List<TbBusinessItem> findByBusinessId(String businessId) {
+		QueryWrapper<TbBusinessItem>ew=new QueryWrapper<>();
+		ew.eq("business_id",businessId);
+		return list(ew);
+    }
 }

+ 1 - 1
sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomer.java

@@ -84,7 +84,7 @@ public class TbCostomer extends Model<TbCostomer> implements Serializable {
 	/**
 	 * 审核状态(1=未审核,2审核通过,3审核不通过) 
 	 */
-	private String judgeStatus;	
+	private Integer judgeStatus;
 
 	/**
 	 * 审核时间 

+ 18 - 19
sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomerController.java

@@ -48,8 +48,8 @@ public class TbCostomerController {
 	@SaCheckPermission(TbCostomer.PERMISSION_CODE)
 	public AjaxJson deleteByIds(){
 		List<Long> ids = SoMap.getRequestSoMap().getListByComma("ids", long.class);
-		int line = SP.publicMapper.deleteByIds(TbCostomer.TABLE_NAME, ids);
-		return AjaxJson.getByLine(line);
+		ids.forEach(id->tbCostomerService.delete(id+""));
+		return AjaxJson.getByLine(1);
 	}
 	
 	/** 改 */  
@@ -85,25 +85,24 @@ public class TbCostomerController {
 
 		return AjaxJson.getByLine(1);
 	}
-	
-	
-	// ------------------------- 前端接口 -------------------------
-	
-	
-	/** 改 - 不传不改 [G] */
-	@RequestMapping("updateByNotNull")
-	public AjaxJson updateByNotNull(String id){
-		AjaxError.throwBy(true, "如需正常调用此接口,请删除此行代码");
-		// 鉴别身份,是否为数据创建者 
-		long userId = SP.publicMapper.getColumnByIdToLong(TbCostomer.TABLE_NAME, "user_id", id);
-		AjaxError.throwBy(userId != StpUserUtil.getLoginIdAsLong(), "此数据您无权限修改");
-		// 开始修改 (请只保留需要修改的字段)
+
+
+	@RequestMapping("getCurrentCustomerId")
+	@SaCheckPermission(TbCostomer.PERMISSION_CODE)
+	public AjaxJson getCurrentCustomer(){
+		String id=StpUserUtil.getCustomerId();
+		return AjaxJson.getSuccessData(id);
+	}
+
+	@RequestMapping("judge")
+	@SaCheckPermission(TbCostomer.PERMISSION_CODE)
+	public AjaxJson judge(){
 		SoMap so = SoMap.getRequestSoMap();
-		so.clearNotIn("id", "name", "phone", "dutyPeople", "addressIds", "addressStr", "businessLicence", "status", "creareTime", "judgeStatus", "judgeTime", "judgeContent").clearNull().humpToLineCase();	
-		int line = SP.publicMapper.updateBySoMapById(TbCostomer.TABLE_NAME, so, id);
-		return AjaxJson.getByLine(line);
+		tbCostomerService.judge(so.getString("id"),so.getInt("judgeStatus"),so.getString("judgeContent"));
+		return AjaxJson.getSuccess();
 	}
-	
+
+
 	
 	
 	

+ 8 - 6
sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomerService.java

@@ -93,12 +93,7 @@ public class TbCostomerService extends ServiceImpl<TbCostomerMapper, TbCostomer>
         return 1;
     }
 
-    /**
-     * 查
-     */
-    TbCostomer getById(String id) {
-        return tbCostomerMapper.getById(id);
-    }
+
 
     /**
      * 查集合 - 根据条件(参数为空时代表忽略指定条件)
@@ -114,4 +109,11 @@ public class TbCostomerService extends ServiceImpl<TbCostomerMapper, TbCostomer>
         spAdminMapper.updateCustomerAdmin(id,status);
         return line;
     }
+
+    public void judge(String id, int status,String judgeContent) {
+      TbCostomer costomer=  this.getById(id);
+      costomer.setJudgeContent(judgeContent)
+              .setJudgeStatus(status).setJudgeTime(new Date());
+      this.updateById(costomer);
+    }
 }

+ 8 - 11
sp-server/src/main/java/com/pj/project/tb_item/TbItem.java

@@ -1,6 +1,8 @@
 package com.pj.project.tb_item;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
+
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import lombok.EqualsAndHashCode;
@@ -37,8 +39,8 @@ public class TbItem extends Model<TbItem> implements Serializable {
 	/**
 	 * 主键 
 	 */
-	@TableId(type = IdType.AUTO)
-	private Long id;	
+	private String id;
+	private String typeId;
 
 	/**
 	 * 项目编号 
@@ -53,17 +55,12 @@ public class TbItem extends Model<TbItem> implements Serializable {
 	/**
 	 * 项目金额(元) 
 	 */
-	private Double price;	
+	private BigDecimal price;
+	private String unit;
+
+
 
-	/**
-	 * 是否必须(1=否,2=是) 
-	 */
-	private String need;	
 
-	/**
-	 * 创建时间 
-	 */
-	private String createTime;	
 
 
 

+ 3 - 10
sp-server/src/main/java/com/pj/project/tb_item/TbItemMapper.xml

@@ -5,8 +5,8 @@
 	<!-- 增 [G] -->
 	<insert id="add">
 		insert into 
-		tb_item (id, item_code, item_name, price, need, create_time) 
-		values (#{id}, #{itemCode}, #{itemName}, #{price}, #{need}, #{createTime}) 
+		tb_item (id, item_code, item_name, price)
+		values (#{id}, #{itemCode}, #{itemName}, #{price})
 	</insert>
 
 	<!-- 删 -->
@@ -22,8 +22,6 @@
 		item_code = #{itemCode}, 
 		item_name = #{itemName}, 
 		price = #{price}, 
-		need = #{need}, 
-		create_time = #{createTime}
 		where id = #{id}
 	</update>
 
@@ -37,13 +35,11 @@
 		<result property="itemCode" column="item_code" />
 		<result property="itemName" column="item_name" />
 		<result property="price" column="price" />
-		<result property="need" column="need" />
-		<result property="createTime" column="create_time" />
 	</resultMap>
 	
 	<!-- 公共查询sql片段 -->
 	<sql id="select_sql">
-		select id, item_code, item_name, price, need, create_time 
+		select *
 		from tb_item 
 	</sql>
 	
@@ -61,8 +57,6 @@
 			<if test=' this.has("itemCode") '> and item_code = #{itemCode} </if>
 			<if test=' this.has("itemName") '> and item_name = #{itemName} </if>
 			<if test=' this.has("price") '> and price = #{price} </if>
-			<if test=' this.has("need") '> and need = #{need} </if>
-			<if test=' this.has("createTime") '> and create_time = #{createTime} </if>
 		</where>
 		order by
 		<choose>
@@ -71,7 +65,6 @@
 			<when test='sortType == 3'> item_name desc </when>
 			<when test='sortType == 4'> price desc </when>
 			<when test='sortType == 5'> need desc </when>
-			<when test='sortType == 6'> create_time desc </when>
 			<otherwise> id desc </otherwise>
 		</choose>
 	</select>

+ 3 - 1
sp-server/src/main/java/com/pj/project/tb_item/TbItemService.java

@@ -2,6 +2,8 @@ package com.pj.project.tb_item;
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.pj.utils.so.SoMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -13,7 +15,7 @@ import com.pj.utils.sg.*;
  * @author qzy 
  */
 @Service
-public class TbItemService {
+public class TbItemService extends ServiceImpl<TbItemMapper,TbItem> implements IService<TbItem> {
 
 	/** 底层 Mapper 对象 */
 	@Autowired

+ 72 - 0
sp-server/src/main/java/com/pj/project/tb_item_type/TbItemType.java

@@ -0,0 +1,72 @@
+package com.pj.project.tb_item_type;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.pj.project.tb_item.TbItem;
+import lombok.EqualsAndHashCode;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * Model: tb_item_type -- 业务项类型
+ * @author qzy 
+ */
+@Data
+@Accessors(chain = true)
+@TableName(TbItemType.TABLE_NAME)
+@EqualsAndHashCode(callSuper = false)
+public class TbItemType extends Model<TbItemType> implements Serializable {
+
+	// ---------- 模块常量 ----------
+	/**
+	 * 序列化版本id 
+	 */
+	private static final long serialVersionUID = 1L;	
+	/**
+	 * 此模块对应的表名 
+	 */
+	public static final String TABLE_NAME = "tb_item_type";	
+	/**
+	 * 此模块对应的权限码 
+	 */
+	public static final String PERMISSION_CODE = "tb-item-type";	
+
+
+	// ---------- 表中字段 ----------
+	/**
+	 * 主键 
+	 */
+	private String id;
+
+	/**
+	 * 名称 
+	 */
+	private String name;	
+
+	/**
+	 * 是否必须(0=否,1=是) 
+	 */
+	private int need;
+	private String code;
+	@TableField(exist = false)
+	private List<TbItem>items=new ArrayList<>();
+
+	@TableField(exist = false)
+	private String itemId;
+	@TableField(exist = false)
+	private Integer num=0;
+
+
+
+
+
+	
+
+
+}

+ 105 - 0
sp-server/src/main/java/com/pj/project/tb_item_type/TbItemTypeController.java

@@ -0,0 +1,105 @@
+package com.pj.project.tb_item_type;
+
+import java.util.List;
+
+import com.pj.utils.so.SoMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import com.pj.utils.sg.*;
+import com.pj.project4sp.SP;
+
+import com.pj.current.satoken.StpUserUtil;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+
+
+/**
+ * Controller: tb_item_type -- 业务项类型
+ * @author qzy 
+ */
+@RestController
+@RequestMapping("/TbItemType/")
+public class TbItemTypeController {
+
+	/** 底层 Service 对象 */
+	@Autowired
+	TbItemTypeService tbItemTypeService;
+
+	/** 增 */  
+	@RequestMapping("add")
+	@SaCheckPermission(TbItemType.PERMISSION_CODE)
+	@Transactional(rollbackFor = Exception.class)
+	public AjaxJson add(TbItemType t){
+		tbItemTypeService.add(t);
+		t = tbItemTypeService.getById(SP.publicMapper.getPrimarykey()+"");
+		return AjaxJson.getSuccessData(t);
+	}
+
+	/** 删 */  
+	@RequestMapping("delete")
+	@SaCheckPermission(TbItemType.PERMISSION_CODE)
+	public AjaxJson delete(String id){
+		int line = tbItemTypeService.delete(id);
+		return AjaxJson.getByLine(line);
+	}
+	
+	/** 删 - 根据id列表 */  
+	@RequestMapping("deleteByIds")
+	@SaCheckPermission(TbItemType.PERMISSION_CODE)
+	public AjaxJson deleteByIds(){
+		List<Long> ids = SoMap.getRequestSoMap().getListByComma("ids", long.class);
+		int line = SP.publicMapper.deleteByIds(TbItemType.TABLE_NAME, ids);
+		return AjaxJson.getByLine(line);
+	}
+	
+	/** 改 */  
+	@RequestMapping("update")
+	@SaCheckPermission(TbItemType.PERMISSION_CODE)
+	public AjaxJson update(TbItemType t){
+		int line = tbItemTypeService.update(t);
+		return AjaxJson.getByLine(line);
+	}
+
+	/** 查 - 根据id */  
+	@RequestMapping("getById")
+	public AjaxJson getById(String id){
+		TbItemType t = tbItemTypeService.getById(id);
+		return AjaxJson.getSuccessData(t);
+	}
+
+	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */  
+	@RequestMapping("getList")
+	public AjaxJson getList() { 
+		SoMap so = SoMap.getRequestSoMap();
+		List<TbItemType> list = tbItemTypeService.getList(so.startPage());
+		return AjaxJson.getPageData(so.getDataCount(), list);
+	}
+	
+	
+	
+	
+	// ------------------------- 前端接口 -------------------------
+	
+	
+	/** 改 - 不传不改 [G] */
+	@RequestMapping("updateByNotNull")
+	public AjaxJson updateByNotNull(String id){
+		AjaxError.throwBy(true, "如需正常调用此接口,请删除此行代码");
+		// 鉴别身份,是否为数据创建者 
+		long userId = SP.publicMapper.getColumnByIdToLong(TbItemType.TABLE_NAME, "user_id", id);
+		AjaxError.throwBy(userId != StpUserUtil.getLoginIdAsLong(), "此数据您无权限修改");
+		// 开始修改 (请只保留需要修改的字段)
+		SoMap so = SoMap.getRequestSoMap();
+		so.clearNotIn("id", "name", "need", "createTime", "unit").clearNull().humpToLineCase();	
+		int line = SP.publicMapper.updateBySoMapById(TbItemType.TABLE_NAME, so, id);
+		return AjaxJson.getByLine(line);
+	}
+	
+	
+	
+	
+	
+	
+
+}

+ 56 - 0
sp-server/src/main/java/com/pj/project/tb_item_type/TbItemTypeMapper.java

@@ -0,0 +1,56 @@
+package com.pj.project.tb_item_type;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+
+import com.pj.utils.so.*;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * Mapper: tb_item_type -- 业务项类型
+ * @author qzy 
+ */
+
+@Mapper
+@Repository
+public interface TbItemTypeMapper extends BaseMapper <TbItemType> {
+
+	/**
+	 * 增  
+	 * @param t 实体对象 
+	 * @return 受影响行数 
+	 */
+	int add(TbItemType t);
+
+	/**
+	 * 删  
+	 * @param id 要删除的数据id  
+	 * @return 受影响行数 
+	 */
+	int delete(String id);	 
+
+	/** 
+	 * 改  
+	 * @param t 实体对象 
+	 * @return 受影响行数 
+	 */
+	int update(TbItemType t);
+
+	/** 
+	 * 查 - 根据id  
+	 * @param id 要查询的数据id 
+	 * @return 实体对象 
+	 */
+	TbItemType getById(String id);	 
+
+	/**
+	 * 查集合 - 根据条件(参数为空时代表忽略指定条件)
+	 * @param so 参数集合 
+	 * @return 数据列表 
+	 */
+	List<TbItemType> getList(SoMap so);
+
+
+}

+ 80 - 0
sp-server/src/main/java/com/pj/project/tb_item_type/TbItemTypeMapper.xml

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.pj.project.tb_item_type.TbItemTypeMapper">
+
+	<!-- 增 [G] -->
+	<insert id="add">
+		insert into 
+		tb_item_type (id, name, need)
+		values (#{id}, #{name}, #{need})
+	</insert>
+
+	<!-- 删 -->
+	<delete id="delete">
+		delete from tb_item_type 
+		where id = #{id}
+	</delete>
+
+	<!-- 改 [G] -->
+	<update id="update">
+		update tb_item_type set
+		id = #{id}, 
+		name = #{name}, 
+		need = #{need}, 
+		where id = #{id}
+	</update>
+
+
+	<!-- ================================== 查询相关 ================================== -->
+	<!-- select id, name, need, create_time, unit from tb_item_type  -->
+	
+	<!-- 通用映射:手动模式 -->
+	<resultMap id="model" type="com.pj.project.tb_item_type.TbItemType">
+		<result property="id" column="id" />
+		<result property="name" column="name" />
+		<result property="need" column="need" />
+		<collection property="items" ofType="com.pj.project.tb_item.TbItem" column="id" select="getItems"/>
+	</resultMap>
+	
+	<!-- 公共查询sql片段 -->
+	<sql id="select_sql">
+		select * 
+		from tb_item_type 
+	</sql>
+	<select id="getItems" resultType="com.pj.project.tb_item.TbItem">
+		select * from tb_item where type_id=#{id}
+	</select>
+	
+	<!-- 查 - 根据id -->
+	<select id="getById" resultMap="model">
+		<include refid="select_sql"></include>
+		where id = #{id}
+	</select>
+	
+	<!-- 查集合 - 根据条件(参数为空时代表忽略指定条件) [G] -->
+	<select id="getList" resultMap="model">
+		<include refid="select_sql"></include>
+		<where>
+			<if test=' this.has("id") '> and id = #{id} </if>
+			<if test=' this.has("name") '> and name = #{name} </if>
+			<if test=' this.has("need") '> and need = #{need} </if>
+		</where>
+		order by
+		<choose>
+			<when test='sortType == 1'> id desc </when>
+			<when test='sortType == 2'> name desc </when>
+			<when test='sortType == 3'> need desc </when>
+			<otherwise> id asc </otherwise>
+		</choose>
+	</select>
+	
+	
+	
+	
+	
+	
+	
+	
+	
+
+</mapper>

+ 50 - 0
sp-server/src/main/java/com/pj/project/tb_item_type/TbItemTypeService.java

@@ -0,0 +1,50 @@
+package com.pj.project.tb_item_type;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pj.utils.so.SoMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.pj.utils.sg.*;
+
+/**
+ * Service: tb_item_type -- 业务项类型
+ * @author qzy 
+ */
+@Service
+public class TbItemTypeService extends ServiceImpl<TbItemTypeMapper,TbItemType> implements IService<TbItemType> {
+
+	/** 底层 Mapper 对象 */
+	@Autowired
+	TbItemTypeMapper tbItemTypeMapper;
+
+	/** 增 */
+	int add(TbItemType t){
+		return tbItemTypeMapper.add(t);
+	}
+
+	/** 删 */
+	int delete(String id){
+		return tbItemTypeMapper.delete(id);
+	}
+
+	/** 改 */
+	int update(TbItemType t){
+		return tbItemTypeMapper.update(t);
+	}
+
+	/** 查 */
+	TbItemType getById(String id){
+		return tbItemTypeMapper.getById(id);
+	}
+
+	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */  
+	List<TbItemType> getList(SoMap so) {
+		return tbItemTypeMapper.getList(so);	
+	}
+	
+
+}