feat: 东区缴费分支初始化

This commit is contained in:
2025-05-15 15:08:15 +08:00
parent 39f3acc15f
commit bafd4aa3ab
261 changed files with 3751 additions and 9416 deletions
+6 -18
View File
@@ -148,30 +148,18 @@
<version>${wxpay.apiv3.version}</version>
<scope>compile</scope>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.github.wechatpay-apiv3</groupId>-->
<!-- <artifactId>wechatpay-apache-httpclient</artifactId>-->
<!-- <version>${wxpay.apiv3.version}</version>-->
<!-- <scope>compile</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-apache-httpclient</artifactId>
<version>${wxpay.apiv3.version}</version>
<scope>compile</scope>
</dependency>
<!-- 二维码依赖 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>${qr.code.version}</version>
</dependency>
<!-- 百度api -->
<dependency>
<groupId>com.baidu.aip</groupId>
<artifactId>java-sdk</artifactId>
<version>${baidu.api.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
@@ -8,24 +8,15 @@ public enum ModuleName {
AUTH("认证中心"),
APPLY_PARODUCT("应用商品"),
ATTENDANCE("考勤"),
DEVICE("设备"),
LETTER_BOX("校长信箱"),
NOTICE("通知"),
SCHOOL("校园主页"),
STUDENT_EXAM("考试管理"),
USER("用户管理"),
STUDENT("学生管理"),
STAFF("职工管理"),
JOB("任务调度"),
SYSTEM("系统管理"),
DEPT("系统部门"),
USER_DEPT("家校部门"),
INSTRUCTION("系统指南"),
ELECTRONIC_STUDENT_CARD("电子学生证"),
TELEPHONE("亲情电话"),
COURSE("课程表"),
PRODUCT("商品管理"),
TRANSATION("交易管理"),
HEALTH("健康管理");
@Getter
String name;
@@ -21,29 +21,22 @@ public enum ResultMsgType {
IMPORT_EXCEL_FAIL("导入失败!", 500),
FILE_TYPE_ERROR("导入文件类型错误", 500),
ID_CARD_EXIST("身份证号码已存在!", 500),
STUDENT_CARD_NUMBER_EXIST("校园学号已存在!", 500),
STUDENT_NUMBER_EXIST("学号已存在!", 500),
STUDENT_NUMBER_NOT_EXIST("学号不存在!", 500),
CAMPUS_NAME_ERROR("学区名称错误", 500),
SECTION_NAME_ERROR("学段名称错误", 500),
GRADE_NAME_ERROR("年级名称错误", 500),
CLASS_NAME_ERROR("班级名称错误", 500),
START_DATE_ERROR("入学时间错误", 500),
SERVER_ERROR("服务器繁忙!请稍后再试", 500),
LOGIN_INFO_ERROR("用户登陆信息异常", 500),
PAY_TYPE_ERROR("暂不支持此支付方式", 500),
ORDER_FAIL("创建订单失败!请稍后再试", 500),
ORDER_NOT_FOUND("未找到订单信息", 500),
ORDER_INVALID("该订单已失效!无法执行该操作", 500),
ORDER_QUERY_FAIL("订单查询失败", 500),
ORDER_CLOSE_FAIL("关闭订单失败", 500),
ORDER_REFUND_FAIL("订单退款失败", 500),
REFUND_QUERY_FAIL("退款查询失败", 500),
ORDER_MONEY_ERROR("订单金额异常", 500),
CARD_STATUS_ERROR("卡状态异常", 500),
;
private final String value;
@@ -91,12 +91,6 @@ public class CurrentUser implements Serializable {
*/
private String mainRolePerms;
/**
* 学校性质:0幼儿园,1小学,2中学,3九年一贯,4十二年一贯,5:高校
*/
private Integer schoolNature;
@JsonIgnore
private EduUserLogo userLogo;
}
@@ -55,8 +55,6 @@ public class FebsAuthUser extends User {
private String status;
private Integer schoolNature;
private String deptIds;
private Long identityId;
@@ -35,9 +35,6 @@ public class EduAttendanceRecord {
private String className;
@ApiModelProperty("0上学,1宿舍")
private Integer type;
@ApiModelProperty("宿舍id")
private Long dormId;
@@ -86,8 +83,5 @@ public class EduAttendanceRecord {
@ApiModelProperty("该条记录使用的考勤时间段")
private Long ruleTimeId;
@ApiModelProperty("考勤时间段类型:0开始时间,1结束时间")
private Integer ruleTimeType;
private transient String deviceName;
}
@@ -109,15 +109,9 @@ public class EduAttendanceResult {
/**
* 考勤结果,100-正常, 201-迟到,202-早退,203-迟到早退,204-旷课,205-请假, 211-晚归,212-异常晚归,213-旷宿,214-已被核查但学生还未归寝
*/
@ApiModelProperty(value = "考勤结果,100-正常,201-迟到,202-早退,203-迟到早退,204-旷课,205-请假,206-上班未打卡|下班正常,207-上班未打卡|下班早退,208-上班未打卡|下班未在有效打卡时间段内,209-上班未在有效打卡时间段内|下班早退,210-上班迟到|下班未打卡,211-晚归,212-异常晚归,213-旷宿,214-已被核查但学生还未归寝")
@ApiModelProperty(value = "考勤结果,100-正常,201-迟到,202-早退,203-迟到早退,204-旷课,205-请假,211-晚归,212-异常晚归,213-旷宿,214-已被核查但学生还未归寝")
@TableField("status")
private Integer status;
@ApiModelProperty(value = "开始时间考勤结果1正常,0异常,空未打卡")
@TableField("begin_status")
private Integer beginStatus;
@ApiModelProperty(value = "结束时间考勤结果1正常,0异常,空未打卡")
@TableField("end_status")
private Integer endStatus;
/**
* 核查时间
@@ -171,7 +165,4 @@ public class EduAttendanceResult {
@ApiModelProperty("学号")
private transient String stuNo;
@ApiModelProperty("类型:1宿舍考勤,0上学考勤")
private transient Integer type;
}
@@ -11,7 +11,6 @@ import java.time.LocalDateTime;
@Data
@ApiModel("规则设备")
public class EduAttendanceRuleDevice {
@TableId(type = IdType.AUTO)
private Long id;
@@ -24,12 +23,9 @@ public class EduAttendanceRuleDevice {
@ApiModelProperty("设备编号")
private String deviceSn;
@ApiModelProperty("设备名称")
private String deviceName;
@ApiModelProperty("创建时间")
private LocalDateTime createDate;
@ApiModelProperty("创建人ID")
private Long createId;
@@ -1,13 +1,11 @@
package com.yida.data.common.core.entity.attendance;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import java.time.LocalDateTime;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
@@ -62,21 +60,10 @@ public class EduAttendanceStaffResult {
/**
* 考勤结果,0-正常,1-迟到,2-早退,3-旷工,4-迟到早退,5-上班未在打卡时间段,6-下班未在打卡时间段
*/
@ApiModelProperty(value = "考勤结果,0-正常,1-迟到,2-早退,3-旷工,4-迟到早退,5-上班未在打卡时间段,6-下班未在打卡时间段,7-上班未在打卡时间段|早退,8-上班迟到|下班未打卡")
@ApiModelProperty(value = "考勤结果,0-正常,1-迟到,2-早退,3-旷工,4-迟到早退,5-上班未在打卡时间段,6-下班未在打卡时间段")
@TableField("status")
private Integer status;
/**
* 上班考勤状态 0 正常 1 异常
*/
@TableField("start_status")
private Integer startStatus;
/**
* 下班考勤状态 0 正常 1 异常
*/
@TableField("end_status")
private Integer endStatus;
/**
* 考勤日期
*/
@@ -105,14 +92,4 @@ public class EduAttendanceStaffResult {
@DateTimeFormat(pattern = "HH:mm:ss")
@JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss")
private LocalTime endRealTime;
@TableField(value = "CREATE_TIME", fill = FieldFill.INSERT)
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE)
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}
@@ -3,18 +3,9 @@ package com.yida.data.common.core.entity.constant;
public interface AppConstant {
/**
* 通讯录(用于操作) https://developer.work.weixin.qq.com/document/path/96078
* 通讯录
*/
String CONTACT = "通讯录";
/**
* 通讯录(用于查询) 职工端智慧迎新
*/
String CONTACT_SELECT = "contact_resources";
/**
* 家校沟通
*/
String CONTACT_SCHOOL = "家校沟通";
/**
@@ -89,28 +80,8 @@ public interface AppConstant {
*/
String TEACHER_LEAVE_REQUEST = "teacher_leave_request";
/**
* 请假家长端
*/
String STUDENT_LEAVE_REQUEST = "student_leave_request";
/**
* 访客教师端
*/
String VISITOR_STAFF = "visitor_staff";
/**
* 微官网 家长端智慧迎新
*/
String INDEX_PARENT = "index_parent";
/**
* 查寝
*/
String DORM_ATTENDANCE_STAFF = "dorm_attendance_staff";
/**
* 智慧迎新职工端
*/
String SMART_WELCOME_STAFF = "smart_welcome_staff";
}
@@ -2,31 +2,11 @@ package com.yida.data.common.core.entity.constant;
public interface CachePrefixConstant {
/**
* 企业微信服务商缓存前缀
*/
String SYS_SERVICE_PROVIDER = "sys:service:provider.";
/**
* 企业微信应用缓存前缀
*/
String SYS_APP = "sys:app.";
/**
* 系统白名单信息
*/
String SYS_WHITE_LIST = "sys:white:list.";
/**
* 部门对应的第三方系统功能
*/
String SYS_DEPT_FUNCTION = "sys:dept:function.";
/**
* 企业微信应用模板缓存前缀
*/
String SYS_APP_TEMPLATE = "sys:app.template.";
/**
* 部门公众号
*/
@@ -81,18 +61,6 @@ public interface CachePrefixConstant {
String IMPORT_STUDENT_KEY = "import.student.";
String IMPORT_STUDENT_FILE = "import.student.file.";
String IMPORT_STUDENT_CARD_NUMBER_KEY = "import.student.cardNo";
/**
* 学生导出信息
*/
String EXPORT_STUDENT_DATA = "student:data:export.";
/**
* 学生宿舍导出信息
*/
String EXPORT_STUDENT_DORM_DATA = "student:dorm:data:export.";
/**
* 登录用户将要登录的部门id
*/
@@ -139,31 +107,6 @@ public interface CachePrefixConstant {
*/
String UNION_PAY_CONFIG = "sys:union.pay.config";
/**
* 建行支付配置信息
*/
String CONSTRUCTION_PAY_CONFIG = "sys:construction.pay.config";
/**
* 收钱吧支付配置信息
*/
String U_PAY_CONFIG = "sys:u.pay.config";
/**
* 百度api配置信息
*/
String BAI_DU_API_CONFIG = "baidu:api.config";
/**
* 学校收钱吧终端信息
*/
String DEPT_CONSUME_TERMINAL = "dept:consume:terminal.";
/**
* 学校消费机服务器信息
*/
String CONSUME_CONFIG = "sys:consume.config";
//------------------学校-------------------
/**
* 导入寝室 进度信息
@@ -183,20 +126,11 @@ public interface CachePrefixConstant {
//------------------用户-------------------
String STUDENT_DATA = "user:student.data";
//------------------用户-------------------
String STUDENT_BASE_DATA = "user:student.base.data";
/**
* 导入住宿学生 进度信息
*/
String IMPORT_STUDENT_DORM = "user:studentDorm.import";
/**
* 导入学生类型 进度信息
*/
String IMPORT_STUDENT_TYPE = "user:studentType.import";
/**
* 学生在校离校,在寝不在寝状态
*/
@@ -229,11 +163,6 @@ public interface CachePrefixConstant {
*/
String ISSUE_FACE_ERROR_MSG = "user:face:issue.error.msg.";
/**
* 设备组人脸下发成功数量
*/
String ISSUE_GROUP_USER_FACE_SUCCESS = "group.user.face.success.";
/**
* 大华code与人员id对应
*/
@@ -256,11 +185,6 @@ public interface CachePrefixConstant {
*/
String DEVICE_DATA = "attendance:device:data";
/**
* 设备数据
*/
String DEVICE_DATA_BY_ID = "attendance:device:id:data";
/**
* 最新考勤记录时间
*/
@@ -276,31 +200,11 @@ public interface CachePrefixConstant {
*/
String ISSUE_FACE_GROUP_DEVICE = "attendance:device:face-group.";
/**
* 设备下发的人脸组鼠标数量
*/
String ISSUE_FACE_GROUP_DEVICE_NUMBER = "attendance:device:face-group.number.";
/**
* 海清设备批量编辑列表
*/
String HQ_EDIT_BATCH = "hq.edit.batch.";
/**
* 海清人脸新增信息
*/
String HQ_BATCH_ADD = "hq.batch.add.";
/**
* 海清人脸新编辑信息
*/
String HQ_BATCH_EDIT = "hq.batch.edit.";
/**
* 接收的认证消息缓存
*/
String HQ_RECEIVE_INFO = "hq.receive.info.";
//--------------商品订单------------------
/**
@@ -436,13 +340,6 @@ public interface CachePrefixConstant {
* 宿舍信息
*/
String FACILITY_DORM_ROOM = "facility:dorm:room";
// --------------------宿舍数据-----------------
/**
* 宿舍信息
*/
String FACILITY_DORM_MASTER = "facility:dorm:master.";
// --------------------第二课堂----------------
/**
* 菜单配置
@@ -469,7 +366,7 @@ public interface CachePrefixConstant {
String BILL_ORDER = "bill.order.";
/**
* 账单订单调起支付所需参数,微信jsapi为prepay_id,微信h5为支付地址,银联支付为支付地址
* 账单订单调起支付所需参数,微信jsapi为prepay_id,微信h5为回调地址,银联支付为支付地址
*/
String BILL_ORDER_FLAG = "bill.order.flag.";
@@ -508,27 +405,6 @@ public interface CachePrefixConstant {
*/
String BILL_PAY_DETAIL_EXPORT_URL = "bill:pay:detail:export:url:";
// --------------------消费充值----------------
/**
* 学生消费订单缓存
*/
String CONSUME_ORDER_STUDENT = "consume.order.student.";
/**
* 消费订单信息
*/
String CONSUME_ORDER = "consume.order.";
/**
* 消费订单调起支付所需参数,微信jsapi为prepay_id,微信h5为支付地址,银联支付为支付地址,收钱吧为支付地址
*/
String CONSUME_ORDER_FLAG = "consume.order.flag.";
/**
* 商品描述
*/
String CONSUME_ORDER_DESC = "充值缴费";
// -----------摄像头-------------------------
/**
* 摄像头
@@ -542,41 +418,6 @@ public interface CachePrefixConstant {
*/
String USER_PIC_DOWNLOAD = "user:pic:downLoad.";
/**
* 职工通行记录下载
*/
String STAFF_ATTENDANCE_RECORD_DOWNLOAD = "staff:attendance:record:downLoad.";
/**
* 职工考勤记录下载
*/
String STAFF_ATTENDANCE_RESULT_DOWNLOAD = "staff:attendance:result:downLoad.";
/**
* 学生宿舍考勤下载
*/
String STUDENT_DORM_ATTENDANCE_RESULT_DOWNLOAD = "student:dorm:attendance:result:downLoad.";
/**
* 通行记录下载
*/
String ATTENDANCE_RECORD_DOWNLOAD = "attendance:record:download.";
/**
* 考勤日报下载
*/
String ATTENDANCE_DAY_REPORT_DOWNLOAD = "attendance:day:report:download.";
/**
* 商品购买情况下载
*/
String PRODUCT_BUY_DATA_DOWNLOAD = "product:buy:data:downLoad.";
/**
* 下载学生照片
*/
@@ -590,7 +431,7 @@ public interface CachePrefixConstant {
/**
* 学校对应关键功能点配置
*/
String SCHOOL_FUNCATION_CODE = "school:funcation:code:";
String SCHOOL_FUNCATION_CODE = "school:funcation:code.";
String ATTENDANCE_DORMITORY_CLASS = "attendance:Dormitory:class.";
@@ -599,9 +440,6 @@ public interface CachePrefixConstant {
String STAFF_MANGE_DEPT = "staff:mange:dept.";
String STAFF_MANGE_CLASS = "staff:mange:class.";
/**
* 对应设备策略id(人脸组id)缓存
*/
@@ -641,165 +479,6 @@ public interface CachePrefixConstant {
String ADD_MANUSCRIPT_PROGRESS = "add:manuscript:progress";
// --------------------智慧迎新-----------------
/**
* 花名册下载缓存
*/
String GUIDE_ROSTER_DATA_DOWNLOAD = "guide:roster:data:download.";
/**
* 花名册身份证、通知书下载图片缓存
*/
String GUIDE_ROSTER_PIC_DATA_DOWNLOAD = "guide:roster:pic:data:download.";
// --------------------智慧迎新-----------------
/**
* 新生迎新步骤信息
*/
String GUIDE_ROSTER_STEP_DATA = "guide:roster:step:data.";
/**
* 花名册人员迎新订单缓存
*/
String GUIDE_STEP_ORDER_ROSTER = "guide.step.order.roster.";
/**
* 迎新步骤订单缓存
*/
String GUIDE_STEP_ORDER = "guide.step.order.";
/**
* 迎新订单调起支付所需参数,微信jsapi为prepay_id,微信h5为支付地址,银联支付为支付地址,建行为支付地址
*/
String GUIDE_STEP_ORDER_FLAG = "guide.step.order.flag.";
/**
* 智慧迎新导入学生人脸
*/
String IMPORT_GUIDE_AVATAR_KEY = "guide:avatar:import.key.";
/**
* 智慧迎新导入花名册
*/
String IMPORT_GUIDE_ROSTER_KEY = "guide:roster:import.key.";
/**
* 智慧迎新系部专业数据
*/
String WELCOME_DEPARTMENT_DATA = "welcome:department:data.";
/**
* 智慧迎新预分班级数据
*/
String WELCOME_CLASS_DATA = "welcome:class:data.";
/**
* 智慧迎新班级对应人员数量
*/
String WELCOME_CLASS_STUDENT_NUMBER = "welcome:class:student:number:";
/**
* 智慧迎新预分宿舍数据
*/
String WELCOME_DORM_DATA = "welcome:dorm:data.";
/**
* 智慧迎新宿舍对应人员数量
*/
String WELCOME_DROM_STUDENT_NUMBER = "welcome:dorm:student:number:";
/**
* 智慧迎新宿舍对应人员数量
*/
String WELCOME_DROM_STUDENT_NUMBER_BUDING = "welcome:dorm:student:number:buding";
/**
* 智慧迎新预分班级导入进度
*/
String WELCOME_CLASS_IMPOST_PROGRESS = "welcome:class:import:progress:";
/**
* 智慧迎新预分宿舍导入进度
*/
String WELCOME_DORM_IMPOST_PROGRESS = "welcome:dorm:import:progress:";
/**
* 智慧迎新花名册信息
*/
String WELCOME_ROSTER = "welcome:roster";
/**
* 学生考勤结果 每月记录
*/
String ATTENDANCE_DATE_STATUS = "attendance:date:status.";
/**
* 管理员查看 每月记录
*/
String ATTENDANCE_MANAGE_DATE_STATUS = "attendance:manage:date:status.";
/**
* 学生考勤结果 每日记录
*/
String ATTENDANCE_STATUS_DAY_STUDENT = "attendance:status:day:student:";
/**
* 教职工考勤结果 每日记录
*/
String ATTENDANCE_STATUS_DAY_STAFF = "attendance:status:day:staff:";
/**
* 考勤管理管理部门树
*/
String ATTENDANCE_USER_MANAGE_TREE = "attendance:user:manage:tree:";
/**
* 考勤管理管理部门树
*/
String ATTENDANCE_STAFF_IDENTITY = "attendance:staff:identity:";
/**
* 职工管理规则
*/
String ATTENDANCE_STAFF_MANAGE_RULE = "attendance:staff:manage:rule";
/**
* 用户打卡记录
*/
String ATTENDANCE_USER_RECORD = "attendance:user:record";
/**
* 学生匹配的考勤规则
*/
String ATTENDANCE_STUDENT_RULE = "attendance:student:rule";
/**
* 校园主页信息
*/
String SCHOOL_HOME_INFO = "school:home:info";
/**
* 学校小程序信息
*/
String DEPT_HOME_APP_INFO = "dept:home:app:info";
/**
* 用户对应微信小程序
*/
String USER_GENERATE_URL_LINK = "user:generate:url:link:";
/**
* 考勤规则
*/
String ATTENDANCE_RULE_DATA = "attendance:rule";
}
@@ -79,20 +79,10 @@ public interface FebsConstant {
String TP_TOKEN = "tupu.token.";
/**
* 微信公众号 token key前缀 7200s
* 微信公众号 token key前缀
*/
String WX_PUBLIC_ACCESS_TOKEN = "wx.public:access.token.";
/**
* 微信 JS-SDK jsapi_ticket key前缀 7200s
*/
String WX_PUBLIC_JS_API_TICKET = "wx.public:jsapi.ticket.";
/**
* 企业微信 JS-SDK jsapi_ticket key前缀 7200s
*/
String QYWX_WX_JS_API_TICKET = "qywx.wx:jsapi.ticket.";
/**
* 几米 access_token key前缀
*/
@@ -43,12 +43,7 @@ public interface LockPrefixConstant {
String CARD_CMD_LOCK = "device:card:cmd-lock";
/**
* 设备下发处理返回数据
* 学生账单订单
*/
String ISSUE_FACE_DEVICE_LOCK = "user:face:issue.device.lock.";
/**
* 设备组下发处理人脸数据锁
*/
String ISSUE_FACE_GROUP_LOCK = "user:face:group.lock.";
String STUDENT_BILL_ORDER_LOCK = "student.bill.order.lock.";
}
@@ -38,21 +38,11 @@ public interface QywxConstant {
*/
String USER_DETAIL_URL = "https://qyapi.weixin.qq.com/cgi-bin/user/get";
/**
* 获取访问用户敏感信息 post https://qyapi.weixin.qq.com/cgi-bin/auth/getuserdetail?access_token=ACCESS_TOKEN
*/
String USER_SENSITIVE_INFO_URL = "https://qyapi.weixin.qq.com/cgi-bin/auth/getuserdetail?access_token=";
/**
* 查询部门成员详情 get https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token=ACCESS_TOKEN&department_id=DEPARTMENT_ID&fetch_child=FETCH_CHILD
*/
String USER_DETAIL_LIST_URL = "https://qyapi.weixin.qq.com/cgi-bin/user/list";
/**
* 获取成员ID列表 POST https://qyapi.weixin.qq.com/cgi-bin/user/list_id?access_token=ACCESS_TOKEN
*/
String USER_ID_LIST_URL = "https://qyapi.weixin.qq.com/cgi-bin/user/list_id?access_token=";
/**
* 创建部门 POST https://qyapi.weixin.qq.com/cgi-bin/department/create?access_token=ACCESS_TOKEN
*/
@@ -73,16 +63,6 @@ public interface QywxConstant {
*/
String DEPT_LIST_URL = "https://qyapi.weixin.qq.com/cgi-bin/department/list";
/**
* 获取子部门ID列表 GET https://qyapi.weixin.qq.com/cgi-bin/department/simplelist?access_token=ACCESS_TOKEN&id=ID
*/
String SIMPLE_DEPT_LIST_URL = "https://qyapi.weixin.qq.com/cgi-bin/department/simplelist";
/**
* 获取单个部门详情 GET https://qyapi.weixin.qq.com/cgi-bin/department/get?access_token=ACCESS_TOKEN&id=ID
*/
String DEPT_INFO_URL = "https://qyapi.weixin.qq.com/cgi-bin/department/get";
/**
* 创建部门(家校沟通) POST https://qyapi.weixin.qq.com/cgi-bin/school/department/create?access_token=ACCESS_TOKEN
*/
@@ -225,39 +205,16 @@ public interface QywxConstant {
*/
String CONTACT_EVENT = "change_contact";
/**
* 创建部门
*/
String DEPT_CREATE_TYPE = "create_party";
/**
* 更新部门
*/
String DEPT_UPDATE_TYPE = "update_party";
/**
* 删除部门
*/
String DEPT_DELETE_TYPE = "delete_party";
/**
* 创建成员
*/
String USER_CREATE_TYPE = "create_user";
/**
* 更新成员
*/
String USER_UPDATE_TYPE = "update_user";
/**
* 删除成员
*/
String USER_DELETE_TYPE = "delete_user";
/**
* 获取企业微信的jsapi_ticket
* https://developer.work.weixin.qq.com/document/path/96909
*/
String GET_JS_API_TICKET_URL = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket";
}
@@ -61,10 +61,4 @@ public interface WxPublicConstant {
* 获取微信小程序 URL Link
*/
String GENERATE_URL_LINK = "https://api.weixin.qq.com/wxa/generate_urllink";
/**
* 获取JS-SDK jsapi_ticket
* https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#62
*/
String GET_JS_API_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
}
@@ -15,6 +15,11 @@ public class AppNotice {
*/
private List<String> userIds;
/**
* 用户id
*/
private List<String> userIdList;
/**
* 订阅号 消息内容
*/
@@ -63,4 +63,5 @@ public class PushMessage {
public static final String AUDIO = "audio";
public static final String NORMAL = "NORMAL";
public static final String ACCOUNT = "MSG_ACCOUNT_MSG";
public static final String H5_SUB_MSG_TYPE = "NEWSEDUCATION";
}
@@ -23,7 +23,7 @@ import java.math.BigDecimal;
@AllArgsConstructor
public class UnionPayOrder implements Serializable {
private static final long serialVersionUID = -1580486861180880702L;
private static final long serialVersionUID = -1548806861180880702L;
@ApiModelProperty("银联云闪付支付类型")
private Integer unionPayType;
@@ -89,7 +89,7 @@ public class EduSchoolManuscript {
@TableField("author_id")
private Long authorId;
@ApiModelProperty("发布位置,0-城市书房, 1-第二课堂(精彩推荐),2-微信公众号,多个用逗号分割")
@ApiModelProperty("发布位置,0-城市书房, 1-第二课堂(精彩推荐),2-微信公众号,多个用逗号分割,3-首页")
@TableField("publish_path")
private String publishPath;
@@ -132,7 +132,7 @@ public class EduSchoolManuscript {
private transient String authorName;
// 新闻区
public static final String NEWS_PATH = "0";
public static final String NEWS_PATH = "3";
// 第二课堂
public static final String SECOND_CLASS_PATH = "1";
// 公众号
@@ -54,7 +54,8 @@ public class Dept implements Serializable {
@ApiModelProperty("部门简称")
private String deptAbbreviation;
/**
* 部门类型,0表示学校,5公司,6部门, 7教育局, 8代理商 {@link DeptTypeEnum}
* 部门类型,0表示学校,5公司,6部门, 7教育局, 8代理商
* {@link DeptTypeEnum}
*/
@ApiModelProperty("部门类型,0表示学校,5公司,6部门, 7教育局, 8代理商")
private Integer deptType;
@@ -70,11 +71,6 @@ public class Dept implements Serializable {
private String wxAesKey;
@ApiModelProperty("学校关联类型类型,0-企业微信,1-易达app,2-大华平台 多类型使用','连接")
private String schoolType;
@ApiModelProperty("学校性质:0小学,1中学,2九年一贯,3十二年一贯,4:高校")
@TableField(value = "school_nature")
private Integer schoolNature;
private Long wxId;
private Long parentWxId;
/**
@@ -45,12 +45,4 @@ public class EduApp {
@ApiModelProperty("应用地址")
private String appSrc;
@ApiModelProperty("应用类型。0-自建应用, 1-服务商代开发应用")
private Integer appType;
@ApiModelProperty("应用模板id")
private String templateId;
@ApiModelProperty("服务商企业微信corpId")
private String serviceCorpId;
}
@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.time.LocalDateTime;
@@ -106,7 +105,5 @@ public class Menu implements Serializable {
private transient String createTimeFrom;
private transient String createTimeTo;
@ApiModelProperty("菜单类型(0-合并, 1-剔除)")
private transient Integer userMenuType;
}
@@ -244,9 +244,4 @@ public class SystemUser implements Serializable {
private String mainRolePerms;
private transient EduUserLogo userLogo;
/**
* 学校性质:0幼儿园,1小学,2中学,3九年一贯,4十二年一贯,5:高校
*/
private transient Integer schoolNature;
}
@@ -25,13 +25,4 @@ public class SystemUserMenu {
@ApiModelProperty("菜单id")
@TableField("menu_id")
private Long menuId;
@ApiModelProperty("菜单类型(0-合并, 1-剔除)")
private Integer type;
/**
* 权限串
*/
private transient String perms;
}
@@ -27,9 +27,7 @@ public enum RoleEnum {
ROLE_CLASS_PRINCIPAL("role:class:principal", "班主任", 9, 5),
ROLE_EDUCATION_PRINCIPAL("role:education:principal", "教育局负责人", 8, 2),
ROLE_TEACHER("role:teacher", "教师基础角色", 10, 8);
ROLE_EDUCATION_PRINCIPAL("role:education:principal", "教育局负责人", 8, 2);
/**
* 角色标识值
@@ -49,9 +49,6 @@ public class EduStaffDept {
@ApiModelProperty(value = "")
private String staffName;
@ApiModelProperty(value = "z职工用户头像")
private String avatar;
/**
* 部门id
*/
@@ -51,42 +51,6 @@ public class EduStudent implements Serializable {
@ApiModelProperty("学生姓名")
private String stuName;
@ApiModelProperty("曾用名")
private String formerName;
@ApiModelProperty("考生号")
private String stuExamNumber;
@ApiModelProperty("银行卡号")
private String creditCardNumbers;
@ApiModelProperty("民族")
private String nation;
@ApiModelProperty("QQ号")
private String qqCode;
@ApiModelProperty("微信号")
private String wxCode;
@ApiModelProperty("邮箱")
private String email;
@ApiModelProperty("入学年级")
private String startGrade;
@ApiModelProperty("政治面貌")
private String politicsStatus;
@ApiModelProperty("邮政编码")
private String postalCode;
@ApiModelProperty("籍贯")
private String nativePlace;
@ApiModelProperty("现住址")
private String presentAddress;
@ApiModelProperty("学生头像url")
private String avatar;
@@ -136,9 +100,6 @@ public class EduStudent implements Serializable {
@ApiModelProperty("学生当前状态,0=在校/在寝,1=离校/离寝")
private Integer status;
@ApiModelProperty("学籍状态:关联字典表")
private String studentStatus;
@ApiModelProperty("学生在寝状态,0-在寝,1-离寝")
private Integer dormStatus;
@@ -9,11 +9,13 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import lombok.Data;
/**
* 用户人脸图像 Entity
*
@@ -82,30 +84,7 @@ public class EduUserFace {
private String picPath;
/**
* 人脸id
* 人脸与人脸组的关联id
*/
private transient Long faceGroupUserId;
/**
* 学生对应卡号
*/
private transient String rfidCard;
/**
* 是否为会员 1=是,0=否(针对学生,教师全是会员)
*/
private transient Integer notes;
/**
* 会员开始时间
*/
private transient String cardValidBegin;
/**
* 会员结束时间
*/
private transient String cardValidEnd;
/**
* 下发的设备名称
*/
private transient String deviceName;
}
@@ -14,11 +14,6 @@ public enum AttendanceResult {
*/
NORMAL(100, "正常"),
/**
* 异常状态
*/
ABNORMAL(999, "异常"),
/**
* 上学未在打卡有效时间段
*/
@@ -45,33 +40,10 @@ public enum AttendanceResult {
* 走读-旷课
*/
STU_NOTARRIVE(204, "旷课"),
/**
* 走读-请假
*/
STU_REQUEST(205, "请假"),
/**
* 上班未打卡|下班正常
*/
STU_NOSTART_AND_END_NORMAL(206, "上班未打卡|下班正常"),
/**
* 上班未打卡|下班正常
*/
STU_NOSTART_AND_END_LATE(207, "上班未打卡|下班早退"),
/**
* 上班未打卡|下班正常
*/
STU_NOSTART_AND_END_NOTIN(208, "上班未打卡|下班未在有效打卡时间段内"),
/**
* 上班未在有效打卡时间段内|下班早退
*/
STU_NOSTARTIN_AND_END_LEAVE(209, "上班未在有效打卡时间段内|下班早退"),
/**
* 上班迟到|下班未打卡
*/
STU_NOSTARTIN_AND_END_NO(210, "上班迟到|下班未打卡"),
/**
* 住宿-晚归
*/
@@ -6,10 +6,8 @@ import lombok.Getter;
@Getter
@AllArgsConstructor
public enum MsgChannel {
MQTT("mqtt","mqtt(人脸设备)"),
ACTIVE("activeMq","active(人脸设备)"),
WIFI("WIFI", "WIFI打卡");
ACTIVE("activeMq","active(人脸设备)");
private String value;
private String name;
@@ -16,11 +16,9 @@ public enum PayWay {
/**
* 支付方式枚举
*/
WEI_XIN("1", "微信"),
WEIXIN("1", "微信"),
ALIPAY("2", "支付宝"),
UNION("3", "银联"),
U_PAY("4", "收钱吧"),
CONSTRUCTION_PAY("5", "建行");
UNION("3", "银联");
/**
* 类型
@@ -17,7 +17,7 @@ public enum UnionPayTypeEnum {
/**
* 银联云闪付支付类型枚举
*/
WX_H5_TYPE(0, "微信H5", UnionPayConstant.UNION_H5_PAY),
WX_H5_TYPE(0, "微信H5", UnionPayConstant.WX_H5_PAY),
WX_TO_MINI_H5_TYPE(1, "微信H5转小程序", UnionPayConstant.WX_TO_MINI_H5_PAY),
ALI_H5_TYPE(2, "支付宝H5", UnionPayConstant.ALI_H5_PAY),
UNION_H5_TYPE(3, "银联H5", UnionPayConstant.UNION_H5_PAY);
@@ -5,8 +5,7 @@ import com.yida.data.common.core.entity.constant.StringConstant;
import com.yida.data.common.core.exception.FebsException;
import com.yida.data.common.core.exception.FileDownloadException;
import com.yida.data.common.core.utils.FebsUtil;
import feign.FeignException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.AccessDeniedException;
@@ -19,11 +18,15 @@ import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.List;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Path;
import java.util.List;
import java.util.Set;
import feign.FeignException;
import lombok.extern.slf4j.Slf4j;
/**
* @author MrBird
@@ -135,7 +138,7 @@ public class BaseExceptionHandler {
@ExceptionHandler(value = HttpRequestMethodNotSupportedException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public FebsResponse handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
log.error("error: ", e);
log.error("error:{},{}", e.getMessage(), e.getStackTrace());
String message = "该方法不支持" + StringUtils.substringBetween(e.getMessage(), "'", "'") + "请求方法";
log.error(message);
return new FebsResponse().message(message);
@@ -178,25 +178,55 @@ public class AppUtil {
}
}
/**
* 推送app消息
*
* @param appNotice 消息配置类
* @param app app信息
* @author ZYJ
* @date 2023/7/14 16:04
*/
public static void sendPushMsg(AppNotice appNotice, EduYidaApp app) {
StringBuilder url = new StringBuilder();
AppNotice appNotice1 = new AppNotice();
BeanUtils.copyProperties(appNotice, appNotice1);
appNotice1.setMsgList(null);
url.append(app.getAppUrl()).append(YidaAppConstant.JIGUANG_SEND_MSG);
// url.append("http://10.143.132.192:8082/push/sendMulti").append(YidaAppConstant.JIGUANG_SEND_MSG);
String body = JSONUtil.toJsonStr(appNotice1);
// 1s后超时 不保证收到推送
try {
String res = HttpUtil.post(url.toString(), body, 1000);
log.info("app消息推送,res:[{}],params:[{}]", res, body);
} catch (Exception e) {
log.error("app消息推送超时,url:[{}],params:[{}]", url, body);
}
}
/**
* 发送稿件
*/
public static String publishManuscript(EduSchoolManuscript manuscript, EduYidaApp yidaApp, String columnId,
String yidaUserId) {
JSONObject body = new JSONObject() {{
set("title", manuscript.getTitle());
set("fileType", manuscript.getCoverType());
set("type", 1);
set("isPush", 1);
set("isSub", 1);
set("isPublish", 1);
set("from", 2);
set("isTop", 0);
set("titleFilePath", manuscript.getCoverUrl());
set("areaId", yidaApp.getAppAreaId());
set("createById", yidaUserId);
}};
JSONObject body = JSONUtil.createObj()
.set("title", manuscript.getTitle())
.set("fileType", manuscript.getCoverType())
.set("type", 1)
.set("isPush", 1)
.set("isSub", 1)
.set("isPublish", 1)
.set("from", 2)
.set("isTop", 0)
.set("titleFilePath", manuscript.getCoverUrl())
.set("areaId", yidaApp.getAppAreaId())
.set("createById", yidaUserId);
// 判断稿件id
if (StrUtil.isNotBlank(manuscript.getYidaAppMunascriptId())) {
body.set("id", manuscript.getYidaAppMunascriptId());
body.set("isNewRecord", false);
} else {
body.set("isNewRecord", true);
}
// 是否发布到栏目
if (StrUtil.isNotBlank(columnId)) {
body.set("columnId", columnId);
@@ -207,9 +237,9 @@ public class AppUtil {
if (StrUtil.isNotBlank(manuscript.getContentUrl())) {
body.set("contenUrl", manuscript.getContentUrl());
}
if (StrUtil.isNotBlank(manuscript.getYidaAppMunascriptId())) {
body.set("id", manuscript.getYidaAppMunascriptId());
}
// if (StrUtil.isNotBlank(manuscript.getYidaAppMunascriptId())) {
// body.set("id", manuscript.getYidaAppMunascriptId());
// }
String res = HttpUtil.post(yidaApp.getAppUrl() + YidaAppConstant.MANUSCRIPT_SAVE, body);
JSONObject resJson = JSONUtil.parseObj(res);
log.info("易达发送稿件,res:[{}],params:[{}]", res, body);
@@ -258,10 +288,16 @@ public class AppUtil {
/**
* 删除稿件
*/
public static void manuscriptDel(List<String> ids, EduYidaApp yidaApp) {
public static void manuscriptDel(List<String> ids, EduYidaApp yidaApp, String userId) {
if (CollUtil.isEmpty(ids)) {
log.info("易达删除稿件IDS为空");
return;
}
JSONObject body = new JSONObject() {{
set("ids", CollUtil.join(ids, ","));
set("operateUserId", userId);
}};
log.info("易达删除稿件:params:{}", body);
HttpUtil.post(yidaApp.getAppUrl() + YidaAppConstant.MANUSCRIPT_DEL, body);
}
@@ -1,19 +1,14 @@
package com.yida.data.common.core.utils;
import cn.hutool.core.date.DateUnit;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
/**
* 时间工具类
@@ -99,115 +94,4 @@ public abstract class DateUtil {
LocalTime now = LocalTime.now();
return now.isAfter(from) && now.isBefore(to);
}
/**
* 计算两个时间点相差的天数
*
* @param
* @return
*/
public static Long daysBetween(Date beginDate, Date endDate) {
return cn.hutool.core.date.DateUtil.between(beginDate, endDate, DateUnit.DAY);
}
/**
* 获取指定年指定月的开始天数和结束天数
*
* @param yearMonth
* @return
*/
public static Map<String, Date> getFirstDayAndLastDayOfTheSpecifiedMonth(String yearMonth) {
int year = Integer.parseInt(yearMonth.split("-")[0]);
int month = Integer.parseInt(yearMonth.split("-")[1]);
// 获取当前分区的日历信息(这里可以使用参数指定时区)
Calendar calendar = Calendar.getInstance();
// 设置年
calendar.set(Calendar.YEAR, year);
// 设置月,月份从0开始
calendar.set(Calendar.MONTH, month - 1);
// 设置为指定月的第一天
calendar.set(Calendar.DAY_OF_MONTH, 1);
// 获取指定月第一天的时间
Date start = calendar.getTime();
// 设置日历天数为当前月实际天数的最大值,即指定月份的最后一天
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
// 获取最后一天的时间
Date end = calendar.getTime();
// 设置返回信息,返回样式根据需求自行格式化
Map<String, Date> dateMap = new HashMap<>();
dateMap.put("start", start);
dateMap.put("end", end);
return dateMap;
}
/**
* 查询日期间有几天一周中的某一天 日期格式 yyyy-MM-dd yyyy-MM-dd 1-7(表示周一到周日)
*
* @param startDate 准备查询的起始日期
* @param endDate 准备查询的结束日期
* @param dayOfWeek 准备查的一周中的某一天(准备查周几?)
* @return 包含所查周几的天数
* @throws ParseException 不支持跨年查询、不支持结束日期早于起始日期、周几输入错误等
*/
public static Integer getMondayNumber(LocalDate startDate, LocalDate endDate, int dayOfWeek) throws ParseException {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
int differenceDay = 0;
//实例化起始和结束Calendar对象
Calendar startCalendar = Calendar.getInstance();
Calendar endCalendar = Calendar.getInstance();
//分别设置Calendar对象的时间
ZoneId zone = ZoneId.systemDefault();
Instant instantStartDate = startDate.atStartOfDay().atZone(zone).toInstant();
Instant instantEndDate = endDate.atStartOfDay().atZone(zone).toInstant();
startCalendar.setTime(Date.from(instantStartDate));
endCalendar.setTime(Date.from(instantEndDate));
//定义起始日期和结束日期分别属于第几周
int startWeek = startCalendar.get(Calendar.WEEK_OF_YEAR);
int endWeek = endCalendar.get(Calendar.WEEK_OF_YEAR);
//拿到起始日期是星期几
int startDayOfWeek = startCalendar.get(Calendar.DAY_OF_WEEK);
if (startDayOfWeek == 1) {
startDayOfWeek = 7;
startWeek--;
} else {
startDayOfWeek--;
}
//拿到结束日期是星期几
int endDayOfWeek = endCalendar.get(Calendar.DAY_OF_WEEK);
if (endDayOfWeek == 1) {
endDayOfWeek = 7;
endWeek--;
} else {
endDayOfWeek--;
}
//计算相差的周数
int differenceWeek = endWeek - startWeek;
//开始计算
if (startDayOfWeek <= dayOfWeek) {
if (endDayOfWeek >= dayOfWeek) {
differenceDay = differenceWeek + 1;
}
} else if (startDayOfWeek > dayOfWeek) {
if (endDayOfWeek < dayOfWeek) {
differenceDay = differenceWeek - 1;
}
} else {
differenceDay = differenceWeek;
}
return differenceDay;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
@@ -9,10 +9,8 @@ import com.yida.data.common.core.entity.constant.PageConstant;
import com.yida.data.common.core.entity.constant.RegexpConstant;
import com.yida.data.common.core.entity.constant.StringConstant;
import com.yida.data.common.core.exception.FebsException;
import java.time.LocalDate;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.omg.CORBA.UNKNOWN;
import org.springframework.core.env.Environment;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils;
@@ -49,7 +47,6 @@ import java.util.stream.IntStream;
public abstract class FebsUtil {
private static final String UNKNOW = "unknown";
private static final String UNKNOWN = "unknown";
/**
* 驼峰转下划线
@@ -216,18 +213,13 @@ public abstract class FebsUtil {
public static String getHttpServletRequestIpAddress() {
HttpServletRequest request = getHttpServletRequest();
String ip = request.getHeader("x-forwarded-for");
if (ip != null && ip.length() != 0 && !UNKNOWN.equalsIgnoreCase(ip)) {
if (ip.contains(StringConstant.COMMA)) {
ip = ip.split(StringConstant.COMMA)[0];
}
}
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
if (ip == null || ip.length() == 0 || UNKNOW.equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
if (ip == null || ip.length() == 0 || UNKNOW.equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
if (ip == null || ip.length() == 0 || UNKNOW.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
@@ -409,91 +401,11 @@ public abstract class FebsUtil {
res = "星期六";
break;
case 7:
res = "星期";
res = "星期";
break;
default:
}
}
return res;
}
public static boolean isWeek(String weekStr, Integer week) {
boolean flag = false;
switch (week) {
case 1:
if (weekStr.contains("星期一")) {
flag = true;
}
break;
case 2:
if (weekStr.contains("星期二")) {
flag = true;
}
break;
case 3:
if (weekStr.contains("星期三")) {
flag = true;
}
break;
case 4:
if (weekStr.contains("星期四")) {
flag = true;
}
break;
case 5:
if (weekStr.contains("星期五")) {
flag = true;
}
break;
case 6:
if (weekStr.contains("星期六")) {
flag = true;
}
break;
case 7:
if (weekStr.contains("星期日")) {
flag = true;
}
break;
default:
break;
}
return flag;
}
/**
* 通过身份证号码获取性别(sex)
*
* @param idCardNo 身份证号码
* @return 性别格式:1:女,0:男
*/
public static Integer getSexByIdCardNo(String idCardNo) {
Integer sexCode = null;
char[] number = idCardNo.toCharArray();
boolean flag = true;
if (number.length == 15) {
for (int x = 0; x < number.length; x++) {
if (!flag) {
return null;
}
flag = Character.isDigit(number[x]);
}
} else if (number.length == 18) {
for (int x = 0; x < number.length - 1; x++) {
if (!flag) {
return null;
}
flag = Character.isDigit(number[x]);
}
}
if (flag && idCardNo.length() == 15) {
sexCode = Integer.parseInt(idCardNo.substring(idCardNo.length() - 3, idCardNo.length())) % 2 == 0 ? 1 : 0;
} else if (flag && idCardNo.length() == 18) {
sexCode = Integer.parseInt(idCardNo.substring(idCardNo.length() - 4, idCardNo.length() - 1)) % 2 == 0 ? 1 : 0;
}
return sexCode;
}
}
@@ -111,7 +111,7 @@ public abstract class FileUtil {
put("source", 50);
}
});
// log.info("上传响应,[{}]", resp);
log.info("上传响应,[{}]", resp);
JSONObject respJson = JSONUtil.parseObj(resp);
if (!"200".equals(respJson.get("status").toString())) {
throw new FebsException(respJson.getStr("message"));
@@ -261,14 +261,6 @@ public abstract class FileUtil {
public static String downloadToLocal(String url) {
LocalDateTime now = LocalDateTime.now();
String path = TEMP_DIR + now.getYear() + "/" + now.getMonthValue() + "/" + now.getDayOfMonth() + "/";
// String filename = cn.hutool.core.io.FileUtil.getName(url);
// if (filename.contains(".jpg") || filename.contains(".png")) {
// if (filename.contains("?")) {
// filename = filename.split("\\?")[0];
// }
// } else {
// filename = UUID.randomUUID() + ".jpg";
// }
String filename = UUID.randomUUID() + ".jpg";
try {
HttpUtil.downloadFile(url, path + filename);
@@ -106,7 +106,7 @@ public class WxPublicUtil {
public String getAccessToken(String appId, String secret) {
String accessToken =
String.valueOf(redisService.get(FebsConstant.WX_PUBLIC_ACCESS_TOKEN + appId + "." + secret));
String.valueOf(redisService.get(FebsConstant.WX_PUBLIC_ACCESS_TOKEN + appId + "." + secret));
if ("null".equals(accessToken)) {
Map<String, Object> params = new HashMap<>();
params.put("grant_type", "client_credential");
@@ -117,7 +117,7 @@ public class WxPublicUtil {
JSONObject token = JSONUtil.parseObj(response);
if (token.containsKey("errcode") && !"0".equals(token.get("errcode").toString())) {
log.error("请求微信公众号access token失败,code:{},msg:{}", token.get("errcode").toString(),
token.get("errmsg").toString());
token.get("errmsg").toString());
throw new FebsException("验证失败");
}
accessToken = token.get("access_token").toString();
@@ -138,7 +138,7 @@ public class WxPublicUtil {
JSONObject token = JSONUtil.parseObj(response);
if (token.containsKey("errcode") && !"0".equals(token.get("errcode"))) {
log.error("请微信求access token失败,code:{},msg:{}", token.get("errcode"),
token.get("errmsg"));
token.get("errmsg"));
throw new FebsException("验证失败");
}
return token.getStr("openid");
@@ -151,10 +151,10 @@ public class WxPublicUtil {
Map<String, Object> body = new HashMap<>();
body.put("media", img);
JSONObject response = JSONUtil.parseObj(
post(WxPublicConstant.UPLOAD_NEWS_IMG + "?access_token=" + token, body));
post(WxPublicConstant.UPLOAD_NEWS_IMG + "?access_token=" + token, body));
if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) {
log.error("上传图片失败,code:{},msg:{}", response.get("errcode"),
response.get("errmsg"));
response.get("errmsg"));
throw new FebsException("上传图片失败");
}
return response.getStr("url");
@@ -166,10 +166,10 @@ public class WxPublicUtil {
public String uploadNews(News news, String token) {
String body = JSONUtil.toJsonPrettyStr(news);
JSONObject response = JSONUtil.parseObj(
post(WxPublicConstant.UPLOAD_NEWS + "?access_token=" + token, body));
post(WxPublicConstant.UPLOAD_NEWS + "?access_token=" + token, body));
if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) {
log.error("上传图文素材失败,code:{},msg:{}", response.get("errcode"),
response.get("errmsg"));
response.get("errmsg"));
throw new FebsException("上传图文素材失败");
}
return response.getStr("media_id");
@@ -190,10 +190,10 @@ public class WxPublicUtil {
put("send_ignore_reprint", 1);
}};
JSONObject response = JSONUtil.parseObj(
post(WxPublicConstant.SEND_MSG + "?access_token=" + token, JSONUtil.toJsonStr(body)));
post(WxPublicConstant.SEND_MSG + "?access_token=" + token, JSONUtil.toJsonStr(body)));
if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) {
log.error("群发图文消息失败,code:{},msg:{}", response.get("errcode"),
response.get("errmsg"));
response.get("errmsg"));
throw new FebsException("群发图文消息失败");
}
return response.getStr("msg_data_id");
@@ -213,10 +213,10 @@ public class WxPublicUtil {
set("msgtype", "text");
}};
JSONObject response = JSONUtil.parseObj(
post(WxPublicConstant.SEND_MSG + "?access_token=" + token, body));
post(WxPublicConstant.SEND_MSG + "?access_token=" + token, body));
if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) {
log.error("群发文本消息失败,code:{},msg:{}", response.get("errcode"),
response.get("errmsg"));
response.get("errmsg"));
throw new FebsException("群发文本消息失败");
}
return response.getStr("msg_data_id");
@@ -236,10 +236,10 @@ public class WxPublicUtil {
set("msgtype", "voice");
}};
JSONObject response = JSONUtil.parseObj(
post(WxPublicConstant.SEND_MSG + "?access_token=" + token, body));
post(WxPublicConstant.SEND_MSG + "?access_token=" + token, body));
if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) {
log.error("群发音频消息失败,code:{},msg:{}", response.get("errcode"),
response.get("errmsg"));
response.get("errmsg"));
throw new FebsException("群发音频消息失败");
}
return response.getStr("msg_data_id");
@@ -259,10 +259,10 @@ public class WxPublicUtil {
set("msgtype", "image");
}};
JSONObject response = JSONUtil.parseObj(
post(WxPublicConstant.SEND_MSG + "?access_token=" + token, body));
post(WxPublicConstant.SEND_MSG + "?access_token=" + token, body));
if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) {
log.error("群发音频消息失败,code:{},msg:{}", response.get("errcode"),
response.get("errmsg"));
response.get("errmsg"));
throw new FebsException("群发音频消息失败");
}
return response.getStr("msg_data_id");
@@ -282,10 +282,10 @@ public class WxPublicUtil {
set("msgtype", "mpvideo");
}};
JSONObject response = JSONUtil.parseObj(
post(WxPublicConstant.SEND_MSG + "?access_token=" + token, body));
post(WxPublicConstant.SEND_MSG + "?access_token=" + token, body));
if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) {
log.error("群发音频消息失败,code:{},msg:{}", response.get("errcode"),
response.get("errmsg"));
response.get("errmsg"));
throw new FebsException("群发音频消息失败");
}
return response.getStr("msg_data_id");
@@ -305,10 +305,10 @@ public class WxPublicUtil {
}}));
}
JSONObject response = JSONUtil.parseObj(
post(WxPublicConstant.UPLOAD_MATERIAL + "?access_token=" + token + "&type=" + type, body));
post(WxPublicConstant.UPLOAD_MATERIAL + "?access_token=" + token + "&type=" + type, body));
if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) {
log.error("上传永久素材失败,code:{},msg:{}", response.get("errcode"),
response.get("errmsg"));
response.get("errmsg"));
throw new FebsException("上传永久素材失败");
}
return response.getStr("media_id");
@@ -322,10 +322,10 @@ public class WxPublicUtil {
put("media_id", mediaId);
}};
JSONObject response = JSONUtil.parseObj(
post(WxPublicConstant.DELETE_MATERIAL + "?access_token=" + token, JSONUtil.toJsonStr(body)));
post(WxPublicConstant.DELETE_MATERIAL + "?access_token=" + token, JSONUtil.toJsonStr(body)));
if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) {
log.error("删除永久素材失败,code:{},msg:{}", response.get("errcode"),
response.get("errmsg"));
response.get("errmsg"));
throw new FebsException("删除永久素材失败");
}
}
@@ -334,15 +334,15 @@ public class WxPublicUtil {
* 上传临时素材 图片(image)、语音(voice)、视频(video)和缩略图(thumb)
*/
public String uploadTempMaterial(String type, File file,
String token) {
String token) {
Map<String, Object> body = new HashMap<String, Object>() {{
put("media", file);
}};
JSONObject response = JSONUtil.parseObj(
HttpUtil.post(WxPublicConstant.UPLOAD_TEMP_MATERIAL + "?access_token=" + token + "&type=" + type, body));
HttpUtil.post(WxPublicConstant.UPLOAD_TEMP_MATERIAL + "?access_token=" + token + "&type=" + type, body));
if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) {
log.error("上传临时素材失败,code:{},msg:{}", response.get("errcode"),
response.get("errmsg"));
response.get("errmsg"));
throw new FebsException("上传临时素材失败");
}
if ("thumb".equals(type)) {
@@ -364,7 +364,7 @@ public class WxPublicUtil {
return null;
}
String url = new StringBuilder(WxPublicConstant.QR_CODE).append("?access_token=").append(accessToken)
.toString();
.toString();
JSONObject body = new JSONObject() {{
if (expire != null) {
set("expire_seconds", expire);
@@ -408,13 +408,13 @@ public class WxPublicUtil {
}});
}};
String post = HttpUtil.post(
new StringBuilder(WxPublicConstant.PUSH_CUSTOM_MSG).append("?access_token=").append(accessToken).toString(),
body.toString());
new StringBuilder(WxPublicConstant.PUSH_CUSTOM_MSG).append("?access_token=").append(accessToken).toString(),
body.toString());
log.info("发送客户消息,res:[{}],body:[{}]", post, body);
}
public void publishTemplateMsg(String accessToken, String openUserId, String templateId, String url,
JSONObject data) {
JSONObject data) {
JSONObject body = new JSONObject() {{
set("touser", openUserId);
if (StrUtil.isNotBlank(url)) {
@@ -424,12 +424,13 @@ public class WxPublicUtil {
set("data", data);
}};
String post = HttpUtil.post(new StringBuilder(WxPublicConstant.PUSH_TEMPLATE_MSG).append(
"?access_token=").append(accessToken).toString(), body.toString());
"?access_token=").append(accessToken).toString(), body.toString());
log.info("发送模板消息,res:[{}],body:[{}]", post, body);
}
/**
* 获取小程序URL Link https + post
* 获取小程序URL Link
* https + post
*
* @param accessToken token值
* @param generateUrlLink 获取小程序URL Link请求类
@@ -440,62 +441,30 @@ public class WxPublicUtil {
public String generateUrlLink(String accessToken, GenerateUrlLink generateUrlLink) {
// 封装参数
JSONObject body = JSONUtil.createObj()
.set("path", generateUrlLink.getPath())
.set("query", generateUrlLink.getQuery())
.set("env_version", generateUrlLink.getEnvVersion())
.set("expire_type", generateUrlLink.getExpireType())
.set("expire_interval", 30);
.set("path", generateUrlLink.getPath())
.set("query", generateUrlLink.getQuery())
.set("env_version", generateUrlLink.getEnvVersion())
.set("expire_type", generateUrlLink.getExpireType())
.set("expire_interval", 30);
if (Objects.nonNull(generateUrlLink.getCloudBase())) {
GenerateUrlLink.CloudBase cloudBase = generateUrlLink.getCloudBase();
body.set("cloud_base", JSONUtil.createObj()
.set("env", cloudBase.getEnv())
.set("domain", cloudBase.getDomain())
.set("path", cloudBase.getPath())
.set("query", cloudBase.getQuery())
.set("resource_appid", cloudBase.getResourceAppId())
.set("env", cloudBase.getEnv())
.set("domain", cloudBase.getDomain())
.set("path", cloudBase.getPath())
.set("query", cloudBase.getQuery())
.set("resource_appid", cloudBase.getResourceAppId())
);
}
// 请求接口
String result = HttpUtil.post(WxPublicConstant.GENERATE_URL_LINK + "?access_token=" + accessToken, body.toString());
// log.info("获取小程序URL Link接口, result: [{}], body: [{}]", result, body);
log.info("获取小程序URL Link接口, result: [{}], body: [{}]", result, body);
JSONObject response = JSONUtil.parseObj(result);
if (response.containsKey("errcode") && !"0".equals(response.getStr("errcode"))) {
log.error("获取小程序URL Link接口失败,code:{},msg:{}", response.get("errcode"),
response.get("errmsg"));
response.get("errmsg"));
throw new FebsException("获取小程序URL Link接口失败");
}
return response.getStr("url_link");
}
/**
* 微信获取JS-SDK jsapi_ticket
*
* @param appId 微信appId
* @param secret 微信secret
* @return java.lang.String
* @author ZYJ
* @date 2023/6/5 14:50
*/
public String getJsApiTicket(String appId, String secret) {
String jsApiTicket =
String.valueOf(redisService.get(FebsConstant.WX_PUBLIC_JS_API_TICKET + appId + "." + secret));
if ("null".equals(jsApiTicket)) {
Map<String, Object> params = new HashMap<>();
params.put("access_token", getAccessToken(appId, secret));
params.put("type", "jsapi");
// 获取JS-SDK jsapi_ticket
String response = get(WxPublicConstant.GET_JS_API_TICKET_URL, params);
JSONObject token = JSONUtil.parseObj(response);
if (token.containsKey("errcode") && !"0".equals(token.get("errcode").toString())) {
log.error("获取JS-SDK jsapi_ticket失败,code:{},msg:{}", token.get("errcode").toString(),
token.get("errmsg").toString());
throw new FebsException("验证失败");
}
jsApiTicket = token.get("ticket").toString();
// 缓存accessToken两小时
redisService.set(FebsConstant.WX_PUBLIC_JS_API_TICKET + appId + "." + secret, jsApiTicket, 7200L);
}
return jsApiTicket;
}
}
@@ -9,20 +9,28 @@ import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.yida.data.common.core.entity.constant.FebsConstant;
import com.yida.data.common.core.entity.constant.QywxConstant;
import com.yida.data.common.core.entity.constant.WxPublicConstant;
import com.yida.data.common.core.entity.notice.qywx.BaseSchoolNotice;
import com.yida.data.common.core.entity.notice.qywx.BaseStaffNotice;
import com.yida.data.common.core.entity.system.Dept;
import com.yida.data.common.core.entity.user.*;
import com.yida.data.common.core.entity.user.EduParent;
import com.yida.data.common.core.entity.user.EduStaff;
import com.yida.data.common.core.entity.user.EduStaffDept;
import com.yida.data.common.core.entity.user.EduStudent;
import com.yida.data.common.core.entity.user.EduTeacherDept;
import com.yida.data.common.core.entity.user.EduUserDept;
import com.yida.data.common.core.exception.FebsException;
import java.io.File;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
@Component
@Slf4j
public class WxUtil {
@@ -168,7 +176,7 @@ public class WxUtil {
public Boolean pushSchoolNotice(String token, BaseSchoolNotice notice) {
JSONObject resp = JSONUtil.parseObj(post(QywxConstant.PUSH_SCHOOL_NOTICE_URL + token,
JSONUtil.toJsonStr(notice).replace("\\n", "\n")));
// log.info("打印学校消息推送信息: {}", JSONUtil.toJsonStr(notice).replace("\\n", "\n"));
log.info("打印学校消息推送信息: {}", JSONUtil.toJsonStr(notice).replace("\\n", "\n"));
if (!"0".equals(resp.containsKey("errcode") ? resp.get("errcode").toString() : null)) {
log.error("微信通知发送失败,msg:{},notice:{}", resp, notice);
return false;
@@ -176,14 +184,12 @@ public class WxUtil {
return true;
}
public Boolean pushStaffNotice(String token, BaseStaffNotice notice) {
// log.info("打印学校消息推送信息: {}", JSONUtil.toJsonStr(notice).replace("\\n", "\n"));
JSONObject resp = JSONUtil.parseObj(post(QywxConstant.PUSH_STAFF_NOTICE_URL + token,
JSONUtil.toJsonStr(notice).replace("\\n", "\n")));
// log.info("打印学校消息推送信息返回信息: {}", resp);
log.info("打印学校消息推送信息: {}", JSONUtil.toJsonStr(notice).replace("\\n", "\n"));
if (!"0".equals(resp.containsKey("errcode") ? resp.get("errcode").toString() : null)) {
log.error("微信通知发送失败,msg:{},notice:{}", resp.get("errmsg"), JSONUtil.toJsonStr(notice).replace("\\n", "\n"));
log.error("微信通知发送失败,msg:{},notice:{}", resp.get("errmsg"), notice);
return false;
}
return true;
@@ -220,41 +226,6 @@ public class WxUtil {
return user.getJSONArray("userlist");
}
/**
* 获取成员ID列表
*
* @param accessToken 调用接口凭证
* @param cursor 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用不填
* @param limit 分页,预期请求的数据量,取值范围 1 ~ 10000
* @return cn.hutool.json.JSONArray
* @author ZYJ
* @date 2022/12/6 17:35
*/
public JSONArray getUserIdList(String accessToken, String cursor, String limit, JSONArray jsonArray) {
// 封装请求参数
JSONObject params = JSONUtil.createObj()
.set("limit", limit);
if (StrUtil.isNotBlank(cursor)) {
params.set("cursor", cursor);
}
String response = post(QywxConstant.USER_ID_LIST_URL + accessToken, params.toString());
JSONObject jsonObject = JSONUtil.parseObj(response);
log.info("企业微信获取成员ID列表请求参数: {}, 返回值: {}", params, jsonObject);
if (!SUCCESS_CODE.equals(jsonObject.containsKey(ERR_CODE) ? jsonObject.get(ERR_CODE).toString() : null)) {
log.error("企业微信获取获取成员ID列表失败,code:{},msg:{}", jsonObject.get(ERR_CODE), jsonObject.get(ERR_MESSAGE));
throw new FebsException("企业微信获取获取成员ID列表失败");
}
// 获取成员列表id数据
JSONArray deptUser = jsonObject.getJSONArray("dept_user");
jsonArray.addAll(deptUser);
// 获取分页游标
String nextCursor = jsonObject.getStr("next_cursor");
if (StrUtil.isNotBlank(nextCursor)) {
getUserIdList(accessToken, nextCursor, limit, jsonArray);
}
return jsonArray;
}
/**
* 使用授权登陆code,获取成员信息,通讯录成员返回UserId,家长返回parent_userid
*/
@@ -265,17 +236,14 @@ public class WxUtil {
params.put("code", code);
String response = get(QywxConstant.USER_INFO_URL, params);
JSONObject user = JSONUtil.parseObj(response);
if (!SUCCESS_CODE.equals(user.containsKey(ERR_CODE) ? user.get(ERR_CODE).toString() : null)) {
log.error("请求微信用户信息失败,code:{},msg:{}", user.get(ERR_CODE),
user.get(ERR_MESSAGE));
if (!"0".equals(user.containsKey("errcode") ? user.get("errcode").toString() : null)) {
log.error("请求微信用户信息失败,code:{},msg:{}", user.get("errcode"),
user.get("errmsg"));
throw new FebsException("获取用户信息失败");
}
return user;
}
/**
* 查询用户详细信息
*/
public JSONObject getUserDetail(String accessToken, String userId) {
// 查询用户微信userid
Map<String, Object> params = new HashMap<>();
@@ -283,34 +251,10 @@ public class WxUtil {
params.put("userid", userId);
String userDetailResponse = get(QywxConstant.USER_DETAIL_URL, params);
JSONObject userDetail = JSONUtil.parseObj(userDetailResponse);
log.info("请求企业微信用户详细信息请求参数: {}, 返回值: {}", params, userDetail);
if (!SUCCESS_CODE.equals(userDetail.containsKey(ERR_CODE) ? userDetail.get(ERR_CODE).toString() : null)) {
log.error("请求企业微信用户详细信息失败,code:{},msg:{}", userDetail.get(ERR_CODE),
userDetail.get(ERR_MESSAGE));
throw new FebsException("请求企业微信用户详细信息失败");
}
return userDetail;
}
/**
* 查询用户敏感信息
*
* @param accessToken 调用接口凭证
* @param userTicket 成员票据
* @return cn.hutool.json.JSONObject
* @author ZYJ
* @date 2022/11/28 15:35
*/
public JSONObject getUserSensitiveInfo(String accessToken, String userTicket) {
JSONObject params = JSONUtil.createObj()
.set("user_ticket", userTicket);
String userDetailResponse = post(QywxConstant.USER_SENSITIVE_INFO_URL + accessToken, params.toString());
JSONObject userDetail = JSONUtil.parseObj(userDetailResponse);
log.info("查询用户敏感信息请求参数: {}, 返回值: {}", params, userDetail);
if (!SUCCESS_CODE.equals(userDetail.containsKey(ERR_CODE) ? userDetail.get(ERR_CODE).toString() : null)) {
log.error("查询用户敏感信息失败,code:{}, msg:{}", userDetail.get(ERR_CODE),
userDetail.get(ERR_MESSAGE));
throw new FebsException("查询用户敏感信息失败");
if (!"0".equals(userDetail.containsKey("errcode") ? userDetail.get("errcode").toString() : null)) {
log.error("请求微信用户详细信息失败,code:{},msg:{}", userDetail.get("errcode"),
userDetail.get("errmsg"));
throw new FebsException("获取用户信息失败");
}
return userDetail;
}
@@ -384,9 +328,9 @@ public class WxUtil {
if (deptId != null) {
params.put("id", deptId);
}
JSONObject response = JSONUtil.parseObj(
get(QywxConstant.DEPT_LIST_URL, params));
log.info("获取企业微信部门列表请求参数: {}, 返回值: {}", params, response);
if (!"0".equals(response.containsKey("errcode") ? response.get("errcode").toString() : null)) {
log.error("获取企业微信部门列表失败,code:{},msg:{},params:{}", response.get("errcode"),
response.get("errmsg"), params);
@@ -396,50 +340,6 @@ public class WxUtil {
return response.getJSONArray("department").toList(Map.class);
}
/**
* 获取子部门ID列表
*
* @param accessToken 调用接口凭证
* @param deptId 部门id。获取指定部门及其下的子部门(以及子部门的子部门等等,递归)。 如果不填,默认获取全量组织架构
* @return java.util.List<java.util.Map>
* @author ZYJ
* @date 2023/4/24 10:46
*/
public List<Map> listSimpleDept(String accessToken, Long deptId) {
Map<String, Object> params = new HashMap<>();
params.put("access_token", accessToken);
if (deptId != null) {
params.put("id", deptId);
}
JSONObject response = JSONUtil.parseObj(get(QywxConstant.SIMPLE_DEPT_LIST_URL, params));
log.info("获取企业微信子部门ID列表请求参数: {}, 返回值: {}", params, response);
if (!SUCCESS_CODE.equals(response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null)) {
log.error("获取企业微信子部门ID列表失败,code:{},msg:{},params:{}", response.get(ERR_CODE),
response.get(ERR_MESSAGE), params);
throw new FebsException("获取企业微信子部门ID列表失败");
}
return response.getJSONArray("department_id").toList(Map.class);
}
/**
* 获取单个部门详情
*/
public JSONObject getDeptInfo(String accessToken, String deptId) {
Map<String, Object> params = new HashMap<>();
params.put("access_token", accessToken);
if (deptId != null) {
params.put("id", deptId);
}
JSONObject response = JSONUtil.parseObj(get(QywxConstant.DEPT_INFO_URL, params));
log.info("获取企业单个部门详情请求参数: {}, 返回值: {}", params, response);
if (!SUCCESS_CODE.equals(response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null)) {
log.error("获取企业单个部门详情失败,code:{},msg:{},params:{}", response.get(ERR_CODE),
response.get(ERR_MESSAGE), params);
throw new FebsException("获取企业单个部门详情失败");
}
return response.getJSONObject("department");
}
/**
* 创建企业微信部门(家校沟通)
*/
@@ -507,10 +407,10 @@ public class WxUtil {
JSONObject response = JSONUtil.parseObj(
post(QywxConstant.SCHOOL_DEPT_UPDATE_URL + "?access_token=" + accessToken,
JSONUtil.toJsonStr(body)));
log.info("删除部门管理员接口,params:[{}],res:[{}]", body, response);
if (!SUCCESS_CODE.equals(response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null)) {
log.error("企业微信删除部门(家校)管理员失败,code:{},msg:{}", response.get(ERR_CODE),
response.get(ERR_MESSAGE));
log.info("删除部门,params:[{}],res:[{}]", body, response);
if (!"0".equals(response.containsKey("errcode") ? response.get("errcode").toString() : null)) {
log.error("企业微信删除部门(家校)管理员失败,code:{},msg:{}", response.get("errcode"),
response.get("errmsg"));
throw new FebsException("删除部门(家校)管理员失败");
}
}
@@ -544,10 +444,9 @@ public class WxUtil {
}
JSONObject response = JSONUtil.parseObj(
get(QywxConstant.SCHOOL_DEPT_LIST_URL, params));
log.info("获取家校沟通部门列表请求参数: {}, 返回值: {}", params, response);
if (!SUCCESS_CODE.equals(response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null)) {
log.error("获取企业微信部门(家校)列表失败,code:{},msg:{},params:{}", response.get(ERR_CODE),
response.get(ERR_MESSAGE), params);
if (!"0".equals(response.containsKey("errcode") ? response.get("errcode").toString() : null)) {
log.error("获取企业微信部门(家校)列表失败,code:{},msg:{},params:{}", response.get("errcode"),
response.get("errmsg"), params);
throw new FebsException("获取企业微信部门(家校)列表失败");
}
@@ -590,9 +489,6 @@ public class WxUtil {
if (StrUtil.isNotBlank(staff.getLandLine())) {
body.put("telephone", staff.getLandLine());
}
if (StrUtil.isNotBlank(staff.getAddress())) {
body.put("address", staff.getAddress());
}
log.info(JSONUtil.toJsonStr(body));
JSONObject response = JSONUtil.parseObj(
post(QywxConstant.USER_CREATE_URL + "?access_token=" + accessToken,
@@ -668,15 +564,12 @@ public class WxUtil {
if (StrUtil.isNotBlank(staff.getLandLine())) {
body.put("telephone", staff.getLandLine());
}
if (StrUtil.isNotBlank(staff.getAddress())) {
body.put("address", staff.getAddress());
}
log.info(JSONUtil.toJsonStr(body));
JSONObject response = JSONUtil.parseObj(
post(QywxConstant.USER_UPDATE_URL + "?access_token=" + accessToken,
JSONUtil.toJsonStr(body)));
if (!"0".equals(response.containsKey("errcode") ? response.get("errcode").toString() : null)) {
log.error("企业微信修改用户失败,code:{},msg:{}", response.get("errcode"),
log.error("企业微信新增用户失败,code:{},msg:{}", response.get("errcode"),
response.get("errmsg"));
throw new FebsException("更新职工失败");
}
@@ -691,7 +584,6 @@ public class WxUtil {
JSONObject response = JSONUtil.parseObj(
post(QywxConstant.USER_DELETE_URL + "?access_token=" + accessToken,
JSONUtil.toJsonStr(body)));
log.info("企业微信删除用户请求参数: {}, 返回值: {}", body, response);
if (!"0".equals(response.containsKey("errcode") ? response.get("errcode").toString() : null)) {
log.error("企业微信删除用户失败,code:{},msg:{}", response.get("errcode"),
response.get("errmsg"));
@@ -827,7 +719,6 @@ public class WxUtil {
JSONObject response = JSONUtil.parseObj(
post(QywxConstant.PARENT_CREATE_URL + "?access_token=" + accessToken,
JSONUtil.toJsonStr(body)));
log.info("企业微信新增家长,res:[{}],params:[{}]", response, body);
if (!"0".equals(response.containsKey("errcode") ? response.get("errcode").toString() : null)) {
log.error("企业微信新增家长失败,code:{},msg:{},result_list:{}", response.get("errcode"),
response.get("errmsg"), response.get("result_list"));
@@ -983,43 +874,10 @@ public class WxUtil {
JSONObject response = JSONUtil.parseObj(
get(QywxConstant.SCHOOL_DEPT_DELETE_URL, params));
String code = response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null;
// 60003代表企业微信部门不存在
if (!SUCCESS_CODE.equals(code) && !"60003".equals(code)) {
if (!SUCCESS_CODE.equals(response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null)) {
log.error("企业微信删除家校部门失败,code:{},msg:{},params:{}", response.get(ERR_CODE),
response.get(ERR_MESSAGE), params);
throw new FebsException("删除家校部门失败,请检查是否包含成员或子部门");
}
}
/**
* 获取企业微信JS-SDK jsapi_ticket
*
* @param accessToken 应用token
* @param deptId 部门id
* @return java.lang.String
* @author ZYJ
* @date 2023/6/5 14:50
*/
public String getJsApiTicket(String accessToken, Long deptId) {
String jsApiTicket =
String.valueOf(redisService.get(FebsConstant.QYWX_WX_JS_API_TICKET + deptId));
if ("null".equals(jsApiTicket)) {
Map<String, Object> params = new HashMap<>();
params.put("access_token", accessToken);
// 获取JS-SDK jsapi_ticket
String response = get(QywxConstant.GET_JS_API_TICKET_URL, params);
JSONObject token = JSONUtil.parseObj(response);
if (token.containsKey("errcode") && !"0".equals(token.get("errcode").toString())) {
log.error("获取JS-SDK jsapi_ticket失败,code:{},msg:{}", token.get("errcode").toString(),
token.get("errmsg").toString());
throw new FebsException("验证失败");
}
jsApiTicket = token.get("ticket").toString();
// 缓存accessToken两小时
redisService.set(FebsConstant.QYWX_WX_JS_API_TICKET + deptId, jsApiTicket, 7200L);
}
return jsApiTicket;
}
}
@@ -5,5 +5,4 @@ com.yida.data.common.core.utils.WxUtil,\
com.yida.data.common.core.utils.WxPublicUtil,\
com.yida.data.common.core.utils.UnionPayPublicUtil,\
com.yida.data.common.core.configure.AsyncPollConfigure,\
com.yida.data.common.core.handler.BaseExceptionHandler,\
com.yida.data.common.core.utils.WxServiceProviderUtil
com.yida.data.common.core.handler.BaseExceptionHandler