Răsfoiți Sursa

Merge branch 'dev' into feature/business

qzyReal 3 ani în urmă
părinte
comite
4209b9300c
41 a modificat fișierele cu 1018 adăugiri și 96 ștergeri
  1. 7 4
      app/apis/api.js
  2. 1 1
      app/manifest.json
  3. 0 2
      app/pages/business-entering/business-entering.vue
  4. 1 5
      app/pages/declare/add.vue
  5. 1 6
      app/pages/disinfect/addDisinfect.vue
  6. 20 1
      app/pages/wx/pay.vue
  7. 17 4
      app/pages/wx/payOrder.vue
  8. 0 5
      sp-admin/.idea/.gitignore
  9. 0 17
      sp-admin/sa-view/tb-business/tb-business-edit.html
  10. 43 1
      sp-admin/sa-view/tb-disinfect/tb-disinfect-list.html
  11. 33 0
      sp-admin/sa-view/tb-fee-statistics/month-statistcs-list.html
  12. 1 1
      sp-admin/sa-view/tb-notices/tb-notices-list.html
  13. 2 1
      sp-admin/sa-view/tb-pass-record/tb-pass-record-list.html
  14. 3 0
      sp-server/src/main/java/com/pj/api/jh/api/JhController.java
  15. 2 0
      sp-server/src/main/java/com/pj/api/jh/bo/JhNotifyBO.java
  16. 49 17
      sp-server/src/main/java/com/pj/api/jh/service/JhService.java
  17. 80 0
      sp-server/src/main/java/com/pj/api/jh/task/CheckPayStatusTask.java
  18. 20 0
      sp-server/src/main/java/com/pj/api/jh/task/StartUpCheckPayStatusTask.java
  19. 22 2
      sp-server/src/main/java/com/pj/api/jh/utils/JhHttpUtils.java
  20. 6 9
      sp-server/src/main/java/com/pj/api/wx/service/WxService.java
  21. 7 8
      sp-server/src/main/java/com/pj/current/SaPlusStartup.java
  22. 1 0
      sp-server/src/main/java/com/pj/current/config/JhConfig.java
  23. 13 0
      sp-server/src/main/java/com/pj/project/tb_business_car/TbBusinessCarService.java
  24. 138 0
      sp-server/src/main/java/com/pj/project/tb_disinfect/ExportDisnfectDTO.java
  25. 5 0
      sp-server/src/main/java/com/pj/project/tb_disinfect/TbDisinfectController.java
  26. 4 0
      sp-server/src/main/java/com/pj/project/tb_disinfect/TbDisinfectMapper.xml
  27. 62 1
      sp-server/src/main/java/com/pj/project/tb_disinfect/TbDisinfectService.java
  28. 28 0
      sp-server/src/main/java/com/pj/project/tb_fee_statistics/ExportMonthDataDTO.java
  29. 6 0
      sp-server/src/main/java/com/pj/project/tb_fee_statistics/TbFeeStatisticsController.java
  30. 87 2
      sp-server/src/main/java/com/pj/project/tb_fee_statistics/TbFeeStatisticsService.java
  31. 85 0
      sp-server/src/main/java/com/pj/project/tb_order/TbOrder.java
  32. 72 0
      sp-server/src/main/java/com/pj/project/tb_order/TbOrderController.java
  33. 30 0
      sp-server/src/main/java/com/pj/project/tb_order/TbOrderMapper.java
  34. 60 0
      sp-server/src/main/java/com/pj/project/tb_order/TbOrderMapper.xml
  35. 89 0
      sp-server/src/main/java/com/pj/project/tb_order/TbOrderService.java
  36. 6 1
      sp-server/src/main/java/com/pj/project/tb_pass_record/TbPassRecord.java
  37. 5 3
      sp-server/src/main/java/com/pj/project/tb_pass_record/TbPassRecordMapper.xml
  38. 11 5
      sp-server/src/main/java/com/pj/project/tb_pass_record/TbPassRecordService.java
  39. 1 0
      sp-server/src/main/resources/application-dev.yml
  40. BIN
      sp-server/src/main/resources/static/disinfect.xlsx
  41. BIN
      sp-server/src/main/resources/static/month-fee.xlsx

+ 7 - 4
app/apis/api.js

@@ -110,12 +110,15 @@ export default {
 	getUnitList() {
 		return ajax.get('/TbUnit/getList')
 	},
-	getPrePay(data) {
-		return ajax.get('/wx/pre-pay', data)
-	},
 	// getPrePay(data) {
-	// 	return ajax.get('/jh/init-pay', data)
+	// 	return ajax.get('/wx/pre-pay', data)
 	// },
+	getPrePay(data) {
+		return ajax.get('/jh/init-pay', data)
+	},
+	checkPayResult(data){
+		return ajax.get('/jh/check-pay-result', data)
+	},
 	getRedirectUrl(data) {
 		return ajax.get('/wx/getRedirectUrl', data)
 	},

+ 1 - 1
app/manifest.json

@@ -85,7 +85,7 @@
     "vueVersion" : "2",
     "h5" : {
         "router" : {
-            "base" : "/h5/",
+            "base" : "/test/",
             "mode" : "history"
         },
         "devServer" : {

+ 0 - 2
app/pages/business-entering/business-entering.vue

@@ -640,8 +640,6 @@
 				}
 				let noNeedIds = this.noNeedIds;
 				let needIds=this.needTypeId;
-				console.log(needIds);
-				console.log(typeList);
 				for(let i in needIds){
 					if(typeList.map(obj=>obj.id).indexOf(needIds[i])==-1){
 						this.$common.toast('缺少必选业务');

+ 1 - 5
app/pages/declare/add.vue

@@ -159,7 +159,7 @@
 				</view>
 			</view>
 			<view class="item">
-				<view class="l"><text style="color: red;">*</text>商铺:</view>
+				<view class="l">商铺:</view>
 				<view class="r">
 					<u-input placeholder="商铺" @input="handler()" v-model="form.shop" />
 				</view>
@@ -473,10 +473,6 @@
 					this.$common.toast('请填写检验检疫证');
 					return;
 				}
-				if (!this.form.shop) {
-					this.$common.toast('请填写商铺');
-					return;
-				}
 				if (!this.form.productionCode) {
 					this.$common.toast('请填写生产批号');
 					return;

+ 1 - 6
app/pages/disinfect/addDisinfect.vue

@@ -65,8 +65,7 @@
 			<view class="item">
 				<view class="l"><text style="color: red;">*</text>规格:</view>
 				<view class="r">
-					<u-input type="number" placeholder="输入规格" @input="handler()" v-model="form.unit">
-						<text slot="suffix">米</text>
+					<u-input  placeholder="输入规格" @input="handler()" v-model="form.unit">
 					</u-input>
 				</view>
 			</view>
@@ -353,10 +352,6 @@
 					this.$common.toast('请填写原产地');
 					return false;
 				}
-				if (!this.$common.isNum(this.form.unit)) {
-					this.$common.toast('规格只能填写数字');
-					return false;
-				}
 				if (!this.form.pack) {
 					this.$common.toast('请填写包装');
 					return false;

+ 20 - 1
app/pages/wx/pay.vue

@@ -196,12 +196,15 @@
 				}
 				let type = this.type;
 				let con = 'A1停车费';
+				let tradeType = 'PORT_PARKING_FEE';
 				if (type == 2) {
 					con = 'A1整车业务';
+					tradeType='PORT_OPERATION_FEE';
 				} else if (type == 1) {
 					con = 'A1车辆消杀'
 				}
 				p.desc = con + '-' + carNos;
+				p.businessType=tradeType;
 				this.$common.showLoading('正在请求...');
 				let that = this;
 				that.$api.getPrePay(that.$common.removeNull(p)).then(resp => {
@@ -220,15 +223,31 @@
 						success: function(res) {
 							if (res.errMsg === "chooseWXPay:ok") {
 								that.$common.toast('支付成功')
+								//that.checkPayResult(data.outTradeNo);
 								that.cars = [];
 								that.item.list = [];
 								that.total = 0
-								// wx.closeWindow();
 							}
+						},
+						complete: function(res) {
+							//that.checkPayResult(data.outTradeNo);
 						}
 					});
 				})
 			},
