Browse Source

统计类型维护

qzyReal 2 years ago
parent
commit
a781bb4fcf
59 changed files with 1730 additions and 949 deletions
  1. 2 2
      app-ui/manifest.json
  2. 527 598
      app-ui/pages/onely-disinfect/type-business-edit.vue
  3. 4 75
      app-ui/pages/onely-disinfect/type-business.vue
  4. 2 2
      app-ui/utils/request.js
  5. 0 4
      sp-admin/sa-view/tb-business/tb-car-disincle-add.html
  6. 1 5
      sp-admin/sa-view/tb-business/tb-car-disincle-edit.html
  7. 1 2
      sp-admin/sa-view/tb-item-type/tb-item-type-list.html
  8. 17 0
      sp-server/src/main/java/com/pj/api/open/bo/ItemPriceBO.java
  9. 9 5
      sp-server/src/main/java/com/pj/api/pushfee/task/FeeDetailSyncTask.java
  10. 23 23
      sp-server/src/main/java/com/pj/constants/business/FeeTypeEnum.java
  11. 5 0
      sp-server/src/main/java/com/pj/project/relation_type_item/RelationTypeItemService.java
  12. 8 4
      sp-server/src/main/java/com/pj/project/sync/HelpService.java
  13. 48 14
      sp-server/src/main/java/com/pj/project/sync/SyncService.java
  14. 14 2
      sp-server/src/main/java/com/pj/project/sync/api/AsyncApi.java
  15. 1 0
      sp-server/src/main/java/com/pj/project/sync/bo/IExpenseListQueryRes.java
  16. 3 1
      sp-server/src/main/java/com/pj/project/sync/bo/ItemTypeBO.java
  17. 2 3
      sp-server/src/main/java/com/pj/project/sync/bo/PriceFactorDTO.java
  18. 39 0
      sp-server/src/main/java/com/pj/project/sync/dto/IExpensePriceReq.java
  19. 18 0
      sp-server/src/main/java/com/pj/project/sync/dto/item/IFactorItem.java
  20. 17 0
      sp-server/src/main/java/com/pj/project/sync/dto/item/IOrderFactorDiffItem.java
  21. 29 0
      sp-server/src/main/java/com/pj/project/sync/dto/item/IOrderItem.java
  22. 19 0
      sp-server/src/main/java/com/pj/project/sync/request/IExpenseFactorQueryReq.java
  23. 31 0
      sp-server/src/main/java/com/pj/project/sync/request/IExpenseListQueryReq.java
  24. 37 0
      sp-server/src/main/java/com/pj/project/sync/request/IExpensePriceReq.java
  25. 19 0
      sp-server/src/main/java/com/pj/project/sync/request/IExpenseQueryReq.java
  26. 41 0
      sp-server/src/main/java/com/pj/project/sync/request/IOrderPriceReq.java
  27. 18 0
      sp-server/src/main/java/com/pj/project/sync/request/item/IFactorItem.java
  28. 17 0
      sp-server/src/main/java/com/pj/project/sync/request/item/IOrderFactorDiffItem.java
  29. 31 0
      sp-server/src/main/java/com/pj/project/sync/request/item/IOrderItem.java
  30. 22 0
      sp-server/src/main/java/com/pj/project/sync/response/IExpenseFactorQueryRes.java
  31. 18 0
      sp-server/src/main/java/com/pj/project/sync/response/IExpenseListQueryRes.java
  32. 19 0
      sp-server/src/main/java/com/pj/project/sync/response/IExpensePriceRes.java
  33. 13 0
      sp-server/src/main/java/com/pj/project/sync/response/IExpenseQueryRes.java
  34. 34 0
      sp-server/src/main/java/com/pj/project/sync/response/IOrderPriceRes.java
  35. 10 5
      sp-server/src/main/java/com/pj/project/sync/response/item/IExpenseItem.java
  36. 24 0
      sp-server/src/main/java/com/pj/project/sync/response/item/IFireResultItem.java
  37. 42 0
      sp-server/src/main/java/com/pj/project/sync/response/item/IPriceFactorItem.java
  38. 26 0
      sp-server/src/main/java/com/pj/project/sync/response/item/IrulesItem.java
  39. 22 0
      sp-server/src/main/java/com/pj/project/sync/response/item/OrderPriceResultItem.java
  40. 5 40
      sp-server/src/main/java/com/pj/project/sync/task/SyncTask.java
  41. 137 32
      sp-server/src/main/java/com/pj/project/tb_business/TbBusinessService.java
  42. 0 14
      sp-server/src/main/java/com/pj/project/tb_business_car/TbBusinessCarService.java
  43. 4 0
      sp-server/src/main/java/com/pj/project/tb_business_item/TbBusinessItem.java
  44. 6 1
      sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomer.java
  45. 19 90
      sp-server/src/main/java/com/pj/project/tb_fee_details/TbFeeDetailsService.java
  46. 1 7
      sp-server/src/main/java/com/pj/project/tb_fee_details/statics/FeeTypeStatics.java
  47. 67 0
      sp-server/src/main/java/com/pj/project/tb_fee_item/TbFeeItem.java
  48. 21 0
      sp-server/src/main/java/com/pj/project/tb_fee_item/TbFeeItemMapper.java
  49. 8 0
      sp-server/src/main/java/com/pj/project/tb_fee_item/TbFeeItemMapper.xml
  50. 22 0
      sp-server/src/main/java/com/pj/project/tb_fee_item/TbFeeItemService.java
  51. 5 1
      sp-server/src/main/java/com/pj/project/tb_fee_statistics/TbFeeStatisticsController.java
  52. 11 7
      sp-server/src/main/java/com/pj/project/tb_fee_statistics/TbFeeStatisticsService.java
  53. 2 3
      sp-server/src/main/java/com/pj/project/tb_item/TbItem.java
  54. 157 2
      sp-server/src/main/java/com/pj/project/tb_item/TbItemService.java
  55. 1 0
      sp-server/src/main/java/com/pj/project/tb_item_fac/TbItemFac.java
  56. 19 4
      sp-server/src/main/java/com/pj/project/tb_item_fac/TbItemFacService.java
  57. 1 1
      sp-server/src/main/java/com/pj/project/tb_item_type/TbItemType.java
  58. 30 2
      sp-server/src/main/java/com/pj/project/tb_item_type/TbItemTypeService.java
  59. 1 0
      sp-server/src/main/resources/application-dev.yml

+ 2 - 2
app-ui/manifest.json

@@ -83,11 +83,11 @@
     "vueVersion" : "2",
     "h5" : {
         "router" : {
-            "base" : "/h5",
+            "base" : "/h5/",
             "mode" : "history"
         },
         "devServer" : {
-            "https" : true
+            "https" : false
         }
     }
 }

+ 527 - 598
app-ui/pages/onely-disinfect/type-business-edit.vue

@@ -1,619 +1,548 @@
 <template>
-  <view>
-    <view class="box">
-      <view class="top">
-        <text class="title">{{ goods.name }}</text>
-      </view>
-      <view class="item" v-if="goods.needDeclare==1">
-        <view class="l">
-          <text style="color: red;" v-if="goods.needDeclare==1">*</text>
-          申报单号:
-        </view>
-        <view class="r">
-          <u-input placeholder="申报订单号" v-model="form.declareNo" clearable readonly>
-            <text slot="suffix" style="font-size: 50rpx;" @click="selectDeclare">+</text>
-          </u-input>
-        </view>
-      </view>
-      <view class="item" v-if="goods.needCustomer==1">
-        <view class="l">客户:</view>
-        <view class="r" style="flex: 12;">
-          <picker :disabled="goods.needDeclare==1" v-if="customer.customerList.length>0" class="p-picker"
-                  @change="customerChange($event)" :value="customer.index" :range="customer.customerList"
-                  range-key="name">
-            <text class="p-text">{{ customer.customerList[customer.index].name }}</text>
-          </picker>
-        </view>
-      </view>
-     <view class="item" v-if="goods.needOwner==1">
-     	<view class="l">
-     		<text style="color: red;">*</text>
-     		货物:
-     	</view>
-     	<view class="r">
-     		<u-input placeholder="输入货物" v-model="form.businessGoodsName">
-     		</u-input>
-     	</view>
-     </view>
-     <view class="item">
-     	<view class="l">
-     		<text style="color: red;" v-if="goods.needOperateTime">*</text>
-     		件数:
-     	</view>
-     	<view class="r">
-     		<u-input v-model="form.businessGoodsNum" type="number">
-     		</u-input>
-     	</view>
-     </view>
-      <view class="item">
-        <view class="l">作业人员:</view>
-        <view class="r">
-          <u-input placeholder="输入作业人员" v-model="form.operator">
-          </u-input>
-        </view>
-      </view>
-      <view class="item-line">
-        <u-row style="height: 40px;">
-          <u-col span=4>车辆</u-col>
-          <u-col span=8>
-            <u-button type="primary" text="添加" @click="addCar" icon="plus"
-                      style="width: 60px;height: 26px;" v-if="goods.mulCar==1||car.list.length==0"/>
-          </u-col>
-        </u-row>
-      </view>
-      <view class="item" v-for="(car,index) in car.list" :key="index">
-        <view class="l">车牌:</view>
-        <view class="r">
-          <u-input placeholder="车辆" v-model="car.carNo" readonly>
-            <view slot="suffix" style="display: flex;">
-              <u-icon @click="editCar(car)" size="20" name="edit-pen-fill" color="blue"></u-icon>
-              <u-icon style="margin-left:20rpx;" size="20" @click="delCar(car)" name="close-circle-fill"
-                      color="red"></u-icon>
-            </view>
-          </u-input>
-        </view>
-      </view>
-      <view class="item-line" style="margin-top: 30rpx;">
-        业务项
-      </view>
-      <view class="business-list" v-for="(item,index) in typeList">
-        <u-row>
-          <u-col span="4">
-            <text>
-              <text style="color: red;display: inline;" v-if="item.need==1">*</text>
-              {{ item.name }}:
-            </text>
-          </u-col>
-          <u-col span="8" style="display: flex;">
-            <u-row>
-              <u-col span="10" @click="showSelect(item)">
-                {{ item.itemName ? item.itemName : '请选择' }}
-              </u-col>
-              <u-col span="2" @click="item.itemName='',item.itemId=''" v-if="item.itemId">
-                <u-icon style="margin-left:15rpx;display: inline;" size="20" name="close-circle-fill"
-                        color="red"></u-icon>
-              </u-col>
-            </u-row>
-          </u-col>
-        </u-row>
-        <view style="display: flex;position: relative;left: 30%;">
-          <u-number-box style="margin-left: 15rpx;" v-if="item.itemName" :disabled="item.inc==0"
-                        v-model="item.num"></u-number-box>
-          <text style="margin-left: 20rpx;color: red;" v-if="item.itemName">
-            ¥{{ item.num * item.price }}
-          </text>
-          <view style="margin-left: 60rpx;" @click="remarkFn(item)">
-            备注
-          </view>
-        </view>
-        <u-line></u-line>
-      </view>
-      <view class="hj" v-show="totalPrice>0">
-        合计:{{ totalPrice }}元
-      </view>
-    </view>
-    <u-button type="primary" text="确定" @click="saveFn" v-show="perList.indexOf('tb-flex-business-edit')!==-1">
-    </u-button>
-    <!-- ---------------------------------------------------------- -->
-    <view class="bottom-safety"></view>
-    <u-picker :show="show" :columns="columns" @confirm="confirmFn" keyName="itemName" @cancel="show=false">
-    </u-picker>
-  </view>
+	<view>
+		<view class="box">
+			<view class="top">
+				<text class="title">{{ goods.name }}</text>
+			</view>
+			<view class="item" v-if="goods.needCustomer==1">
+				<view class="l">客户:</view>
+				<view class="r" style="flex: 12;">
+					<picker v-if="customer.customerList.length>0" class="p-picker" @change="customerChange($event)"
+						:value="customer.index" :range="customer.customerList" range-key="name">
+						<text class="p-text">{{ customer.customerList[customer.index].name }}</text>
+					</picker>
+				</view>
+			</view>
+			<view class="item" v-if="goods.needOwner==1">
+				<view class="l">
+					<text style="color: red;">*</text>
+					货物:
+				</view>
+				<view class="r">
+					<u-input placeholder="输入货物" v-model="form.businessGoodsName">
+					</u-input>
+				</view>
+			</view>
+			<view class="item">
+				<view class="l">
+					<text style="color: red;" v-if="goods.needOperateTime">*</text>
+					数量(件):
+				</view>
+				<view class="r">
+					<u-input v-model="form.businessGoodsNum" type="number">
+					</u-input>
+				</view>
+			</view>
+			<view class="item">
+				<view class="l">作业人员:</view>
+				<view class="r">
+					<u-input placeholder="输入作业人员" v-model="form.operator">
+					</u-input>
+				</view>
+			</view>
+			<view class="item-line">
+				<u-row style="height: 40px;">
+					<u-col span=4>车辆</u-col>
+					<u-col span=8>
+						<u-button type="primary" text="添加" @click="addCar" icon="plus" style="width: 60px;height: 26px;"
+							v-if="goods.mulCar==1||car.list.length==0" />
+					</u-col>
+				</u-row>
+			</view>
+			<view class="item" v-for="(car,index) in car.list" :key="index">
+				<view class="l">车牌:</view>
+				<view class="r">
+					<u-input placeholder="车辆" v-model="car.carNo" readonly>
+						<view slot="suffix" style="display: flex;">
+							<u-icon @click="editCar(car)" size="20" name="edit-pen-fill" color="blue"></u-icon>
+							<u-icon style="margin-left:20rpx;" size="20" @click="delCar(car)" name="close-circle-fill"
+								color="red"></u-icon>
+						</view>
+					</u-input>
+				</view>
+			</view>
+			<view class="item-line" style="margin-top: 30rpx;">
+				业务项
+			</view>
+			<view class="business-list" v-for="(item,index) in typeList">
+				<u-row>
+					<u-col span="4">
+						<text>
+							<text style="color: red;display: inline;" v-if="item.need==1">*</text>
+							{{ item.name }}:
+						</text>
+					</u-col>
+					<u-col span="8" style="display: flex;">
+						<u-row>
+							<u-col span="10" @click="showSelect(item)">
+								{{ item.itemName ? item.itemName : '请选择' }}
+							</u-col>
+							<u-col span="2" @click="item.itemName='',item.itemId=''" v-if="item.itemId">
+								<u-icon style="margin-left:15rpx;display: inline;" size="20" name="close-circle-fill"
+									color="red"></u-icon>
+							</u-col>
+						</u-row>
+					</u-col>
+				</u-row>
+				<view style="display: flex;position: relative;left: 30%;">
+					<u-number-box style="margin-left: 15rpx;" v-if="item.itemName" :disabled="item.inc==0"
+						v-model="item.num"></u-number-box>
+					<text style="margin-left: 20rpx;color: red;" v-if="item.itemName">
+						¥{{ item.num * item.price }}
+					</text>
+					<view style="margin-left: 60rpx;" @click="remarkFn(item)">
+						备注
+					</view>
+				</view>
+				<u-line></u-line>
+			</view>
+			<view class="hj" v-show="totalPrice>0">
+				合计:{{ totalPrice }}元
+			</view>
+		</view>
+		<u-button type="primary" text="确定" @click="saveFn" v-show="perList.indexOf('tb-flex-business-edit')!==-1">
+		</u-button>
+		<!-- ---------------------------------------------------------- -->
+		<view class="bottom-safety"></view>
+		<u-picker :show="show" :columns="columns" @confirm="confirmFn" keyName="itemName" @cancel="show=false">
+		</u-picker>
+	</view>
 </template>
 
 <script>
