|
|
@@ -9,14 +9,8 @@ import com.chuanghai.smartschool.tuitionpayment.common.exception.RRException;
|
|
|
import com.chuanghai.smartschool.tuitionpayment.common.utils.CommonResult;
|
|
|
import com.chuanghai.smartschool.tuitionpayment.config.WechatConfig;
|
|
|
import com.chuanghai.smartschool.tuitionpayment.config.WeixiaoConfig;
|
|
|
-import com.chuanghai.smartschool.tuitionpayment.entity.PayItem;
|
|
|
-import com.chuanghai.smartschool.tuitionpayment.entity.PayOrderEntity;
|
|
|
-import com.chuanghai.smartschool.tuitionpayment.entity.PayableInfoEntity;
|
|
|
-import com.chuanghai.smartschool.tuitionpayment.entity.PayableInfoWaterEntity;
|
|
|
-import com.chuanghai.smartschool.tuitionpayment.service.PayItemService;
|
|
|
-import com.chuanghai.smartschool.tuitionpayment.service.PayOrderService;
|
|
|
-import com.chuanghai.smartschool.tuitionpayment.service.PayableInfoService;
|
|
|
-import com.chuanghai.smartschool.tuitionpayment.service.PayableInfoWaterService;
|
|
|
+import com.chuanghai.smartschool.tuitionpayment.entity.*;
|
|
|
+import com.chuanghai.smartschool.tuitionpayment.service.*;
|
|
|
import com.chuanghai.smartschool.tuitionpayment.vo.PayableInfoStudentResultVO;
|
|
|
import com.chuanghai.smartschool.tuitionpayment.vo.WeixiaoVO;
|
|
|
import com.fasterxml.jackson.core.type.TypeReference;
|
|
|
@@ -31,15 +25,14 @@ import org.springframework.http.ResponseEntity;
|
|
|
import org.springframework.http.converter.StringHttpMessageConverter;
|
|
|
import org.springframework.scheduling.annotation.Scheduled;
|
|
|
import org.springframework.stereotype.Controller;
|
|
|
+import org.springframework.util.LinkedMultiValueMap;
|
|
|
+import org.springframework.util.MultiValueMap;
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
import org.springframework.web.client.RestTemplate;
|
|
|
|
|
|
import java.net.URLEncoder;
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* 微信相关接口
|
|
|
@@ -57,14 +50,6 @@ public class WechatController {
|
|
|
@Autowired
|
|
|
private WeixiaoConfig weixiaoConfig;
|
|
|
|
|
|
- /**
|
|
|
- * 用于记录用户的access_token
|
|
|
- */
|
|
|
- private String accessTokenPublic = "";
|
|
|
- /**
|
|
|
- * 用于记录催缴的次数 计时器
|
|
|
- */
|
|
|
- private Integer askCount = 0;
|
|
|
|
|
|
@Autowired
|
|
|
private PayableInfoService payableInfoService;
|
|
|
@@ -78,6 +63,26 @@ public class WechatController {
|
|
|
private FeedbackMsgController feedbackMsgController;
|
|
|
@Autowired
|
|
|
private PayItemService payItemService;
|
|
|
+ @Autowired
|
|
|
+ private SchoolUserService schoolUserService;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 用于记录用户的access_token
|
|
|
+ */
|
|
|
+ private String accessTokenPublic = "";
|
|
|
+ /**
|
|
|
+ * 用于记录催缴的次数 计时器
|
|
|
+ */
|
|
|
+ private Integer askCount = 0;
|
|
|
+ /**
|
|
|
+ * 微校中的学校组织代码
|
|
|
+ */
|
|
|
+ private String schoolOrgId;
|
|
|
+ /**
|
|
|
+ * 用于记录当前获取微校用户的页码信息
|
|
|
+ */
|
|
|
+ private static Integer userPage = 1;
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* 微信授权回调地址
|
|
|
@@ -184,6 +189,8 @@ public class WechatController {
|
|
|
ObjectMapper mapper = new ObjectMapper();
|
|
|
String userInfoUrl = "https://open.wecard.qq.com/cgi-bin/oauth2/token";
|
|
|
Map<String, String> userInfoParam = new HashMap<>();
|
|
|
+ // userInfoParam.put("app_key","48103AB41FFBC5FE");
|
|
|
+ // userInfoParam.put("app_secret", "5B7FB4D3CC243695EED3693044D0FC54");
|
|
|
userInfoParam.put("app_key", weixiaoConfig.getAppKey());
|
|
|
userInfoParam.put("app_secret", weixiaoConfig.getAppSecret());
|
|
|
userInfoParam.put("grant_type", "client_credentials");
|
|
|
@@ -195,56 +202,199 @@ public class WechatController {
|
|
|
});
|
|
|
accessTokenPublic = userInfoMap.get("access_token").toString();
|
|
|
} catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
+ throw new RRException(BizCodeEnume.TOKET_INVALID, "微校token获取失败");
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取微校的组织结构
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @PostMapping("/getSchoolOrg")
|
|
|
+ public String getSchoolOrg() {
|
|
|
+
|
|
|
+ String orgInfoUrl = "https://open.wecard.qq.com/cgi-bin/user/org-edu-list";
|
|
|
+ MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
|
|
|
+ map.add("access_token", accessTokenPublic);
|
|
|
+ RestTemplate restTemplate = new RestTemplate();
|
|
|
+ HttpHeaders headers = new HttpHeaders();
|
|
|
+ headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
|
|
|
+
|
|
|
+ HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(map, headers);
|
|
|
+ ResponseEntity<String> responseEntity = restTemplate.postForEntity(orgInfoUrl, request, String.class);
|
|
|
+ JSONObject jsonObj = JSON.parseObject(responseEntity.getBody());
|
|
|
+
|
|
|
+ JSONArray orgArray = jsonObj.getJSONArray("organization");
|
|
|
+ if (orgArray != null) {
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(orgArray.get(0).toString());
|
|
|
+ schoolOrgId = jsonObject.get("id").toString();
|
|
|
}
|
|
|
+ return schoolOrgId;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 获取微校用户的信息
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @PostMapping("getSchoolUser")
|
|
|
+ @ResponseBody
|
|
|
+ public String getSchoolUser() {
|
|
|
+ //先判断是否获取过学校的组织结构编号
|
|
|
+ if (schoolOrgId == null) {
|
|
|
+ getSchoolOrg();
|
|
|
+ }
|
|
|
+ String userInfoUrl = "https://open.wecard.qq.com/cgi-bin/user/get-org-users";
|
|
|
+ MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
|
|
|
+ map.add("access_token", accessTokenPublic);
|
|
|
+ map.add("org_id", schoolOrgId);
|
|
|
+ map.add("fetch_child", 1);
|
|
|
+ map.add("page", userPage);
|
|
|
+ map.add("page_size", 5000);//5000
|
|
|
+
|
|
|
+ RestTemplate restTemplate = new RestTemplate();
|
|
|
+ HttpHeaders headers = new HttpHeaders();
|
|
|
+ headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
|
|
|
+
|
|
|
+ HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(map, headers);
|
|
|
+ ResponseEntity<String> responseEntity = restTemplate.postForEntity(userInfoUrl, request, String.class);
|
|
|
+ JSONObject jsonObj = JSON.parseObject(responseEntity.getBody());
|
|
|
+ Integer total = Integer.parseInt(jsonObj.get("total").toString());
|
|
|
+ //获得总页码数
|
|
|
+ int totalPage = (int) Math.ceil(total / 5000);//5000
|
|
|
+ JSONArray userlist = jsonObj.getJSONArray("userlist");
|
|
|
+ ObjectMapper mapper = new ObjectMapper();
|
|
|
+ ArrayList<SchoolUser> schoolUserList = new ArrayList<>();
|
|
|
+ if (userlist != null) {
|
|
|
+ userlist.forEach(user -> {
|
|
|
+ SchoolUser schoolUser = new SchoolUser();
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
|
+ int year = calendar.getWeekYear();
|
|
|
+ try {
|
|
|
+ Map<String, Object> jsonMap = mapper.readValue(JSONObject.toJSON(user).toString(), new TypeReference<Map<String, Object>>() {
|
|
|
+ });
|
|
|
+ if (jsonMap.get("card_number") != null) {
|
|
|
+ schoolUser.setCardNumber(jsonMap.get("card_number").toString());
|
|
|
+ String card_number = jsonMap.get("card_number").toString();
|
|
|
+ if (!card_number.startsWith("VIS") && !card_number.startsWith("REG") && !card_number.startsWith("p")) {
|
|
|
+ if (card_number.length() > 5 && card_number.length() < 18) {
|
|
|
+ if (card_number.length() != 11) {
|
|
|
+ schoolUser.setStudentNo(card_number);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (jsonMap.get("serial_number") != null) {
|
|
|
+ if (!(jsonMap.get("serial_number").toString().equals(""))) {
|
|
|
+ schoolUser.setStudentNo(jsonMap.get("serial_number").toString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (jsonMap.get("name") != null) {
|
|
|
+ schoolUser.setName(jsonMap.get("name").toString());
|
|
|
+ }
|
|
|
+ if (jsonMap.get("id_card") != null) {
|
|
|
+ schoolUser.setIdCard(jsonMap.get("id_card").toString());
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ // 通过cardNumbe查询用户是否存在
|
|
|
+ SchoolUser schoolUserInBase = querySchoolUser(schoolUser.getCardNumber());
|
|
|
+ if (schoolUserInBase.getId() != null) {
|
|
|
+ schoolUser.setId(schoolUserInBase.getId());
|
|
|
+ }
|
|
|
+ //将得到的数据封装进list集合中,批量添加数据
|
|
|
+ schoolUserList.add(schoolUser);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ //批量添加数据
|
|
|
+ if (schoolUserList.size() > 0){
|
|
|
+ schoolUserService.saveOrUpdateBatch(schoolUserList);
|
|
|
+ }
|
|
|
+ if (userPage <= totalPage) {
|
|
|
+ userPage += 1;
|
|
|
+ getSchoolUser();
|
|
|
+
|
|
|
+ } else {
|
|
|
+ return String.valueOf(userPage);
|
|
|
+ }
|
|
|
+ return String.valueOf(totalPage);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重置微校的计数页码
|
|
|
+ * @param page
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @GetMapping("resetUserPage")
|
|
|
+ @ResponseBody
|
|
|
+ public String resetUserPage(String page){
|
|
|
+ Integer thisUserOage = userPage;
|
|
|
+ userPage = Integer.parseInt(page);
|
|
|
+ return "修改前页码计数器 --"+thisUserOage+" 修改后页码计数器---"+userPage;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过cardNumber判断该用户是否存在于数据库SchoolUser表当中
|
|
|
+ *
|
|
|
+ * @param cardNumber
|
|
|
+ * @param
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @PostMapping("/querySchoolUser")
|
|
|
+ public SchoolUser querySchoolUser(String cardNumber) {
|
|
|
+ QueryWrapper<SchoolUser> wrapper = new QueryWrapper<>();
|
|
|
+ //通过微校用户的 cardNumber idCard workNo studentNo 四者均为唯一标识查找用户是否存在数据库中
|
|
|
+ wrapper.eq("card_number", cardNumber);
|
|
|
+ List<SchoolUser> list = schoolUserService.list(wrapper);
|
|
|
+ SchoolUser schoolUser = new SchoolUser();
|
|
|
+ if (list.size() > 0) {
|
|
|
+ schoolUser = list.get(0);
|
|
|
+ }
|
|
|
+ return schoolUser;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
* 通过学生姓名 身份证查找用户的cardNumber
|
|
|
*
|
|
|
- * @param studentName
|
|
|
- * @param idCard
|
|
|
+ * @param cardNumber
|
|
|
* @return
|
|
|
*/
|
|
|
@GetMapping("getWeiXiaoToken1")
|
|
|
@ResponseBody
|
|
|
- public String getCardNumber(String studentName, String idCard) {
|
|
|
- //学生cradNumber(2020级以后的为身份证号)
|
|
|
- String card_number = "";
|
|
|
- //学生编号(2020级以后的为学号)
|
|
|
- String serial_number = "";
|
|
|
+ public String getIdCard(String cardNumber) {
|
|
|
|
|
|
RestTemplate client = new RestTemplate();
|
|
|
ObjectMapper mapper = new ObjectMapper();
|
|
|
String userInfoUrl = "https://open.wecard.qq.com/cgi-bin/user/search";
|
|
|
Map<String, String> userInfoParam = new HashMap<>();
|
|
|
userInfoParam.put("access_token", accessTokenPublic);
|
|
|
- userInfoParam.put("keywords", studentName);
|
|
|
+ userInfoParam.put("keywords", cardNumber);
|
|
|
ResponseEntity<String> userInfoResponse = client.postForEntity(userInfoUrl, userInfoParam, String.class);
|
|
|
JSONObject jsonObj = JSON.parseObject(userInfoResponse.getBody());
|
|
|
JSONArray userlist = jsonObj.getJSONArray("userlist");
|
|
|
- for (int m = 0; m < userlist.size(); m++) {
|
|
|
+ String id_card = "";
|
|
|
try {
|
|
|
- Map<String, Object> userInfoMap = mapper.readValue(userlist.get(m).toString(), new TypeReference<Map<String, Object>>() {
|
|
|
+ Map<String, Object> userInfoMap = mapper.readValue(userlist.get(0).toString(), new TypeReference<Map<String, Object>>() {
|
|
|
});
|
|
|
- String id_card = "";
|
|
|
+
|
|
|
if (userInfoMap.get("id_card") != null) {
|
|
|
id_card = userInfoMap.get("id_card").toString();
|
|
|
}
|
|
|
- if (idCard.equals(id_card)) {
|
|
|
- if (userInfoMap.get("card_number") != null) {
|
|
|
- card_number = userInfoMap.get("card_number").toString();
|
|
|
- }
|
|
|
- }
|
|
|
- if (userInfoMap.get("serial_number") != null) {
|
|
|
- serial_number = userInfoMap.get("serial_number").toString();
|
|
|
- }
|
|
|
+
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- return card_number+"-"+serial_number;
|
|
|
+
|
|
|
+ return id_card;
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -287,10 +437,10 @@ public class WechatController {
|
|
|
WeixiaoVO weixiaoVO = new WeixiaoVO();
|
|
|
QueryWrapper<PayableInfoEntity> wrapper = new QueryWrapper<>();
|
|
|
QueryWrapper<PayableInfoWaterEntity> water = new QueryWrapper<>();
|
|
|
- wrapper.eq("pay_notice_type", "1")
|
|
|
- .eq("payment_item", itemName);
|
|
|
- water.eq("pay_notice_type", "1")
|
|
|
- .eq("payment_item", itemName);
|
|
|
+ wrapper.eq("payment_item", itemName)
|
|
|
+ .eq("pay_notice_type", "1");
|
|
|
+ water.eq("payment_item", itemName)
|
|
|
+ .eq("pay_notice_type", "1");
|
|
|
List<PayableInfoEntity> payableInfoEntityList = payableInfoService.list(wrapper);
|
|
|
List<PayableInfoWaterEntity> payableInfoWaterEntityList = payableInfoWaterService.list(water);
|
|
|
|
|
|
@@ -309,10 +459,12 @@ public class WechatController {
|
|
|
payableInfoWaterService.updateById(payableInfoEntityWater);
|
|
|
});
|
|
|
}
|
|
|
+
|
|
|
+ weixiaoVO.setCardNumberList(cardNumberList);
|
|
|
weixiaoVO.setCardNumberList(cardNumberList);
|
|
|
weixiaoVO.setTitle(itemName + "缴纳通知");
|
|
|
- weixiaoVO.setSender("财务办公室");
|
|
|
- weixiaoVO.setContent("同学你好," + itemName + "缴费已经开始,请尽快查看缴费详情完成缴费,谢谢合作!");
|
|
|
+ weixiaoVO.setSender("南昌交通学院");
|
|
|
+ weixiaoVO.setContent("您有一笔" + itemName + "账单,请在尽快缴纳");
|
|
|
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(weixiaoVO);
|
|
|
return notice(jsonObject);
|
|
|
}
|
|
|
@@ -333,7 +485,7 @@ public class WechatController {
|
|
|
QueryWrapper<PayableInfoWaterEntity> water = new QueryWrapper<>();
|
|
|
wrapper.in("pay_item_type", "1", "3")
|
|
|
.eq("payment_item", itemName);
|
|
|
- water.eq("pay_notice_type", "1")
|
|
|
+ water.eq("pay_item_type", "1")
|
|
|
.eq("payment_item", itemName);
|
|
|
List<PayableInfoEntity> payableInfoEntityList = payableInfoService.list(wrapper);
|
|
|
List<PayableInfoWaterEntity> payableInfoWaterEntityList = payableInfoWaterService.list(water);
|
|
|
@@ -349,13 +501,11 @@ public class WechatController {
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
WeixiaoVO weixiaoVO = new WeixiaoVO();
|
|
|
weixiaoVO.setCardNumberList(cardNumberList);
|
|
|
weixiaoVO.setTitle(itemName + "催缴通知");
|
|
|
- weixiaoVO.setSender("财务办公室");
|
|
|
- weixiaoVO.setContent("同学你好," + itemName + "缴费已经开始,请尽快查看缴费详情完成缴费,谢谢合作!");
|
|
|
+ weixiaoVO.setSender("南昌交通学院");
|
|
|
+ weixiaoVO.setContent("您有一笔" + itemName + "账单,请在尽快缴纳");
|
|
|
JSONObject json = (JSONObject) JSONObject.toJSON(weixiaoVO);
|
|
|
return notice(json);
|
|
|
|
|
|
@@ -420,8 +570,8 @@ public class WechatController {
|
|
|
|
|
|
}
|
|
|
weixiaoVO.setCardNumberList(cardNumberList);
|
|
|
- weixiaoVO.setContent("同学你好,你的" + itemName + "缴费订单异常缴费失败,请尽快查看缴费详情,并再次缴费。若为系统原因,请及时反馈!");
|
|
|
- weixiaoVO.setSender("财务办公室");
|
|
|
+ weixiaoVO.setContent("您的" + itemName + "订单缴费失败,请尽快查看缴费详情,并再次缴费。若为系统原因,请及时反馈!");
|
|
|
+ weixiaoVO.setSender("南昌交通学院");
|
|
|
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(weixiaoVO);
|
|
|
notice(jsonObject);
|
|
|
//更新订单异常推送的状态
|
|
|
@@ -490,8 +640,9 @@ public class WechatController {
|
|
|
});
|
|
|
}
|
|
|
weixiaoVO.setCardNumberList(cardNumberList);
|
|
|
- weixiaoVO.setContent("同学你好," + itemName + "缴费详情已经下发,请尽快查看缴费项目并完成缴费,谢谢配合!");
|
|
|
- weixiaoVO.setSender("财务办公室");
|
|
|
+ weixiaoVO.setCardNumberList(cardNumberList);
|
|
|
+ weixiaoVO.setSender("南昌交通学院");
|
|
|
+ weixiaoVO.setContent("您有一笔" + itemName + "账单,请在尽快缴纳");
|
|
|
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(weixiaoVO);
|
|
|
return notice(jsonObject);
|
|
|
} else {
|
|
|
@@ -511,8 +662,9 @@ public class WechatController {
|
|
|
weixiaoVO.setTitle(payableInfoEntity.getPaymentItem() + "缴纳通知");
|
|
|
});
|
|
|
weixiaoVO.setCardNumberList(cardNumberList);
|
|
|
- weixiaoVO.setContent("同学你好," + itemName + "缴费详情已经下发,请尽快查看缴费项目并完成缴费,谢谢配合!");
|
|
|
- weixiaoVO.setSender("财务办公室");
|
|
|
+ weixiaoVO.setCardNumberList(cardNumberList);
|
|
|
+ weixiaoVO.setSender("南昌交通学院");
|
|
|
+ weixiaoVO.setContent("您有一笔" + itemName + "账单,请在尽快缴纳");
|
|
|
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(weixiaoVO);
|
|
|
return notice(jsonObject);
|
|
|
}
|
|
|
@@ -540,7 +692,7 @@ public class WechatController {
|
|
|
weixiaoVO.setTitle("缴费反馈处理通知");
|
|
|
weixiaoVO.setCardNumberList(cardNumberList);
|
|
|
weixiaoVO.setContent(content);
|
|
|
- weixiaoVO.setSender("财务办公室");
|
|
|
+ weixiaoVO.setSender("南昌交通学院");
|
|
|
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(weixiaoVO);
|
|
|
feedbackMsgController.handleFeedbackMsg(id, content);
|
|
|
return notice(jsonObject);
|