+			checkPayResult(outTradeNo) {
+				this.$common.showLoading('正在查询结果...')
+				this.$api.checkPayResult({
+					outTradeNo: outTradeNo
+				}).then(resp => {
+					let data = resp.data;
+					if (data.orderStatus == 'SUCCESS' || data.orderStatus == 'FINISH') {
+						this.$common.toast('支付成功')
+					} else {
+						this.$common.toast('支付失败')
+					}
+				})
+			},
 			payTypeChange(value) {
 
 			},

+ 17 - 4
app/pages/wx/payOrder.vue

@@ -176,7 +176,8 @@
 					tradeType: "JSAPI",
 					openid: this.wx.openid
 				}
-				p.desc="A1-业务费用"
+				p.desc = "A1-业务费用";
+				p.businessType='PORT_OPERATION_FEE';
 				this.$api.getPrePay(this.$common.removeNull(p)).then(resp => {
 					let data = resp.data;
 					let that = this;
@@ -189,13 +190,25 @@
 						paySign: data.paySign, // 支付签名
 						success: function(res) {
 							if (res.errMsg === "chooseWXPay:ok") {
-								that.$common.toast('支付成功')
-								// wx.closeWindow();
+								that.checkPayResult(data.outTradeNo);
 							}
 						}
 					});
 				})
-			}
+			},
+			checkPayResult(outTradeNo) {
+				this.$common.showLoading('正在确认结果...')
+				this.$api.checkPayResult({
+					outTradeNo: outTradeNo
+				}).then(resp => {
+					let data = resp.data;
+					if (data.orderStatus == 'SUCCESS' || data.orderStatus == 'FINISH') {
+						this.$common.toast('支付成功')
+					} else {
+						this.$common.toast('支付失败')
+					}
+				})
+			},
 		}
 	}
 </script>

+ 0 - 5
sp-admin/.idea/.gitignore

@@ -1,5 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Editor-based HTTP Client requests
-/httpRequests/

+ 0 - 17
sp-admin/sa-view/tb-business/tb-business-edit.html

@@ -718,23 +718,6 @@
 							sa.error('载重只能输入数字')
 							return;
 						}
