qzyReal il y a 2 ans
Parent
commit
3efca6536c
42 fichiers modifiés avec 897 ajouts et 296 suppressions
  1. 22 42
      sp-admin/sa-view/tb-business/tb-car-disincle-add.html
  2. 6 29
      sp-admin/sa-view/tb-business/tb-car-disincle-edit.html
  3. 2 2
      sp-admin/sa-view/tb-business/tb-car-disincle-info.html
  4. 1 1
      sp-admin/sa-view/tb-business/tb-car-disincle-list.html
  5. 13 4
      sp-admin/sa-view/tb-fee-statistics/dayStatsPrint.html
  6. 11 2
      sp-admin/sa-view/tb-fee-statistics/detailPrint.html
  7. 0 2
      sp-admin/sa-view/tb-goods/tb-goods-list.html
  8. 2 2
      sp-admin/sa-view/tb-item-type/tb-item-add.html
  9. 2 2
      sp-admin/sa-view/tb-item-type/tb-item-edit.html
  10. 2 2
      sp-admin/sa-view/tb-item-type/tb-item-list.html
  11. 152 145
      sp-admin/sa-view/tb-item-type/tb-item-type-list.html
  12. 0 7
      sp-admin/sa-view/tb-item-type/tb-item.html
  13. 2 1
      sp-server/src/main/java/com/pj/api/invoice/service/InvoiceApplyService.java
  14. 6 3
      sp-server/src/main/java/com/pj/api/pushfee/task/FeeDetailSyncTask.java
  15. 0 5
      sp-server/src/main/java/com/pj/api/pushfee/web/TestApi.java
  16. 24 2
      sp-server/src/main/java/com/pj/project/sync/HelpService.java
  17. 51 5
      sp-server/src/main/java/com/pj/project/sync/SyncService.java
  18. 36 0
      sp-server/src/main/java/com/pj/project/sync/api/AsyncApi.java
  19. 13 0
      sp-server/src/main/java/com/pj/project/sync/bo/FactorDTO.java
  20. 10 0
      sp-server/src/main/java/com/pj/project/sync/bo/FactorParams.java
  21. 102 0
      sp-server/src/main/java/com/pj/project/sync/bo/IExpenseItem.java
  22. 17 0
      sp-server/src/main/java/com/pj/project/sync/bo/IExpenseListQueryRes.java
  23. 24 0
      sp-server/src/main/java/com/pj/project/sync/bo/ItemTypeBO.java
  24. 18 0
      sp-server/src/main/java/com/pj/project/sync/bo/PriceFactorDTO.java
  25. 11 0
      sp-server/src/main/java/com/pj/project/sync/bo/SubExpenseDTO.java
  26. 29 0
      sp-server/src/main/java/com/pj/project/sync/bo/SyncResultBO.java
  27. 18 0
      sp-server/src/main/java/com/pj/project/sync/dto/ItemTypeDTO.java
  28. 1 1
      sp-server/src/main/java/com/pj/project/sync/dto/PartnerDTO.java
  29. 2 1
      sp-server/src/main/java/com/pj/project/sync/dto/PartnerParam.java
  30. 103 0
      sp-server/src/main/java/com/pj/project/sync/task/SyncTask.java
  31. 5 0
      sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomerService.java
  32. 5 31
      sp-server/src/main/java/com/pj/project/tb_fee_details/TbFeeDetailsService.java
  33. 6 0
      sp-server/src/main/java/com/pj/project/tb_item/TbItem.java
  34. 6 0
      sp-server/src/main/java/com/pj/project/tb_item/TbItemService.java
  35. 79 0
      sp-server/src/main/java/com/pj/project/tb_item_fac/TbItemFac.java
  36. 21 0
      sp-server/src/main/java/com/pj/project/tb_item_fac/TbItemFacMapper.java
  37. 6 0
      sp-server/src/main/java/com/pj/project/tb_item_fac/TbItemFacMapper.xml
  38. 26 0
      sp-server/src/main/java/com/pj/project/tb_item_fac/TbItemFacService.java
  39. 6 0
      sp-server/src/main/java/com/pj/project/tb_item_type/TbItemType.java
  40. 1 0
      sp-server/src/main/java/com/pj/project/tb_item_type/TbItemTypeController.java
  41. 52 3
      sp-server/src/main/java/com/pj/project/tb_item_type/TbItemTypeService.java
  42. 4 4
      sp-server/src/main/resources/application-dev.yml

+ 22 - 42
sp-admin/sa-view/tb-business/tb-car-disincle-add.html

@@ -70,35 +70,29 @@
 													</el-option>
 												</el-select>
 											</div>
-											<div class="c-item" v-if="goods.needDeclare==1">
+											<div class="c-item" v-if="goods.needOwner==1">
 												<label class="c-label">
 													<span style="color: red;">*</span>
-													申报单号:</label>
-												<el-input v-model="m.declareNo" placeholder="选择申报单"
-													:readonly="goods.needDeclare==1" clearable>
+													货物名称:</label>
+												<el-input v-model="m.businessGoodsName" placeholder="填写货物" clearable>
 												</el-input>
-												<div style="cursor: pointer;color: blue;display: inline;"
-													@click="handlerDeclare">
-													<i class="el-icon-folder-add"></i>
-												</div>
 											</div>
 										</el-col>
 										<el-col span=8>
 											<div class="c-item" v-if="goods.needCustomer">
 												<label class="c-label"><span style="color: red;">*</span>客户:</label>
-												<el-select :disabled="goods.needDeclare||m.declareNo"
+												<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" v-if="goods.needOwner==1">
-												<label class="c-label">
-													<span style="color: red;">*</span>
-													货物:</label>
-												<el-input v-model="m.businessGoodsName" placeholder="填写货物" clearable>
-												</el-input>
+											<div class="c-item" v-if="goods.needOperateTime==1">
+												<label class="c-label"><span style="color: red;">*</span>数量(件):</label>
+												<el-input-number class="item-num" v-model="m.businessGoodsNum"
+													:min="1" :max="99999" size="mini">
+												</el-input-number>
 											</div>
 										</el-col>
 										<el-col span=8>
@@ -107,12 +101,7 @@
 												<el-input v-model="m.operator" placeholder="作业人员" clearable>
 												</el-input>
 											</div>
-											<div class="c-item" v-if="goods.needOperateTime==1">
-												<label class="c-label"><span style="color: red;">*</span>件数:</label>
-												<el-input-number class="item-num" v-model="m.businessGoodsNum"
-													:min="1" :max="99999" size="mini">
-												</el-input-number>
-											</div>
+											
 										</el-col>
 									</el-row>
 								</div>
@@ -155,7 +144,7 @@
 								<div>
 									<el-form-item v-for="(type,index) in itemTypeList">
 										<el-row justify="center">
-											<el-col span="9">
+											<el-col span="16">
 												<label style="color: red;"
 													v-if="type.need==1">*</label><label>{{type.name}}:</label>
 												<el-select v-model="type.itemId" style="width: 120px;"
@@ -165,10 +154,10 @@
 													</el-option>
 												</el-select>
 											</el-col>
-											<el-col span="7">
+											<el-col span="8">
 												<el-input-number style="margin-left: 60px;" class="item-num"
 													v-model="type.num" :min="1" :max="10" size="mini"
-													:disabled="type.inc==0"></el-input-number>
+													></el-input-number>
 												<div class="xj" v-if="type.itemId">
 													{{type.price * type.num}}元
 													<label @click="cleanItem(type)"
@@ -176,12 +165,6 @@
 															class="el-icon-delete"></i>)</label>
 												</div>
 											</el-col>
-											<el-col span="8">
-												<label class="c-label">
-													备注:</label>
-												<el-input v-model="type.remark" placeholder="请输入备注" clearable>
-												</el-input>
-											</el-col>
 										</el-row>
 										<el-divider></el-divider>
 									</el-form-item>
@@ -455,14 +438,15 @@
 						type.price = '';
 					},
 					itemChange(type) {
-						let itemId = type.itemId;
-						let item = type.items.filter(obj => obj.id == itemId).pop();
-						if (item) {
-							type.inc = item.inc;
-							type.price = item.price;
-							type.needRemark = item.needRemark
+						if(this.validBefore()){
+							let itemId = type.itemId;
+							let item = type.items.filter(obj => obj.id == itemId).pop();
+							if (item) {
+								type.inc = item.inc;
+								type.price = item.price;
+								type.needRemark = item.needRemark
+							}
 						}
-						this.validBefore();
 					},
 					confirmAdd() {
 						let list = this.car.list;
@@ -629,10 +613,6 @@
 						let goods = this.goods;
 						let needCustomer = goods.needCustomer;
 						let m = this.m;
-						if (goods.needDeclare == 1 && !m.declareNo) {
-							sa.error('请选择申报单');
-							return false;
-						}
 						if (needCustomer == 1 && !m.customerId) {
 							sa.error('请选择客户');
 							return false;
@@ -657,8 +637,8 @@
 								sa.error('请补充' + car.carNo + '规格');
 								return;
 							}
-
 						}
+						return true;
 					},
 					// 提交数据
 					ok: function() {

+ 6 - 29
sp-admin/sa-view/tb-business/tb-car-disincle-edit.html

@@ -66,24 +66,12 @@
 													</el-option>
 												</el-select>
 											</div>
-											<div class="c-item" v-if="goods.needDeclare==1">
-												<label class="c-label">
-													<span style="color: red;">*</span>
-													申报单号:</label>
-												<el-input v-model="m.declareNo" placeholder="选择申报单"
-													:readonly="goods.needDeclare==1" clearable>
-												</el-input>
-												<div style="cursor: pointer;color: blue;display: inline;"
-													@click="handlerDeclare">
-													<i class="el-icon-folder-add"></i>
-												</div>
-											</div>
 										</el-col>
 										<el-col span=8>
 											<div class="c-item" v-if="goods.needCustomer">
 												<label class="c-label"><span style="color: red;">*</span>客户:</label>
 												<el-select
-													:disabled="goods.needDeclare||m.declareNo||currentCustomerId!='1'"
+													:disabled="currentCustomerId!='1'"
 													v-model="m.customerId" placeholder="请选择">
 													<el-option v-for="item in customerList" :key="item.id"
 														:label="item.name" :value="item.id">
@@ -93,7 +81,7 @@
 											<div class="c-item" v-if="goods.needOwner==1">
 												<label class="c-label">
 													<span style="color: red;">*</span>
-													货物:</label>
+													货物名称:</label>
 												<el-input v-model="m.businessGoodsName" placeholder="填写货物" clearable>
 												</el-input>
 											</div>
@@ -105,7 +93,7 @@
 												</el-input>
 											</div>
 											<div class="c-item" v-if="goods.needOperateTime==1">
-												<label class="c-label"><span style="color: red;">*</span>件数:</label>
+												<label class="c-label"><span style="color: red;">*</span>件数数量(件):</label>
 												<el-input-number class="item-num" v-model="m.businessGoodsNum" :min="1"
 													:max="99999" size="mini">
 												</el-input-number>
@@ -152,7 +140,7 @@
 								<div>
 									<el-form-item v-for="(type,index) in itemTypeList">
 										<el-row justify="center">
-											<el-col span="9">
+											<el-col span="16">
 												<label style="color: red;"
 													v-if="type.need==1">*</label><label>{{type.name}}:</label>
 												<el-select v-model="type.itemId" style="width: 120px;"
@@ -162,10 +150,9 @@
 													</el-option>
 												</el-select>
 											</el-col>
-											<el-col span="7">
+											<el-col span="8">
 												<el-input-number style="margin-left: 60px;" class="item-num"
-													v-model="type.num" :min="1" :max="10" size="mini"
-													:disabled="type.inc==0"></el-input-number>
+													v-model="type.num" :min="1" :max="10" size="mini"></el-input-number>
 												<div class="xj" v-if="type.itemId">
 													{{type.price * type.num}}元
 													<label @click="cleanItem(type)"
@@ -173,12 +160,6 @@
 															class="el-icon-delete"></i>)</label>
 												</div>
 											</el-col>