-export default {
-  data() {
-    return {
-      show: false,
-      columns: [],
-      customerId: '1',
-      customer: {
-        index: 0,
-        customerList: [],
-      },
-      goods: {
-        id: '',
-        name: '',
-        mulCar: 0
-      },
-      typeList: [],
-      allTypeList: [],
-      form: {
-        customerId: '',
-        declareNo: '',
-        carNo: '',
-        owner: '',
-        carSize: '',
-        goodsName: '',
-        netWeight: '',
-      },
-      show: false,
-      item: {
-        items: []
-      },
-      car: {
-        list: [{
-          id: '',
-          carNo: '',
-          index: 0
-        }]
-      },
-      perList: []
-    }
-  },
-  computed: {
-    totalPrice() {
-      let typeList = this.typeList.filter(obj => obj.itemName);
-      let price = 0;
-      for (let i in typeList) {
-        let type = typeList[i];
-        price = price + type.price * type.num;
-      }
-      return price;
-    },
-  },
-  onLoad(options) {
-    let id = options.id;
-    this.form.id = id;
-    this.customerId = uni.getStorageSync('customerId');
-    this.goods = JSON.parse(options.goodsJson);
-    this.getOtherBusinessById();
-    let that = this;
-    uni.$on('getSelectDeclare', declare => {
-      that.$nextTick(() => {
-        that.handlerSelectDeclare(declare)
-      })
-    })
-    uni.$on('getCar', car => {
-      that.$nextTick(() => {
-        that.handlerCar(car)
-      })
-    })
-    uni.$on('getRemark', type => {
-      that.$nextTick(() => {
-        that.handlerRemark(type)
-      })
-    })
+	export default {
+		data() {
+			return {
+				show: false,
+				columns: [],
+				customerId: '1',
+				customer: {
+					index: 0,
+					customerList: [],
+				},
+				goods: {
+					id: '',
+					name: '',
+					mulCar: 0
+				},
+				typeList: [],
+				allTypeList: [],
+				form: {
+					customerId: '',
+					declareNo: '',
+					carNo: '',
+					owner: '',
+					carSize: '',
+					goodsName: '',
+					netWeight: '',
+				},
+				show: false,
+				item: {
+					items: []
+				},
+				car: {
+					list: [{
+						id: '',
+						carNo: '',
+						index: 0
+					}]
+				},
+				perList: []
+			}
+		},
+		computed: {
+			totalPrice() {
+				let typeList = this.typeList.filter(obj => obj.itemName);
+				let price = 0;
+				for (let i in typeList) {
+					let type = typeList[i];
+					price = price + type.price * type.num;
+				}
+				return price;
+			},
+		},
+		onLoad(options) {
+			let id = options.id;
+			this.form.id = id;
+			this.customerId = uni.getStorageSync('customerId');
+			this.goods = JSON.parse(options.goodsJson);
+			this.getOtherBusinessById();
+			let that = this;
 
-  },
-  onShow() {
+			uni.$on('getCar', car => {
+				that.$nextTick(() => {
+					that.handlerCar(car)
+				})
+			})
+			uni.$on('getRemark', type => {
+				that.$nextTick(() => {
+					that.handlerRemark(type)
+				})
+			})
 
-    this.perList = uni.getStorageSync('perList')
-  },
-  methods: {
-    remarkFn(type) {
-      console.log(type)
-      let remark = type.remark ? type.remark : '';
-      this.$common.to('/pages/onely-disinfect/add-remark?needRemark=' + type.needRemark + '&typeId=' + type.id + '&remark=' + remark)
-    },
-    handlerRemark(type) {
-      let typeList = this.typeList;
-      typeList.filter(obj => type.typeId == obj.id).forEach(obj => obj.remark = type.remark)
-    },
-    addCar() {
-      this.car.list.push({
-        index: Math.random(),
-        id: '',
-        carNo: '',
-        index: 0
-      })
-    },
-    filterItems(car) {
-      let carList = this.car.list;
-      let filterTypeList = JSON.parse(JSON.stringify(this.allTypeList));
-      if (carList.length == 0) {
-        this.typeList = filterTypeList;
-        return;
-      }
-      if (!car) {
-        let checkList = carList.filter(obj => obj.carType.indexOf('空') === -1);
-        if (checkList.length > 0) {
-          car = checkList[0];
-        }
-      }
-      let carSize = car.carSize;
-      let carType = car.carType;
-      if (carType.indexOf('空') !== -1 && carList.length > 1) {
-        return;
-      }
-      let netWeight = car.netWeight;
-      let tempList = [];
-      for (let i in filterTypeList) {
-        let type = filterTypeList[i];
-        let items = type.items;
-        if (carType) {
-          items = items.filter(item => item.itemType && item.itemType.indexOf(carType) !== -1);
-        }
-        if (carSize && carSize > 1) {
-          items = items.filter(item => item.minLength <= carSize && item.carLength >= carSize);
-        }
-        if (netWeight && netWeight > 1 && carType.indexOf('空') == -1) {
-          items = items.filter(item => item.minWeight <= netWeight && item.maxWeight >= netWeight);
-        }
-        let itemIds = items.map(item => item.id);
-        if (itemIds.indexOf(type.itemId) == -1) {
-          this.cleanItem(type);
-        }
-        type.items = items;
-        tempList.push(type);
-      }
-      this.typeList = tempList;
-    },
-    cleanItem(type) {
-      type.itemId = '';
-      type.itemName = '';
-      type.price = '';
-    },
-    getOtherBusinessById() {
-      this.$api.getOtherBusinessById({
-        id: this.form.id
-      }).then(resp => {
-        let data = resp.data;
-        this.car.list = data.cars;
-        let items = data.items;
-        this.form = data;
-        this.getTypeByGoodsId(items);
-        this.getCustomerList(data.customerId);
-      })
-    },
-    showSelect(item) {
-      if (this.validBefore()) {
-        this.columns = [];
-        this.columns.push(item.items);
-        this.show = true;
-      }
-    },
+		},
+		onShow() {
 
-    confirmFn(e) {
-      let selects = e.value;
-      if (selects.length > 0) {
-        let item = selects[0];
-        let typeId = item.typeId;
-        let typeList = this.typeList;
-        typeList.filter(obj => obj.id == typeId).forEach(obj => {
-          obj.itemId = item.id;
-          obj.itemName = item.itemName;
-          obj.inc = item.inc;
-          obj.price = item.price;
-          obj.needRemark = item.needRemark;
-        })
-      }
-      this.show = false;
-    },
-    getTypeByGoodsId(items) {
-      this.$api.getTypeByGoodsId({
-        goodsId: this.goods.id
-      }).then(resp => {
-        let list = resp.data;
-        for (let i in items) {
-          let item = items[i];
-          for (let j in list) {
-            let type = list[j];
-            if (type.id == item.itemTypeId) {
-              type.items.filter(obj => obj.id == item.itemId)
-                  .forEach(obj => {
-                    console.log(obj)
-                    type.num = item.num;
-                    type.price = item.itemPrice;
-                    type.itemName = item.itemName;
-                    type.itemId = item.itemId;
-                    type.inc = obj.inc;
-                    type.remark = item.remark;
-                  })
+			this.perList = uni.getStorageSync('perList')
+		},
+		methods: {
+			remarkFn(type) {
+				console.log(type)
+				let remark = type.remark ? type.remark : '';
+				this.$common.to('/pages/onely-disinfect/add-remark?needRemark=' + type.needRemark + '&typeId=' + type.id +
+					'&remark=' + remark)
+			},
+			handlerRemark(type) {
+				let typeList = this.typeList;
+				typeList.filter(obj => type.typeId == obj.id).forEach(obj => obj.remark = type.remark)
+			},
+			addCar() {
+				this.car.list.push({
+					index: Math.random(),
+					id: '',
+					carNo: '',
+					index: 0
+				})
+			},
+			filterItems(car) {
+				let carList = this.car.list;
+				let filterTypeList = JSON.parse(JSON.stringify(this.allTypeList));
+				if (carList.length == 0) {
+					this.typeList = filterTypeList;
+					return;
+				}
+				if (!car) {
+					let checkList = carList.filter(obj => obj.carType.indexOf('空') === -1);
+					if (checkList.length > 0) {
+						car = checkList[0];
+					}
+				}
+				let carSize = car.carSize;
+				let carType = car.carType;
+				if (carType.indexOf('空') !== -1 && carList.length > 1) {
+					return;
+				}
+				let netWeight = car.netWeight;
+				let tempList = [];
+				for (let i in filterTypeList) {
+					let type = filterTypeList[i];
+					let items = type.items;
+					if (carType) {
+						items = items.filter(item => item.itemType && item.itemType.indexOf(carType) !== -1);
+					}
+					if (carSize && carSize > 1) {
+						items = items.filter(item => item.minLength <= carSize && item.carLength >= carSize);
+					}
+					if (netWeight && netWeight > 1 && carType.indexOf('空') == -1) {
+						items = items.filter(item => item.minWeight <= netWeight && item.maxWeight >= netWeight);
+					}
+					let itemIds = items.map(item => item.id);
+					if (itemIds.indexOf(type.itemId) == -1) {
+						this.cleanItem(type);
+					}
+					type.items = items;
+					tempList.push(type);
+				}
+				this.typeList = tempList;
+			},
+			cleanItem(type) {
+				type.itemId = '';
+				type.itemName = '';
+				type.price = '';
+			},
+			getOtherBusinessById() {
+				this.$api.getOtherBusinessById({
+					id: this.form.id
+				}).then(resp => {
+					let data = resp.data;
+					this.car.list = data.cars;
+					let items = data.items;
+					this.form = data;
+					this.getTypeByGoodsId(items);
+					this.getCustomerList(data.customerId);
+				})
+			},
+			showSelect(item) {
+				if (this.validBefore()) {
+					this.columns = [];
+					this.columns.push(item.items);
+					this.show = true;
+				}
+			},
 
+			confirmFn(e) {
+				let selects = e.value;
+				if (selects.length > 0) {
+					let item = selects[0];
+					let typeId = item.typeId;
+					let typeList = this.typeList;
+					typeList.filter(obj => obj.id == typeId).forEach(obj => {
+						obj.itemId = item.id;
+						obj.itemName = item.itemName;
+						obj.inc = item.inc;
+						obj.price = item.price;
+						obj.needRemark = item.needRemark;
+					})
+				}
+				this.show = false;
+			},
+			getTypeByGoodsId(items) {
+				this.$api.getTypeByGoodsId({
+					goodsId: this.goods.id
+				}).then(resp => {
+					let list = resp.data;
+					for (let i in items) {
+						let item = items[i];
+						for (let j in list) {
+							let type = list[j];
+							if (type.id == item.itemTypeId) {
+								type.items.filter(obj => obj.id == item.itemId)
+									.forEach(obj => {
+										console.log(obj)
+										type.num = item.num;
+										type.price = item.itemPrice;
+										type.itemName = item.itemName;
+										type.itemId = item.itemId;
+										type.inc = obj.inc;
+										type.remark = item.remark;
+									})
 
-            }
-          }
-        }
-        this.allTypeList = JSON.parse(JSON.stringify(list));
-        this.typeList = list;
-      })
-    },
-    getCustomerList(customerId) {
-      this.$api.getCustomerList({
-        pageNo: 1,
-        pageSize: 100
-      }).then(resp => {
-        let list = resp.data;
-        console.log(list.map(obj => obj.id).indexOf(customerId))
-        this.customer.index = list.map(obj => obj.id).indexOf(customerId);
-        this.customer.customerList = list;
-        console.log(this.customer)
-      })
-    },
-    customerChange(e) {
-      var value = e.detail.value; //当前picker选中的值
-      this.customer.index = value;
-    },
-    handlerCar(car) {
-      let list = this.car.list;
-      let check = list.filter(obj => obj.carNo == car.carNo).pop();
-      if (check) {
-        check.carSize = car.carSize;
-        check.netWeight = car.netWeight;
-        check.carType = car.carType;
-      } else {
-        this.car.list.push(car);
-      }
-      this.clearEmptyCar(car);
-    },
-    clearEmptyCar(car) {
-      let list = this.car.list;
-      let obj = list.filter(obj => !obj.carNo).pop();
-      if (obj) {
-        this.car.list.splice(list.indexOf(obj), 1);
-      }
-      this.filterItems(car);
-    },
-    handlerSelectDeclare(declare) {
-      let oldDeclareNo = this.form.declareNo;
-      if (oldDeclareNo && oldDeclareNo !== declare.declareNo) {
-        this.car.list = [];
-      }
-      this.form.declareNo = declare.declareNo;
-      this.form.cardNo = declare.carNo;
-      this.form.chinaCarNo = declare.chinaCarNo;
-      this.form.netWeight = declare.grossWeight;
-      this.form.owner = declare.sendUnit;
-      let customerList = this.customer.customerList;
-      this.customer.index = customerList.map(customer => customer.id).indexOf(declare.customerId);
-      let carNo = declare.carNo;
-      let grossWeight = declare.grossWeight;
-      let carList = this.car.list;
-      let exit = carList.filter(obj => obj.carNo == carNo).pop();
-      if (!exit) {
-        let car = {
-          carNo: carNo,
-          netWeight: grossWeight,
-          carType: '载重'
-        }
-        this.car.list.push(car)
-      }
-      this.form.cardNo = declare.carNo;
-      this.form.chinaCarNo = declare.chinaCarNo;
-      this.form.netWeight = declare.grossWeight;
-      let chinaCarNo = declare.chinaCarNo;
-      if (chinaCarNo) {
-        let list = [];
-        chinaCarNo.replace(",", ",").split(",").forEach(carNo => {
-          let exit = carList.filter(obj => obj.carNo == carNo).pop();
-          if (!exit) {
-            let car = {
-              carNo: carNo,
-              carType: '空车'
-            }
-            this.car.list.push(car)
-          }
-        })
-      }
-      this.clearEmptyCar();
-    },
 
-    selectDeclare() {
-      this.$common.to('/pages/business-entering/declare-select?declareNo=' + this.form.declareNo)
-    },
-    editCar(car) {
-      let goods = this.goods;
-      this.$common.to('/pages/onely-disinfect/car-manager?carJson=' + JSON.stringify(car) + "&needCarSize=" +
-          goods.needCarSize + '&needWeight=' + goods.needWeight)
-    },
-    delCar(car) {
-      let list = this.car.list;
-      if (list.length == 1) {
-        this.$common.toast('至少有一辆车');
-        return;
-      }
-      this.car.list.splice(list.indexOf(car), 1);
-      this.filterItems();
-    },
-    validBefore() {
-      let form = this.form;
-      let goods = this.goods;
-      let needDeclare = goods.needDeclare;
-      let needCustomer = goods.needCustomer;
-      let index = this.customer.index;
-      if (needDeclare == 1 && !form.declareNo) {
-        this.$common.toast('请选择申报单');
-        return false;
-      }
-     if (!form.businessGoodsName && goods.needOwner == 1) {
-     	this.$common.toast('请填写货物');
-     	return false;
-     }
-     let needOperateTime = goods.needOperateTime;
-     let businessGoodsNum = form.businessGoodsNum;
-     if ((!businessGoodsNum || businessGoodsNum <= 0) && needOperateTime == '1') {
-     	this.$common.toast('请填写件数');
-     	return false;
-     }
-      let carList = this.car.list;
-      if (carList.length == 0) {
-        this.$common.toast('请录入车辆');
-        return false;
-      }
-      let needCarSize = goods.needCarSize;
-      let needWeight = goods.needWeight;
-      for (let i in carList) {
-        let car = carList[i];
-        if (needCarSize == 1 && !car.carSize) {
-          this.$common.toast('请补充' + car.carNo + '的规格');
-          return false;
-        }
-        if (needWeight == 1 && car.carType.indexOf('重') !== -1 && !car.netWeight) {
-          this.$common.toast('请补充' + car.carNo + '载重');
-          return false;
-        }
-      }
-      return true;
-    },
-    check() {
-      let form = this.form;
-      let goods = this.goods;
-      let needDeclare = goods.needDeclare;
-      let needCustomer = goods.needCustomer;
-      let index = this.customer.index;
-      if (needDeclare == 1 && !form.declareNo) {
-        this.$common.toast('请选择申报单');
-        return false;
-      }
-     if (!form.businessGoodsName && goods.needOwner == 1) {
-     	this.$common.toast('请填写货物');
-     	return false;
-     }
-     let needOperateTime = goods.needOperateTime;
-     let businessGoodsNum = form.businessGoodsNum;
-     if ((!businessGoodsNum || businessGoodsNum <= 0) && needOperateTime == '1') {
-     	this.$common.toast('请填写件数');
-     	return false;
-     }
-      let carList = this.car.list;
-      if (carList.length == 0) {
-        this.$common.toast('请录入车辆');
-        return false;
-      }
-      let needCarSize = goods.needCarSize;
-      let needWeight = goods.needWeight;
-      for (let i in carList) {
-        let car = carList[i];
-        if (needCarSize == 1 && !car.carSize) {
-          this.$common.toast('请补充' + car.carNo + '的规格');
-          return false;
-        }
-        if (needWeight == 1 && car.carType && car.carType.indexOf('重') !== -1 && !car.netWeight) {
-          this.$common.toast('请补充' + car.carNo + '载重');
-          return false;
-        }
-      }
-      let typeList = this.typeList;
-      let selectList = [];
-      for (let i in typeList) {
-        let type = typeList[i];
-        if (type.need == 1 && !type.itemId) {
-          this.$common.toast('【' + type.name + '】必选');
-          return false;
-        }
-        if (type.needRemark == 1 && !type.remark) {
-          this.$common.toast('请录入【' + type.name + '】备注');
-          return false;
-        }
-        if (type.itemId) {
-          let obj = {
-            typeId: type.id,
-            typeName: type.name,
-            id: type.itemId,
-            num: type.num,
-            price: type.price,
-            remark: type.remark
-          }
-          selectList.push(obj);
-        }
-      }
-      this.form.itemJson = JSON.stringify(selectList);
-      this.form.carJson = JSON.stringify(this.car.list);
-      this.form.items = null;
-      this.form.cars = null;
-      if (needCustomer == 1) {
-        let customerList = this.customer.customerList;
-        let index = this.customer.index;
-        let customer = customerList[index];
-        this.form.customerId = customer.id;
-        this.form.customerName = customer.name;
-      } else {
-        this.form.customerId = '';
-        this.form.customerName = '';
-      }
-      this.form.goodsId = this.goods.id;
-      this.form.goodsName = this.goods.name;
-      let chinaCarNo = carList
-          .filter(car => this.$common.isCarNo(car.carNo.toUpperCase()))
-          .map(car => car.carNo.toUpperCase())
-          .join("、");
-      let yueCarNo = carList
-          .filter(car => !this.$common.isCarNo(car.carNo.toUpperCase()))
-          .map(car => car.carNo.toUpperCase())
-          .join("、");
-      this.form.cardNo = yueCarNo;
-      this.form.chinaCarNo = chinaCarNo;
-      return true;
-    },
-    saveFn() {
-      if (this.check()) {
-        let obj = this.$common.removeNull(this.form);
-        this.$api.editOtherBusiness(obj).then(resp => {
-          if (resp.code == 200) {
-            this.$common.toast('修改成功');
-            setTimeout(() => {
-              this.$common.to('/pages/onely-disinfect/Index')
-            }, 1000)
-          }
-        })
-      }
-    },
-  }
-}
+							}
+						}
+					}
+					this.allTypeList = JSON.parse(JSON.stringify(list));
+					this.typeList = list;
+				})
+			},
+			getCustomerList(customerId) {
+				this.$api.getCustomerList({
+					pageNo: 1,
+					pageSize: 100
+				}).then(resp => {
+					let list = resp.data;
+					console.log(list.map(obj => obj.id).indexOf(customerId))
+					this.customer.index = list.map(obj => obj.id).indexOf(customerId);
+					this.customer.customerList = list;
+					console.log(this.customer)
+				})
+			},
+			customerChange(e) {
+				var value = e.detail.value; //当前picker选中的值
+				this.customer.index = value;
+			},
+			handlerCar(car) {
+				let list = this.car.list;
+				let check = list.filter(obj => obj.carNo == car.carNo).pop();
+				if (check) {
+					check.carSize = car.carSize;
+					check.netWeight = car.netWeight;
+					check.carType = car.carType;
+				} else {
+					this.car.list.push(car);
+				}
+				this.clearEmptyCar(car);
+			},
+			clearEmptyCar(car) {
+				let list = this.car.list;
+				let obj = list.filter(obj => !obj.carNo).pop();
+				if (obj) {
+					this.car.list.splice(list.indexOf(obj), 1);
+				}
+				this.filterItems(car);
+			},
+
+			editCar(car) {
+				let goods = this.goods;
+				this.$common.to('/pages/onely-disinfect/car-manager?carJson=' + JSON.stringify(car) + "&needCarSize=" +
+					goods.needCarSize + '&needWeight=' + goods.needWeight)
+			},
+			delCar(car) {
+				let list = this.car.list;
+				if (list.length == 1) {
+					this.$common.toast('至少有一辆车');
+					return;
+				}
+				this.car.list.splice(list.indexOf(car), 1);
+				this.filterItems();
+			},
+			validBefore() {
+				let form = this.form;
+				let goods = this.goods;
+				let needCustomer = goods.needCustomer;
+				let index = this.customer.index;
+				if (!form.businessGoodsName && goods.needOwner == 1) {
+					this.$common.toast('请填写货物');
+					return false;
+				}
+				let needOperateTime = goods.needOperateTime;
+				let businessGoodsNum = form.businessGoodsNum;
+				if ((!businessGoodsNum || businessGoodsNum <= 0) && needOperateTime == '1') {
+					this.$common.toast('请填写件数');
+					return false;
+				}
+				let carList = this.car.list;
+				if (carList.length == 0) {
+					this.$common.toast('请录入车辆');
+					return false;
+				}
+				let needCarSize = goods.needCarSize;
+				let needWeight = goods.needWeight;
+				for (let i in carList) {
+					let car = carList[i];
+					if (needCarSize == 1 && !car.carSize) {
+						this.$common.toast('请补充' + car.carNo + '的规格');
+						return false;
+					}
+					if (needWeight == 1 && car.carType.indexOf('重') !== -1 && !car.netWeight) {
+						this.$common.toast('请补充' + car.carNo + '载重');
+						return false;
+					}
+				}
+				return true;
+			},
+			check() {
+				let form = this.form;
+				let goods = this.goods;
+				let needCustomer = goods.needCustomer;
+				let index = this.customer.index;
+				if (!form.businessGoodsName && goods.needOwner == 1) {
+					this.$common.toast('请填写货物');
+					return false;
+				}
+				let needOperateTime = goods.needOperateTime;
+				let businessGoodsNum = form.businessGoodsNum;
+				if ((!businessGoodsNum || businessGoodsNum <= 0) && needOperateTime == '1') {
+					this.$common.toast('请填写件数');
+					return false;
+				}
+				let carList = this.car.list;
+				if (carList.length == 0) {
+					this.$common.toast('请录入车辆');
+					return false;
+				}
+				let needCarSize = goods.needCarSize;
+				let needWeight = goods.needWeight;
+				for (let i in carList) {
+					let car = carList[i];
+					if (needCarSize == 1 && !car.carSize) {
+						this.$common.toast('请补充' + car.carNo + '的规格');
+						return false;
+					}
+					if (needWeight == 1 && car.carType && car.carType.indexOf('重') !== -1 && !car.netWeight) {
+						this.$common.toast('请补充' + car.carNo + '载重');
+						return false;
+					}
+				}
+				let typeList = this.typeList;
+				let selectList = [];
+				for (let i in typeList) {
+					let type = typeList[i];
+					if (type.need == 1 && !type.itemId) {
+						this.$common.toast('【' + type.name + '】必选');
+						return false;
+					}
+					if (type.needRemark == 1 && !type.remark) {
+						this.$common.toast('请录入【' + type.name + '】备注');
+						return false;
+					}
+					if (type.itemId) {
+						let obj = {
+							typeId: type.id,
+							typeName: type.name,
+							id: type.itemId,
+							num: type.num,
+							price: type.price,
+							remark: type.remark
+						}
+						selectList.push(obj);
+					}
+				}
+				this.form.itemJson = JSON.stringify(selectList);
+				this.form.carJson = JSON.stringify(this.car.list);
+				this.form.items = null;
+				this.form.cars = null;
+				if (needCustomer == 1) {
+					let customerList = this.customer.customerList;
+					let index = this.customer.index;
+					let customer = customerList[index];
+					this.form.customerId = customer.id;
+					this.form.customerName = customer.name;
+				} else {
+					this.form.customerId = '';
+					this.form.customerName = '';
+				}
+				this.form.goodsId = this.goods.id;
+				this.form.goodsName = this.goods.name;
+				let chinaCarNo = carList
+					.filter(car => this.$common.isCarNo(car.carNo.toUpperCase()))
+					.map(car => car.carNo.toUpperCase())
+					.join("、");
+				let yueCarNo = carList
+					.filter(car => !this.$common.isCarNo(car.carNo.toUpperCase()))
+					.map(car => car.carNo.toUpperCase())
+					.join("、");
+				this.form.cardNo = yueCarNo;
+				this.form.chinaCarNo = chinaCarNo;
+				return true;
+			},
+			saveFn() {
+				if (this.check()) {
+					let obj = this.$common.removeNull(this.form);
+					this.$api.editOtherBusiness(obj).then(resp => {
+						if (resp.code == 200) {
+							this.$common.toast('修改成功');
+							setTimeout(() => {
+								this.$common.to('/pages/onely-disinfect/Index')
+							}, 1000)
+						}
+					})
+				}
+			},
+		}
+	}
 </script>
 
 <style lang="scss">