-						let checkList = this.itemTypeList;
-						let chechItem = this.checkItem;
-						for (let j in this.needTypeId) {
-							let id = this.needTypeId[j];
-							for (let i in checkList) {
-								let type = checkList[i];
-								let typeName = type.name;
-								if (id == type.id && !type.itemId && typeName !== '特殊车辆' && typeName !== '干杂货人工装卸') {
-									sa.error('选择[' + this.m.goodsName + ']时,[' + typeName + ']必选')
-									return;
-								}
-								if (!chechItem && this.m.goodsName == '干杂货') {
-									sa.error('请选择特殊车辆或干杂货人工装卸之一')
-									return;
-								}
-							}
-						}
 						let typeList = this.itemTypeList.filter(obj => obj.itemId);
 						let needIds = this.needTypeId;
 						for (let i in needIds) {

+ 43 - 1
sp-admin/sa-view/tb-disinfect/tb-disinfect-list.html

@@ -28,6 +28,7 @@
 				<div class="fast-btn">
 <!--					<el-button size="mini" type="primary" @click="add()">新增</el-button>-->
 					<el-button size="mini" type="info" @click="sa.f5()">刷新</el-button>
+					<el-button type="warning" icon="el-icon-download" @click="exportFn()">导出</el-button>
 				</div>
 				<!-- ------------- 数据列表 ------------- -->
 				<el-table class="data-table" ref="data-table" :data="dataList" >
@@ -68,6 +69,21 @@
 				<!-- ------------- 分页 ------------- -->
 				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
 			</div>
+			<el-dialog title="提示" :visible.sync="emodel.visible" width="36%">
+				<span>日期范围:</span>
+				<el-form size="mini">
+					<div class="c-item">
+						<el-date-picker size="mini" v-model="dataTime" type="daterange" unlink-panels="false"
+										range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
+										format="yyyy 年 MM 月 dd 日" value-format="yyyy-MM-dd">
+						</el-date-picker>
+					</div>
+				</el-form>
+				<span slot="footer" class="dialog-footer">
+					<el-button @click="emodel.visible = false">取 消</el-button>
+					<el-button type="primary" @click="sureExport">确 定</el-button>
+				</span>
+			</el-dialog>
 		</div>
 		<script>
 			var app = new Vue({
@@ -108,9 +124,35 @@
 						sortType: 0		// 排序方式 
 					},
 					dataCount: 0,
-					dataList: [], // 数据集合 
+					dataList: [], // 数据集合
+					emodel: {
+						visible: false,
+						form: {
+							beginTime: '',
+							endTime: ''
+						}
+					},
+					dataTime: [],
 				},
 				methods: {
+					exportFn() {
+						Object.assign(this.emodel, {
+							visible: true,
+						})
+					},
+					sureExport() {
+						if (this.dataTime.length != 0) {
+							this.emodel.form.beginTime = this.dataTime[0];
+							this.emodel.form.endTime = this.dataTime[1];
+						} else{
+							sa.msg("请选择日期范围");
+							return;
+						}
+						sa.ajax('/TbDisinfect/export/disinfect', this.emodel.form,  function(resp) {
+							window.open(resp.data);
+							this.emodel.visible = false;
+						}.bind(this));
+					},
 					// 刷新
 					f5: function() {
 						sa.ajax('/TbDisinfect/getList', sa.removeNull(this.p), function(res) {

+ 33 - 0
sp-admin/sa-view/tb-fee-statistics/month-statistcs-list.html

@@ -45,6 +45,7 @@
 						</el-date-picker>
 					</div>
 					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button type="warning" icon="el-icon-download" @click="exportFn()">导出</el-button>
 					<br/>
 				</el-form>
 				<!-- ------------- 快捷按钮 ------------- -->
@@ -77,6 +78,17 @@
 				<!-- ------------- 分页 ------------- -->
 				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
 			</div>
+			<el-dialog title="提示" :visible.sync="emodel.visible" width="38%">
+				<!-- 日期选择器 -->
+				<div class="c-item">
+					<label class="c-label">月份:</label>
+					<el-date-picker type="month" value-format="yyyy-MM" v-model="emodel.form.exportMonth"  placeholder="选择月份"  ></el-date-picker>
+				</div>
+				<span slot="footer" class="dialog-footer">
+					<el-button @click="emodel.visible = false">取 消</el-button>
+					<el-button type="primary" @click="sureExport">确 定</el-button>
+				</span>
+			</el-dialog>
 		</div>
 		<script>
 			var app = new Vue({
@@ -111,8 +123,29 @@
 						beginMonth: '', //查询开始时间
 						endMonth: '', //查询结束时间
 					},
+					emodel: {
+						visible: false,
+						form: {
+							exportMonth: '', //导出月份
+						}
+					},
 				},
 				methods: {
+					exportFn() {
+						Object.assign(this.emodel, {
+							visible: true,
+						})
+					},
+					sureExport() {
+						if (this.emodel.form.exportMonth == '') {
+							sa.msg("请选择月份");
+							return;
+						}
+						sa.ajax('/TbFeeStatistics/export/monthStatistics', this.emodel.form,  function(resp) {
+							window.open(resp.data);
+							this.emodel.visible = false;
+						}.bind(this));
+					},
 					// 刷新
 					f5: function() {
 						if ( this.selectMonth != null && this.selectMonth.length != 0) {

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

@@ -41,7 +41,7 @@
 					<sa-td name="主题" prop="text" ></sa-td>
 <!--					<sa-td name="详情内容" prop="content" type="richtext"></sa-td>-->
 					<sa-td name="类型" prop="type" type="enum" :jv="{0: '公告消息', 1: '业务消息'}"></sa-td>
-					<sa-td name="更新时间" prop="updateTime" type="datetime"></sa-td>
+					<sa-td name="通知时间" prop="updateTime" type="datetime"></sa-td>
 					<el-table-column label="操作" fixed="right"  width="240px">
 						<template slot-scope="s">
 							<el-button class="c-btn" type="success" icon="el-icon-view"  @click="get(s.row)">查看</el-button>

+ 2 - 1
sp-admin/sa-view/tb-pass-record/tb-pass-record-list.html

@@ -40,7 +40,8 @@
 					<sa-td name="入场时间" prop="inTime" ></sa-td>
 					<sa-td name="出场时间" prop="outTime" ></sa-td>
 					<sa-td name="状态" prop="status" type="enum" :jv="{1: '未入场', 2: '已入场', 3: '已出场'}"></sa-td>
-					<sa-td name="更新时间" prop="updateTime" ></sa-td>
+					<sa-td name="停车时长(分钟)" prop="partTime" ></sa-td>
+<!--					<sa-td name="更新时间" prop="updateTime" ></sa-td>-->
 <!--					<el-table-column label="操作" fixed="right"  width="240px">-->
 <!--						<template slot-scope="s">-->
 <!--							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>-->

+ 3 - 0
sp-server/src/main/java/com/pj/api/jh/api/JhController.java

@@ -1,6 +1,8 @@
 package com.pj.api.jh.api;
 
 import cn.hutool.core.util.XmlUtil;
+import cn.hutool.json.JSONUtil;
+import cn.hutool.log.StaticLog;
 import com.pj.api.jh.bo.JhNotifyBO;
 import com.pj.api.jh.service.JhService;
 import com.pj.utils.sg.AjaxJson;
@@ -38,6 +40,7 @@ public class JhController {
     }
     @RequestMapping(value = "notify")
     public String notifyResult(JhNotifyBO bo) {
+        StaticLog.info("聚合支付回调:{}", JSONUtil.toJsonStr(bo));
         jhService.notifyResult(bo);
         return "SUCCESS";
     }

+ 2 - 0
sp-server/src/main/java/com/pj/api/jh/bo/JhNotifyBO.java

@@ -1,9 +1,11 @@
 package com.pj.api.jh.bo;
 
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 @Data
+@Accessors(chain = true)
 public class JhNotifyBO implements Serializable {
     private String businessMerchantNo;
     private String orderPrice;

+ 49 - 17
sp-server/src/main/java/com/pj/api/jh/service/JhService.java

@@ -1,5 +1,6 @@
 package com.pj.api.jh.service;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
@@ -7,6 +8,7 @@ import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import cn.hutool.log.StaticLog;
+import com.pj.api.jh.task.CheckPayStatusTask;
 import com.pj.api.jh.utils.JhHttpUtils;
 import com.pj.api.jh.utils.MerchantApiUtil;
 import com.pj.api.jh.bo.JhNotifyBO;
@@ -16,6 +18,9 @@ import com.pj.api.wx.service.WxService;
 import com.pj.current.config.JhConfig;
 import com.pj.current.config.MyConfig;
 import com.pj.current.config.PartConfig;
+import com.pj.current.task.TaskService;
+import com.pj.project.tb_order.TbOrder;
+import com.pj.project.tb_order.TbOrderService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -25,6 +30,7 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -49,25 +55,34 @@ public class JhService {
 
     @Resource
     JhHttpUtils jhHttpUtils;
+    @Resource
+    private TbOrderService tbOrderService;
+    @Resource
+    private TaskService taskService;
 
-    public JSONObject initPay(HttpServletRequest request) throws Exception {
+    public Map<String, ?> initPay(HttpServletRequest request) throws Exception {
+        if (!jhConfig.isEnable()) {
+            return wxService.prePay(request);
+        }
         String money = request.getParameter("money");
         String openid = request.getParameter("openid");
         String desc = request.getParameter("desc");
         String businessId = request.getParameter("b");
         String c = request.getParameter("c");
         String a = request.getParameter("a");
+        String tradeType = request.getParameter("tradeType");
+        String businessType = request.getParameter("businessType");
         Attach atchMap = new Attach();
         atchMap.setC(c).setB(businessId).setA(a);
-        String out_trade_no = RandomUtil.randomString(30);
-        StaticLog.info("outTradeNo:{}",out_trade_no);
+        String out_trade_no = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + RandomUtil.randomNumbers(6);
+        StaticLog.info("outTradeNo:{}", out_trade_no);
         Map<String, Object> params = new HashMap<>();
         params.put("attach", JSONUtil.toJsonStr(atchMap));
         params.put("productType", jhConfig.getProductType());
         params.put("businessMerchantNo", jhConfig.getBusinessMerchantNo());
         params.put("openId", openid);
         params.put("merchantNo", jhConfig.getBusinessMerchantNo());
-        params.put("tradeType", jhConfig.getTradeType());
+        params.put("tradeType", businessType);
         params.put("subTradeType", "");
         String total_free = partConfig.isTestEnv() ? "0.01" : money + "";
         log.info("order price:{}", total_free);
@@ -85,45 +100,62 @@ public class JhService {
         params.put("sign", sign);
         String jsonParam = JSONUtil.toJsonStr(params);
         String initPayUrl = jhConfig.getServerUrl() + "/uaps-web-gateway/cnpPay/initPay";
-        String result = jhHttpUtils.postJson(initPayUrl,jsonParam);
+        String result = jhHttpUtils.postJson(initPayUrl, jsonParam);
         StaticLog.info("调用聚合支付返回:{}", result);
         JSONObject jsonResult = JSONUtil.parseObj(result);
-        if (StrUtil.equals("0000", jsonResult.get("resultCode").toString())) {
-            JSONObject payMessage = JSONUtil.parseObj(jsonResult.get("payMessage").toString());
+        if (StrUtil.equals("0000", jsonResult.getStr("resultCode"))) {
+            JSONObject payMessage = JSONUtil.parseObj(jsonResult.getStr("payMessage"));
             String p = payMessage.getStr("package");
             Map<String, String> r = wxService.getPayP(payMessage.getStr("timeStamp"), payMessage.getStr("nonceStr"), openid, p);
             StaticLog.info("re:{}", JSONUtil.toJsonStr(r));
             JSONObject object = JSONUtil.parseObj(payMessage);
+
             object.set("outTradeNo", out_trade_no);
-            return object;
+            TbOrder tbOrder = new TbOrder();
+            tbOrder.setAttach(JSONUtil.toJsonStr(atchMap))
+                    .setOpenid(openid)
+                    .setOrderTime(new Date())
+                    .setOutTradeNo(out_trade_no).setPrice(money);
+            tbOrderService.save(tbOrder);
+            taskService.addTask(new CheckPayStatusTask(RandomUtil.randomNumbers(12), 2000, out_trade_no));
+            return BeanUtil.beanToMap(object);
         }
         throw new Exception("支付信息有误");
     }
 
-
-    public JSONObject checkPayResult(String outTradeNo) {
-        String url = jhConfig.getServerUrl() + "/uaps-web-gateway/query/singleOrder";
+    public Map<String, Object> buildCheckParams(String outTradeNo) {
         Map<String, Object> params = new HashMap<>();
         params.put("businessMerchantNo", jhConfig.getBusinessMerchantNo());
         params.put("outTradeNo", outTradeNo);
         String paySecrit = jhConfig.getPaySecret();
         String sign = MerchantApiUtil.getSign(params, paySecrit);
         params.put("sign", sign);
-        String result = jhHttpUtils.postForm(url,params);
-        StaticLog.info("调用聚合支付查询支付接口返回:{}", result);
+        return params;
+    }
+
+    public JSONObject checkPayResult(String outTradeNo) {
+        String url = jhConfig.getServerUrl() + "/uaps-web-gateway/query/singleOrder";
+        Map<String, Object> params = buildCheckParams(outTradeNo);
+        String result = jhHttpUtils.postForm(url, params);
         return JSONUtil.parseObj(result);
     }
+
     @Async
     public void notifyResult(JhNotifyBO bo) {
-        StaticLog.info("聚合支付回调:{}", JSONUtil.toJsonStr(bo));
-        if (!"SUCCESS".equals(bo.getTradeStatus().toUpperCase())){
+        String orderStatus=bo.getTradeStatus();
+        if (!"SUCCESS".equals(orderStatus) && !"FINISH".equals(orderStatus)) {
             return;
         }
-        NotifyBO notifyBO=new NotifyBO();
+        NotifyBO notifyBO = new NotifyBO();
+        String outTradeNo = bo.getOutTradeNo();
         notifyBO.setOutTradeNo(bo.getOutTradeNo())
                 .setAttach(bo.getAttach())
                 .setTransactionId(bo.getBankTrxNo())
-        .setTotalFee(NumberUtil.mul(bo.getOrderPrice(),100+"").toString());
+                .setTotalFee(NumberUtil.mul(bo.getOrderPrice(), 100 + "").toString());
         wxService.WxNotify(notifyBO);
+        TbOrder tbOrder = tbOrderService.findByOutTradeNo(outTradeNo);
+        tbOrder.setOrderStatus(orderStatus)
+                .setTransactionId(bo.getBankTrxNo())
+                .setCompleteDate(bo.getSuccessTime());
     }
 }

+ 80 - 0
sp-server/src/main/java/com/pj/api/jh/task/CheckPayStatusTask.java

@@ -0,0 +1,80 @@
+package com.pj.api.jh.task;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.pj.api.jh.bo.JhNotifyBO;
+import com.pj.api.jh.service.JhService;
+import com.pj.api.jh.utils.JhHttpUtils;
+import com.pj.api.wx.service.WxService;
+import com.pj.current.config.JhConfig;
+import com.pj.current.task.Task;
+import com.pj.project.tb_order.TbOrder;
+import com.pj.project.tb_order.TbOrderService;
+import com.pj.project4sp.global.BusinessException;
+import lombok.extern.slf4j.Slf4j;
+
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.Map;
+
+@Slf4j
+public class CheckPayStatusTask extends Task {
+    private String outTradeNo;
+    private LocalDateTime startTime;
+
+    public CheckPayStatusTask(String id, long delayInMilliseconds, String outTradeNo) {
+        super(id, delayInMilliseconds);
+        this.outTradeNo = outTradeNo;
+        this.startTime = LocalDateTime.now();
+    }
+
+    @Override
+    public void run() {
+        JhConfig jhConfig = SpringUtil.getBean(JhConfig.class);
+        JhService jhService = SpringUtil.getBean(JhService.class);
+        String url = jhConfig.getServerUrl() + "/uaps-web-gateway/query/singleOrder";
+        Map<String, Object> params = jhService.buildCheckParams(outTradeNo);
+        check(url, params);
+    }
+
+    private void check(String url, Map<String, Object> params) {
+        LocalDateTime now = LocalDateTime.now();
+        if (ChronoUnit.MINUTES.between(startTime,now)>5){
+            log.error("超时订单,不再查单:{}",outTradeNo);
+            return;
+        }
+        log.info("开始查单===:{}", JSONUtil.toJsonStr(params));
+        JhHttpUtils jhHttpUtils = SpringUtil.getBean(JhHttpUtils.class);
+        JSONObject result = jhHttpUtils.checkStatus(url, params);
+        String orderStatus = result.getStr("orderStatus");
+        if (StrUtil.equals(orderStatus, "WAITING_PAYMENT")) {
+            try {
+                Thread.sleep(2000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            this.check(url, params);
+        } else if (StrUtil.equals(orderStatus, "SUCCESS") || StrUtil.equals(orderStatus, "FINISH")) {
+            TbOrderService tbOrderService = SpringUtil.getBean(TbOrderService.class);
+            TbOrder tbOrder = tbOrderService.findByOutTradeNo(outTradeNo);
+            if (StrUtil.equals("WAITING_PAYMENT", tbOrder.getOrderStatus())) {
+                tbOrder.setOrderStatus(orderStatus)
+                        .setTransactionId(result.getStr("bankTrxNo"))
+                        .setCompleteDate(result.getStr("completeDate"));
+                tbOrderService.updateById(tbOrder);
+                JhService jhService = SpringUtil.getBean(JhService.class);
+                JhNotifyBO notifyBO = new JhNotifyBO();
+                notifyBO.setAttach(tbOrder.getAttach()).setBankTrxNo(tbOrder.getTransactionId()).setTradeStatus(orderStatus)
+                        .setOutTradeNo(tbOrder.getOutTradeNo()).setOrderPrice(tbOrder.getPrice());
+                jhService.notifyResult(notifyBO);
+            }
+
+        }
+
+    }
+
+
+}

+ 20 - 0
sp-server/src/main/java/com/pj/api/jh/task/StartUpCheckPayStatusTask.java

@@ -0,0 +1,20 @@
+package com.pj.api.jh.task;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.pj.current.task.Task;
+import com.pj.project.tb_order.TbOrder;
+import com.pj.project.tb_order.TbOrderService;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class StartUpCheckPayStatusTask extends Task {
+    public StartUpCheckPayStatusTask(String id, long delayInMilliseconds) {
+        super(id, delayInMilliseconds);
+    }
+
+    @Override
+    public void run() {
+        TbOrderService tbOrderService = SpringUtil.getBean(TbOrderService.class);
+        tbOrderService.check();
+    }
+}

+ 22 - 2
sp-server/src/main/java/com/pj/api/jh/utils/JhHttpUtils.java

@@ -1,11 +1,15 @@
 package com.pj.api.jh.utils;
 
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpException;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.pj.project4sp.global.BusinessException;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.retry.annotation.Backoff;
 import org.springframework.retry.annotation.Retryable;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;
@@ -14,7 +18,7 @@ import java.util.Map;
 @Slf4j
 public class JhHttpUtils {
 
-    @Retryable(maxAttempts = 10, backoff = @Backoff(delay = 1000, maxDelay = 1200))
+    @Retryable(maxAttempts = 10, backoff = @Backoff(delay = 3000, maxDelay = 6200))
     public String postJson(String url, String body) {
         log.info("开始请求接口:{},{}", url, body);
         String resp = HttpUtil.createPost(url)
@@ -26,7 +30,7 @@ public class JhHttpUtils {
         return resp;
     }
 
-    @Retryable(maxAttempts = 10, backoff = @Backoff(delay = 1000, maxDelay = 1200))
+    @Retryable(maxAttempts = 10, backoff = @Backoff(delay = 3000, maxDelay = 4000))
     public String postForm(String url, Map<String, Object> params) {
         log.info("开始请求接口:{},{}", url, JSONUtil.toJsonStr(params));
         String resp = HttpUtil.createPost(url)
@@ -36,4 +40,20 @@ public class JhHttpUtils {
         log.info("接口返回:{},{}", url, resp);
         return resp;
     }
+
+    @Retryable(maxAttempts = 15, backoff = @Backoff(delay = 3000, maxDelay = 10000))
+    public JSONObject checkStatus(String url, Map<String, Object> params) {
+        log.info("检查支付状态:{},{}", url, JSONUtil.toJsonStr(params));
+        String resp = HttpUtil.createPost(url)
+                .setConnectionTimeout(3000)
+                .setReadTimeout(2000)
+                .form(params)
+                .execute().body();
+        log.info("检查支付状态返回:{},{}", url, resp);
+        JSONObject result = JSONUtil.parseObj(resp);
+        if (!StrUtil.equals(result.getStr("resultCode"), "0000")) {
+            throw new BusinessException(result.getStr("errMsg"));
+        }
+        return result;
+    }
 }

+ 6 - 9
sp-server/src/main/java/com/pj/api/wx/service/WxService.java

@@ -2,6 +2,7 @@ package com.pj.api.wx.service;
 
 import cn.hutool.cache.CacheUtil;
 import cn.hutool.cache.impl.TimedCache;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.net.URLDecoder;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.RandomUtil;
@@ -30,6 +31,7 @@ import com.pj.project.tb_costomer.TbCostomer;
 import com.pj.project.tb_costomer.TbCostomerService;
 import com.pj.project.tb_fee_details.TbFeeDetailsService;
 import com.pj.project.tb_fee_statistics.TbFeeStatisticsService;
+import com.pj.project.tb_order.TbOrderService;
 import com.pj.project.tb_pay_record.TbPayRecord;
 import com.pj.project.tb_pay_record.TbPayRecordService;
 import com.pj.utils.cache.RedisUtil;
@@ -64,10 +66,6 @@ public class WxService {
     @Resource
     WxUtils wxUtils;
     @Resource
-    TbPayRecordService tbPayRecordService;
-    @Resource
-    TbCostomerService tbCostomerService;
-    @Resource
     TbBusinessCarService tbBusinessCarService;
     @Resource
     @Lazy
@@ -79,6 +77,7 @@ public class WxService {
     @Resource
     TbFeeDetailsService tbFeeDetailsService;
 
+
     /**
      * 统一下单接口
      */
@@ -181,15 +180,14 @@ public class WxService {
         }
     }
 
-    TimedCache<String, Integer> NotifyCache = CacheUtil.newTimedCache(360000);
 
     @Async
-    public void WxNotify(NotifyBO notifyBO)  {
+    public void WxNotify(NotifyBO notifyBO) {
         String outTradeNo = notifyBO.getOutTradeNo();
-        if (NotifyCache.get(outTradeNo) != null) {
+        if (RedisUtil.get(outTradeNo) != null) {
             return;
         }
-        NotifyCache.put(outTradeNo, 1);
+        RedisUtil.setByHour(outTradeNo, DateUtil.now(), 2);
         String total_fee = notifyBO.getTotalFee();
         BigDecimal money = new BigDecimal(total_fee).divide(new BigDecimal(100), 2, BigDecimal.ROUND_UP);
         String attachStr = notifyBO.getAttach();
@@ -234,7 +232,6 @@ public class WxService {
     }
 
 
-
     public String getRedirectUrl(String path, String state) {
         String redirectUrl = myConfig.getWebDomain() + path;
         String encoderUrl = URLDecoder.decode(redirectUrl, Charset.forName("utf-8"));

+ 7 - 8
sp-server/src/main/java/com/pj/current/SaPlusStartup.java

@@ -1,10 +1,11 @@
 package com.pj.current;
 
-import java.net.InetAddress;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
+import com.pj.api.jh.task.StartUpCheckPayStatusTask;
 import com.pj.current.config.WxConfig;
+import com.pj.current.task.TaskService;
 import com.pj.current.task.TokenTask;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
@@ -41,16 +42,14 @@ public class SaPlusStartup implements CommandLineRunner {
     @Resource
     WxConfig wxConfig;
 
+    @Resource
+    TaskService taskService;
+
     @Override
-    public void run(String... args) throws Exception {
+    public void run(String... args){
         tokenTask.run();
         threadPoolTaskScheduler.scheduleAtFixedRate(tokenTask, wxConfig.getFlushSecond() * 1000);
-        String ip = InetAddress.getLocalHost().getHostAddress();
-        String str = "\n------------- " + applicationName + " (" + active + ") 启动成功 --by " + getNow() + " -------------\n" +
-                "\t- Local:   http://localhost:" + port + path + "\n" +
-                "\t- Local2:  http://127.0.0.1:" + port + path + "\n" +
-                "\t- Network: http://" + ip + ":" + port + path + "\n";
-        log.info("启动信息:{}",str);
+        taskService.addTask(new StartUpCheckPayStatusTask("=========检查正在支付订单状态========",2000L));
     }
 
 

+ 1 - 0
sp-server/src/main/java/com/pj/current/config/JhConfig.java

@@ -20,5 +20,6 @@ public class JhConfig {
     private String tradeType;
     private String paySecret;
     private String serverUrl;
+    private boolean enable;
 
 }

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

@@ -345,4 +345,17 @@ public class TbBusinessCarService extends ServiceImpl<TbBusinessCarMapper, TbBus
       this.removeById(id);
         return AjaxJson.getSuccess();
     }
+
+    public List<TbBusinessCar> findInCarByDay(String day){
+        QueryWrapper<TbBusinessCar> qw = new QueryWrapper();
+        qw.like("real_in_time", day);
+        List<TbBusinessCar> list = this.list(qw);
+        return list;
+    }
+    public List<TbBusinessCar> findOutCarByDay(String day){
+        QueryWrapper<TbBusinessCar> qw = new QueryWrapper();
+        qw.like("real_out_time", day);
+        List<TbBusinessCar> list = this.list(qw);
+        return list;
+    }
 }

+ 138 - 0
sp-server/src/main/java/com/pj/project/tb_disinfect/ExportDisnfectDTO.java

@@ -0,0 +1,138 @@
+package com.pj.project.tb_disinfect;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+public class ExportDisnfectDTO {
+
+    private Integer index;
+
+    private String customerName;
+
+    /**
+     * 发货人
+     */
+    private String sendPeople;
+
+    /**
+     * 收货人
+     */
+    private String receivePeople;
+
+    /**
+     * 品名
+     */
+    private String goodsName;
+
+    /**
+     * 产地
+     */
+    private String origin;
+
+    /**
+     * 数量
+     */
+    private Integer num;
+
+    /**
+     * 重量
+     */
+    private String grossWeight;
+
+    /**
+     * 规格
+     */
+    private Double unit;
+
+    /**
+     * 包装
+     */
+    private String pack;
+
+    /**
+     * 标记
+     */
+    private String flag;
+
+    /**
+     * 号码
+     */
+    private String phone;
+
+    /**
+     * 启运地
+     */
+    private String sourceAddress;
+
+    /**
+     * 到达口岸
+     */
+    private String arrivePart;
+
+    /**
+     * 运输工具
+     */
+    private String carName;
+
+    /**
+     * 运输工具号码
+     */
+    private String carNo;
+
+    /**
+     * 中国运输工具
+     */
+    private String chinaCarName;
+
+    /**
+     * 中国运输号码
+     */
+    private String chinaCarNo;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 申请单位
+     */
+    private String applyUnit;
+
+    /**
+     * 申请人
+     */
+    private String declarePeople;
+
+    /**
+     * 申请人联系号码
+     */
+    private String declarePhone;
+
+    /**
+     * 申请时间
+     */
+    private String applyTime;
+
+    /**
+     * 受理人
+     */
+    private String acceptPeople;
+
+    /**
+     * 受理时间
+     */
+    private String acceptTime;
+
+    /**
+     * 计费(分)
+     */
+    private BigDecimal money;
+
+}

+ 5 - 0
sp-server/src/main/java/com/pj/project/tb_disinfect/TbDisinfectController.java

@@ -80,6 +80,11 @@ public class TbDisinfectController {
 		List<TbDisinfect> list = tbDisinfectService.getList(so.startPage());
 		return AjaxJson.getPageData(so.getDataCount(), list);
 	}
+    @RequestMapping("export/disinfect")
+    public AjaxJson exportDisinfect() throws Exception{
+        SoMap so = SoMap.getRequestSoMap();
+	    return AjaxJson.getSuccessData(tbDisinfectService.exportDisinfect(so));
+    }
 	
 	
 	

+ 4 - 0
sp-server/src/main/java/com/pj/project/tb_disinfect/TbDisinfectMapper.xml

@@ -72,6 +72,10 @@
 			<if test=' this.has("acceptPeople") '> and accept_people = #{acceptPeople} </if>
 			<if test=' this.has("acceptTime") '> and accept_time = #{acceptTime} </if>
 			<if test=' this.has("money") '> and money = #{money} </if>
+            <if test=' this.has("beginTime") and this.has("endTime") '>
+                and apply_time >= #{beginTime}
+                and apply_time  &lt;= #{endTime}
+            </if>
 		</where>
 		order by
 		<choose>

+ 62 - 1
sp-server/src/main/java/com/pj/project/tb_disinfect/TbDisinfectService.java

@@ -1,18 +1,32 @@
 package com.pj.project.tb_disinfect;
 
-import java.util.List;
+import java.io.File;
+import java.io.InputStream;
+import java.util.*;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.fill.FillConfig;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pj.current.config.MyConfig;
 import com.pj.project.tb_business.TbBusiness;
 import com.pj.project.tb_business.TbBusinessMapper;
+import com.pj.project.tb_fee_details.ExportFeeDetailDTO;
+import com.pj.project4sp.uploadfile.UploadUtil;
 import com.pj.utils.so.SoMap;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
 
 import com.pj.utils.sg.*;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
+
 /**
  * Service: tb_disinfect -- 消毒申请单
  * @author qzy 
@@ -24,6 +38,8 @@ public class TbDisinfectService extends ServiceImpl<TbDisinfectMapper, TbDisinfe
 	/** 底层 Mapper 对象 */
 	@Autowired
 	TbDisinfectMapper tbDisinfectMapper;
+	@Resource
+    MyConfig myConfig;
 
 	/** 增 */
 	void add(TbDisinfect t){
@@ -49,6 +65,51 @@ public class TbDisinfectService extends ServiceImpl<TbDisinfectMapper, TbDisinfe
 	List<TbDisinfect> getList(SoMap so) {
 		return tbDisinfectMapper.getList(so);	
 	}
+
+	public String exportDisinfect(SoMap so) throws Exception{
+        Date now = new Date();
+        String nowStr = DateUtil.format(now, "yyyy-MM-dd HH:mm");
+        String beginTime = so.getString("beginTime");
+        String endTime = so.getString("endTime");
+        so.put("beginTime", beginTime + " 00:00:00");
+        so.put("endTime", endTime + " 23:59:59");
+        String time = beginTime + "至" + endTime;
+        Map<String, String> head = new HashMap<>();
+        head.put("time", time);
+        head.put("exportTime", nowStr);
+        List<ExportDisnfectDTO>  exportList = new ArrayList<>();
+        List<TbDisinfect> list = this.getList(so);
+        Integer index = 0;
+        for (TbDisinfect disinfect : list) {
+            ExportDisnfectDTO dto = new ExportDisnfectDTO();
+            BeanUtil.copyProperties(disinfect, dto);
+            Double grossWeight = disinfect.getGrossWeight()*1000;
+            dto.setIndex(++index).setGrossWeight(grossWeight.toString());
+            exportList.add(dto);
+        }
+        String separator = File.separator;
+        String today = DateUtil.today();
+        String rootPath = UploadUtil.uploadConfig.rootFolder + separator + UploadUtil.uploadConfig.httpPrefix;
+        String prefix = myConfig.getDomain() + UploadUtil.uploadConfig.httpPrefix;
+        String extPath = "disinfect" + separator + today + separator;
+        String fileName = "消毒申请记录_" + time + ".xlsx";
+        String savePath = rootPath + separator + extPath;
+        File saveFIle = new File(savePath);
+        if (!saveFIle.exists()) {
+            saveFIle.mkdirs();
+        }
+        ClassPathResource classPathResource = new ClassPathResource("static/disinfect.xlsx");
+        InputStream tempInputStream =classPathResource.getInputStream();
+        ExcelWriter excelWriter = EasyExcel.write(savePath + fileName, ExportFeeDetailDTO.class)
+                .withTemplate(tempInputStream).build();
+        WriteSheet writeSheet = EasyExcel.writerSheet().build();
+        FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();//换行
+        excelWriter.fill(head, writeSheet);
+        excelWriter.fill(exportList, fillConfig, writeSheet);
+        excelWriter.finish();
+        return prefix + "/disinfect/" + today + "/消毒申请记录_" + time + ".xlsx";
+
+    }
 	
 
 }

+ 28 - 0
sp-server/src/main/java/com/pj/project/tb_fee_statistics/ExportMonthDataDTO.java

@@ -0,0 +1,28 @@
+package com.pj.project.tb_fee_statistics;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+/**
+ * Created with IntelliJ IDEA.
+ *
+ * @Auther: lzm
+ * @Date: 2022/05/09/9:56
+ * @Description:
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+public class ExportMonthDataDTO {
+
+    private String index;
+    private String day;
+    private Integer inNum;
+    private Integer outNum;
+    private Integer addNum;
+    private BigDecimal dayMoney;
+
+}

+ 6 - 0
sp-server/src/main/java/com/pj/project/tb_fee_statistics/TbFeeStatisticsController.java

@@ -98,6 +98,12 @@ public class TbFeeStatisticsController {
         TbFeeStatistics feeStatistics = tbFeeStatisticsService.updateParkNum(day);
         return AjaxJson.getSuccessData(feeStatistics);
     }
+
+    @RequestMapping("export/monthStatistics")
+    public AjaxJson exportMonthStatistics() throws Exception{
+        SoMap so = SoMap.getRequestSoMap();
+        return AjaxJson.getSuccessData(tbFeeStatisticsService.exportMonthStatistics(so));
+    }
 	
 	
 	

+ 87 - 2
sp-server/src/main/java/com/pj/project/tb_fee_statistics/TbFeeStatisticsService.java

@@ -1,26 +1,37 @@
 package com.pj.project.tb_fee_statistics;
 
+import java.io.File;
+import java.io.InputStream;
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.Month;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.fill.FillConfig;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.pj.api.wx.bo.PriceBO;
+import com.pj.current.config.MyConfig;
 import com.pj.current.config.PartConfig;
 import com.pj.project.tb_business.TbBusiness;
 import com.pj.project.tb_business.TbBusinessService;
 import com.pj.project.tb_business_car.TbBusinessCar;
 import com.pj.project.tb_business_car.TbBusinessCarService;
 import com.pj.project.tb_business_item.TbBusinessItem;
+import com.pj.project.tb_fee_details.ExportFeeDetailDTO;
 import com.pj.project.tb_fee_details.TbFeeDetails;
 import com.pj.project.tb_fee_details.TbFeeDetailsService;
+import com.pj.project4sp.uploadfile.UploadUtil;
 import com.pj.utils.so.SoMap;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.ClassPathResource;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
@@ -51,6 +62,8 @@ public class TbFeeStatisticsService extends ServiceImpl<TbFeeStatisticsMapper, T
     TbFeeDetailsService tbFeeDetailsService;
     @Resource
     private PartConfig partConfig;
+    @Resource
+    private MyConfig myConfig;
 
     /**
      * 增
@@ -259,4 +272,76 @@ public class TbFeeStatisticsService extends ServiceImpl<TbFeeStatisticsMapper, T
         return feeStatistics;
     }
 
+    public String exportMonthStatistics(SoMap so) throws Exception{
+        String monthStr = so.getString("exportMonth");
+        so.put("month",monthStr);
+        Date month = DateUtil.parse(monthStr, "yyyy-MM");
+        Month monthEnum = DateUtil.monthEnum(month);
+        boolean leap = DateUtil.isLeapYear(DateUtil.year(month));
+        Integer lastDay = monthEnum.getLastDay(leap);
+        Map<String, ExportMonthDataDTO> dataMap = new TreeMap<>();
+        for(int i=1; i<=lastDay ; i++){
+            ExportMonthDataDTO data = new ExportMonthDataDTO();
+            String index = i<10 ? "0"+i : ""+i;
+            String day = monthStr + "-" + index;
+            data.setIndex(index).setDay(day);
+            dataMap.put(index, data);
+        }
+        List<TbFeeStatistics> list = this.getList(so);
+        Integer totalIn = 0;
+        Integer totalOut= 0;
+        Integer totalAdd = 0;
+        BigDecimal totalMoney = BigDecimal.valueOf(0);
+        for (TbFeeStatistics statistics : list) {
+            String day = statistics.getDay();
+            String key = StrUtil.sub(day, 8, 10);
+            ExportMonthDataDTO data = dataMap.get(key);
+            List<TbBusinessCar> inCarList = tbBusinessCarService.findInCarByDay(day);
+            List<TbBusinessCar> outCarList = tbBusinessCarService.findOutCarByDay(day);
+            Integer inNum = inCarList != null ? inCarList.size() : 0;
+            Integer outNum = outCarList != null ? outCarList.size() : 0;
+            Integer addNum = inNum - outNum;
+            data.setDay(day).setInNum(inNum).setOutNum(outNum).setAddNum(addNum).setDayMoney(statistics.getTaxMoney());
+            //dataMap.put(key, data);
+            totalIn += inNum;
+            totalOut += outNum;
+            totalAdd += addNum;
+            totalMoney = totalMoney.add(statistics.getTaxMoney());
+        }
+        List<ExportMonthDataDTO> exportList = new ArrayList<>(dataMap.values()) ;
+
+        Map<String, String> head = new HashMap<>();
+        Integer exportMonth = Integer.valueOf(StrUtil.sub(monthStr, 5,7));
+        String today = DateUtil.today();
+        head.put("exportMonth", exportMonth + "");
+        head.put("exportDay", today);
+        head.put("totalIn", totalIn + "");
+        head.put("totalOut", totalOut + "");
+        head.put("totalAdd", totalAdd + "");
+        head.put("totalMoney", totalMoney.toString());
+
+        String separator = File.separator;
+
+        String rootPath = UploadUtil.uploadConfig.rootFolder + separator + UploadUtil.uploadConfig.httpPrefix;
+        String prefix = myConfig.getDomain() + UploadUtil.uploadConfig.httpPrefix;
+        String extPath = "feeStatistics_month" + separator + today + separator;
+        String fileName = "收费月统计表_" + monthStr + ".xlsx";
+        String savePath = rootPath + separator + extPath;
+        File saveFIle = new File(savePath);
+        if (!saveFIle.exists()) {
+            saveFIle.mkdirs();
+        }
+
+        ClassPathResource classPathResource = new ClassPathResource("static/month-fee.xlsx");
+        InputStream tempInputStream =classPathResource.getInputStream();
+        ExcelWriter excelWriter = EasyExcel.write(savePath + fileName, ExportFeeDetailDTO.class)
+                .withTemplate(tempInputStream).build();
+        WriteSheet writeSheet = EasyExcel.writerSheet().build();
+        FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();//换行
+        excelWriter.fill(head, writeSheet);
+        excelWriter.fill(exportList, fillConfig, writeSheet);
+        excelWriter.finish();
+        return prefix + "/feeStatistics_month/" + today + "/收费月统计表_" + monthStr + ".xlsx";
+    }
+
 }

+ 85 - 0
sp-server/src/main/java/com/pj/project/tb_order/TbOrder.java

@@ -0,0 +1,85 @@
+package com.pj.project.tb_order;
+
+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_order -- 临时订单表
+ * @author qzy 
+ */
+@Data
+@Accessors(chain = true)
+@TableName(TbOrder.TABLE_NAME)
+@EqualsAndHashCode(callSuper = false)
+public class TbOrder extends Model<TbOrder> implements Serializable {
+
+	// ---------- 模块常量 ----------
+	/**
+	 * 序列化版本id 
+	 */
+	private static final long serialVersionUID = 1L;	
+	/**
+	 * 此模块对应的表名 
+	 */
+	public static final String TABLE_NAME = "tb_order";	
+	/**
+	 * 此模块对应的权限码 
+	 */
+	public static final String PERMISSION_CODE = "tb-order";	
+
+
+	// ---------- 表中字段 ----------
+	/**
+	 *  
+	 */
+	@TableId(type = IdType.AUTO)
+	private Long id;	
+
+	/**
+	 * 商户订单号 
+	 */
+	private String outTradeNo;	
+
+	/**
+	 * 额外字段 
+	 */
+	private String attach;	
+
+	/**
+	 * 下单时间 
+	 */
+	private Date orderTime;
+
+	/**
+	 * 用户openid 
+	 */
+	private String openid;	
+
+	/**
+	 * SUCCESS 支付成功 FAILED 支付失败 WAITING_PAYMENT等待支付 FINISH 交易完成
+	 */
+	private String orderStatus;	
+
+	/**
+	 * 金额(元) 
+	 */
+	private String price;
+
+	private String transactionId;
+	private String completeDate;
+
+
+
+
+
+	
+
+
+}

+ 72 - 0
sp-server/src/main/java/com/pj/project/tb_order/TbOrderController.java

@@ -0,0 +1,72 @@
+package com.pj.project.tb_order;
+
+import java.util.List;
+
+import com.pj.utils.so.SoMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import com.pj.utils.sg.*;
+import com.pj.project4sp.SP;
+
+import com.pj.current.satoken.StpUserUtil;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+
+
+/**
+ * Controller: tb_order -- 临时订单表
+ * @author qzy 
+ */
+@RestController
+@RequestMapping("/TbOrder/")
+public class TbOrderController {
+
+	/** 底层 Service 对象 */
+	@Autowired
+	TbOrderService tbOrderService;
+
+
+
+	/** 查 - 根据id */  
+	@RequestMapping("getById")
+	public AjaxJson getById(Long id){
+		TbOrder t = tbOrderService.getById(id);
+		return AjaxJson.getSuccessData(t);
+	}
+
+	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */  
+	@RequestMapping("getList")
+	public AjaxJson getList() { 
+		SoMap so = SoMap.getRequestSoMap();
+		List<TbOrder> list = tbOrderService.getList(so.startPage());
+		return AjaxJson.getPageData(so.getDataCount(), list);
+	}
+	
+	
+	
+	
+	// ------------------------- 前端接口 -------------------------
+	
+	
+	/** 改 - 不传不改 [G] */
+	@RequestMapping("updateByNotNull")
+	public AjaxJson updateByNotNull(Long id){
+		AjaxError.throwBy(true, "如需正常调用此接口,请删除此行代码");
+		// 鉴别身份,是否为数据创建者 
+		long userId = SP.publicMapper.getColumnByIdToLong(TbOrder.TABLE_NAME, "user_id", id);
+		AjaxError.throwBy(userId != StpUserUtil.getLoginIdAsLong(), "此数据您无权限修改");
+		// 开始修改 (请只保留需要修改的字段)
+		SoMap so = SoMap.getRequestSoMap();
+		so.clearNotIn("id", "outTradeNo", "attach", "orderTime", "openid", "orderStatus", "price").clearNull().humpToLineCase();	
+		int line = SP.publicMapper.updateBySoMapById(TbOrder.TABLE_NAME, so, id);
+		return AjaxJson.getByLine(line);
+	}
+	
+	
+	
+	
+	
+	
+
+}

+ 30 - 0
sp-server/src/main/java/com/pj/project/tb_order/TbOrderMapper.java

@@ -0,0 +1,30 @@
+package com.pj.project.tb_order;
+
+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_order -- 临时订单表
+ * @author qzy 
+ */
+
+@Mapper
+@Repository
+public interface TbOrderMapper extends BaseMapper <TbOrder> {
+
+
+
+	/**
+	 * 查集合 - 根据条件(参数为空时代表忽略指定条件)
+	 * @param so 参数集合 
+	 * @return 数据列表 
+	 */
+	List<TbOrder> getList(SoMap so);
+
+
+}

+ 60 - 0
sp-server/src/main/java/com/pj/project/tb_order/TbOrderMapper.xml

@@ -0,0 +1,60 @@
+<?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_order.TbOrderMapper">
+
+	<!-- ================================== 查询相关 ================================== -->
+	<!-- select id, out_trade_no, attach, order_time, openid, order_status, price from tb_order  -->
+	
+	<!-- 通用映射:手动模式 -->
+	<resultMap id="model" type="com.pj.project.tb_order.TbOrder">
+		<result property="id" column="id" />
+		<result property="outTradeNo" column="out_trade_no" />
+		<result property="attach" column="attach" />
+		<result property="orderTime" column="order_time" />
+		<result property="openid" column="openid" />
+		<result property="orderStatus" column="order_status" />
+		<result property="price" column="price" />
+	</resultMap>
+	
+	<!-- 公共查询sql片段 -->
+	<sql id="select_sql">
+		select * 
+		from tb_order 
+	</sql>
+
+	
+	<!-- 查集合 - 根据条件(参数为空时代表忽略指定条件) [G] -->
+	<select id="getList" resultMap="model">
+		<include refid="select_sql"></include>
+		<where>
+			<if test=' this.has("id") '> and id = #{id} </if>
+			<if test=' this.has("outTradeNo") '> and out_trade_no = #{outTradeNo} </if>
+			<if test=' this.has("attach") '> and attach = #{attach} </if>
+			<if test=' this.has("orderTime") '> and order_time = #{orderTime} </if>
+			<if test=' this.has("openid") '> and openid = #{openid} </if>
+			<if test=' this.has("orderStatus") '> and order_status = #{orderStatus} </if>
+			<if test=' this.has("price") '> and price = #{price} </if>
+		</where>
+		order by
+		<choose>
+			<when test='sortType == 1'> id desc </when>
+			<when test='sortType == 2'> out_trade_no desc </when>
+			<when test='sortType == 3'> attach desc </when>
+			<when test='sortType == 4'> order_time desc </when>
+			<when test='sortType == 5'> openid desc </when>
+			<when test='sortType == 6'> order_status desc </when>
+			<when test='sortType == 7'> price desc </when>
+			<otherwise> id desc </otherwise>
+		</choose>
+	</select>
+	
+	
+	
+	
+	
+	
+	
+	
+	
+
+</mapper>

+ 89 - 0
sp-server/src/main/java/com/pj/project/tb_order/TbOrderService.java

@@ -0,0 +1,89 @@
+package com.pj.project.tb_order;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Map;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+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.jh.bo.JhNotifyBO;
+import com.pj.api.jh.service.JhService;
+import com.pj.api.jh.utils.JhHttpUtils;
+import com.pj.api.wx.bo.NotifyBO;
+import com.pj.api.wx.service.WxService;
+import com.pj.current.config.JhConfig;
+import com.pj.project.tb_business.TbBusiness;
+import com.pj.project.tb_business.TbBusinessMapper;
+import com.pj.utils.so.SoMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import com.pj.utils.sg.*;
+
+import javax.annotation.Resource;
+
+/**
+ * Service: tb_order -- 临时订单表
+ *
+ * @author qzy
+ */
+@Service
+public class TbOrderService extends ServiceImpl<TbOrderMapper, TbOrder> implements IService<TbOrder> {
+
+    /**
+     * 底层 Mapper 对象
+     */
+    @Autowired
+    TbOrderMapper tbOrderMapper;
+    @Resource
+    JhHttpUtils jhHttpUtils;
+    @Resource
+    JhConfig jhConfig;
+    @Resource
+    @Lazy
+    JhService jhService;
+
+
+    /**
+     * 查集合 - 根据条件(参数为空时代表忽略指定条件)
+     */
+    List<TbOrder> getList(SoMap so) {
+        return tbOrderMapper.getList(so);
+    }
+
+    @Async
+    public void check() {
+        QueryWrapper<TbOrder> ew = new QueryWrapper<>();
+        ew.eq("order_status", "WAITING_PAYMENT");
+        ew.ge("date_format(order_time,'%Y-%m-%d %H:%i:%s')", LocalDateTime.now().minusMinutes(10).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        List<TbOrder> list = this.list(ew);
+        String url = jhConfig.getServerUrl() + "/uaps-web-gateway/query/singleOrder";
+        list.forEach(tbOrder -> {
+            Map<String, Object> params = jhService.buildCheckParams(tbOrder.getOutTradeNo());
+            JSONObject result = jhHttpUtils.checkStatus(url, params);
+            String orderStatus = result.getStr("orderStatus");
+            if (StrUtil.equals(orderStatus, "SUCCESS") || StrUtil.equals(orderStatus, "FINISH")) {
+                tbOrder.setOrderStatus(orderStatus)
+                        .setTransactionId(result.getStr("bankTrxNo"))
+                        .setCompleteDate(result.getStr("completeDate"));
+                this.updateById(tbOrder);
+                JhNotifyBO notifyBO = new JhNotifyBO();
+                notifyBO.setAttach(tbOrder.getAttach()).setBankTrxNo(tbOrder.getTransactionId()).setTradeStatus(orderStatus)
+                        .setOutTradeNo(tbOrder.getOutTradeNo()).setOrderPrice(tbOrder.getPrice());
+                jhService.notifyResult(notifyBO);
+            }
+        });
+    }
+
+    public TbOrder findByOutTradeNo(String outTradeNo) {
+        QueryWrapper<TbOrder> ew = new QueryWrapper<>();
+        ew.eq("out_trade_no", outTradeNo);
+        return getOne(ew);
+    }
+}

+ 6 - 1
sp-server/src/main/java/com/pj/project/tb_pass_record/TbPassRecord.java

@@ -81,10 +81,15 @@ public class TbPassRecord extends Model<TbPassRecord> implements Serializable {
     private Date outTime;
 
 	/**
-	 * 更新时间 
+	 * 更新时间
 	 */
     private Date updateTime;
 
+    /**
+     * 停车时长(分)
+     */
+    private long partTime;
+
 
 
 

+ 5 - 3
sp-server/src/main/java/com/pj/project/tb_pass_record/TbPassRecordMapper.xml

@@ -5,8 +5,8 @@
 	<!-- 增 [G] -->
 	<insert id="add">
 		insert into 
-		tb_pass_record (id, business_id, customer_id, customer_name, card_no, car_country_name, status, in_time, out_time, update_time)
-		values (#{id}, #{businessId}, #{customerId}, #{customerName}, #{cardNo}, #{carCountryName}, #{status}, #{inTime}, #{outTime}, #{updateTime})
+		tb_pass_record (id, business_id, customer_id, customer_name, card_no, car_country_name, status, in_time, out_time, part_time, update_time)
+		values (#{id}, #{businessId}, #{customerId}, #{customerName}, #{cardNo}, #{carCountryName}, #{status}, #{inTime}, #{outTime}, #{partTime}, #{updateTime})
 	</insert>
 
 	<!-- 删 -->
@@ -32,7 +32,8 @@
 		car_country_name = #{carCountryName},
 		status = #{status}, 
 		in_time = #{inTime}, 
-		out_time = #{outTime}, 
+		out_time = #{outTime},
+		part_time = #{partTime},
 		update_time = #{updateTime}
 		where id = #{id}
 	</update>
@@ -52,6 +53,7 @@
 		<result property="status" column="status" />
 		<result property="inTime" column="in_time" />
 		<result property="outTime" column="out_time" />
+        <result property="partTime" column="part_time" />
 		<result property="updateTime" column="update_time" />
 	</resultMap>
 	

+ 11 - 5
sp-server/src/main/java/com/pj/project/tb_pass_record/TbPassRecordService.java

@@ -3,6 +3,8 @@ package com.pj.project.tb_pass_record;
 import java.util.Date;
 import java.util.List;
 
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -65,11 +67,15 @@ public class TbPassRecordService extends ServiceImpl<TbPassRecordMapper, TbPassR
         if(record == null)
             record = new TbPassRecord();
         record.setBusinessId(businessId)
-                .setCustomerId(customerId).setCustomerName(customerName)
-                .setCardNo(carNo).setStatus(status)
-                .setInTime(inTime).setOutTime(outTime)
-                .setCarCountryName(carCountryName)
-                .setUpdateTime(new Date());
+            .setCustomerId(customerId).setCustomerName(customerName)
+            .setCardNo(carNo).setStatus(status)
+            .setInTime(inTime).setOutTime(outTime)
+            .setCarCountryName(carCountryName)
+            .setUpdateTime(new Date());
+        if(record.getInTime() != null && record.getOutTime() != null){
+            long minutes = DateUtil.between(record.getInTime(), record.getOutTime(), DateUnit.MINUTE);
+            record.setPartTime(minutes);
+        }
         saveOrUpdate(record);
     }
 

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

@@ -84,3 +84,4 @@ jh-config:
     trade-type: GAS_PAY
     pay-secret: f0b9d6ea704d4c03a6b44be50d055025
     server-url: http://116.252.74.15:8081
+    enable: true

BIN
sp-server/src/main/resources/static/disinfect.xlsx


BIN
sp-server/src/main/resources/static/month-fee.xlsx