-											<el-col span="8">
-												<label class="c-label">
-													备注:</label>
-												<el-input v-model="type.remark" placeholder="请输入备注" clearable>
-												</el-input>
-											</el-col>
 										</el-row>
 										<el-divider></el-divider>
 									</el-form-item>
@@ -647,10 +628,6 @@
 						let goods = this.goods;
 						let needCustomer = goods.needCustomer;
 						let m = this.m;
-						if (goods.needDeclare == 1 && !m.declareNo) {
-							sa.error('请选择申报单');
-							return false;
-						}
 						if (needCustomer == 1 && !m.customerId) {
 							sa.error('请选择客户');
 							return false;

+ 2 - 2
sp-admin/sa-view/tb-business/tb-car-disincle-info.html

@@ -42,8 +42,8 @@
 												<sa-info name="业务项目" br>{{m.goodsName}}</sa-info>
 												<!-- <sa-info name="作业时间" br>{{m.operateTime}}</sa-info> -->
 												<sa-info name="业务费用" br>{{m.itemPrice}}(元)</sa-info>
-												<sa-info name="货物" br v-if="m.businessGoodsName">{{m.businessGoodsName}}</sa-info>
-												<sa-info name="件数" br v-if="m.businessGoodsNum">{{m.businessGoodsNum}}</sa-info>
+												<sa-info name="货物名称" br v-if="m.businessGoodsName">{{m.businessGoodsName}}</sa-info>
+												<sa-info name="数量(件)" br v-if="m.businessGoodsNum">{{m.businessGoodsNum}}</sa-info>
 												<sa-info name="补录人" br v-if="m.supplementBy">{{m.supplementBy}}
 												</sa-info>
 												<sa-info name="补录时间" br v-if="m.supplementTime">{{m.supplementTime}}

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

@@ -72,7 +72,7 @@
 					<el-table-column type="index" width="50"></el-table-column>
 					<sa-td name="业务单号" prop="no" width="160"></sa-td>
 					<sa-td name="客户名称" prop="customerName" width="190"></sa-td>
-					<sa-td name="货物" prop="businessGoodsName" width="160"></sa-td>
+					<sa-td name="货物名称" prop="businessGoodsName" width="160"></sa-td>
 					<sa-td name="业务项" prop="goodsName" width="160"></sa-td>
 					<el-table-column label="车牌号" width="160">
 						<template slot-scope="s">

+ 13 - 4
sp-admin/sa-view/tb-fee-statistics/dayStatsPrint.html

@@ -121,8 +121,8 @@
 								<td>-</td>
 								<td>{{(total.totalTaxes).toFixed(2)}}</td>
 								<td>{{total.totalWxPrice}}</td>
-								<td>-</td>
-								<td>-</td>
+								<td>0</td>
+								<td>0</td>
 								<td>{{total.totalYuePrice}}</td>
 								<td>-</td>
 								<td>-</td>
@@ -130,7 +130,7 @@
 								<td>-</td>
 							</tr>
 						</table>
-						<span style="position: absolute;top: 750px;left: 1050px">{{index+1}}/{{dataList.length}}</span>
+						<span style="position: absolute;top: 780px;left: 1050px">{{index+1}}/{{dataList.length}}</span>
 					</div>
 				</div>
 			</div>
@@ -190,7 +190,16 @@
 								totalTaxMoney += item.taxes;
 								totalNoTaxMoney += item.noTaxMoney;
 								child.push(item);
-								if (child.length == 10 || i == len - 1) {
+								if(child.length == 11&&dataList.length==0){
+									let title = {
+										time: this.p.ids ? "勾选打印" : this.p.beginTime ? this.p.beginTime +
+											'至' + this.p.endTime : '所有时间',
+										list: child
+									}
+									dataList.push(title);
+									child = [];
+								}
+								if (child.length == 12 || i == len - 1) {
 									let title = {
 										time: this.p.beginDay ? this.p.beginDay + '至' + this.p.endDay :
 											'所有时间',

+ 11 - 2
sp-admin/sa-view/tb-fee-statistics/detailPrint.html

@@ -138,7 +138,7 @@
 								<td></td>
 							</tr>
 						</table>
-						<span style="position: absolute;top: 750px;left: 1050px">{{index+1}}/{{dataList.length}}</span>
+						<span style="position: absolute;top: 780px;left: 1050px">{{index+1}}/{{dataList.length}}</span>
 					</div>
 				</div>
 			</div>
@@ -173,7 +173,16 @@
 							for (i = 0; i < len; i++) {
 								let item = list[i];
 								child.push(item);
-								if (child.length == 10 || i == len - 1) {
+								if(child.length == 11&&dataList.length==0){
+									let title = {
+										time: this.p.ids ? "勾选打印" : this.p.beginTime ? this.p.beginTime +
+											'至' + this.p.endTime : '所有时间',
+										list: child
+									}
+									dataList.push(title);
+									child = [];
+								}
+								if (child.length == 12 || i == len - 1) {
 									let title = {
 										time: this.p.ids ? "勾选打印" : this.p.beginTime ? this.p.beginTime +
 											'至' + this.p.endTime : '所有时间',

+ 0 - 2
sp-admin/sa-view/tb-goods/tb-goods-list.html

@@ -40,8 +40,6 @@
                    @change="s => updateNeedCarSize(s.row)" width="90"></sa-td>
             <sa-td name="车辆" prop="mulCar" type="switch" :jv="{0: '单辆[#005500]', 1: '多辆[#ff0000]'}"
                    @change="s => updateMulCar(s.row)" width="90"></sa-td>
-            <sa-td name="申报单" prop="needDeclare" type="switch" :jv="{0: '选填[#005500]', 1: '必填[#ff0000]'}"
-                   @change="s => updateNeedDeclare(s.row)" width="90"></sa-td>
             <sa-td name="客户" prop="needCustomer" type="switch" :jv="{0: '选填[#005500]', 1: '必填[#ff0000]'}"
                    @change="s => updateNeedCustomer(s.row)" width="90"></sa-td>
             <sa-td name="货物" prop="needOwner" type="switch" :jv="{0: '选填[#005500]', 1: '必填[#ff0000]'}"

+ 2 - 2
sp-admin/sa-view/tb-item-type/tb-item-add.html

@@ -40,7 +40,7 @@
             <el-form v-if="m">
                 <sa-item type="text" name="车型" v-model="m.itemName" placeholder="请输入项目名称" br></sa-item>
                 <div class="c-item">
-                    <label class="c-label">业务类型:</label>
+                    <label class="c-label">通知类型:</label>
                     <el-select v-model="m.businessType">
                         <el-option v-for="item in businessTypeList" :key="item.id" :value="item.id"
                                    :label="item.name">
@@ -48,7 +48,7 @@
                     </el-select>
                 </div>
                 <div class="c-item">
-                    <label class="c-label">收费项目:</label>
+                    <label class="c-label">统计类型:</label>
                     <el-select v-model="m.payType">
                         <el-option v-for="item in payTypeList" :key="item.id" :value="item.id"
                                    :label="item.name">

+ 2 - 2
sp-admin/sa-view/tb-item-type/tb-item-edit.html

@@ -40,7 +40,7 @@
             <el-form v-if="m">
                 <sa-item type="text" name="车型" v-model="m.itemName" placeholder="请输入业务类型" br></sa-item>
                 <div class="c-item">
-                    <label class="c-label">业务类型:</label>
+                    <label class="c-label">通知类型:</label>
                     <el-select v-model="m.businessType">
                         <el-option v-for="item in businessTypeList" :key="item.id" :value="item.id"
                                    :label="item.name">
@@ -48,7 +48,7 @@
                     </el-select>
                 </div>
                 <div class="c-item">
-                    <label class="c-label">收费项目:</label>
+                    <label class="c-label">统计类别:</label>
                     <el-select v-model="m.payType">
                         <el-option v-for="item in payTypeList" :key="item.id" :value="item.id"
                                    :label="item.name">

+ 2 - 2
sp-admin/sa-view/tb-item-type/tb-item-list.html

@@ -34,9 +34,9 @@
 					<el-table-column type="index" width="50">
 					</el-table-column>
 					<sa-td name="车型" prop="itemName" width="300px"></sa-td>
-					<sa-td name="业务类型" prop="businessTypeName"></sa-td>
+					<sa-td name="通知类型" prop="businessTypeName"></sa-td>
 					<sa-td name="空车/载重" prop="itemType"></sa-td>
-					<sa-td name="收费项目" prop="payTypeName"></sa-td>
+					<sa-td name="统计类型" prop="payTypeName"></sa-td>
 					<sa-td name="价格" prop="price"></sa-td>
 					<sa-td name="计价单位" prop="unit"></sa-td>
 					<sa-td name="税率(%)" prop="taxRate"></sa-td>

+ 152 - 145
sp-admin/sa-view/tb-item-type/tb-item-type-list.html

@@ -1,149 +1,156 @@
 <!DOCTYPE html>
 <html>
-<head>
-    <title>作业配置项-列表</title>
-    <meta charset="utf-8">
-    <meta name="viewport"
-          content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
-    <!-- 所有的 css & js 资源 -->
-    <link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
-    <link rel="stylesheet" href="../../static/sa.css">
-    <script src="../../static/kj/vue.min.js"></script>
-    <script src="../../static/kj/element-ui/index.js"></script>
-    <script src="../../static/kj/httpVueLoader.js"></script>
-    <script src="../../static/kj/jquery.min.js"></script>
-    <script src="../../static/kj/layer/layer.js"></script>
-    <script src="../../static/sa.js"></script>
-</head>
-<body>
-<div class="vue-box" style="display: none;" :style="'display: block;'">
-    <div class="c-panel">
-        <!-- ------------- 检索参数 ------------- -->
-        <div class="c-title">检索参数</div>
-        <el-form ref="form" :model='p' @submit.native.prevent>
-            <sa-item type="text" name="项目名称" v-model="p.name"></sa-item>
-            <el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
-            <sa-item type="fast-btn" show="reset" style="display: inline;"></sa-item>
-            <el-button v-if="sa.isAuth('tb-item-type-add')" type="primary" icon="el-icon-plus" @click="add()">新增
-            </el-button>
-            <br/>
-        </el-form>
-        <!-- ------------- 数据列表 ------------- -->
-        <el-table class="data-table" ref="data-table" :data="dataList">
-            <el-table-column type="index" width="50"></el-table-column>
-            <sa-td name="项目名称" prop="name"></sa-td>
-            <sa-td name="排序" prop="sort"></sa-td>
-            <el-table-column label="操作" fixed="right" width="260px">
-                <template slot-scope="s">
-                    <!-- <el-button class="c-btn" type="success"  @click="get(s.row)">二维码
+	<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>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<sa-item type="fast-btn" show="reset" style="display: inline;"></sa-item>
+					<el-button v-if="sa.isAuth('tb-item-type-add')" type="primary" icon="el-icon-plus" @click="add()">新增
+					</el-button>
+					<br />
+				</el-form>
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList">
+					<el-table-column type="index" width="50"></el-table-column>
+					<sa-td name="项目名称" prop="name"></sa-td>
+					<sa-td name="项目名称" prop="name"></sa-td>
+					<el-table-column label="有效期" width="260px">
+						<template slot-scope="s">
+							{{s.row.startTime}}~{{s.row.endTime}}
+						</template>
+					</el-table-column>
+					<sa-td name="状态" prop="status" type="enum" :jv="{0: '禁用[#ff0000]', 1: '启用[#005500]'}"></sa-td>
+					<el-table-column label="操作" fixed="right" width="260px">
+						<template slot-scope="s">
+							<!-- <el-button class="c-btn" type="success"  @click="get(s.row)">二维码
                     </el-button> -->
-                    <el-button v-if="sa.isAuth('tb-item-type-relation')" class="c-btn" type="success"
-                               @click="itemFn(s.row)">收费明细
-                    </el-button>
-                    <el-button v-if="sa.isAuth('tb-item-type-edit')" class="c-btn" type="primary" icon="el-icon-edit"
-                               @click="update(s.row)">修改
-                    </el-button>
-                    <el-button v-if="sa.isAuth('tb-item-type-del')" class="c-btn" type="danger" icon="el-icon-delete"
-                               @click="del(s.row)">删除
-                    </el-button>
-                </template>
-            </el-table-column>
-        </el-table>
-        <!-- ------------- 分页 ------------- -->
-        <sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()">
-        </sa-item>
-    </div>
-</div>
-<script>
-    var app = new Vue({
-        components: {
-            "sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),
-            "sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),
-        },
-        el: '.vue-box',
-        data: {
-            idStr: sa.p('idStr', ''),
-            goodsId: sa.p('goodsId', ''),
-            p: { // 查询参数
-                id: '', // 主键
-                name: '', // 项目名称
-                pageNo: 1, // 当前页
-                pageSize: 20, // 页大小
-                sortType: 0 // 排序方式
-            },
-            dataCount: 0,
-            dataList: [], // 数据集合
-            itemTypeList: [],
-            businessTypeList: [{
-                value: '0',
-                name: '默认'
-            },
-                {
-                    value: '1',
-                    name: '消杀'
-                },
-                {
-                    value: '2',
-                    name: '装卸'
-                },
-                {
-                    value: '3',
-                    name: '核酸'
-                },
-            ]
-        },
-        methods: {
-            itemFn(data) {
-                sa.showIframe('【' + data.name + '】收费明细', 'tb-item.html?id=' + data.id, '1080px', '90%');
-            },
-            businessChange(data) {
-                data.businessType = data.type.join(',');
-                data.type = '';
-                sa.ajax('/TbItemType/update', data, function (res) {
-                    this.f5();
-                }.bind(this));
-            },
-            // 修改
-            update: function (data) {
-                sa.showIframe('修改数据', 'tb-item-type-add.html?id=' + data.id, '600px', '60%');
-            },
-            // 修改
-            get: function (data) {
-                sa.showIframe('【' + data.name + '】二维码', 'tb-item-type-info.html?id=' + data.id, '550px', '80%');
-            },
-            // 新增
-            add: function (data) {
-                sa.showIframe('新增数据', 'tb-item-type-add.html?id=-1', '600px', '60%');
-            },
-            // 删除
-            del: function (data) {
-                sa.confirm('是否删除,此操作不可撤销', function () {
-                    sa.ajax('/TbItemType/delete?id=' + data.id, function (res) {
-                        sa.arrayDelete(this.dataList, data);
-                        sa.ok('删除成功');
-                        sa.f5TableHeight(); // 刷新表格高度
-                    }.bind(this))
-                }.bind(this));
-            },
-            // 刷新
-            f5: function () {
-                sa.ajax('/TbItemType/getList', sa.removeNull(this.p), function (res) {
-                    let list = res.data;
-                    for (let i in list) {
-                        let obj = list[i];
-                        obj.type = obj.businessType.split(',')
-                    }
-                    this.dataList = list; // 数据
-                    this.dataCount = res.dataCount; // 数据总数
-                    sa.f5TableHeight(); // 刷新表格高度
-                }.bind(this));
-            },
-        },
-        created: function () {
-            this.f5();
-            sa.onInputEnter();
-        }
-    })
-</script>
-</body>
+							<el-button v-if="sa.isAuth('tb-item-type-relation')" class="c-btn" type="success"
+								@click="itemFn(s.row)">收费明细
+							</el-button>
+							<el-button v-if="sa.isAuth('tb-item-type-edit')" class="c-btn" type="primary"
+								icon="el-icon-edit" @click="update(s.row)">修改
+							</el-button>
+							<el-button v-if="sa.isAuth('tb-item-type-del')" class="c-btn" type="danger"
+								icon="el-icon-delete" @click="del(s.row)">删除
+							</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()">
+				</sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),
+				},
+				el: '.vue-box',
+				data: {
+					idStr: sa.p('idStr', ''),
+					goodsId: sa.p('goodsId', ''),
+					p: { // 查询参数
+						id: '', // 主键
+						name: '', // 项目名称
+						pageNo: 1, // 当前页
+						pageSize: 20, // 页大小
+						sortType: 0 // 排序方式
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合
+					itemTypeList: [],
+					businessTypeList: [{
+							value: '0',
+							name: '默认'
+						},
+						{
+							value: '1',
+							name: '消杀'
+						},
+						{
+							value: '2',
+							name: '装卸'
+						},
+						{
+							value: '3',
+							name: '核酸'
+						},
+					]
+				},
+				methods: {
+					itemFn(data) {
+						sa.showIframe('【' + data.name + '】收费明细', 'tb-item.html?id=' + data.id, '1080px', '90%');
+					},
+					businessChange(data) {
+						data.businessType = data.type.join(',');
+						data.type = '';
+						sa.ajax('/TbItemType/update', data, function(res) {
+							this.f5();
+						}.bind(this));
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-item-type-add.html?id=' + data.id, '600px', '60%');
+					},
+					// 修改
+					get: function(data) {
+						sa.showIframe('【' + data.name + '】二维码', 'tb-item-type-info.html?id=' + data.id, '550px',
+							'80%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-item-type-add.html?id=-1', '600px', '60%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/TbItemType/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight(); // 刷新表格高度
+							}.bind(this))
+						}.bind(this));
+					},
+					// 刷新
+					f5: function() {
+						sa.ajax('/TbItemType/getList', sa.removeNull(this.p), function(res) {
+							let list = res.data;
+							for (let i in list) {
+								let obj = list[i];
+								obj.type = obj.businessType.split(',')
+							}
+							this.dataList = list; // 数据
+							this.dataCount = res.dataCount; // 数据总数
+							sa.f5TableHeight(); // 刷新表格高度
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
 </html>

+ 0 - 7
sp-admin/sa-view/tb-item-type/tb-item.html

@@ -43,13 +43,6 @@
                     <label>{{s.row.minWeight}}—{{s.row.maxWeight}}</label>
                 </template>
             </sa-td>
-
-            <sa-td name="明细数量" prop="inc" type="switch" :jv="{1: '多个[#005500]', 0: '单个[#ff0000]'}"
-                   @change="s => updateNum(s.row)" width="100"></sa-td>
-            <sa-td name="备注" prop="needRemark" type="switch" :jv="{1: '必填[#005500]', 0: '选填[#ff0000]'}"
-                   @change="s => updateRemarkNeed(s.row)" width="100"></sa-td>
-            <!-- <sa-td name="状态" prop="mustRemark" type="switch" :jv="{1: '必填[#005500]', 0: '选填[#ff0000]'}"
-                @change="s => updateRemarkMust(s.row)"></sa-td> -->
             <el-table-column label="操作" fixed="right">
                 <template slot-scope="s">
                     <el-button class="c-btn" type="danger" @click="del(s.row)">移除

+ 2 - 1
sp-server/src/main/java/com/pj/api/invoice/service/InvoiceApplyService.java

@@ -18,6 +18,7 @@ import com.pj.api.invoice.bo.InvoiceApplySubDetail;
 import com.pj.api.invoice.utils.InvoiceUtils;
 import com.pj.api.wx.bo.Attach;
 import com.pj.api.wx.bo.PriceBO;
+import com.pj.constants.business.PayEnum;
 import com.pj.current.config.InvoiceConfig;
 import com.pj.project.tb_fee_details.TbFeeDetails;
 import com.pj.project.tb_fee_details.TbFeeDetailsService;
@@ -102,7 +103,7 @@ public class InvoiceApplyService {
         List<InvoiceApplySub> applys = new ArrayList<>();
         for (TbInvoiceDetails invoiceDetail : invoiceDetails) {
             InvoiceApplySub apply = new InvoiceApplySub();
-            apply.setBillNo(invoiceDetail.getId()).setPayType("微信支付")
+            apply.setBillNo(invoiceDetail.getId()).setPayType(PayEnum.PayType.WX_PAY.getDesc())
                     .setBillDate(DateUtil.format(now, "yyyy-MM-dd"))
                     .setTotalAmount(invoiceDetail.getMoney()).setIncludeTaxFlag(1)
                     .setAutoInvoice(1).setAutoMerge(1)

+ 6 - 3
sp-server/src/main/java/com/pj/api/pushfee/task/FeeDetailSyncTask.java

@@ -16,6 +16,7 @@ import com.pj.api.pushfee.bo.SyncBillParam;
 import com.pj.api.pushfee.bo.SyncBillRequest;
 import com.pj.constants.business.FeeTypeEnum;
 import com.pj.constants.business.PartFeeEnum;
+import com.pj.constants.business.PayEnum;
 import com.pj.current.config.PushfeeConfig;
 import com.pj.current.task.Task;
 import com.pj.project.sync.HelpService;
@@ -38,11 +39,13 @@ public class FeeDetailSyncTask extends Task {
 
     private String detailId;
     private String syncType;
+    private PayEnum.PayType payType;
 
-    public FeeDetailSyncTask(String taskId, long delayInMilliseconds, String detailId, String syncType) {
-        super(taskId, delayInMilliseconds);
+    public FeeDetailSyncTask(String id, long delayInMilliseconds, String detailId, String syncType, PayEnum.PayType payType) {
+        super(id, delayInMilliseconds);
         this.detailId = detailId;
         this.syncType = syncType;
+        this.payType = payType;
     }
 
     private List<SyncBillParam> buildParams(TbFeeDetails tbFeeDetails) {
@@ -75,7 +78,7 @@ public class FeeDetailSyncTask extends Task {
                 .setPaidAmount(tbFeeDetails.getItemPrice().toString()).setRefundAmount("0").setPayStatus("支付成功")
                 .setPayTime(tbFeeDetails.getPayTime()).setBillTime(tbFeeDetails.getCreateTime())
                 .setPrice(tbFeeDetails.getItemPrice().toString()).setActPrice(tbFeeDetails.getItemPrice())
-                .setBillStatus("已完成");
+                .setBillStatus("已完成").setPaymentWayNo(payType.getCode()+"").setPaymentWayName(payType.getDesc());
         log.info("基础数据:{}", JSONUtil.parseObj(opd));
         opdList.add(opd);
         return opdList;

+ 0 - 5
sp-server/src/main/java/com/pj/api/pushfee/web/TestApi.java

@@ -15,9 +15,4 @@ public class TestApi {
     @Resource
     TaskService taskService;
 
-    @RequestMapping("test")
-    public AjaxJson test(String id){
-        taskService.addTask(new FeeDetailSyncTask(RandomUtil.randomNumbers(5),2000,id,"insert"));
-        return AjaxJson.getSuccess();
-    }
 }

+ 24 - 2
sp-server/src/main/java/com/pj/project/sync/HelpService.java

@@ -2,15 +2,18 @@ package com.pj.project.sync;
 
 import cn.com.btxc.micro.uni.openapi.inject.ComposeOperation;
 import cn.com.btxc.micro.uni.openapi.inter.message.Message;
+import cn.com.btxc.micro.uni.openapi.inter.message.ParsedMessage;
 import cn.com.btxc.micro.uni.openapi.keys.ApiKey;
 import cn.com.btxc.micro.uni.openapi.role.ClientRole;
 import cn.com.btxc.micro.uni.openapi.role.builder.ClientRoleBuilder;
+import cn.com.btxc.micro.uni.openapi.role.builder.ServerRoleBuilder;
 import cn.com.btxc.micro.uni.openapi.rsa.operation.ComposeOperationImpl;
 import cn.hutool.http.HttpUtil;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.pj.current.config.PushfeeConfig;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -20,6 +23,11 @@ import javax.annotation.Resource;
 public class HelpService {
     @Resource
     private PushfeeConfig pushfeeConfig;
+    public static final String clientPublicKeyBase6 = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCimSu5J8apt2YR/o9joOCNdFzO3rOHcdcqnSCm1Wt19VwskTVjkKHc/CXHUoskX5vMiMiv6xPnf/lDpMO6KnCrwlVQFtbPvmnkwyUs/haW8ggR865MqDcBpdMGnuV0YJ04UXxSrOX+eu+dl91Web4/ZiRKbObOa8WhFm/Ln2QKswIDAQAB";
+    public static final String clientPrivateKeyBase6 = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKKZK7knxqm3ZhH+j2Og4I10XM7es4dx1yqdIKbVa3X1XCyRNWOQodz8JcdSiyRfm8yIyK/rE+d/+UOkw7oqcKvCVVAW1s++aeTDJSz+FpbyCBHzrkyoNwGl0wae5XRgnThRfFKs5f56752X3VZ5vj9mJEps5s5rxaEWb8ufZAqzAgMBAAECgYAmP/QaLXI9kIgxaXnfzQOmIx6GB7uh/DTKsIXy2TfbWunhDhPKJUb+jk5w0kkrOFaVSgQz5hAboG5J7GOi0sMINLb7H2WsOm3uGM/8HPZYsrNFnB8VUiD26LIZ6+HhPXfp/LN+k5eUnUlD6z/dZU1k6hJPOSFC3PyzfBWqaQMqGQJBAMVdQ9Uw+eC94qD1MSSEQZhqpfGE4vO7WrSACLFqyZrHvaIwZTjdUZRF1aMlJyT0afOkfSN/53QQEcejXMUrSBcCQQDS576SXkpdfrN2jmr9BAimi+6AP71GUgXL3O+2yRL2szLoU7GwtMREPBFw+ocnC4UN87NCYveJCzenQEt48JfFAkAqEIa0mYuoatAyng+rSMTyR0i3ASud5wCeF+vCZJAzfP7d4pKwW/tXLsspynFdXvp2A0jomAosooAnnJnZLDBhAkBzXoXm92Fip45wShPIeE5rHJzI1xUoxHGbRS50JKYVAY3VfQL0kM3ULa+0x7bq6uhL64WhyRVziAlXmlouvB2pAkEAuDvsjVhdo3uMGL7Tr+igPhajoWUTjPuAf+Od3SsqMTPFLBpbJM8ziXk39Me9S8wqgGwR3pnlC1Z6Rybgm+uy4g==";
+    //服务端公私钥
+    public static final String serverPublicKeyBase6 = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCb5yK85EKqwiQU+z1jyjOng6ecssQpEjC6STbCuSWN6KHLkijBxdqrCumXhbIyOVx4lHK9Rg5EjzlQxoaXQTgJdItaGjLC+UTE+NNAnnaFLg0x4jajNpLo473zdZxTYQaT3q/aKnTeXuKHw11PPUe4hmmfxPcdt9yJ0Iqo/XxV3QIDAQAB";
+    public static final String serverPrivateKeyBase64 = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJvnIrzkQqrCJBT7PWPKM6eDp5yyxCkSMLpJNsK5JY3oocuSKMHF2qsK6ZeFsjI5XHiUcr1GDkSPOVDGhpdBOAl0i1oaMsL5RMT400CedoUuDTHiNqM2kujjvfN1nFNhBpPer9oqdN5e4ofDXU89R7iGaZ/E9x233InQiqj9fFXdAgMBAAECgYASoeKgcaVYFCDM0yQIn5thy1XGYAUapX5mXSaqygbneWSQ2FR/qB5Ur9awEb30y682CAPYhB1jazyd30QpopVINvyhaWhgq1b/8KD92FqOg1eXxa7bTuTe8aMuKTB/ZJjEry0d5Mu3i6zYKtTSbnpnag5I3UE5awLDy7utYOoOHwJBAPtvz2ZBhtJvL3lsMgs7kGqrPqqI2LAX8J3oOCtE/6eQjQ0I5fBCybrwHp3baDrYul5KTL3kJvl4iWN/gHDi/nMCQQCeu3gzy0DVtM8M8bzFc/ZA753WRn4Z5axQa6lE7Tski8TUw4Bhbfan9E/C6l6Guo/+2hXPAE/RMcncClqeXXZvAkEAgf6FsO1x4fxABDvvB6Ws/ak5hfuoZCqMaWd1GtHah2yRsEqIbxZoq7CXc6/LDJmeiT9Ku+ZoTBSIm5uA8Vw6hwJALEbs872pmzMxYlH4Lzf2pAxzAbduK3kmhNRTRjfKfJpEUHksUYEkAZujuCI6NejKi/N3i+NxYFA8F5YHyw8VHwJAWoiYSYLSziHgDytoPKFvUp6EKLGDClhACJKc4LuaPNWICMxb5Dp88sY0NDYb4HzCyWIE5G4vbiF/K3kEEwCIVA==";
     private static final Gson gson = new GsonBuilder().disableHtmlEscaping().create();
 
     /**
@@ -30,14 +38,28 @@ public class HelpService {
      */
     public String req(String path, Object body) {
         String sysId = pushfeeConfig.getSysId();
-        ApiKey clientApiKey = new ApiKey(sysId, pushfeeConfig.getSysName(), pushfeeConfig.getServerPublicKeyBase6(), pushfeeConfig.getClientPublicKeyBase6(), pushfeeConfig.getClientPrivateKeyBase6());
+        ApiKey clientApiKey = new ApiKey(sysId, pushfeeConfig.getSysName(), serverPublicKeyBase6, clientPublicKeyBase6, clientPrivateKeyBase6);
         ComposeOperation operation = new ComposeOperationImpl();
         ClientRole clientHelper = ClientRoleBuilder.builder().operation(operation).build();
         Message message = clientHelper.requestPayloadObject(sysId, body, clientApiKey);
         String messageToBeSend = gson.toJson(message);
         log.info("客户端发送报文:" + messageToBeSend);
-        return HttpUtil.createPost(pushfeeConfig.getSyncUrl()+path)
+        return HttpUtil.createPost(pushfeeConfig.getSyncUrl() + path)
                 .header("Authorization", "openApi")
                 .timeout(2000).setReadTimeout(3000).body(messageToBeSend).execute().body();
     }
+
+    /**
+     * 解密
+     * @param content
+     * @param bean
+     * @return
+     */
+    public <T> T deCrypte(String content, Class<T> clazz) {
+        String sysId = pushfeeConfig.getSysId();
+        ApiKey clientApiKey = new ApiKey(sysId, pushfeeConfig.getSysName(), serverPublicKeyBase6, clientPublicKeyBase6, clientPrivateKeyBase6);
+        ComposeOperation operation = new ComposeOperationImpl();
+        ParsedMessage parsedMessage = ServerRoleBuilder.builder().operation(operation).build().processRequestBody(content, clientApiKey);
+        return parsedMessage.getBean(clazz);
+    }
 }

+ 51 - 5
sp-server/src/main/java/com/pj/project/sync/SyncService.java

@@ -1,16 +1,62 @@
 package com.pj.project.sync;
 
+import cn.hutool.json.JSONUtil;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.pj.current.config.PushfeeConfig;
+import com.pj.project.sync.bo.*;
+import com.pj.project.sync.dto.ItemTypeDTO;
+import com.pj.project.sync.dto.PartnerDTO;
+import com.pj.project.sync.dto.PartnerParam;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.util.Collections;
 import java.util.List;
 
 @Service
-@Transactional
+@Slf4j
 public class SyncService {
-    public void syncPartnes(String id,String name,String syncType){
-        PartnerParam dto=new PartnerParam(id,name,syncType);
-        List<PartnerParam>list= Collections.singletonList(dto);
+    @Resource
+    private PushfeeConfig pushfeeConfig;
+    @Resource
+    private HelpService helpService;
+    private static final Gson gson = new GsonBuilder().disableHtmlEscaping().create();
+
+    /**
+     * 同步合作伙伴
+     *
+     * @param id
+     * @param name
+     * @param syncType
+     */
+    public void syncPartnes(String id, String name, String syncType) {
+        PartnerParam dto = new PartnerParam(id, name, syncType);
+        List<PartnerParam> list = Collections.singletonList(dto);
+        PartnerDTO partnerDTO = new PartnerDTO();
+        partnerDTO.setPartnersList(list);
+        String resp = helpService.req("/data/sync/partners", partnerDTO);
+        log.info("async partner::{},{}", resp, JSONUtil.toJsonStr(partnerDTO));
     }
+
+    public List<IExpenseItem> syncItemTypeList(String itemTypeName,String itemCode) {
+        ItemTypeDTO dto = new ItemTypeDTO();
+        dto.setSysId(pushfeeConfig.getSysId()).setBizTypeNo(itemCode).setExpenseName(itemTypeName);
+        String resp = helpService.req("/price/external/expense/list", dto);
+        SyncResultBO resultBO = JSONUtil.toBean(resp, SyncResultBO.class);
+        log.info("async item type::{}", resp);
+        IExpenseListQueryRes res = helpService.deCrypte(resultBO.getData(), IExpenseListQueryRes.class);
+        FactorParams factorParams=new FactorParams();
+        res.getList().forEach(iExpenseItem -> {
+            factorParams.setUniqueExpenseId(iExpenseItem.getUniqueExpenseId());
+            String factorResp = helpService.req("/price/external/expense/factor", factorParams);
+            SyncResultBO factorResultBO = JSONUtil.toBean(factorResp, SyncResultBO.class);
+            FactorDTO factorRes = helpService.deCrypte(factorResultBO.getData(), FactorDTO.class);
+            iExpenseItem.setPriceFactor(factorRes.getPriceFactors());
+        });
+        return res.getList();
+
+    }
+
 }

+ 36 - 0
sp-server/src/main/java/com/pj/project/sync/api/AsyncApi.java

@@ -0,0 +1,36 @@
+package com.pj.project.sync.api;
+
+import cn.com.btxc.micro.uni.openapi.inject.ComposeOperation;
+import cn.com.btxc.micro.uni.openapi.keys.ApiKey;
+import cn.com.btxc.micro.uni.openapi.rsa.operation.ComposeOperationImpl;
+import com.pj.project.sync.HelpService;
+import com.pj.project.sync.SyncService;
+import com.pj.project.sync.dto.ItemTypeDTO;
+import com.pj.project.tb_item_type.TbItemTypeService;
+import com.pj.utils.sg.AjaxJson;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("business/sync")
+@Slf4j
+public class AsyncApi {
+
+    @Resource
+    private TbItemTypeService tbItemTypeService;
+
+
+    //主动发送请求:请求费项详情
+    @PostMapping("item-type")
+    public AjaxJson syncItemType(@RequestBody String request) {
+        log.info("sync 业务类型:{}", request);
+        tbItemTypeService.receive(request);
+        return AjaxJson.get(1, "成功");
+    }
+
+}

+ 13 - 0
sp-server/src/main/java/com/pj/project/sync/bo/FactorDTO.java

@@ -0,0 +1,13 @@
+package com.pj.project.sync.bo;
+
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@OpenApi(apiName = "REQ_004")
+public class FactorDTO {
+    private String uniqueExpenseId;
+    private List<PriceFactorDTO> priceFactors;
+}

+ 10 - 0
sp-server/src/main/java/com/pj/project/sync/bo/FactorParams.java

@@ -0,0 +1,10 @@
+package com.pj.project.sync.bo;
+
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import lombok.Data;
+
+@Data
+@OpenApi(apiName = "REQ_004")
+public class FactorParams {
+    private String uniqueExpenseId;
+}

+ 102 - 0
sp-server/src/main/java/com/pj/project/sync/bo/IExpenseItem.java

@@ -0,0 +1,102 @@
+package com.pj.project.sync.bo;
+
+
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@Slf4j
+public class IExpenseItem {
+    /**
+     * 系统id
+     */
+    private String sysId;
+
+    /**
+     *  系统名称
+     */
+    private String sysName;
+
+    /**
+     * 费项编号
+     */
+    private String uniqueExpenseId;
+
+    /**
+     * 费项名称
+     */
+    private String expenseName;
+
+    /**
+     * 业务类型编号
+     */
+    private String bizTypeNo;
+
+    /**
+     * 业务类型名称
+     */
+    private String bizTypeName;
+
+    /**
+     * 税率
+     */
+    private BigDecimal taxRate;
+
+    /**
+     * 费项单位
+     */
+    private String expenseUnit;
+
+    /**
+     * 费项描述
+     */
+    private String expenseDesc;
+
+    /**
+     * 规格编号
+     */
+    private String pattern;
+
+    /**
+     * 规格名称:单规格、多规格
+     */
+    private String patternName;
+
+    /**
+     * 费项金额。只有单规格费项才有值
+     */
+    private BigDecimal fixedPrice;
+
+    /**
+     * 生效时间
+     */
+    private Date affectDate;
+
+    /**
+     * 过期时间
+     */
+    private Date finishDate;
+
+    /**
+     * 动态调价
+     */
+    private Integer isDynamicPrice;
+
+    /**
+     * 版本号
+     */
+    private String version;
+
+    /**
+     * 多规格费项价格子项信息
+     */
+
+    private List<SubExpenseDTO> subExpenses;
+    private List<PriceFactorDTO> priceFactor;
+
+
+}

+ 17 - 0
sp-server/src/main/java/com/pj/project/sync/bo/IExpenseListQueryRes.java

@@ -0,0 +1,17 @@
+package com.pj.project.sync.bo;
+
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@OpenApi(apiName = "REQ_003")
+public class IExpenseListQueryRes {
+
+    /**
+     * 费项列表
+     */
+    List<IExpenseItem> list;
+
+}

+ 24 - 0
sp-server/src/main/java/com/pj/project/sync/bo/ItemTypeBO.java

@@ -0,0 +1,24 @@
+package com.pj.project.sync.bo;
+
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@OpenApi(apiName = "REQ_012")
+public class ItemTypeBO implements Serializable {
+    private String sysId;
+    private String sysName;
+    private String keyId;
+    private String keyName;
+    private String syncType;
+    private String parentId;
+    private String level;
+    private String partnersId;
+    private String state;
+    private Date startTime;
+    private Date endTime;
+
+}

+ 18 - 0
sp-server/src/main/java/com/pj/project/sync/bo/PriceFactorDTO.java

@@ -0,0 +1,18 @@
+package com.pj.project.sync.bo;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+public class PriceFactorDTO implements Serializable {
+    private String id;
+    private String sysId;
+    private String unit;
+    private String facName;
+    private String textType;
+    private String operator;
+    private String rangeVal;
+
+}

+ 11 - 0
sp-server/src/main/java/com/pj/project/sync/bo/SubExpenseDTO.java

@@ -0,0 +1,11 @@
+package com.pj.project.sync.bo;
+
+import lombok.Data;
+
+@Data
+public class SubExpenseDTO {
+    private String subExpenseName;
+
+    private String subExpensePrice;
+
+}

+ 29 - 0
sp-server/src/main/java/com/pj/project/sync/bo/SyncResultBO.java

@@ -0,0 +1,29 @@
+package com.pj.project.sync.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class SyncResultBO implements Serializable {
+    private Integer code;
+    private String msg;
+    private String timestamp;
+    private String data;
+
+    @Data
+  public   static class DataBO {
+        private ReqBO request;
+        private String signature;
+
+        @Data
+        public static class ReqBO {
+            private String sysId;
+            private String encrypted;
+            private String keyEncrypted;
+            private String apiName;
+            private String timeStamp;
+        }
+    }
+
+}

+ 18 - 0
sp-server/src/main/java/com/pj/project/sync/dto/ItemTypeDTO.java

@@ -0,0 +1,18 @@
+package com.pj.project.sync.dto;
+
+
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@OpenApi(apiName = "REQ_003")
+@Accessors(chain = true)
+public class ItemTypeDTO implements Serializable {
+    private String sysId;
+    private String bizTypeNo;
+    private String expenseName;
+
+}

+ 1 - 1
sp-server/src/main/java/com/pj/project/sync/PartnerDTO.java → sp-server/src/main/java/com/pj/project/sync/dto/PartnerDTO.java

@@ -1,4 +1,4 @@
-package com.pj.project.sync;
+package com.pj.project.sync.dto;
 
 import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
 import lombok.Data;

+ 2 - 1
sp-server/src/main/java/com/pj/project/sync/PartnerParam.java → sp-server/src/main/java/com/pj/project/sync/dto/PartnerParam.java

@@ -1,5 +1,6 @@
-package com.pj.project.sync;
+package com.pj.project.sync.dto;
 
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.Getter;

+ 103 - 0
sp-server/src/main/java/com/pj/project/sync/task/SyncTask.java

@@ -0,0 +1,103 @@
+package com.pj.project.sync.task;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.RandomUtil;
+import com.pj.constants.business.CarEnum;
+import com.pj.project.relation_type_item.RelationTypeItem;
+import com.pj.project.relation_type_item.RelationTypeItemService;
+import com.pj.project.sync.SyncService;
+import com.pj.project.sync.bo.IExpenseItem;
+import com.pj.project.tb_item.TbItem;
+import com.pj.project.tb_item.TbItemService;
+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 lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Component
+@Slf4j
+public class SyncTask {
+    @Resource
+    private TbItemTypeService tbItemTypeService;
+    @Resource
+    private SyncService syncService;
+    @Resource
+    private TbItemService tbItemService;
+    @Resource
+    private RelationTypeItemService relationTypeItemService;
+    @Resource
+    private TbItemFacService tbItemFacService;
+
+    @Scheduled(fixedRate = 60000)
+    public void sync() {
+        List<IExpenseItem> items = syncService.syncItemTypeList(null, null);
+        Date now = new Date();
+        for (IExpenseItem item : items) {
+            TbItemType tbItemType = handlerItemType(item, now);
+            TbItem tbItem = handlerItem(tbItemType, item, now);
+            handlerFac(item, tbItem, now);
+        }
+    }
+
+    private void handlerFac(IExpenseItem item, TbItem tbItem, Date now) {
+        item.getPriceFactor().forEach(fac -> {
+            String id = fac.getId();
+            TbItemFac tbItemFac = tbItemFacService.getById(id);
+            if (tbItemFac==null){
+                tbItemFac=new TbItemFac();
+            }
+            tbItemFac.setName(fac.getFacName());
+            BeanUtil.copyProperties(fac,tbItemFac);
+            tbItemFac.setItemId(tbItem.getId()).setId(id);
+            tbItemFacService.saveOrUpdate(tbItemFac);
+        });
+    }
+
+    private TbItem handlerItem(TbItemType tbItemType, IExpenseItem item, Date now) {
+        String name = item.getExpenseName();
+        String code = item.getUniqueExpenseId();
+        TbItem tbItem = tbItemService.findByCode(code);
+        if (tbItem == null) {
+            tbItem = new TbItem();
+        }
+        String typeId = tbItemType.getId();
+        tbItem.setItemCode(code).setItemName(name).setUnit(item.getExpenseUnit()).setStatus(1)
+                .setInc(1).setNeedRemark(0).setPrice(item.getFixedPrice()).setMinLength(0).setCarLength(25)
+                .setMinWeight(0).setMaxWeight(999999).setTaxRate(item.getTaxRate().doubleValue())
+                .setTypeId(typeId).setTypeName(tbItemType.getName())
+                .setItemType(CarEnum.CarTypeEnum.EMPTY_TYPE.getDesc() + "," + CarEnum.CarTypeEnum.WEIGHT_TYPE.getDesc());
+        tbItemService.saveOrUpdate(tbItem);
+        RelationTypeItem relationTypeItem = relationTypeItemService.findByTypeIdAndItemId(typeId, tbItem.getId());
+        if (relationTypeItem == null) {
+            relationTypeItem = new RelationTypeItem();
+            relationTypeItem.setTypeId(typeId).setItemId(tbItem.getId())
+                    .setInc(1).setNeedRemark(0).setMustRemark(0);
+            relationTypeItemService.save(relationTypeItem);
+        }
+        return tbItem;
+    }
+
+    TbItemType handlerItemType(IExpenseItem item, Date now) {
+        String code = item.getBizTypeNo();
+        String name = item.getBizTypeName();
+        TbItemType tbItemType = tbItemTypeService.findByCode(code);
+        if (tbItemType == null) {
+            tbItemType = new TbItemType();
+            tbItemType.setSort(RandomUtil.randomInt(0, 15));
+        }
+        tbItemType.setName(name)
+                .setCode(code)
+                .setSyncTime(now);
+        tbItemTypeService.saveOrUpdate(tbItemType);
+        return tbItemType;
+    }
+}

+ 5 - 0
sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomerService.java

@@ -4,6 +4,8 @@ import cn.hutool.core.util.StrUtil;
 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.constants.business.SyncTypeEnum;
+import com.pj.project.sync.SyncService;
 import com.pj.project.tb_init_permission.TbInitPermission;
 import com.pj.project.tb_init_permission.TbInitPermissionService;
 import com.pj.project4sp.SP;
@@ -48,6 +50,8 @@ public class TbCostomerService extends ServiceImpl<TbCostomerMapper, TbCostomer>
     private SpAdminMapper spAdminMapper;
     @Resource
     private SpAdminService spAdminService;
+    @Resource
+    private SyncService syncService;
 
     /**
      * 增
@@ -114,6 +118,7 @@ public class TbCostomerService extends ServiceImpl<TbCostomerMapper, TbCostomer>
             throw new RuntimeException("名称已存在");
         }
         this.updateById(t);
+        syncService.syncPartnes(t.getId(), t.getName(), SyncTypeEnum.UPDATE.getCode());
         return 1;
     }
 

+ 5 - 31
sp-server/src/main/java/com/pj/project/tb_fee_details/TbFeeDetailsService.java

@@ -244,7 +244,7 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
             String type = StrUtil.isEmpty(in24Detail.getId()) ? SyncTypeEnum.INSERT.getCode() : SyncTypeEnum.UPDATE.getCode();
             saveOrUpdate(in24Detail);
             details.add(in24Detail);
-            taskService.addTask(new FeeDetailSyncTask(RandomUtil.randomNumbers(10), 1000, in24Detail.getId(), type));
+            taskService.addTask(new FeeDetailSyncTask(RandomUtil.randomNumbers(10), 1000, in24Detail.getId(), type,payType));
             //24小时外的停车费
             BigDecimal out24Price = payPrice.subtract(in24Price);
             if (out24Price.compareTo(BigDecimal.valueOf(0)) > 0) {
@@ -255,7 +255,7 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
                 setFee(out24Details, car, transactionId, outTradeNo, now);
                 type = StrUtil.isEmpty(out24Details.getId()) ? SyncTypeEnum.INSERT.getCode() : SyncTypeEnum.UPDATE.getCode();
                 saveOrUpdate(out24Details);
-                taskService.addTask(new FeeDetailSyncTask(RandomUtil.randomNumbers(10), 1000, out24Details.getId(), type));
+                taskService.addTask(new FeeDetailSyncTask(RandomUtil.randomNumbers(10), 1000, out24Details.getId(), type,payType));
                 details.add(out24Details);
             }
         }
@@ -352,7 +352,7 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
                     .setModule(module);
             String type = StrUtil.isEmpty(businessFeeDetail.getId()) ? SyncTypeEnum.INSERT.getCode() : SyncTypeEnum.UPDATE.getCode();
             saveOrUpdate(businessFeeDetail);
-            taskService.addTask(new FeeDetailSyncTask(RandomUtil.randomNumbers(10), 1000, businessFeeDetail.getId(), type));
+            taskService.addTask(new FeeDetailSyncTask(RandomUtil.randomNumbers(10), 1000, businessFeeDetail.getId(), type,payType));
             feeDetails.add(businessFeeDetail);
         }
         return feeDetails;
@@ -392,8 +392,8 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
             detailDTO.setBusinessNo(feeDetails.getBusinessNo()).setCarNo(feeDetails.getCarNo())
                     .setFeeType(feeType).setItemTypeName(feeDetails.getItemTypeName())
                     .setItemName(feeDetails.getItemName()).setItemPrice(feeDetails.getItemPrice())
-                    .setPayType("微信支付").setIndex(index++)
-                    .setPayMode("直接收款")
+                    .setPayType(PayEnum.PayType.WX_PAY.getDesc()).setIndex(index++)
+                    .setPayMode(PayEnum.PayType.CASH_PAY.getDesc())
                     .setWeight(feeDetails.getWeight()).setNum(feeDetails.getNum()).setUnitPrice(feeDetails.getUnitPrice())
                     .setSettle("已结算").setTaxRate(feeDetails.getTaxRate().multiply(new BigDecimal(100)))
                     .setTaxPrice(feeDetails.getTaxPrice()).setNoTaxPrice(feeDetails.getNoTaxPrice()).setPayTime(feeDetails.getPayTime())
@@ -570,13 +570,6 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
 
     public void jiChaConfirm(List<Long> ids) {
         SpAdmin admin = StpUserUtil.getAdmin();
-        List<String> roleIds = StrUtil.splitTrim(admin.getRoleId(), ",");
-        for (String roleId : roleIds) {
-            SpRole role = spRoleMapper.getById(Long.valueOf(roleId));
-            if (!StrUtil.equals(PersonEnum.JICHA.getDesc(), role.getName()) && !StrUtil.equals("admin", role.getType())) {
-                throw new BusinessException("无操作权限");
-            }
-        }
         List<TbFeeDetails> detailsList = this.listByIds(ids);
         Set<String> days = new HashSet<>();
         for (TbFeeDetails detail : detailsList) {
@@ -594,10 +587,6 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
 
     public void kaiDanConfirm(List<Long> ids) {
         SpAdmin admin = StpUserUtil.getAdmin();
-        SpRole role = spRoleMapper.getById(Long.valueOf(admin.getRoleId()));
-        if (!StrUtil.equals(PersonEnum.KAIDAN.getDesc(), role.getName()) && !StrUtil.equals("admin", role.getType())) {
-            throw new BusinessException("无操作权限");
-        }
         List<TbFeeDetails> detailsList = this.listByIds(ids);
         Set<String> days = new HashSet<>();
         for (TbFeeDetails detail : detailsList) {
@@ -615,16 +604,6 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
 
     public void diaoDuConfirm(List<Long> ids) {
         SpAdmin admin = StpUserUtil.getAdmin();
-        AtomicBoolean hasPermission = new AtomicBoolean(false);
-        StrUtil.splitTrim(admin.getRoleId(), ",").forEach(roleId -> {
-            SpRole role = spRoleMapper.getById(Long.valueOf(roleId));
-            if (StrUtil.equals(PersonEnum.FUHE.getDesc(), role.getName()) || StrUtil.equals("admin", role.getType())) {
-                hasPermission.set(true);
-            }
-        });
-        if (!hasPermission.get()) {
-            throw new BusinessException("无操作权限");
-        }
         List<TbFeeDetails> detailsList = this.listByIds(ids);
         Set<String> days = new HashSet<>();
         for (TbFeeDetails detail : detailsList) {
@@ -688,11 +667,6 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
     }
 
     public void jiChaCancel(List<Long> ids) {
-        SpAdmin admin = StpUserUtil.getAdmin();
-        SpRole role = spRoleMapper.getById(Long.valueOf(admin.getRoleId()));
-        if (!StrUtil.equals(PersonEnum.JICHA.getDesc(), role.getName()) && !StrUtil.equals("admin", role.getType())) {
-            throw new BusinessException("该操作需要统计稽查员的权限");
-        }
         List<TbFeeDetails> detailsList = this.listByIds(ids);
         Set<String> days = new HashSet<>();
         for (TbFeeDetails detail : detailsList) {

+ 6 - 0
sp-server/src/main/java/com/pj/project/tb_item/TbItem.java

@@ -3,6 +3,7 @@ package com.pj.project.tb_item;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.pj.project.tb_item_fac.TbItemFac;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -82,6 +83,11 @@ public class TbItem extends Model<TbItem> implements Serializable {
     private String payTypeName;
     private String itemType;
     private Double taxRate;
+
+
+
+
+
     @TableField(exist = false)
     private String remark;
 

+ 6 - 0
sp-server/src/main/java/com/pj/project/tb_item/TbItemService.java

@@ -1,5 +1,6 @@
 package com.pj.project.tb_item;
 
+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;
@@ -49,4 +50,9 @@ public class TbItemService extends ServiceImpl<TbItemMapper, TbItem> implements
     }
 
 
+    public TbItem findByCode(String code) {
+        QueryWrapper<TbItem>ew=new QueryWrapper<>();
+        ew.lambda().eq(TbItem::getItemCode,code);
+        return getOne(ew);
+    }
 }

+ 79 - 0
sp-server/src/main/java/com/pj/project/tb_item_fac/TbItemFac.java

@@ -0,0 +1,79 @@
+package com.pj.project.tb_item_fac;
+
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.EqualsAndHashCode;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * Model: tb_item_fac -- 费项因子
+ * @author qzy 
+ */
+@Data
+@Accessors(chain = true)
+@TableName(TbItemFac.TABLE_NAME)
+@EqualsAndHashCode(callSuper = false)
+public class TbItemFac extends Model<TbItemFac> implements Serializable {
+
+	// ---------- 模块常量 ----------
+	/**
+	 * 序列化版本id 
+	 */
+	private static final long serialVersionUID = 1L;	
+	/**
+	 * 此模块对应的表名 
+	 */
+	public static final String TABLE_NAME = "tb_item_fac";	
+	/**
+	 * 此模块对应的权限码 
+	 */
+	public static final String PERMISSION_CODE = "tb-item-fac";	
+
+
+	// ---------- 表中字段 ----------
+	/**
+	 *  
+	 */
+	private String id;
+
+	/**
+	 *  
+	 */
+	private String name;	
+
+	/**
+	 *  
+	 */
+	private String itemId;	
+
+	/**
+	 *  
+	 */
+	private String textType;	
+
+	/**
+	 *  
+	 */
+	private String operator;	
+
+	/**
+	 *  
+	 */
+	private String rangeVal;	
+
+	/**
+	 *  
+	 */
+	private String unit;	
+
+
+
+
+
+	
+
+
+}

+ 21 - 0
sp-server/src/main/java/com/pj/project/tb_item_fac/TbItemFacMapper.java

@@ -0,0 +1,21 @@
+package com.pj.project.tb_item_fac;
+
+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_fac -- 费项因子
+ * @author qzy 
+ */
+
+@Mapper
+@Repository
+public interface TbItemFacMapper extends BaseMapper <TbItemFac> {
+
+
+}

+ 6 - 0
sp-server/src/main/java/com/pj/project/tb_item_fac/TbItemFacMapper.xml

@@ -0,0 +1,6 @@
+<?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_fac.TbItemFacMapper">
+
+
+</mapper>

+ 26 - 0
sp-server/src/main/java/com/pj/project/tb_item_fac/TbItemFacService.java

@@ -0,0 +1,26 @@
+package com.pj.project.tb_item_fac;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pj.project.tb_item_type.TbItemType;
+import com.pj.project.tb_item_type.TbItemTypeMapper;
+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_fac -- 费项因子
+ * @author qzy 
+ */
+@Service
+public class TbItemFacService extends ServiceImpl<TbItemFacMapper, TbItemFac> implements IService<TbItemFac> {
+
+	/** 底层 Mapper 对象 */
+	@Autowired
+	TbItemFacMapper tbItemFacMapper;
+
+}

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

@@ -11,6 +11,7 @@ import lombok.experimental.Accessors;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -72,6 +73,11 @@ public class TbItemType extends Model<TbItemType> implements Serializable {
      * 可以支付步骤1:生成即可,2:确认后
      */
     private Integer payStep = 2;
+    private int status=1;
+    private Date startTime;
+    private Date endTime;
+
+    private Date syncTime;
 
     @TableField(exist = false)
     private List<TbItem> items = new ArrayList<>();

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

@@ -102,6 +102,7 @@ public class TbItemTypeController {
     }
 
 
+
     /**
      * 查集合 - 根据条件(参数为空时代表忽略指定条件)
      */

+ 52 - 3
sp-server/src/main/java/com/pj/project/tb_item_type/TbItemTypeService.java

@@ -3,14 +3,20 @@ package com.pj.project.tb_item_type;
 import cn.hutool.cache.CacheUtil;
 import cn.hutool.cache.impl.TimedCache;
 import cn.hutool.core.util.StrUtil;
+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.constants.UserTypeEnum;
+import com.pj.constants.business.SyncTypeEnum;
 import com.pj.current.satoken.StpUserUtil;
 import com.pj.project.relation_goods_type.RelationGoodsType;
 import com.pj.project.relation_goods_type.RelationGoodsTypeService;
 import com.pj.project.relation_type_item.RelationTypeItem;
 import com.pj.project.relation_type_item.RelationTypeItemService;
+import com.pj.project.sync.HelpService;
+import com.pj.project.sync.SyncService;
+import com.pj.project.sync.bo.ItemTypeBO;
+import com.pj.project.sync.dto.ItemTypeDTO;
 import com.pj.project.tb_costomer.TbCostomer;
 import com.pj.project.tb_costomer.TbCostomerService;
 import com.pj.project.tb_item.TbItem;
@@ -23,6 +29,7 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -50,6 +57,8 @@ public class TbItemTypeService extends ServiceImpl<TbItemTypeMapper, TbItemType>
     @Resource
     private RelationGoodsTypeService relationGoodsTypeService;
 
+    @Resource
+    private HelpService helpService;
 
     /**
      * 删
@@ -123,7 +132,7 @@ public class TbItemTypeService extends ServiceImpl<TbItemTypeMapper, TbItemType>
             List<String> itemIds = list.stream().map(RelationTypeItem::getItemId).collect(Collectors.toList());
 
             TbItemType tbItemType = this.getById(typeId);
-            if (tbItemType==null) {
+            if (tbItemType == null) {
                 continue;
             }
             tbItemType.setNeed(relationGoodsType.getNeedSelect());
@@ -135,8 +144,8 @@ public class TbItemTypeService extends ServiceImpl<TbItemTypeMapper, TbItemType>
                 list.stream()
                         .filter(relationTypeItem -> relationTypeItem.getItemId().equals(item.getId()) && relationTypeItem.getTypeId().equals(typeId))
                         .findFirst().ifPresent(relationTypeItem -> {
-                            item.setInc(relationTypeItem.getInc()).setNeedRemark(relationTypeItem.getNeedRemark()).setTypeId(relationGoodsType.getTypeId());
-                        });
+                    item.setInc(relationTypeItem.getInc()).setNeedRemark(relationTypeItem.getNeedRemark()).setTypeId(relationGoodsType.getTypeId());
+                });
             }
             tbItemType.setItems(items);
             itemTypeList.add(tbItemType);
@@ -144,4 +153,44 @@ public class TbItemTypeService extends ServiceImpl<TbItemTypeMapper, TbItemType>
         timedCache.put(goodsId, itemTypeList);
         return itemTypeList;
     }
+
+
+    public TbItemType findByCode(String code) {
+        QueryWrapper<TbItemType> ew = new QueryWrapper<>();
+        ew.lambda().eq(TbItemType::getCode, code);
+        return getOne(ew);
+    }
+
+    /**
+     * 接收计费系统同步
+     *
+     * @param request
+     */
+    public void receive(String request) {
+        ItemTypeBO itemTypeBO = helpService.deCrypte(request, ItemTypeBO.class);
+        String type = itemTypeBO.getSyncType();
+        String code = itemTypeBO.getKeyId();
+        TbItemType db = findByCode(code);
+        Date now = new Date();
+        if (StrUtil.equals(type, SyncTypeEnum.DELETE.getCode())) {
+            this.removeByCode(code);
+            if (db!=null){
+                relationTypeItemService.removeByTypeId(db.getId());
+            }
+        } else {
+            if (db == null) {
+                db = new TbItemType();
+            }
+            db.setSyncTime(now).setName(itemTypeBO.getKeyName()).setStatus(Integer.parseInt(itemTypeBO.getState()))
+                    .setStartTime(itemTypeBO.getStartTime()).setEndTime(itemTypeBO.getEndTime());
+            this.saveOrUpdate(db);
+        }
+
+    }
+
+    private void removeByCode(String code) {
+        QueryWrapper<TbItemType> ew = new QueryWrapper<>();
+        ew.lambda().eq(TbItemType::getCode, code);
+        this.remove(ew);
+    }
 }

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

@@ -105,10 +105,10 @@ pushfee-config:
     start-time: 2022-08-10 00:00:00
     #默认时间间隔为一小时
     time-span: 3600000
-    client-public-key-base6: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCimSu5J8apt2YR/o9joOCNdFzO3rOHcdcqnSCm1Wt19VwskTVjkKHc/CXHUoskX5vMiMiv6xPnf/lDpMO6KnCrwlVQFtbPvmnkwyUs/haW8ggR865MqDcBpdMGnuV0YJ04UXxSrOX+eu+dl91Web4/ZiRKbObOa8WhFm/Ln2QKswIDAQAB
-    client-private-key-base6: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKKZK7knxqm3ZhH+j2Og4I10XM7es4dx1yqdIKbVa3X1XCyRNWOQodz8JcdSiyRfm8yIyK/rE+d/+UOkw7oqcKvCVVAW1s++aeTDJSz+FpbyCBHzrkyoNwGl0wae5XRgnThRfFKs5f56752X3VZ5vj9mJEps5s5rxaEWb8ufZAqzAgMBAAECgYAmP/QaLXI9kIgxaXnfzQOmIx6GB7uh/DTKsIXy2TfbWunhDhPKJUb+jk5w0kkrOFaVSgQz5hAboG5J7GOi0sMINLb7H2WsOm3uGM/8HPZYsrNFnB8VUiD26LIZ6+HhPXfp/LN+k5eUnUlD6z/dZU1k6hJPOSFC3PyzfBWqaQMqGQJBAMVdQ9Uw+eC94qD1MSSEQZhqpfGE4vO7WrSACLFqyZrHvaIwZTjdUZRF1aMlJyT0afOkfSN/53QQEcejXMUrSBcCQQDS576SXkpdfrN2jmr9BAimi+6AP71GUgXL3O+2yRL2szLoU7GwtMREPBFw+ocnC4UN87NCYveJCzenQEt48JfFAkAqEIa0mYuoatAyng+rSMTyR0i3ASud5wCeF+vCZJAzfP7d4pKwW/tXLsspynFdXvp2A0jomAosooAnnJnZLDBhAkBzXoXm92Fip45wShPIeE5rHJzI1xUoxHGbRS50JKYVAY3VfQL0kM3ULa+0x7bq6uhL64WhyRVziAlXmlouvB2pAkEAuDvsjVhdo3uMGL7Tr+igPhajoWUTjPuAf+Od3SsqMTPFLBpbJM8ziXk39Me9S8wqgGwR3pnlC1Z6Rybgm+uy4g==
-    server-public-key-base6: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCb5yK85EKqwiQU+z1jyjOng6ecssQpEjC6STbCuSWN6KHLkijBxdqrCumXhbIyOVx4lHK9Rg5EjzlQxoaXQTgJdItaGjLC+UTE+NNAnnaFLg0x4jajNpLo473zdZxTYQaT3q/aKnTeXuKHw11PPUe4hmmfxPcdt9yJ0Iqo/XxV3QIDAQAB
-    server-private-key-base64: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJvnIrzkQqrCJBT7PWPKM6eDp5yyxCkSMLpJNsK5JY3oocuSKMHF2qsK6ZeFsjI5XHiUcr1GDkSPOVDGhpdBOAl0i1oaMsL5RMT400CedoUuDTHiNqM2kujjvfN1nFNhBpPer9oqdN5e4ofDXU89R7iGaZ/E9x233InQiqj9fFXdAgMBAAECgYASoeKgcaVYFCDM0yQIn5thy1XGYAUapX5mXSaqygbneWSQ2FR/qB5Ur9awEb30y682CAPYhB1jazyd30QpopVINvyhaWhgq1b/8KD92FqOg1eXxa7bTuTe8aMuKTB/ZJjEry0d5Mu3i6zYKtTSbnpnag5I3UE5awLDy7utYOoOHwJBAPtvz2ZBhtJvL3lsMgs7kGqrPqqI2LAX8J3oOCtE/6eQjQ0I5fBCybrwHp3baDrYul5KTL3kJvl4iWN/gHDi/nMCQQCeu3gzy0DVtM8M8bzFc/ZA753WRn4Z5axQa6lE7Tski8TUw4Bhbfan9E/C6l6Guo/+2hXPAE/RMcncClqeXXZvAkEAgf6FsO1x4fxABDvvB6Ws/ak5hfuoZCqMaWd1GtHah2yRsEqIbxZoq7CXc6/LDJmeiT9Ku+ZoTBSIm5uA8Vw6hwJALEbs872pmzMxYlH4Lzf2pAxzAbduK3kmhNRTRjfKfJpEUHksUYEkAZujuCI6NejKi/N3i+NxYFA8F5YHyw8VHwJAWoiYSYLSziHgDytoPKFvUp6EKLGDClhACJKc4LuaPNWICMxb5Dp88sY0NDYb4HzCyWIE5G4vbiF/K3kEEwCIVA==
+    client-public-key-base6: "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCimSu5J8apt2YR/o9joOCNdFzO3rOHcdcqnSCm1Wt19VwskTVjkKHc/CXHUoskX5vMiMiv6xPnf/lDpMO6KnCrwlVQFtbPvmnkwyUs/haW8ggR865MqDcBpdMGnuV0YJ04UXxSrOX+eu+dl91Web4/ZiRKbObOa8WhFm/Ln2QKswIDAQAB"
+    client-private-key-base6: "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKKZK7knxqm3ZhH+j2Og4I10XM7es4dx1yqdIKbVa3X1XCyRNWOQodz8JcdSiyRfm8yIyK/rE+d/+UOkw7oqcKvCVVAW1s++aeTDJSz+FpbyCBHzrkyoNwGl0wae5XRgnThRfFKs5f56752X3VZ5vj9mJEps5s5rxaEWb8ufZAqzAgMBAAECgYAmP/QaLXI9kIgxaXnfzQOmIx6GB7uh/DTKsIXy2TfbWunhDhPKJUb+jk5w0kkrOFaVSgQz5hAboG5J7GOi0sMINLb7H2WsOm3uGM/8HPZYsrNFnB8VUiD26LIZ6+HhPXfp/LN+k5eUnUlD6z/dZU1k6hJPOSFC3PyzfBWqaQMqGQJBAMVdQ9Uw+eC94qD1MSSEQZhqpfGE4vO7WrSACLFqyZrHvaIwZTjdUZRF1aMlJyT0afOkfSN/53QQEcejXMUrSBcCQQDS576SXkpdfrN2jmr9BAimi+6AP71GUgXL3O+2yRL2szLoU7GwtMREPBFw+ocnC4UN87NCYveJCzenQEt48JfFAkAqEIa0mYuoatAyng+rSMTyR0i3ASud5wCeF+vCZJAzfP7d4pKwW/tXLsspynFdXvp2A0jomAosooAnnJnZLDBhAkBzXoXm92Fip45wShPIeE5rHJzI1xUoxHGbRS50JKYVAY3VfQL0kM3ULa+0x7bq6uhL64WhyRVziAlXmlouvB2pAkEAuDvsjVhdo3uMGL7Tr+igPhajoWUTjPuAf+Od3SsqMTPFLBpbJM8ziXk39Me9S8wqgGwR3pnlC1Z6Rybgm+uy4g=="
+    server-public-key-base6: "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCb5yK85EKqwiQU+z1jyjOng6ecssQpEjC6STbCuSWN6KHLkijBxdqrCumXhbIyOVx4lHK9Rg5EjzlQxoaXQTgJdItaGjLC+UTE+NNAnnaFLg0x4jajNpLo473zdZxTYQaT3q/aKnTeXuKHw11PPUe4hmmfxPcdt9yJ0Iqo/XxV3QIDAQAB"
+    server-private-key-base64: "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJvnIrzkQqrCJBT7PWPKM6eDp5yyxCkSMLpJNsK5JY3oocuSKMHF2qsK6ZeFsjI5XHiUcr1GDkSPOVDGhpdBOAl0i1oaMsL5RMT400CedoUuDTHiNqM2kujjvfN1nFNhBpPer9oqdN5e4ofDXU89R7iGaZ/E9x233InQiqj9fFXdAgMBAAECgYASoeKgcaVYFCDM0yQIn5thy1XGYAUapX5mXSaqygbneWSQ2FR/qB5Ur9awEb30y682CAPYhB1jazyd30QpopVINvyhaWhgq1b/8KD92FqOg1eXxa7bTuTe8aMuKTB/ZJjEry0d5Mu3i6zYKtTSbnpnag5I3UE5awLDy7utYOoOHwJBAPtvz2ZBhtJvL3lsMgs7kGqrPqqI2LAX8J3oOCtE/6eQjQ0I5fBCybrwHp3baDrYul5KTL3kJvl4iWN/gHDi/nMCQQCeu3gzy0DVtM8M8bzFc/ZA753WRn4Z5axQa6lE7Tski8TUw4Bhbfan9E/C6l6Guo/+2hXPAE/RMcncClqeXXZvAkEAgf6FsO1x4fxABDvvB6Ws/ak5hfuoZCqMaWd1GtHah2yRsEqIbxZoq7CXc6/LDJmeiT9Ku+ZoTBSIm5uA8Vw6hwJALEbs872pmzMxYlH4Lzf2pAxzAbduK3kmhNRTRjfKfJpEUHksUYEkAZujuCI6NejKi/N3i+NxYFA8F5YHyw8VHwJAWoiYSYLSziHgDytoPKFvUp6EKLGDClhACJKc4LuaPNWICMxb5Dp88sY0NDYb4HzCyWIE5G4vbiF/K3kEEwCIVA=="
 oa:
     enable: true
     url: http://117.141.148.233:18766/bpm/operational/addReview/