-page {
-  background-color: #fff;
-}
+	page {
+		background-color: #fff;
+	}
 
-.hs-item {
-  text-align: center;
-}
+	.hs-item {
+		text-align: center;
+	}
 
-.item-line {
-  color: #a2a2a2;
-  padding: 5px 0 10px 29px;
-  border-bottom: 1px solid #E5E5E5;
-}
+	.item-line {
+		color: #a2a2a2;
+		padding: 5px 0 10px 29px;
+		border-bottom: 1px solid #E5E5E5;
+	}
 
-.hj {
-  padding: 50rpx;
-  font-size: 40rpx;
-  color: red;
-  font-weight: bold;
-}
+	.hj {
+		padding: 50rpx;
+		font-size: 40rpx;
+		color: red;
+		font-weight: bold;
+	}
 
-.business-list {
-  line-height: 75rpx;
-  margin: 4rpx 0 0 48rpx;
+	.business-list {
+		line-height: 75rpx;
+		margin: 4rpx 0 0 48rpx;
 
-}
+	}
 
-.save-btn {
-  background-color: #ff4200;
-  height: 88rpx;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  margin: 60rpx;
-  color: #fff;
-  font-size: 30rpx;
-  font-weight: bold;
-  border-radius: 10rpx;
-}
+	.save-btn {
+		background-color: #ff4200;
+		height: 88rpx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		margin: 60rpx;
+		color: #fff;
+		font-size: 30rpx;
+		font-weight: bold;
+		border-radius: 10rpx;
+	}
 
-@import '@/common/common.scss'
+	@import '@/common/common.scss'
 </style>

+ 4 - 75
app-ui/pages/onely-disinfect/type-business.vue

@@ -4,21 +4,10 @@
 			<view class="top">
 				<text class="title">{{ goods.name }}</text>
 			</view>
-			<view class="item" v-if="goods.needDeclare==1">
-				<view class="l">
-					<text style="color: red;" v-if="goods.needDeclare==1">*</text>
-					申报单号:
-				</view>
-				<view class="r">
-					<u-input placeholder="申报订单号" v-model="form.declareNo" clearable readonly>
-						<text slot="suffix" style="font-size: 50rpx;" @click="selectDeclare">+</text>
-					</u-input>
-				</view>
-			</view>
 			<view class="item" v-if="goods.needCustomer==1">
 				<view class="l">客户:</view>
 				<view class="r" style="flex: 12;">
-					<picker :disabled="goods.needDeclare==1" v-if="customer.customerList.length>0" class="p-picker"
+					<picker  v-if="customer.customerList.length>0" class="p-picker"
 						@change="customerChange($event)" :value="customer.index" :range="customer.customerList"
 						range-key="name">
 						<text class="p-text">{{ customer.customerList[customer.index].name }}</text>
@@ -38,7 +27,7 @@
 			<view class="item">
 				<view class="l">
 					<text style="color: red;" v-if="goods.needOperateTime">*</text>
-					件数
+					数量(件)
 				</view>
 				<view class="r">
 					<u-input v-model="form.businessGoodsNum" type="number">
@@ -184,11 +173,6 @@
 			this.getCustomerList();
 			this.getTypeByGoodsId();
 			let that = this;
-			uni.$on('getSelectDeclare', declare => {
-				that.$nextTick(() => {
-					that.handlerSelectDeclare(declare)
-				})
-			})
 			uni.$on('getCar', car => {
 				that.$nextTick(() => {
 					that.handlerCar(car)
@@ -333,53 +317,6 @@
 				}
 				this.filterItems(car);
 			},
-			handlerSelectDeclare(declare) {
-				let oldDeclareNo = this.form.declareNo;
-				if (oldDeclareNo && oldDeclareNo !== declare.declareNo) {
-					this.car.list = [];
-				}
-				this.form.declareNo = declare.declareNo;
-				this.form.cardNo = declare.carNo;
-				this.form.chinaCarNo = declare.chinaCarNo;
-				this.form.netWeight = declare.grossWeight;
-				this.form.owner = declare.sendUnit;
-				let customerList = this.customer.customerList;
-				this.customer.index = customerList.map(customer => customer.id).indexOf(declare.customerId);
-				let carNo = declare.carNo;
-				let grossWeight = declare.grossWeight;
-				let carList = this.car.list;
-				let exit = carList.filter(obj => obj.carNo == carNo).pop();
-				if (!exit) {
-					let car = {
-						carNo: carNo,
-						netWeight: grossWeight,
-						carType: '载重'
-					}
-					this.car.list.push(car)
-				}
-				this.form.cardNo = declare.carNo;
-				this.form.chinaCarNo = declare.chinaCarNo;
-				this.form.netWeight = declare.grossWeight;
-				let chinaCarNo = declare.chinaCarNo;
-				if (chinaCarNo) {
-					let list = [];
-					chinaCarNo.replace(",", ",").split(",").forEach(carNo => {
-						let exit = carList.filter(obj => obj.carNo == carNo).pop();
-						if (!exit) {
-							let car = {
-								carNo: carNo,
-								carType: '空车',
-							}
-							this.car.list.push(car)
-						}
-					})
-				}
-				this.clearEmptyCar();
-			},
-
-			selectDeclare() {
-				this.$common.to('/pages/business-entering/declare-select?declareNo=' + this.form.declareNo)
-			},
 			editCar(car) {
 				let goods = this.goods;
 				this.$common.to('/pages/onely-disinfect/car-manager?carJson=' + JSON.stringify(car) + "&needCarSize=" +
@@ -398,13 +335,9 @@
 			validBefore() {
 				let form = this.form;
 				let goods = this.goods;
-				let needDeclare = goods.needDeclare;
 				let needCustomer = goods.needCustomer;
 				let index = this.customer.index;
-				if (needDeclare == 1 && !form.declareNo) {
-					this.$common.toast('请选择申报单');
-					return false;
-				}
+				
 				if (!form.businessGoodsName && goods.needOwner == 1) {
 					this.$common.toast('请填写货物');
 					return false;
@@ -439,13 +372,9 @@
 			check() {
 				let form = this.form;
 				let goods = this.goods;
-				let needDeclare = goods.needDeclare;
 				let needCustomer = goods.needCustomer;
 				let index = this.customer.index;
-				if (needDeclare == 1 && !form.declareNo) {
-					this.$common.toast('请选择申报单');
-					return false;
-				}
+				
 				if (!form.businessGoodsName && goods.needOwner == 1) {
 					this.$common.toast('请填写货物');
 					return false;

+ 2 - 2
app-ui/utils/request.js

@@ -1,8 +1,8 @@
-// const server = 'http://127.0.0.1:8099/pro';
+const server = 'http://192.168.88.25:8099/pro';
 // const server = 'https://pco.aseanbusiness.cn/pro';
 
 
-const server = 'https://dxkaa1.gxbtka.com/pro';
+// const server = 'https://dxkaa1.gxbtka.com/pro';
 
 
 import common from '../common/js/common.js';

+ 0 - 4
sp-admin/sa-view/tb-business/tb-car-disincle-add.html

@@ -645,10 +645,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;

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

@@ -93,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>
@@ -659,10 +659,6 @@
 					ok: function() {
 						let goods = this.goods;
 						let m = this.m;
-						if (goods.needDeclare == 1 && !m.declareNo) {
-							sa.error('请选择申报单');
-							return false;
-						}
 						if (!m.businessGoodsName && goods.needOwner == 1) {
 							sa.error('请填写货物');
 							return false;

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

@@ -31,8 +31,7 @@
 				<!-- ------------- 数据列表 ------------- -->
 				<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>
+					<sa-td name="收费项目" prop="name"></sa-td>
 					<el-table-column label="有效期" width="260px">
 						<template slot-scope="s">
 							{{s.row.startTime}}~{{s.row.endTime}}

+ 17 - 0
sp-server/src/main/java/com/pj/api/open/bo/ItemPriceBO.java

@@ -0,0 +1,17 @@
+package com.pj.api.open.bo;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@Accessors(chain = true)
+public class ItemPriceBO implements Serializable {
+    private Long id;
+    private String name;
+    private BigDecimal price;
+    private int pay;
+    private String uniqExpenseId;
+}

+ 9 - 5
sp-server/src/main/java/com/pj/api/pushfee/task/FeeDetailSyncTask.java

@@ -20,10 +20,13 @@ import com.pj.constants.business.PayEnum;
 import com.pj.current.config.PushfeeConfig;
 import com.pj.current.task.Task;
 import com.pj.project.sync.HelpService;
+import com.pj.project.sync.bo.SyncResultBO;
 import com.pj.project.tb_costomer.TbCostomer;
 import com.pj.project.tb_costomer.TbCostomerService;
 import com.pj.project.tb_fee_details.TbFeeDetails;
 import com.pj.project.tb_fee_details.TbFeeDetailsService;
+import com.pj.project.tb_fee_item.TbFeeItem;
+import com.pj.project.tb_fee_item.TbFeeItemService;
 import lombok.extern.slf4j.Slf4j;
 
 import java.util.ArrayList;
@@ -67,18 +70,20 @@ public class FeeDetailSyncTask extends Task {
                 opd.setPartnersId(tbCostomer.getId());
             }
         }
+        TbFeeItemService tbFeeItemService = SpringUtil.getBean(TbFeeItemService.class);
+        TbFeeItem tbFeeItem = tbFeeItemService.getById(tbFeeDetails.getFeeType());
         String subBillNo = StrUtil.isEmpty(tbFeeDetails.getBusinessNo()) ? tbFeeDetails.getBusinessCarNo() : tbFeeDetails.getBusinessCarNo();
         String classifyPath = tbFeeDetails.getFeeType() + "-" + itemTypeId + "-" + itemId;
         opd.setSyncType(syncType).setQuantity(tbFeeDetails.getNum().toString())
                 .setSubjectName(tbFeeDetails.getCarNo()).setSubBillNo(subBillNo)
                 .setBizTypeNo(itemTypeId).setBizTypeName(tbFeeDetails.getItemTypeName())
-                .setChargeItemName(FeeTypeEnum.getDesc(tbFeeDetails.getFeeType())).setChargeItemNo(tbFeeDetails.getFeeType() + "")
+                .setChargeItemName(tbFeeItem.getName()).setChargeItemNo(tbFeeDetails.getFeeType() + "")
                 .setClassifyPath(classifyPath).setPartnersName(partnersName)
                 .setPaidSerialNo(tbFeeDetails.getTransactionId())
                 .setPaidAmount(tbFeeDetails.getItemPrice().toString()).setRefundAmount("0").setPayStatus("支付成功")
                 .setPayTime(tbFeeDetails.getPayTime()).setBillTime(tbFeeDetails.getCreateTime())
                 .setPrice(tbFeeDetails.getItemPrice().toString()).setActPrice(tbFeeDetails.getItemPrice())
-                .setBillStatus("已完成").setPaymentWayNo(payType.getCode()+"").setPaymentWayName(payType.getDesc());
+                .setBillStatus("已完成").setPaymentWayNo(payType.getCode() + "").setPaymentWayName(payType.getDesc());
         log.info("基础数据:{}", JSONUtil.parseObj(opd));
         opdList.add(opd);
         return opdList;
@@ -103,9 +108,8 @@ public class FeeDetailSyncTask extends Task {
         List<SyncBillParam> list = buildParams(tbFeeDetails);
         SyncBillRequest detail = new SyncBillRequest();
         detail.setBillList(list);
-        String response = helpService.req("/data/sync/bill",detail);
-        log.info("服务端返回响应:{}", response);
-        if (JSONUtil.parseObj(response).getInt("code") == 200) {
+        SyncResultBO response = helpService.req("/data/sync/bill", detail);
+        if (response.getCode() == 200) {
             tbFeeDetails.setSyncStatus(1);
         } else {
             tbFeeDetails.setSyncStatus(2);

+ 23 - 23
sp-server/src/main/java/com/pj/constants/business/FeeTypeEnum.java

@@ -8,29 +8,29 @@ import java.util.*;
 @Getter
 @AllArgsConstructor
 public enum FeeTypeEnum {
-    OTHER_FEE(-1, "其他"),
-    NUCLEIC_FEE(1, "核酸检测"),
-    DISINFECT_FEE(2, "消杀作业"),
-    STEVEDORE_FEE(3, "装卸作业"),
-    PARK_FEE(4, "停车业务"),
-    WEIGHT_FEE(5, "过磅费"),
-    MANAGE_FEE(6, "入场管理费"),
-    CHARGE_FEE(7, "充电打冷作业");
+//    OTHER_FEE(-1, "其他"),
+//    NUCLEIC_FEE(1, "核酸检测"),
+//    DISINFECT_FEE(2, "消杀作业"),
+//    STEVEDORE_FEE(3, "装卸作业"),
+    PARK_FEE(4, "停车业务");
+//    WEIGHT_FEE(5, "过磅费"),
+//    MANAGE_FEE(6, "入场管理费"),
+//    CHARGE_FEE(7, "充电打冷作业");
     private int code;
     private String desc;
-
-    public static List<Map<String, Object>> getList() {
-        List<Map<String, Object>> list = new ArrayList<>();
-        for (FeeTypeEnum feeTypeEnum : FeeTypeEnum.values()) {
-            Map<String, Object> map = new HashMap<>();
-            map.put("id", feeTypeEnum.getCode());
-            map.put("name", feeTypeEnum.getDesc());
-            list.add(map);
-        }
-        return list;
-    }
-    public static String getDesc(int code) {
-      return   Arrays.stream(FeeTypeEnum.values()).filter(feeTypeEnum -> feeTypeEnum.getCode()==code)
-                .findAny().orElse(OTHER_FEE).getDesc();
-    }
+//
+//    public static List<Map<String, Object>> getList() {
+//        List<Map<String, Object>> list = new ArrayList<>();
+//        for (FeeTypeEnum feeTypeEnum : FeeTypeEnum.values()) {
+//            Map<String, Object> map = new HashMap<>();
+//            map.put("id", feeTypeEnum.getCode());
+//            map.put("name", feeTypeEnum.getDesc());
+//            list.add(map);
+//        }
+//        return list;
+//    }
+//    public static String getDesc(int code) {
+//      return   Arrays.stream(FeeTypeEnum.values()).filter(feeTypeEnum -> feeTypeEnum.getCode()==code)
+//                .findAny().orElse(OTHER_FEE).getDesc();
+//    }
 }

+ 5 - 0
sp-server/src/main/java/com/pj/project/relation_type_item/RelationTypeItemService.java

@@ -127,4 +127,9 @@ public class RelationTypeItemService extends ServiceImpl<RelationTypeItemMapper,
     }
 
 
+    public void removeByItemId(String itemId) {
+        QueryWrapper<RelationTypeItem> ew = new QueryWrapper<>();
+        ew.lambda().eq(RelationTypeItem::getItemId, itemId);
+        this.remove(ew);
+    }
 }

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

@@ -9,9 +9,11 @@ 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 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.SyncResultBO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.formula.functions.T;
 import org.springframework.stereotype.Component;
@@ -36,23 +38,25 @@ public class HelpService {
      * @param body
      * @return
      */
-    public String req(String path, Object body) {
+    public SyncResultBO req(String path, Object body) {
         String sysId = pushfeeConfig.getSysId();
         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)
+        log.info("客户端发送报文:{},{}" +path, messageToBeSend);
+        String resp= HttpUtil.createPost(pushfeeConfig.getSyncUrl() + path)
                 .header("Authorization", "openApi")
                 .timeout(2000).setReadTimeout(3000).body(messageToBeSend).execute().body();
+        log.info("返回:{},{}" +path, resp);
+        return JSONUtil.toBean(resp,SyncResultBO.class);
     }
 
     /**
      * 解密
      * @param content
-     * @param bean
+     * @param
      * @return
      */
     public <T> T deCrypte(String content, Class<T> clazz) {

+ 48 - 14
sp-server/src/main/java/com/pj/project/sync/SyncService.java

@@ -5,13 +5,22 @@ 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.IExpensePriceReq;
 import com.pj.project.sync.dto.ItemTypeDTO;
 import com.pj.project.sync.dto.PartnerDTO;
 import com.pj.project.sync.dto.PartnerParam;
+import com.pj.project.sync.dto.item.IFactorItem;
+import com.pj.project.sync.request.IOrderPriceReq;
+import com.pj.project.sync.request.item.IOrderItem;
+import com.pj.project.sync.response.IExpensePriceRes;
+import com.pj.project.sync.response.IOrderPriceRes;
+import com.pj.project.sync.response.item.IExpenseItem;
+import com.pj.utils.sg.AjaxError;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.Collections;
 import java.util.List;
 
@@ -36,27 +45,52 @@ public class SyncService {
         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));
+        helpService.req("/data/sync/partners", partnerDTO);
     }
 
-    public List<IExpenseItem> syncItemTypeList(String itemTypeName,String itemCode) {
+    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);
+        SyncResultBO resultBO = helpService.req("/price/external/expense/list", dto);
         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();
 
     }
 
+    /**
+     * 费项价格计算
+     *
+     * @param uniqExpenseId
+     * @param num
+     * @param factorItems
+     * @return
+     */
+    public IExpensePriceRes calItemPrice(String uniqExpenseId, int num, List<IFactorItem> factorItems) {
+        IExpensePriceReq iExpensePriceReq = new IExpensePriceReq();
+        iExpensePriceReq.setUniqExpenseId(uniqExpenseId)
+                .setExpenseNum(num)
+                .setFactors(factorItems);
+        SyncResultBO resultBO = helpService.req("/price/external/expense/price", iExpensePriceReq);
+        if (resultBO.getCode() == 200) {
+            IExpensePriceRes res = helpService.deCrypte(resultBO.getData(), IExpensePriceRes.class);
+            return res;
+        }
+        throw new AjaxError("计算费用出错");
+    }
+
+    /**
+     * 订单计算接口
+     * @param expenses
+     */
+    public IOrderPriceRes orderPriceCal(  List<IOrderItem> expenses ){
+        IOrderPriceReq iOrderPriceReq=new IOrderPriceReq();
+        iOrderPriceReq.setSysId(pushfeeConfig.getSysId()).setExpenses(expenses).setOrderNum(1);
+        SyncResultBO resultBO = helpService.req("/price/external/order/calc", iOrderPriceReq);
+        if (resultBO.getCode() == 200) {
+            IOrderPriceRes res = helpService.deCrypte(resultBO.getData(), IOrderPriceRes.class);
+            return res;
+        }
+        throw new AjaxError("订单计费出错");
+    }
+
 }

+ 14 - 2
sp-server/src/main/java/com/pj/project/sync/api/AsyncApi.java

@@ -6,6 +6,7 @@ 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.TbItemService;
 import com.pj.project.tb_item_type.TbItemTypeService;
 import com.pj.utils.sg.AjaxJson;
 import lombok.extern.slf4j.Slf4j;
@@ -23,14 +24,25 @@ public class AsyncApi {
 
     @Resource
     private TbItemTypeService tbItemTypeService;
+    @Resource
+    private TbItemService tbItemService;
 
 
-    //主动发送请求:请求费项详情
+    /**
+     * 业务类型同步接口
+     * @param request
+     * @return
+     */
     @PostMapping("item-type")
     public AjaxJson syncItemType(@RequestBody String request) {
         log.info("sync 业务类型:{}", request);
         tbItemTypeService.receive(request);
         return AjaxJson.get(1, "成功");
     }
-
+    @PostMapping("item-detail")
+    public AjaxJson syncItemDetail(@RequestBody String request) {
+        log.info("sync 费项详情:{}", request);
+        tbItemService.receive(request);
+        return AjaxJson.get(1, "成功");
+    }
 }

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

@@ -1,6 +1,7 @@
 package com.pj.project.sync.bo;
 
 import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import com.pj.project.sync.response.item.IExpenseItem;
 import lombok.Data;
 
 import java.util.List;

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

@@ -15,9 +15,11 @@ public class ItemTypeBO implements Serializable {
     private String keyName;
     private String syncType;
     private String parentId;
+    private String label;
     private String level;
     private String partnersId;
-    private String state;
+    //0 启用 1禁用
+    private int state=0;
     private Date startTime;
     private Date endTime;
 

+ 2 - 3
sp-server/src/main/java/com/pj/project/sync/bo/PriceFactorDTO.java

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

+ 39 - 0
sp-server/src/main/java/com/pj/project/sync/dto/IExpensePriceReq.java

@@ -0,0 +1,39 @@
+package com.pj.project.sync.dto;
+
+
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import com.pj.project.sync.dto.item.IFactorItem;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 订单商品项
+ */
+@Data
+@NoArgsConstructor
+@OpenApi(apiName = "REQ_006")
+@Accessors(chain = true)
+public class IExpensePriceReq {
+
+    private String sysId;
+
+    /**
+     * 费项唯一编号
+     */
+    private String uniqExpenseId;
+
+    /**
+     * 数量。
+     */
+    private Integer expenseNum;
+
+    /**
+     * 订单费项列表
+     */
+    private List<IFactorItem> factors;
+
+
+}

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

@@ -0,0 +1,18 @@
+package com.pj.project.sync.dto.item;
+
+import lombok.Data;
+
+@Data
+public class IFactorItem {
+
+    /**
+     * 因子id
+     */
+    private String facId;
+
+    /**
+     * 因子参数
+     */
+    private String facParams;
+
+}

+ 17 - 0
sp-server/src/main/java/com/pj/project/sync/dto/item/IOrderFactorDiffItem.java

@@ -0,0 +1,17 @@
+package com.pj.project.sync.dto.item;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class IOrderFactorDiffItem {
+    private Integer expenseNum;
+
+    /**
+     * 费项差价 = 变更后费项价格 - 初始费项价格
+     */
+    private BigDecimal priceDiff;
+
+    private BigDecimal totalPriceDiff;
+}

+ 29 - 0
sp-server/src/main/java/com/pj/project/sync/dto/item/IOrderItem.java

@@ -0,0 +1,29 @@
+package com.pj.project.sync.dto.item;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 订单商品项
+ */
+@Data
+public class IOrderItem implements Serializable {
+
+    /**
+     * 费项唯一编号
+     */
+    private String uniqExpenseId;
+
+    /**
+     * 数量
+     */
+    private Integer expenseNum;
+
+    /**
+     * 订单费项列表
+     */
+    private List<IFactorItem> factors;
+
+}

+ 19 - 0
sp-server/src/main/java/com/pj/project/sync/request/IExpenseFactorQueryReq.java

@@ -0,0 +1,19 @@
+package com.pj.project.sync.request;
+
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+@OpenApi(apiName = "REQ_005")
+public class IExpenseFactorQueryReq implements Serializable {
+
+  /**
+   * 费项编号
+   */
+  private String uniqueExpenseId;
+
+}

+ 31 - 0
sp-server/src/main/java/com/pj/project/sync/request/IExpenseListQueryReq.java

@@ -0,0 +1,31 @@
+package com.pj.project.sync.request;
+
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+@OpenApi(apiName = "REQ_003")
+public class IExpenseListQueryReq implements Serializable {
+
+  /**
+   * 系统id
+   */
+  private String sysId;
+  /**
+   * 业务类型编号
+   */
+  private String bizTypeNo;
+  /**
+   * 费项编号
+   */
+  private String uniqueExpenseId;
+  /**
+   * 费项名称
+   */
+  private String expenseName;
+
+}

+ 37 - 0
sp-server/src/main/java/com/pj/project/sync/request/IExpensePriceReq.java

@@ -0,0 +1,37 @@
+package com.pj.project.sync.request;
+
+
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import com.pj.project.sync.request.item.IFactorItem;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 订单商品项
+ */
+@Data
+@NoArgsConstructor
+@OpenApi(apiName = "REQ_007")
+public class IExpensePriceReq {
+
+    private String sysId;
+
+    /**
+     * 费项唯一编号
+     */
+    private String uniqExpenseId;
+
+    /**
+     * 数量。
+     */
+    private Integer expenseNum;
+
+    /**
+     * 订单费项列表
+     */
+    private List<IFactorItem> factors;
+
+
+}

+ 19 - 0
sp-server/src/main/java/com/pj/project/sync/request/IExpenseQueryReq.java

@@ -0,0 +1,19 @@
+package com.pj.project.sync.request;
+
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+@OpenApi(apiName = "REQ_004")
+public class IExpenseQueryReq implements Serializable {
+
+  /**
+   * 费项编号
+   */
+  private String uniqueExpenseId;
+
+}

+ 41 - 0
sp-server/src/main/java/com/pj/project/sync/request/IOrderPriceReq.java

@@ -0,0 +1,41 @@
+package com.pj.project.sync.request;
+
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import com.pj.project.sync.request.item.IOrderFactorDiffItem;
+import com.pj.project.sync.request.item.IOrderItem;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@OpenApi(apiName = "REQ_005")
+public class IOrderPriceReq implements Serializable {
+
+    private String sysId;
+
+    /**
+     * 订单唯一id
+     */
+    private String orderId;
+
+    /**
+     * 订单数量
+     */
+    private Integer orderNum;
+
+    /**
+     * 费项项
+     */
+    private List<IOrderItem> expenses;
+
+    /**
+     * 动态调价
+     */
+    private List<IOrderFactorDiffItem> factorDiff;
+
+}

+ 18 - 0
sp-server/src/main/java/com/pj/project/sync/request/item/IFactorItem.java

@@ -0,0 +1,18 @@
+package com.pj.project.sync.request.item;
+
+import lombok.Data;
+
+@Data
+public class IFactorItem {
+
+    /**
+     * 因子id
+     */
+    private String facId;
+
+    /**
+     * 因子参数
+     */
+    private String facParams;
+
+}

+ 17 - 0
sp-server/src/main/java/com/pj/project/sync/request/item/IOrderFactorDiffItem.java

@@ -0,0 +1,17 @@
+package com.pj.project.sync.request.item;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class IOrderFactorDiffItem {
+    private Integer expenseNum;
+
+    /**
+     * 费项差价 = 变更后费项价格 - 初始费项价格
+     */
+    private BigDecimal priceDiff;
+
+    private BigDecimal totalPriceDiff;
+}

+ 31 - 0
sp-server/src/main/java/com/pj/project/sync/request/item/IOrderItem.java

@@ -0,0 +1,31 @@
+package com.pj.project.sync.request.item;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 订单商品项
+ */
+@Data
+@Accessors(chain = true)
+public class IOrderItem implements Serializable {
+
+    /**
+     * 费项唯一编号
+     */
+    private String uniqExpenseId;
+
+    /**
+     * 数量
+     */
+    private Integer expenseNum;
+
+    /**
+     * 订单费项列表
+     */
+    private List<IFactorItem> factors;
+
+}

+ 22 - 0
sp-server/src/main/java/com/pj/project/sync/response/IExpenseFactorQueryRes.java

@@ -0,0 +1,22 @@
+package com.pj.project.sync.response;
+
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import com.pj.project.sync.response.item.IPriceFactorItem;
+import lombok.Data;
+import org.apache.commons.compress.utils.Lists;
+
+import java.util.List;
+
+@Data
+@OpenApi(apiName = "REQ_005")
+public class IExpenseFactorQueryRes {
+    /**
+     * 费项编号
+     */
+    private String uniqueExpenseId;
+
+    /**
+     * 费项
+     */
+    private List<IPriceFactorItem> priceFactors = Lists.newArrayList();
+}

+ 18 - 0
sp-server/src/main/java/com/pj/project/sync/response/IExpenseListQueryRes.java

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

+ 19 - 0
sp-server/src/main/java/com/pj/project/sync/response/IExpensePriceRes.java

@@ -0,0 +1,19 @@
+package com.pj.project.sync.response;
+
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import com.pj.project.sync.response.item.IFireResultItem;
+import lombok.Data;
+
+@Data
+@OpenApi(apiName = "REQ_007")
+public class IExpensePriceRes {
+    /**
+     * 数量。
+     */
+    private Integer expenseNum;
+
+    /**
+     * 命中结果
+     */
+    private IFireResultItem expenseResult;
+}

+ 13 - 0
sp-server/src/main/java/com/pj/project/sync/response/IExpenseQueryRes.java

@@ -0,0 +1,13 @@
+package com.pj.project.sync.response;
+
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import com.pj.project.sync.response.item.IExpenseItem;
+import lombok.Data;
+
+@OpenApi(apiName = "REQ_004")
+@Data
+public class IExpenseQueryRes {
+
+    IExpenseItem item;
+
+}

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

@@ -0,0 +1,34 @@
+package com.pj.project.sync.response;
+
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import com.pj.project.sync.response.item.OrderPriceResultItem;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@OpenApi(apiName = "REQ_006")
+@NoArgsConstructor
+public class IOrderPriceRes implements Serializable {
+
+    /**
+     * 计价ID
+     */
+    private String calculateId;
+
+    /**
+     * 订单应支付的总金额
+     */
+    private BigDecimal totalOrderPrice;
+
+    /**
+     * 单价命中结果
+     */
+    private List<OrderPriceResultItem> fireResult;
+
+
+
+}

+ 10 - 5
sp-server/src/main/java/com/pj/project/sync/bo/IExpenseItem.java → sp-server/src/main/java/com/pj/project/sync/response/item/IExpenseItem.java

@@ -1,6 +1,8 @@
-package com.pj.project.sync.bo;
+package com.pj.project.sync.response.item;
 
 
+import cn.com.btxc.micro.uni.openapi.inter.OpenApi;
+import com.pj.project.sync.bo.SubExpenseDTO;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
@@ -10,8 +12,13 @@ import java.util.List;
 
 @Data
 @Slf4j
+@OpenApi(apiName = "REQ_013")
 public class IExpenseItem {
     /**
+     * 操作类型
+     */
+    private String syncType;
+    /**
      * 系统id
      */
     private String sysId;
@@ -92,11 +99,9 @@ public class IExpenseItem {
     private String version;
 
     /**
-     * 多规格费项价格子项信息
+     * 多规格规则
      */
 
-    private List<SubExpenseDTO> subExpenses;
-    private List<PriceFactorDTO> priceFactor;
-
+    private List<IrulesItem> rules;
 
 }

+ 24 - 0
sp-server/src/main/java/com/pj/project/sync/response/item/IFireResultItem.java

@@ -0,0 +1,24 @@
+package com.pj.project.sync.response.item;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class IFireResultItem {
+
+    /**
+     * 命中规则id
+     */
+    private Long fireRuleId;
+
+    /**
+     * 命中价格
+     */
+    private BigDecimal firePrice;
+
+    /**
+     * 当前费项优惠前的总金额 = firePrice * expenseNum
+     */
+    private BigDecimal expenseTotalPrice;
+
+}

+ 42 - 0
sp-server/src/main/java/com/pj/project/sync/response/item/IPriceFactorItem.java

@@ -0,0 +1,42 @@
+package com.pj.project.sync.response.item;
+
+import lombok.Data;
+
+@Data
+public class IPriceFactorItem {
+
+    private Long id;
+
+    private String sysId;
+
+
+    /**
+     * 因子名称
+     */
+    private String facName;
+
+
+    /**
+     * 类型:Enum-枚举,Number-数字,Date-日期,Time-时间
+     */
+    private String textType;
+
+
+    /**
+     * 单位
+     */
+    private String unit;
+
+
+    /**
+     * 比较运算符
+     */
+    private String operator;
+
+
+    /**
+     * 因子值
+     */
+    private String rangeVal;
+
+}

+ 26 - 0
sp-server/src/main/java/com/pj/project/sync/response/item/IrulesItem.java

@@ -0,0 +1,26 @@
+package com.pj.project.sync.response.item;
+
+import com.pj.project.sync.bo.PriceFactorDTO;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class IrulesItem implements Serializable {
+    private Long id;        //Long	价格因子树的节点id
+    private Long expenseId;//		Long	费项id
+    private Long facId;//		Long	因子id
+    private Long parentId;//	Long	当前规则节点的父id
+    private String nodeType;//		String	结点类型,ROOT根节点,LEAF叶节点
+    private String path;//	String	节点路径,根节点为/,叶节点如/14/
+    private String factorPath;//	String	节点的因子路径,/facId1/facId2/
+    private int sort;//	int	排序
+    private String operator;//	String	运算符:GreaterThan-大于,LessThan-小于,Equals-等于,Contains-包含,Range-范围
+    private String action;//		String	响应
+    private String actionParams;//	String	响应参数
+    private String actionParamsDesc;//	String	响应描述
+    private String isFormula;//		int	是否是公式,0-非公式,1-公式
+    private PriceFactorDTO priceFactor;//	Object	价格因子
+    private List<IrulesItem> children;
+}

+ 22 - 0
sp-server/src/main/java/com/pj/project/sync/response/item/OrderPriceResultItem.java

@@ -0,0 +1,22 @@
+package com.pj.project.sync.response.item;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@NoArgsConstructor
+@Data
+public class OrderPriceResultItem implements Serializable {
+
+    /**
+     * 费项唯一id
+     */
+    protected String uniqExpenseId;
+
+    /**
+     * 命中价格(单价)
+     */
+    protected BigDecimal firePrice;
+}

+ 5 - 40
sp-server/src/main/java/com/pj/project/sync/task/SyncTask.java

@@ -2,11 +2,13 @@ package com.pj.project.sync.task;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
 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.sync.response.item.IExpenseItem;
+import com.pj.project.tb_costomer.TbCostomer;
 import com.pj.project.tb_item.TbItem;
 import com.pj.project.tb_item.TbItemService;
 import com.pj.project.tb_item_fac.TbItemFac;
@@ -37,54 +39,17 @@ public class SyncTask {
     @Resource
     private TbItemFacService tbItemFacService;
 
-    @Scheduled(fixedRate = 60000)
+//    @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();

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

@@ -8,6 +8,7 @@ import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.RandomUtil;
@@ -20,6 +21,7 @@ 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.api.open.bo.ItemPriceBO;
 import com.pj.api.pushfee.oa.CallbackBO;
 import com.pj.api.wx.bo.MsgDataBO;
 import com.pj.api.wx.bo.PriceBO;
@@ -36,6 +38,11 @@ import com.pj.project.oa.bo.ParamsBO;
 import com.pj.project.relation_business_car.RelationBusinessCar;
 import com.pj.project.relation_business_car.RelationBusinessCarService;
 
+import com.pj.project.sync.SyncService;
+import com.pj.project.sync.request.IOrderPriceReq;
+import com.pj.project.sync.request.item.IFactorItem;
+import com.pj.project.sync.request.item.IOrderItem;
+import com.pj.project.sync.response.IOrderPriceRes;
 import com.pj.project.tb_account.AutomaticPay;
 import com.pj.project.tb_account.TbAccount;
 import com.pj.project.tb_account.TbAccountService;
@@ -64,6 +71,8 @@ import com.pj.project.tb_goods.TbGoods;
 import com.pj.project.tb_goods.TbGoodsService;
 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 com.pj.project.tb_notices.TbNoticesService;
@@ -174,12 +183,14 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
     @Resource
     @Lazy
     private TbFeeStatisticsService tbFeeStatisticsService;
+    @Resource
+    private SyncService syncService;
+    @Resource
+    private TbItemFacService tbItemFacService;
 
     private final List<String> CAR_LIST = StrUtil.splitTrim("浙,粤,京,津,冀,晋,蒙,辽,黑,沪,吉,苏,皖,赣,鲁,豫,鄂,湘,桂,琼,渝,川,贵,云,藏, 陕, 甘, 青, 宁", ",");
 
 
-
-
     public void storeMsg(String businessCustomerId, String content) {
         String currentCustomerId = StpUserUtil.getCustomerId();
         if (StrUtil.equals(currentCustomerId, UserTypeEnum.PLATFORM_ADMIN.getCustomerId())) {
@@ -357,6 +368,75 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
 
     }
 
+    /**
+     * 计费系统计算停车费
+     *
+     * @param iTime   入场时间
+     * @param oTime   离场时间
+     * @param carSize 车长
+     * @return
+     */
+    public IOrderPriceRes getPartMoney(Date iTime, Date oTime, double carSize) {
+        long minutes = DateUtil.between(iTime, oTime, DateUnit.MINUTE);
+        double hours = NumberUtil.div(minutes, 60, 1);
+        List<IOrderItem> expenses = new ArrayList<>();
+        TbItem tbItem = tbItemService.getPartItem();
+        if (tbItem == null) {
+            throw new AjaxError("未配置停车费规则");
+        }
+        IOrderItem orderItem = new IOrderItem();
+        orderItem.setUniqExpenseId(tbItem.getItemCode()).setExpenseNum(1);
+        List<TbItemFac> facList = tbItemFacService.getByItemId(tbItem.getId());
+        List<IFactorItem> factors = new ArrayList<>();
+        facList.forEach(tbItemFac -> {
+            String name = tbItemFac.getName();
+            IFactorItem iFactorItem = new IFactorItem();
+            iFactorItem.setFacId(tbItemFac.getId());
+            if (StrUtil.contains(name, "车")) {
+                iFactorItem.setFacParams(carSize + "");
+            } else if (StrUtil.contains(name, "时")) {
+                iFactorItem.setFacParams(hours + "");
+            }
+            factors.add(iFactorItem);
+        });
+        orderItem.setFactors(factors);
+        return syncService.orderPriceCal(expenses);
+    }
+
+    /**
+     * 停车费因子构建
+     * @param iTime
+     * @param oTime
+     * @param carSize
+     * @return
+     */
+    public  List<IOrderItem> getPartExpenses(Date iTime, Date oTime, double carSize) {
+        long minutes = DateUtil.between(iTime, oTime, DateUnit.MINUTE);
+        double hours = NumberUtil.div(minutes, 60, 1);
+        List<IOrderItem> expenses = new ArrayList<>();
+        TbItem tbItem = tbItemService.getPartItem();
+        if (tbItem == null) {
+            throw new AjaxError("未配置停车费规则");
+        }
+        IOrderItem orderItem = new IOrderItem();
+        orderItem.setUniqExpenseId(tbItem.getItemCode()).setExpenseNum(1);
+        List<TbItemFac> facList = tbItemFacService.getByItemId(tbItem.getId());
+        List<IFactorItem> factors = new ArrayList<>();
+        facList.forEach(tbItemFac -> {
+            String name = tbItemFac.getName();
+            IFactorItem iFactorItem = new IFactorItem();
+            iFactorItem.setFacId(tbItemFac.getId());
+            if (StrUtil.contains(name, "车")) {
+                iFactorItem.setFacParams(carSize + "");
+            } else if (StrUtil.contains(name, "时")) {
+                iFactorItem.setFacParams(hours + "");
+            }
+            factors.add(iFactorItem);
+        });
+        orderItem.setFactors(factors);
+        return expenses;
+    }
+
 
     public BigDecimal calculationPartMoney(Date iTime, Date oTime, double carSize) {
         BigDecimal zero = new BigDecimal("0");
@@ -454,7 +534,8 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
                 if (StrUtil.isEmpty(carType)) {
                     carType = CarEnum.CarTypeEnum.EMPTY_TYPE.getType();
                 }
-                BigDecimal partMoney = calculationPartMoney(inTime, outTime, tbBusinessCar.getCarSize());
+                BigDecimal partMoney = new BigDecimal("1");
+
                 if (StrUtil.isNotEmpty(tbBusinessCar.getColor()) && tbBusinessCar.getCarSize() != null) {
                     String freeColor = partConfig.getFreeColor();
                     //4.2米以下蓝色车辆
@@ -473,6 +554,13 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
                 if (CarEnum.PayTypeEnum.FEE_TYPE.getType().equals(tbBusinessCar.getPayType())) {
                     partMoney = new BigDecimal("0");
                 }
+                if (partMoney.doubleValue() == 1) {
+                    IOrderPriceRes partPrice = getPartMoney(inTime, outTime, tbBusinessCar.getCarSize());
+                    result.put("carCalculateId", partPrice.getCalculateId());
+                    partMoney = partPrice.getTotalOrderPrice();
+                    //todo 计算停车费
+                }
+                // partMoney = calculationPartMoney(inTime, outTime, tbBusinessCar.getCarSize());
                 carMap.put("price", partMoney);
             }
         }
@@ -483,33 +571,50 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
         result.put("carList", Collections.singleton(carMap));
         BigDecimal itemsPrice = new BigDecimal("0");
         List<Map<String, Object>> itemList = new ArrayList<>();
-        //未支付的
-        items = items.stream().filter(item -> item.getPayStatus() == 0).collect(Collectors.toList());
-        for (TbBusinessItem item : items) {
-            BigDecimal itemPrice = item.getItemPrice().multiply(new BigDecimal(item.getNum()));
-            itemsPrice = itemsPrice.add(itemPrice);
-            Map<String, Object> itemMap = new HashMap<>();
-            itemMap.put("id", item.getId());
-            itemMap.put("name", item.getItemName() + "(" + item.getItemTypeName() + ")");
-            itemMap.put("price", itemPrice);
-            itemMap.put("pay", item.getPayStatus());
-            itemList.add(itemMap);
-            TbBusinessSort tbBusinessSort = tbBusinessSortService.findByItemTypeId(item.getItemTypeId());
-            if (tbBusinessSort != null) {
-                TbSortGroup sortGroup = tbSortGroupService.getById(tbBusinessSort.getGroupId());
-                if (sortGroup.getCompletePay().equals(1) && sortGroup.getStatus().equals(1)) {
-                    List<TbBusinessSort> sorts = tbBusinessSortService.findByGroupId(sortGroup.getId());
-                    for (TbBusinessSort sort : sorts) {
-                        long count = items.stream().filter(tbBusinessItem -> StrUtil.equals(sort.getTypeId(), tbBusinessItem.getItemTypeId()))
-                                .count();
-                        if (count == 0) {
-                            result.put("showPay", false);
+        if (!items.isEmpty()) {
+            //未支付的
+            List<IOrderItem> expenses = new ArrayList<>();
+            items.stream().filter(item -> item.getPayStatus() == 0)
+                    .forEach(item -> {
+                        String num = item.getNum();
+                        String itemCode = item.getItemCode();
+                        IOrderItem iOrderItem = new IOrderItem();
+                        iOrderItem.setExpenseNum(Integer.parseInt(num)).setUniqExpenseId(itemCode);
+                        expenses.add(iOrderItem);
+                    });
+            IOrderPriceRes orderPriceRes = syncService.orderPriceCal(expenses);
+            BigDecimal totalPrice = orderPriceRes.getTotalOrderPrice();
+            result.put("itemCalculateId", orderPriceRes.getCalculateId());
+            for (TbBusinessItem item : items) {
+                BigDecimal itemPrice = item.getItemPrice().multiply(new BigDecimal(item.getNum()));
+                itemsPrice = itemsPrice.add(itemPrice);
+                Map<String, Object> itemMap = new HashMap<>();
+                itemMap.put("id", item.getId());
+                itemMap.put("name", item.getItemName() + "(" + item.getItemTypeName() + ")");
+                itemMap.put("price", itemPrice);
+                itemMap.put("pay", item.getPayStatus());
+                orderPriceRes.getFireResult().stream().filter(priceItem -> StrUtil.equals(item.getItemCode(), priceItem.getUniqExpenseId()))
+                        .findAny().ifPresent(priceItem -> {
+                    itemMap.put("price", priceItem.getFirePrice().multiply(new BigDecimal(item.getNum())));
+                });
+                itemList.add(itemMap);
+                TbBusinessSort tbBusinessSort = tbBusinessSortService.findByItemTypeId(item.getItemTypeId());
+                if (tbBusinessSort != null) {
+                    TbSortGroup sortGroup = tbSortGroupService.getById(tbBusinessSort.getGroupId());
+                    if (sortGroup.getCompletePay().equals(1) && sortGroup.getStatus().equals(1)) {
+                        List<TbBusinessSort> sorts = tbBusinessSortService.findByGroupId(sortGroup.getId());
+                        for (TbBusinessSort sort : sorts) {
+                            long count = items.stream().filter(tbBusinessItem -> StrUtil.equals(sort.getTypeId(), tbBusinessItem.getItemTypeId()))
+                                    .count();
+                            if (count == 0) {
+                                result.put("showPay", false);
+                            }
                         }
                     }
                 }
             }
+            result.put("itemsPrice", totalPrice);
         }
-        result.put("itemsPrice", itemsPrice);
         result.put("itemList", itemList);
         result.put("businessNo", businessList.stream().map(TbBusiness::getNo).distinct().collect(Collectors.joining("、")));
         result.put("goodsName", businessList.stream().map(TbBusiness::getGoodsName).distinct().collect(Collectors.joining("、")));
@@ -609,14 +714,14 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
         List<PriceBO> priceBOList = new ArrayList<>();
         TbGoods tbGoods = tbGoodsService.getById(db.getGoodsId());
         //该确认确未确认
-        if (tbGoods.getPayStep().equals(GoodsEnum.PayStep.AFTER_CONFIRM.getCode()) &&db.getAdminConfirmInput()==0) {
+        if (tbGoods.getPayStep().equals(GoodsEnum.PayStep.AFTER_CONFIRM.getCode()) && db.getAdminConfirmInput() == 0) {
             throw new AjaxError("该业务需要确认后才能收费");
         }
         for (TbBusinessCar tbBusinessCar : cars) {
             String carNo = tbBusinessCar.getCarNo().toUpperCase();
-            String prefix=StrUtil.sub(carNo,0,1);
-            if (CAR_LIST.contains(prefix)&&tbGoods.getChinaCarPay()==1
-                    ||!CAR_LIST.contains(prefix)&&tbGoods.getVietnamCarPay()==1) {
+            String prefix = StrUtil.sub(carNo, 0, 1);
+            if (CAR_LIST.contains(prefix) && tbGoods.getChinaCarPay() == 1
+                    || !CAR_LIST.contains(prefix) && tbGoods.getVietnamCarPay() == 1) {
                 Date realInTime = tbBusinessCar.getRealInTime();
                 Date realOutTime = tbBusinessCar.getRealOutTime();
                 if (realInTime != null && realOutTime != null) {
@@ -669,9 +774,9 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
             //生成扣费记录
             automaticPay.createTbDeductionRecord(tbFeeDetailsList, tbAccount, plate, bind.getCustomerName(), no);
             automaticPay.unbindRun(plate);
-        }else if (payType == PayEnum.PayType.OFF_LINE_PAY.getCode()){
+        } else if (payType == PayEnum.PayType.OFF_LINE_PAY.getCode()) {
             //车辆的扣费记录
-            if (partMoney.doubleValue() > 0){
+            if (partMoney.doubleValue() > 0) {
                 tbFeeDetailsService.chargeParkFee(
                         priceBOList, null, null, payTime, PayEnum.PayType.OFF_LINE_PAY);
             }
@@ -1315,7 +1420,7 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
         if (tbCostomer != null) {
             tbBusiness.setCustomerId(customerId).setCustomerName(tbCostomer.getName());
         }
-        boolean businessIsPay =PayEnum.PayStatusEnum.HAS_PAY_CONFIRM.getCode() == errorBusinessBO.getPayStatus();
+        boolean businessIsPay = PayEnum.PayStatusEnum.HAS_PAY_CONFIRM.getCode() == errorBusinessBO.getPayStatus();
         Date businessPayTime = errorBusinessBO.getPayTime();
 
         BigDecimal price = new BigDecimal("0");

+ 0 - 14
sp-server/src/main/java/com/pj/project/tb_business_car/TbBusinessCarService.java

@@ -304,16 +304,6 @@ public class TbBusinessCarService extends ServiceImpl<TbBusinessCarMapper, TbBus
             feeDetailsLIst.forEach(fee -> fee.setCarNo(newCarNo));
             tbFeeDetailsService.updateBatchById(feeDetailsLIst);
         }
-        if (businessList.isEmpty()) {
-            List<TbFeeDetails> feeDetailsList = tbFeeDetailsService.getByBusinessCarIdAndCarNoAndFeeType(t.getId(), oldCarNo, FeeTypeEnum.PARK_FEE.getCode());
-            for (TbFeeDetails feeDetail : feeDetailsList) {
-                if (feeDetail != null) {
-                    feeDetail.setCarNo(newCarNo);
-                    tbFeeDetailsService.updateById(feeDetail);
-                }
-            }
-
-        }
     }
 
     public List<TbBusinessCar> findTheNoBusinessCar(String carNo) {
@@ -353,10 +343,6 @@ public class TbBusinessCarService extends ServiceImpl<TbBusinessCarMapper, TbBus
     }
 
     public AjaxJson deleteRecord(String id) {
-        List<TbFeeDetails> tbFeeDetails = tbFeeDetailsService.findByBusinessCarId(id, FeeTypeEnum.PARK_FEE.getCode());
-        if (!tbFeeDetails.isEmpty()) {
-            return AjaxJson.getError("该车有付款记录,不能删除");
-        }
         List<RelationBusinessCar> relationBusinessCars = relationBusinessCarService.findByBusinessCarId(id);
         if (!relationBusinessCars.isEmpty()) {
             return AjaxJson.getError("该车有业务,不能删除");

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

@@ -124,6 +124,10 @@ public class TbBusinessItem extends Model<TbBusinessItem> implements Serializabl
      */
     private String pickBy;
     private String pickByAdminId;
+	/**
+	 * 计价ID
+	 */
+	private String calculateId;
 
 	@TableField(exist = false)
 	private String goodsName;

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

@@ -13,6 +13,7 @@ import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * Model: tb_costomer -- 客户管理
@@ -106,7 +107,7 @@ public class TbCostomer extends Model<TbCostomer> implements Serializable {
      */
     private int payType;
     /**
-     * 类型0、理货员;1、消杀;2、装卸
+     * 类型0、理货员;1、消杀;2、装卸====>收微信通知用
      */
     private String type = "0";
 
@@ -150,6 +151,10 @@ public class TbCostomer extends Model<TbCostomer> implements Serializable {
                     .findFirst().orElseThrow(() -> new BusinessException("不存在")).getDesc();
         }
 
+        public static String getDescs(String type) {
+            return StrUtil.splitTrim(type, ",").stream().map(CustomerEnum::getDesc).collect(Collectors.joining(","));
+        }
+
         public static List<Map<String, String>> getList() {
             List<Map<String, String>> list = new ArrayList<>();
             for (CustomerEnum customerEnum : CustomerEnum.values()) {

+ 19 - 90
sp-server/src/main/java/com/pj/project/tb_fee_details/TbFeeDetailsService.java

@@ -40,6 +40,8 @@ import com.pj.project.tb_fee_details.dto.DetailSumDTO;
 import com.pj.project.tb_fee_details.dto.ExportFeeDetailDTO;
 import com.pj.project.tb_fee_details.dto.PrintFeeDetailDTO;
 import com.pj.project.tb_fee_details.statics.FeeTypeStatics;
+import com.pj.project.tb_fee_item.TbFeeItem;
+import com.pj.project.tb_fee_item.TbFeeItemService;
 import com.pj.project.tb_fee_statistics.TbFeeStatistics;
 import com.pj.project.tb_fee_statistics.TbFeeStatisticsService;
 import com.pj.project.tb_goods.TbGoods;
@@ -85,8 +87,7 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
     private MyConfig myConfig;
     @Resource
     private PartConfig partConfig;
-    @Resource
-    SpRoleMapper spRoleMapper;
+
     @Resource
     TbFeeStatisticsService tbFeeStatisticsService;
     @Resource
@@ -99,6 +100,8 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
     TbDeductionBindService tbDeductionBindService;
     @Resource
     TaskService taskService;
+    @Resource
+    private TbFeeItemService tbFeeItemService;
 
     /**
      * 增
@@ -141,13 +144,6 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
         return list(qw);
     }
 
-    public TbFeeDetails getByBusinessIdAndCarNoAndFeeType(String businessId, String carNo, Integer feeType) {
-        QueryWrapper<TbFeeDetails> qw = new QueryWrapper<>();
-        qw.eq("business_id", businessId);
-        qw.eq("car_no", carNo);
-        qw.eq("fee_type", feeType);
-        return getOne(qw);
-    }
 
     public List<TbFeeDetails> getByBusinessIdAndCarNo(String businessId, String carNo) {
         QueryWrapper<TbFeeDetails> qw = new QueryWrapper<>();
@@ -156,48 +152,6 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
         return list(qw);
     }
 
-    public TbFeeDetails getByBusinessIdAndCarNoAndItemType(String businessId, String carNo, String itemTypeId) {
-        QueryWrapper<TbFeeDetails> qw = new QueryWrapper<>();
-        qw.eq("business_id", businessId);
-        qw.eq("car_no", carNo);
-        qw.eq("item_type_id", itemTypeId);
-        return getOne(qw);
-    }
-
-    /**
-     * 查找放行记录所有的收费明细
-     *
-     * @param businessCarId
-     * @param carNo
-     * @param feeType
-     * @return
-     */
-    public List<TbFeeDetails> getByBusinessCarIdAndCarNoAndFeeType(String businessCarId, String carNo, Integer feeType) {
-        QueryWrapper<TbFeeDetails> qw = new QueryWrapper<>();
-        qw.eq("business_car_id", businessCarId);
-        qw.eq("car_no", carNo);
-        qw.eq("fee_type", feeType);
-        return list(qw);
-    }
-
-    public List<TbFeeDetails> getByBusinessCarIdAndCarNoAndFeeTypeAndPayDay(String businessCarId, String carNo, Integer feeType, String payDay) {
-        QueryWrapper<TbFeeDetails> qw = new QueryWrapper<>();
-        qw.eq("business_car_id", businessCarId);
-        qw.eq("car_no", carNo);
-        qw.eq("fee_type", feeType);
-        qw.eq("pay_day", payDay);
-        return list(qw);
-    }
-
-    public TbFeeDetails findBuCarIdAndCarNoAndFeeTypeAndItemTypeName(String businessCarId, String carNo, Integer feeType, String itemTypeName) {
-        QueryWrapper<TbFeeDetails> qw = new QueryWrapper<>();
-        qw.eq("business_car_id", businessCarId);
-        qw.eq("car_no", carNo);
-        qw.eq("fee_type", feeType);
-        qw.eq("item_type_name", itemTypeName);
-        return getOne(qw);
-    }
-
     public List<TbFeeDetails> findByTransactionId(String transactionId) {
         QueryWrapper<TbFeeDetails> qw = new QueryWrapper<>();
         qw.like("transaction_id", transactionId);
@@ -244,7 +198,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,payType));
+            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 +209,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,payType));
+                taskService.addTask(new FeeDetailSyncTask(RandomUtil.randomNumbers(10), 1000, out24Details.getId(), type, payType));
                 details.add(out24Details);
             }
         }
@@ -352,7 +306,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,payType));
+            taskService.addTask(new FeeDetailSyncTask(RandomUtil.randomNumbers(10), 1000, businessFeeDetail.getId(), type, payType));
             feeDetails.add(businessFeeDetail);
         }
         return feeDetails;
@@ -364,7 +318,7 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
         String beginTime = so.getString("beginTime");
         String endTime = so.getString("endTime");
         String time = "未选时间";
-        if (StrUtil.isNotEmpty(beginTime)&&StrUtil.isNotEmpty(endTime)){
+        if (StrUtil.isNotEmpty(beginTime) && StrUtil.isNotEmpty(endTime)) {
             time = beginTime + "至" + endTime;
         }
         Map<String, String> head = new HashMap<>();
@@ -377,9 +331,9 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
         List<ExportFeeDetailDTO> exportList = new ArrayList<>();
         List<String> ids = so.getListByComma("ids", String.class);
         List<TbFeeDetails> list;
-        if (ids!=null&&!ids.isEmpty()){
-            list=this.listByIds(ids);
-        }else {
+        if (ids != null && !ids.isEmpty()) {
+            list = this.listByIds(ids);
+        } else {
             list = this.getList(so);
         }
         if (list.size() > 2000) {
@@ -387,10 +341,10 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
         }
         int index = 1;
         for (TbFeeDetails feeDetails : list) {
-            String feeType = FeeTypeEnum.getDesc(feeDetails.getFeeType());
+            TbFeeItem tbFeeItem = tbFeeItemService.getById(feeDetails.getFeeType());
             ExportFeeDetailDTO detailDTO = new ExportFeeDetailDTO();
             detailDTO.setBusinessNo(feeDetails.getBusinessNo()).setCarNo(feeDetails.getCarNo())
-                    .setFeeType(feeType).setItemTypeName(feeDetails.getItemTypeName())
+                    .setFeeType(tbFeeItem.getName()).setItemTypeName(feeDetails.getItemTypeName())
                     .setItemName(feeDetails.getItemName()).setItemPrice(feeDetails.getItemPrice())
                     .setPayType(PayEnum.PayType.WX_PAY.getDesc()).setIndex(index++)
                     .setPayMode(PayEnum.PayType.CASH_PAY.getDesc())
@@ -485,8 +439,6 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
     }
 
 
-
-
     public List<TbFeeDetails> findByBusinessCarId(String businessCarId, int feeType) {
         QueryWrapper<TbFeeDetails> ew = new QueryWrapper<>();
         ew.eq("business_car_id", businessCarId);
@@ -508,18 +460,18 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
         BigDecimal allDayNoTaxFee = new BigDecimal(0);
         List<String> ids = so.getListByComma("ids", String.class);
         List<TbFeeDetails> feeDetaillist;
-        if (ids!=null&&!ids.isEmpty()){
-            feeDetaillist=this.listByIds(ids);
-        }else {
+        if (ids != null && !ids.isEmpty()) {
+            feeDetaillist = this.listByIds(ids);
+        } else {
             feeDetaillist = this.getList(so);
         }
         List<ExportFeeDetailDTO> printList = new ArrayList<>();
         Integer index = 1;
         for (TbFeeDetails feeDetails : feeDetaillist) {
-            String feeType = FeeTypeEnum.getDesc(feeDetails.getFeeType());
+            TbFeeItem tbFeeItem=tbFeeItemService.getById(feeDetails.getFeeType());
             ExportFeeDetailDTO detailDTO = new ExportFeeDetailDTO();
             detailDTO.setBusinessNo(feeDetails.getBusinessNo()).setCarNo(feeDetails.getCarNo())
-                    .setFeeType(feeType).setItemTypeName(feeDetails.getItemTypeName())
+                    .setFeeType(tbFeeItem.getName()).setItemTypeName(feeDetails.getItemTypeName())
                     .setItemName(feeDetails.getItemName()).setItemPrice(feeDetails.getItemPrice())
                     .setPayType("微信支付").setIndex(index++)
                     .setPayMode("直接收款")
@@ -775,27 +727,4 @@ public class TbFeeDetailsService extends ServiceImpl<TbFeeDetailsMapper, TbFeeDe
     }
 
 
-    private void setFeeAuto(TbFeeDetails parkFee, TbBusinessCar car, String transactionId, String outTradeNo, Date now) {
-        String nowStr = DateUtil.format(now, "yyyy-MM-dd HH:mm:ss");
-        String toDay = DateUtil.format(now, "yyyy-MM-dd");
-        parkFee.setTaxRate(partConfig.getTaxRate());
-        BigDecimal taxPrice = parkFee.getItemPrice().divide(BigDecimal.valueOf(1).add(parkFee.getTaxRate()), 2, BigDecimal.ROUND_HALF_UP).multiply(parkFee.getTaxRate());
-        taxPrice = taxPrice.setScale(2, BigDecimal.ROUND_HALF_UP);
-        BigDecimal noTaxPrice = parkFee.getItemPrice().subtract(taxPrice);
-        noTaxPrice = noTaxPrice.setScale(2, BigDecimal.ROUND_HALF_UP);
-        parkFee.setBusinessCarId(car.getId())
-                .setCarNo(car.getCarNo())
-                .setNoTaxPrice(noTaxPrice).setTaxPrice(taxPrice)
-                .setFeeType(FeeTypeEnum.PARK_FEE.getCode())
-                .setPayDay(toDay).setPayType(5).setCreateTime(now).setUpdateTime(now)
-                .setIsSettle(1).setPayMode(1).setPayTime(nowStr)
-                .setTransactionId(transactionId).setOutTradeNo(outTradeNo)
-                .setBusinessCarNo(car.getNo());
-        if (StrUtil.isNotEmpty(car.getCustomerId())) {
-            TbCostomer costomer = tbCostomerService.getById(car.getCustomerId());
-            if (costomer != null) {
-                parkFee.setCustomerName(costomer.getName());
-            }
-        }
-    }
 }

+ 1 - 7
sp-server/src/main/java/com/pj/project/tb_fee_details/statics/FeeTypeStatics.java

@@ -15,11 +15,5 @@ public class FeeTypeStatics implements Serializable {
     private Integer feeType;
 
 
-    public String getName() {
-        Integer feeType = this.getFeeType();
-        if (feeType == null) {
-            return this.name;
-        }
-        return FeeTypeEnum.getDesc(feeType);
-    }
+
 }

+ 67 - 0
sp-server/src/main/java/com/pj/project/tb_fee_item/TbFeeItem.java

@@ -0,0 +1,67 @@
+package com.pj.project.tb_fee_item;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.EqualsAndHashCode;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * Model: tb_fee_item -- 统计分类
+ * @author qzy 
+ */
+@Data
+@Accessors(chain = true)
+@TableName(TbFeeItem.TABLE_NAME)
+@EqualsAndHashCode(callSuper = false)
+public class TbFeeItem extends Model<TbFeeItem> implements Serializable {
+
+	// ---------- 模块常量 ----------
+	/**
+	 * 序列化版本id 
+	 */
+	private static final long serialVersionUID = 1L;	
+	/**
+	 * 此模块对应的表名 
+	 */
+	public static final String TABLE_NAME = "tb_fee_item";	
+	/**
+	 * 此模块对应的权限码 
+	 */
+	public static final String PERMISSION_CODE = "tb-fee-item";	
+
+
+	// ---------- 表中字段 ----------
+	/**
+	 *  
+	 */
+	@TableId(type = IdType.AUTO)
+	private Long id;	
+
+	/**
+	 *  
+	 */
+	private Integer feeCode;	
+
+	/**
+	 *  
+	 */
+	private String name;	
+
+	/**
+	 *  
+	 */
+	private Date syncTime;
+
+
+
+
+
+	
+
+
+}

+ 21 - 0
sp-server/src/main/java/com/pj/project/tb_fee_item/TbFeeItemMapper.java

@@ -0,0 +1,21 @@
+package com.pj.project.tb_fee_item;
+
+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_fee_item -- 统计分类
+ * @author qzy 
+ */
+
+@Mapper
+@Repository
+public interface TbFeeItemMapper extends BaseMapper <TbFeeItem> {
+
+
+}

+ 8 - 0
sp-server/src/main/java/com/pj/project/tb_fee_item/TbFeeItemMapper.xml

@@ -0,0 +1,8 @@
+<?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_fee_item.TbFeeItemMapper">
+
+	
+	
+
+</mapper>

+ 22 - 0
sp-server/src/main/java/com/pj/project/tb_fee_item/TbFeeItemService.java

@@ -0,0 +1,22 @@
+package com.pj.project.tb_fee_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 org.springframework.stereotype.Service;
+
+/**
+ * Service: tb_fee_item -- 统计分类
+ * @author qzy 
+ */
+@Service
+public class TbFeeItemService extends ServiceImpl<TbFeeItemMapper, TbFeeItem> implements IService<TbFeeItem> {
+
+
+    public TbFeeItem findByName(String label) {
+        QueryWrapper<TbFeeItem>ew=new QueryWrapper<>();
+        ew.lambda().eq(TbFeeItem::getName,label);
+        return getOne(ew);
+    }
+}

+ 5 - 1
sp-server/src/main/java/com/pj/project/tb_fee_statistics/TbFeeStatisticsController.java

@@ -2,6 +2,7 @@ package com.pj.project.tb_fee_statistics;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import com.pj.constants.business.FeeTypeEnum;
+import com.pj.project.tb_fee_item.TbFeeItemService;
 import com.pj.project4sp.SP;
 import com.pj.utils.sg.AjaxJson;
 import com.pj.utils.so.SoMap;
@@ -10,6 +11,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import java.util.List;
 
 
@@ -27,6 +29,8 @@ public class TbFeeStatisticsController {
      */
     @Autowired
     TbFeeStatisticsService tbFeeStatisticsService;
+    @Resource
+    private TbFeeItemService tbFeeItemService;
 
     /**
      * 增
@@ -170,7 +174,7 @@ public class TbFeeStatisticsController {
 
     @RequestMapping(value = "getFeeType")
     public AjaxJson getFeeType() {
-        return AjaxJson.getSuccessData(FeeTypeEnum.getList());
+        return AjaxJson.getSuccessData(tbFeeItemService.list());
     }
 
 

+ 11 - 7
sp-server/src/main/java/com/pj/project/tb_fee_statistics/TbFeeStatisticsService.java

@@ -18,6 +18,8 @@ import com.pj.project.tb_business_car.TbBusinessCarService;
 import com.pj.project.tb_fee_details.TbFeeDetails;
 import com.pj.project.tb_fee_details.TbFeeDetailsService;
 import com.pj.project.tb_fee_details.dto.ExportFeeDetailDTO;
+import com.pj.project.tb_fee_item.TbFeeItem;
+import com.pj.project.tb_fee_item.TbFeeItemService;
 import com.pj.project.tb_fee_statistics.dto.ExportDayStatsDTO;
 import com.pj.project.tb_fee_statistics.dto.ExportMonthDataDTO;
 import com.pj.project.tb_fee_statistics.dto.PrintDayStatsDTO;
@@ -59,6 +61,8 @@ public class TbFeeStatisticsService extends ServiceImpl<TbFeeStatisticsMapper, T
 
     @Resource
     private MyConfig myConfig;
+    @Resource
+    private TbFeeItemService tbFeeItemService;
 
 
     /**
@@ -112,7 +116,6 @@ public class TbFeeStatisticsService extends ServiceImpl<TbFeeStatisticsMapper, T
     }
 
 
-
     /**
      * 照搬收费明细到日统计
      */
@@ -298,10 +301,10 @@ public class TbFeeStatisticsService extends ServiceImpl<TbFeeStatisticsMapper, T
 
         List<ExportDayStatsDTO> printList = new ArrayList<>();
         for (TbFeeStatistics stats : statsList) {
-            String feeType = FeeTypeEnum.getDesc(stats.getFeeType());
+            TbFeeItem tbFeeItem = tbFeeItemService.getById(stats.getFeeType());
             ExportDayStatsDTO dayStatsDTO = new ExportDayStatsDTO();
             dayStatsDTO.setDayTime(stats.getDay())
-                    .setFeeType(feeType).setNum(stats.getNum())
+                    .setFeeType(tbFeeItem.getName()).setNum(stats.getNum())
                     .setTaxMoney(stats.getTaxMoney())
                     .setTaxRate(stats.getTaxRate())
                     .setTaxes(stats.getTaxes())
@@ -310,7 +313,7 @@ public class TbFeeStatisticsService extends ServiceImpl<TbFeeStatisticsMapper, T
                     .setKaiDanPerson(stats.getKaiDanPerson() != null ? stats.getKaiDanPerson() : "")
                     .setJiChaPerson(stats.getJiChaPerson() != null ? stats.getJiChaPerson() : "")
                     .setDiaoDuPerson(stats.getDiaoDuPerson() != null ? stats.getDiaoDuPerson() : "")
-                    .setJudgeBy(stats.getJudgeBy()==null?"":stats.getJudgeBy());
+                    .setJudgeBy(stats.getJudgeBy() == null ? "" : stats.getJudgeBy());
             if (StrUtil.isNotEmpty(isMonth)) {
                 dayStatsDTO.setDayTime(stats.getMonth());
             }
@@ -372,10 +375,10 @@ public class TbFeeStatisticsService extends ServiceImpl<TbFeeStatisticsMapper, T
 
         List<ExportDayStatsDTO> exportList = new ArrayList<>();
         for (TbFeeStatistics stats : statsList) {
-            String feeType = FeeTypeEnum.getDesc(stats.getFeeType());
+            TbFeeItem tbFeeItem = tbFeeItemService.getById(stats.getFeeType());
             ExportDayStatsDTO dayStatsDTO = new ExportDayStatsDTO();
             dayStatsDTO.setDayTime(stats.getDay())
-                    .setFeeType(feeType).setNum(stats.getNum())
+                    .setFeeType(tbFeeItem.getName()).setNum(stats.getNum())
                     .setTaxMoney(stats.getTaxMoney())
                     .setTaxRate(stats.getTaxRate().multiply(BigDecimal.valueOf(100)))
                     .setTaxes(stats.getTaxes())
@@ -446,10 +449,11 @@ public class TbFeeStatisticsService extends ServiceImpl<TbFeeStatisticsMapper, T
 
     /**
      * 审核
+     *
      * @param id
      */
     public void judge(Long id) {
-      TbFeeStatistics tbFeeStatistics=  this.getById(id);
+        TbFeeStatistics tbFeeStatistics = this.getById(id);
         tbFeeStatistics.setJudgeTime(new Date()).setJudgeBy(StpUserUtil.getCreateBy());
         this.updateById(tbFeeStatistics);
     }

+ 2 - 3
sp-server/src/main/java/com/pj/project/tb_item/TbItem.java

@@ -84,8 +84,8 @@ public class TbItem extends Model<TbItem> implements Serializable {
     private String itemType;
     private Double taxRate;
 
-
-
+    @TableField(exist = false)
+    private List<TbItemFac> facList = new ArrayList<>();
 
 
     @TableField(exist = false)
@@ -110,5 +110,4 @@ public class TbItem extends Model<TbItem> implements Serializable {
     private int inc;
 
 
-
 }

+ 157 - 2
sp-server/src/main/java/com/pj/project/tb_item/TbItemService.java

@@ -1,12 +1,33 @@
 package com.pj.project.tb_item;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 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.CarEnum;
+import com.pj.constants.business.SyncTypeEnum;
+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.bo.ItemTypeBO;
+import com.pj.project.sync.response.item.IExpenseItem;
+import com.pj.project.tb_costomer.TbCostomer;
+import com.pj.project.tb_fee_item.TbFeeItem;
+import com.pj.project.tb_fee_item.TbFeeItemService;
+import com.pj.project.tb_item_fac.TbItemFac;
+import com.pj.project.tb_item_fac.TbItemFacService;
+import com.pj.project.tb_item_type.TbItemType;
+import com.pj.project.tb_item_type.TbItemTypeService;
 import com.pj.utils.so.SoMap;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -15,6 +36,8 @@ import java.util.List;
  * @author qzy
  */
 @Service
+@Slf4j
+@Transactional
 public class TbItemService extends ServiceImpl<TbItemMapper, TbItem> implements IService<TbItem> {
 
     /**
@@ -22,6 +45,16 @@ public class TbItemService extends ServiceImpl<TbItemMapper, TbItem> implements
      */
     @Autowired
     TbItemMapper tbItemMapper;
+    @Resource
+    private HelpService helpService;
+    @Resource
+    RelationTypeItemService relationTypeItemService;
+    @Resource
+    private TbItemTypeService tbItemTypeService;
+    @Resource
+    private TbItemFacService tbItemFacService;
+    @Resource
+    private TbFeeItemService tbFeeItemService;
 
 
     /**
@@ -51,8 +84,130 @@ public class TbItemService extends ServiceImpl<TbItemMapper, TbItem> implements
 
 
     public TbItem findByCode(String code) {
-        QueryWrapper<TbItem>ew=new QueryWrapper<>();
-        ew.lambda().eq(TbItem::getItemCode,code);
+        QueryWrapper<TbItem> ew = new QueryWrapper<>();
+        ew.lambda().eq(TbItem::getItemCode, code);
         return getOne(ew);
     }
+
+    /**
+     * 费项详情
+     *
+     * @param request
+     */
+    public void receive(String request) {
+        IExpenseItem iExpenseItem = helpService.deCrypte(request, IExpenseItem.class);
+        TbItemType tbItemType = tbItemTypeService.findByCode(iExpenseItem.getBizTypeNo());
+        log.info("detail:{}", JSONUtil.toJsonStr(iExpenseItem));
+        if (tbItemType == null) {
+            log.error("类型不存在");
+            return;
+        }
+        String uniqueExpenseId = iExpenseItem.getUniqueExpenseId();
+        String syncType = iExpenseItem.getSyncType();
+        if (StrUtil.equals(syncType, SyncTypeEnum.DELETE.getCode())) {
+            TbItem db = findByCode(uniqueExpenseId);
+            if (db != null) {
+                this.removeById(db.getId());
+                relationTypeItemService.removeByItemId(db.getId());
+            }
+        } else {
+            TbItem tbItem = handlerItem(tbItemType, iExpenseItem, new Date());
+            //多规格费项因子
+            if (StrUtil.equals(iExpenseItem.getPattern(), "RULES")) {
+                handlerFac(iExpenseItem, tbItem);
+            }
+        }
+    }
+
+    /**
+     * 处理费项详情
+     *
+     * @param tbItemType
+     * @param item
+     * @param now
+     * @return
+     */
+    private TbItem handlerItem(TbItemType tbItemType, IExpenseItem item, Date now) {
+        String name = item.getExpenseName();
+        String code = item.getUniqueExpenseId();
+        TbItem tbItem = this.findByCode(code);
+        if (tbItem == null) {
+            tbItem = new TbItem();
+        }
+        TbFeeItem tbFeeItem = tbFeeItemService.getById(tbItemType.getBusinessType());
+        if (tbFeeItem != null) {
+            tbItem.setBusinessType(tbItemType.getBusinessType())
+                    .setBusinessTypeName(tbFeeItem.getName());
+        }
+        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());
+        String businessType = tbItemType.getBusinessType();
+        if (StrUtil.isEmpty(businessType) || StrUtil.equals("0", businessType)) {
+            tbItem.setBusinessType(TbCostomer.CustomerEnum.BUSINESS_TYPE.getType())
+                    .setBusinessTypeName("默认");
+        } else {
+            tbItem.setBusinessType(businessType).setBusinessTypeName(TbCostomer.CustomerEnum.getDescs(businessType));
+        }
+        this.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;
+    }
+
+    /**
+     * 费项因子
+     *
+     * @param item
+     * @param tbItem
+     */
+    private void handlerFac(IExpenseItem item, TbItem tbItem) {
+        item.getRules().forEach(fac -> {
+            Long id = fac.getId();
+            TbItemFac tbItemFac = tbItemFacService.getById(id);
+            if (tbItemFac == null) {
+                tbItemFac = new TbItemFac();
+            }
+            tbItemFac.setName(fac.getPriceFactor().getFacName())
+                    .setTextType(fac.getPriceFactor().getTextType())
+                    .setFacId(fac.getId()).setRangeVal(fac.getPriceFactor().getRangeVal())
+                    .setUnit(fac.getPriceFactor().getUnit());
+            BeanUtil.copyProperties(fac, tbItemFac);
+            tbItemFac.setItemId(tbItem.getId()).setId(id + "");
+            tbItemFacService.saveOrUpdate(tbItemFac);
+        });
+    }
+
+    /**
+     * 停车费规则
+     *
+     * @return
+     */
+    public TbItem getPartItem() {
+        QueryWrapper<TbItem> ew = new QueryWrapper<>();
+        ew.lambda().like(TbItem::getItemName, "停车费");
+        List<TbItem> list = this.list(ew);
+        return list.isEmpty() ? null : list.get(0);
+    }
+
+
+    /**
+     * 根据code删除
+     *
+     * @param uniqueExpenseId
+     */
+    private void removeByCode(String uniqueExpenseId) {
+        QueryWrapper<TbItem> ew = new QueryWrapper<>();
+        ew.lambda().eq(TbItem::getItemCode, uniqueExpenseId);
+        this.remove(ew);
+    }
 }

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

@@ -43,6 +43,7 @@ public class TbItemFac extends Model<TbItemFac> implements Serializable {
 	 *  
 	 */
 	private String name;	
+	private Long facId;
 
 	/**
 	 *  

+ 19 - 4
sp-server/src/main/java/com/pj/project/tb_item_fac/TbItemFacService.java

@@ -2,6 +2,7 @@ package com.pj.project.tb_item_fac;
 
 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.project.tb_item_type.TbItemType;
@@ -14,13 +15,27 @@ import com.pj.utils.sg.*;
 
 /**
  * Service: tb_item_fac -- 费项因子
- * @author qzy 
+ *
+ * @author qzy
  */
 @Service
 public class TbItemFacService extends ServiceImpl<TbItemFacMapper, TbItemFac> implements IService<TbItemFac> {
 
-	/** 底层 Mapper 对象 */
-	@Autowired
-	TbItemFacMapper tbItemFacMapper;
+    /**
+     * 底层 Mapper 对象
+     */
+    @Autowired
+    TbItemFacMapper tbItemFacMapper;
+
+    /**
+     * 费项因子
+     * @param itemId
+     * @return
+     */
+    public List<TbItemFac> getByItemId(String itemId) {
+        QueryWrapper<TbItemFac> ew = new QueryWrapper<>();
+        ew.lambda().eq(TbItemFac::getItemId, itemId);
+        return list(ew);
+    }
 
 }

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

@@ -64,7 +64,7 @@ public class TbItemType extends Model<TbItemType> implements Serializable {
     private Integer inc = 0;
 
     /**
-     * 业务类型1,消杀;2装卸;0默认
+     * 业务类型1,消杀;2装卸;0默认===>和tb_costomer中的type对应
      */
     private String businessType = "0";
     private Integer business = 1;

+ 30 - 2
sp-server/src/main/java/com/pj/project/tb_item_type/TbItemTypeService.java

@@ -3,6 +3,7 @@ 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 cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -19,12 +20,16 @@ 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_fee_item.TbFeeItem;
+import com.pj.project.tb_fee_item.TbFeeItemService;
 import com.pj.project.tb_item.TbItem;
 import com.pj.project.tb_item.TbItemService;
 import com.pj.utils.so.SoMap;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
@@ -39,6 +44,8 @@ import java.util.stream.Collectors;
  * @author qzy
  */
 @Service
+@Slf4j
+@Transactional
 public class TbItemTypeService extends ServiceImpl<TbItemTypeMapper, TbItemType> implements IService<TbItemType> {
 
     /**
@@ -59,6 +66,8 @@ public class TbItemTypeService extends ServiceImpl<TbItemTypeMapper, TbItemType>
 
     @Resource
     private HelpService helpService;
+    @Resource
+    private TbFeeItemService tbFeeItemService;
 
     /**
      * 删
@@ -167,22 +176,41 @@ public class TbItemTypeService extends ServiceImpl<TbItemTypeMapper, TbItemType>
      * @param request
      */
     public void receive(String request) {
+        log.info("同步业务类型:{}", request);
         ItemTypeBO itemTypeBO = helpService.deCrypte(request, ItemTypeBO.class);
+        log.info("解密业务类型:{}", JSONUtil.toJsonStr(itemTypeBO));
         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){
+            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()))
+            String label = itemTypeBO.getLabel();
+            TbFeeItem tbFeeItem = tbFeeItemService.findByName(label);
+            if (tbFeeItem == null) {
+                tbFeeItem = new TbFeeItem();
+                tbFeeItem.setName(label).setSyncTime(now);
+                tbFeeItemService.save(tbFeeItem);
+            }
+
+            int state = itemTypeBO.getState() == 0 ? 1 : 0;
+            db.setSyncTime(now).setName(itemTypeBO.getKeyName()).setStatus(state).setCode(code)
+                    .setBusinessType(tbFeeItem.getId()+"")
                     .setStartTime(itemTypeBO.getStartTime()).setEndTime(itemTypeBO.getEndTime());
+            String partnerIds = itemTypeBO.getPartnersId();
+            if (StrUtil.isNotEmpty(partnerIds)) {
+                List<String> ids = StrUtil.splitTrim(partnerIds, ",");
+                List<TbCostomer> costomerList = tbCostomerService.listByIds(ids);
+                String businessType = costomerList.stream().map(TbCostomer::getType).collect(Collectors.joining(","));
+                db.setBusinessType(businessType);
+            }
             this.saveOrUpdate(db);
         }
 

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

@@ -109,6 +109,7 @@ pushfee-config:
     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/