diff --git a/module-aicc/pom.xml b/module-aicc/pom.xml new file mode 100644 index 0000000..e8a9d1b --- /dev/null +++ b/module-aicc/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + + com.whdc + fxkh-txl-parent + 1.0 + ../poms/dependency.xml + + + fxkh-txl-aicc + jar + 防汛抗旱通讯录API - 自动外呼模块 + + + + + com.whdc + fxkh-txl-common + + + + + org.springframework.boot + spring-boot-starter + + + + + com.baomidou + mybatis-plus-boot-starter + + + + + com.dameng + DmJdbcDriver18 + + + com.dameng + DmDialect-for-hibernate4.0 + + + com.alibaba + druid + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.apache.commons + commons-pool2 + + + + + org.apache.httpcomponents + httpclient + + + org.apache.httpcomponents + httpcore + + + com.squareup.okhttp3 + okhttp + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-test + test + + + \ No newline at end of file diff --git a/module-aicc/src/main/java/com/whdc/aicc/model/AutoCall.java b/module-aicc/src/main/java/com/whdc/aicc/model/AutoCall.java new file mode 100644 index 0000000..6cc4bb6 --- /dev/null +++ b/module-aicc/src/main/java/com/whdc/aicc/model/AutoCall.java @@ -0,0 +1,77 @@ +package com.whdc.aicc.model; + +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 com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * @author lyf + * @since 2025-06-14 + */ +@Data +@Accessors(chain = true) +@ApiModel(description = "自动拨号") +@TableName("FXKH_TXL.AUTOCALL") +@ToString +public class AutoCall { + /* + new的时候必填responderId,responderName,wcmId,createTm + query后必填__开头的 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + @TableField(value = "responder_id") + @JsonProperty("addressBookOldId") + private Integer responderId; + @JsonProperty("addressBookOldName") + @TableField(value = "responder_name") + private String responderName; + @TableField(value = "status") + private String status;//接通,空号,停机,关机,未接,拒接,占线,呼叫失败,null(空代表未呼叫) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "_create_tm") + private Date createTm; + @TableField(value = "wcm_id") + private Integer wcmId; + @TableField(value = "level") + private Integer level; + + @TableField(value = "__talk_times") + private Integer talkTimes;//通话时长,单位秒 + @TableField(value = "__sip_term_cause") + private String sipTermCause; //例如”对方挂机“ + @TableField(value = "__caller") + private String caller; + @TableField(value = "__number") + private String number; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "__startring_at") + private Date startringAt; //-3 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "__connected_at") + private Date connectedAt; //-3 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "__started_at") + private Date startedAt; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "__endring_at") + private Date endringAt; //-3 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "__disconnected_at") + private Date disconnectedAt; //-3 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "__stopped_at") + private Date stopedAt; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "__last_modify") + private Date lastModify; +} diff --git a/module-aicc/src/main/java/com/whdc/aicc/model/AutoCallConfig.java b/module-aicc/src/main/java/com/whdc/aicc/model/AutoCallConfig.java new file mode 100644 index 0000000..172db8d --- /dev/null +++ b/module-aicc/src/main/java/com/whdc/aicc/model/AutoCallConfig.java @@ -0,0 +1,15 @@ +package com.whdc.aicc.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * @author lyf + * @since 2025-06-19 + */ +@Data +@TableName("FXKH_TXL.AUTOCALL_CONFIG") +public class AutoCallConfig { + private String key; + private String value; +} diff --git a/module-aicc/src/main/java/com/whdc/aicc/model/AutoCallPerson.java b/module-aicc/src/main/java/com/whdc/aicc/model/AutoCallPerson.java new file mode 100644 index 0000000..3c8ef04 --- /dev/null +++ b/module-aicc/src/main/java/com/whdc/aicc/model/AutoCallPerson.java @@ -0,0 +1,98 @@ +package com.whdc.aicc.model; + +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 lombok.Data; + +import java.util.Date; + +/** + * @author lyf + * @since 2025-07-08 + */ +@Data +@TableName("FXKH_TXL.AUTO_CALL_PERSON") +public class AutoCallPerson { + public static final int STATUS_DEFAULT = 0; + public static final int STATUS_UPLOADED = 1; + public static final int STATUS_CALLED = 2; + public static final int STATUS_PUT = 3; + public static final int STATUS_CANCELLED = 4; + public static final int STATUS_MANUAL_CLOSE = 6; + public static final int ERRCODE_ENCODE = 1; + public static final int ERRCODE_UPLOAD_FAIL = 2; + public static final String TAG_DONE = "已知晓"; + + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + @TableField(value = "task_id") + private Integer taskId; + @TableField(value = "status") + private Integer status; //0:未上传 default 0 + @TableField(value = "level") + private Integer level; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "_create_tm") + private Date createTm; + @TableField(value = "error_code") + private Integer errorCode; //default 0 + @TableField(value = "uploaded_times") + private Integer uploadedTimes; //default 0 + @TableField(value = "sms_content") + private String smsContent; //短信内容 + @TableField(value = "manual_close") + private Integer manualClose; //default 0 + @TableField(value = "position") + private String position; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "manual_close_tm") + private Date manualCloseTm; + + @TableField(value = "__request_id") + private String uploadRequestId; //任务名,同时作为参数的taskName,用custId + @TableField(value = "__cust_id") + private String uploadCustId; //联系人id,用warningResponderId加时间戳毫秒 + @TableField(value = "__cust_name") + private String uploadCustName; //联系人 + @TableField(value = "__content") + private String uploadContent; //外呼内容 + @TableField(value = "__number") + private String uploadNumber; + @TableField(value = "__upload_resp_msg") + private String uploadRespMsg; //上传结果 + @TableField(value = "__remark") + private String detailRemark;//接通,空号,停机,关机,未接,拒接,占线,呼叫失败,null(空代表未呼叫) + @TableField(value = "__talk_times") + private Integer detailTalkTimes;//通话时长,单位秒 + @TableField(value = "__sip_term_cause") + private String detailSipTermCause; //例如”对方挂机“ + @TableField(value = "__tag") + private String tag; //话术识别:未识别,已知晓 + @TableField("__is_complete") + private Integer isComplete; //default 0 + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "__startring_at") + private Date detailStartringAt; //-3 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "__connected_at") + private Date detailConnectedAt; //-3 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "__started_at") + private Date detailStartedAt; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "__endring_at") + private Date detailEndringAt; //-3 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "__disconnected_at") + private Date detailDisconnectedAt; //-3 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "__stopped_at") + private Date detailStopedAt; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(value = "__last_modify") + private Date detailLastModify; +} diff --git a/module-aicc/src/main/java/com/whdc/aicc/model/AutoCallTask.java b/module-aicc/src/main/java/com/whdc/aicc/model/AutoCallTask.java new file mode 100644 index 0000000..0d4dd7d --- /dev/null +++ b/module-aicc/src/main/java/com/whdc/aicc/model/AutoCallTask.java @@ -0,0 +1,67 @@ +package com.whdc.aicc.model; + +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 lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * @author lyf + * @since 2025-07-08 + */ +@Data +@TableName("FXKH_TXL.AUTO_CALL_TASK") +public class AutoCallTask { + public static final int STATUS_DEFAULT = 0; // 不生成 + public static final int STATUS_SHOULD_GENERATE = 1; + public static final int STATUS_GENERATED_AKA_READY_TO_UPLOAD = 2; + public static final int STATUS_ANY_SUCCESS = 3; + public static final int STATUS_ALL_FAIL = 4; + public static final int STATUS_CANCELLED = 5; + public static final int STATUS_MANUAL_CLOSE = 6; //人工处置 + public static final int ERRCODE_NO_PERSON = 1; + public static final int ERRCODE_DB_ERROR = 2; + + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + @TableField(value = "warn_id") + private Integer warnId; //not null + @TableField(value = "status") + private Integer status; //0:不拨打 default 0 + @TableField(value = "error_code") + private Integer errorCode; //default 0 + @TableField(value = "warn_name") + private String warnName; + @TableField(value = "warn_tm") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date warnTm; + @TableField(value = "warn_level") + private String warnLevel; + @TableField(value = "WARN_CTNM") + private String warnCtnm; + @TableField(value = "warn_cnnm") + private String warnCnnm; + @TableField(value = "warn_content") + private String warnContent; + @TableField(value = "__tag") + private String tag; //话术识别:未识别,已知晓 + @TableField(value = "submit") + private Integer submit; //是否已提交线程池,default 0 + + @TableField(value = "_create_tm") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTm; + @TableField(value = "_remark") + private String remark; + + @TableField(exist = false) + private List callList; + + @TableField(exist = false) + private AutoCallPerson successPerson; +} diff --git a/module-aicc/src/main/java/com/whdc/aicc/model/aicc/AICCCallRespDetail.java b/module-aicc/src/main/java/com/whdc/aicc/model/aicc/AICCCallRespDetail.java new file mode 100644 index 0000000..81309b9 --- /dev/null +++ b/module-aicc/src/main/java/com/whdc/aicc/model/aicc/AICCCallRespDetail.java @@ -0,0 +1,71 @@ +package com.whdc.aicc.model.aicc; + + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.ToString; + +import java.util.List; + +/** + * 联通查询任务状态接口返回对象 + * + * @author lyf + * @since 2025-06-17 + */ +@lombok.Data +@ToString +public class AICCCallRespDetail { + private Data data; + + @lombok.Data + @ToString + public static class Data { + List records; + } + + @lombok.Data + @ToString + public static class Record { + private String caller; //外呼号码 + private Long dataTime; + private String processId; //机器人id + private String sessionDetailId; //联系人id,等同返回值的custId + private Integer talkTimes;//通话时长,单位秒 + private String remark; //中文状态,接通,空号,停机,关机,未接,拒接,占线,呼叫失败,""代表未呼叫 + private String taskName; //任务名 + private Integer status; //0进行中 2结束 4暂停 + private Integer totalCount; + private Integer sendCount; + private boolean isCompleted; + + private RawVarListMap rawVarListMap; + private List tags; + } + + @lombok.Data + @ToString + public static class RawVarListMap { + private String taskName; //任务名,作为参数的taskName + private String dialTaskMainSn; //任务编号,作为参数的requestId + private String custId; //联系人id + private String sipTermCause; //例如”对方挂机“ + private String sipTermStatus; //接通是200 + private String caller; + @JSONField(name = "@NUMBER") + private String number; + private String startringAt; + private String connectedAt; + private String startedAt; + private String endringAt; + private String disconnectedAt; + private String stopedAt; + private String lastModify; + } + + @lombok.Data + @ToString + public static class Tag { + @JSONField(name = "tag_name") + private String tagName; + } +} diff --git a/module-aicc/src/main/java/com/whdc/aicc/model/aicc/AICCCallRespTask.java b/module-aicc/src/main/java/com/whdc/aicc/model/aicc/AICCCallRespTask.java new file mode 100644 index 0000000..ded08a8 --- /dev/null +++ b/module-aicc/src/main/java/com/whdc/aicc/model/aicc/AICCCallRespTask.java @@ -0,0 +1,38 @@ +package com.whdc.aicc.model.aicc; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * uploadCallData接口的返回值 + * + * @author lyf + * @since 2025-06-20 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class AICCCallRespTask extends AICCCallRespWrapper { + /* + { + "msg": "操作成功!", + "result": { + "msg": "任务名称重复" | "导入成功", + "count": "0", + "status": "-1" + }, + "code": 0, + "redirected": false, + "success": true, + "errorType": 0, + "errorCode": "", + "timestamp": 1750383985979 + } + */ + //code 0 success true + public static final String MSG_SUCCESS = "导入成功"; + public static final String MSG_REPEAT = "任务名称重复"; + + private String msg; + private String count; + private String status; +} diff --git a/module-aicc/src/main/java/com/whdc/aicc/model/aicc/AICCCallRespWrapper.java b/module-aicc/src/main/java/com/whdc/aicc/model/aicc/AICCCallRespWrapper.java new file mode 100644 index 0000000..55d48dc --- /dev/null +++ b/module-aicc/src/main/java/com/whdc/aicc/model/aicc/AICCCallRespWrapper.java @@ -0,0 +1,37 @@ +package com.whdc.aicc.model.aicc; + +import lombok.Data; + +/** + * @author lyf + * @since 2025-06-20 + */ +@Data +public class AICCCallRespWrapper { + /* + { + "code": 406, + "errorCode": "", + "errorType": 0, + "msg": "Token失效,请重新登录!", + "redirected": true, + "success": false, + "timestamp": 1750384243314 + } + */ + //code 406 success false + private String msg; + private int code; + private boolean redirected; + private boolean success; + private int errorType; + private String errorCode; + private long timestamp; + + //token失效没有result + private T result; + + public boolean isTokenInvalid() { + return code == 406 && !success; + } +} diff --git a/module-aicc/src/main/java/com/whdc/aicc/model/aicc/AICCLogin.java b/module-aicc/src/main/java/com/whdc/aicc/model/aicc/AICCLogin.java new file mode 100644 index 0000000..ee6a3f5 --- /dev/null +++ b/module-aicc/src/main/java/com/whdc/aicc/model/aicc/AICCLogin.java @@ -0,0 +1,19 @@ +package com.whdc.aicc.model.aicc; + +import lombok.Data; + +/** + * @author lyf + * @since 2025-06-20 + */ +@Data +public class AICCLogin { + /* + {"msg":"操作成功!","result":{"msg":"操作成功","tenantId":"963936517","status":"0","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhCU0wwMSIsInRlbmFudElkIjoiOTYzOTM2NTE3IiwiZXhwIjoxNzUwNjg4NjE4fQ.INUcA-keg7T3HrZXH87K2ZqOT2trxLF38kmA9Wu301w"},"code":0,"redirected":false,"success":true,"errorType":0,"errorCode":"","timestamp":1750386218853} + */ + //code 0 success true + private String msg; + private String tenantId; + private String status; + private String token; +} diff --git a/module-aicc/src/main/java/com/whdc/aicc/model/aicc/AICCUploadTask.java b/module-aicc/src/main/java/com/whdc/aicc/model/aicc/AICCUploadTask.java new file mode 100644 index 0000000..4d446fb --- /dev/null +++ b/module-aicc/src/main/java/com/whdc/aicc/model/aicc/AICCUploadTask.java @@ -0,0 +1,120 @@ +package com.whdc.aicc.model.aicc; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @author lyf + * @since 2025-06-20 + */ +@Data +public class AICCUploadTask { + /* + JSONObject data = new JSONObject(); + data.put("taskName", taskName); + data.put("processId", processId); + data.put("callerGroup", callerGroup); + data.put("requestId", requestId); + data.put("calleeType", 2); + data.put("repeatTimes", 2); + data.put("autoCall", "0"); + data.put("spanSeconds", 60); + data.put("processType", "3"); + data.put("mutiTimeRange", timeRange); + JSONArray params = new JSONArray(); + JSONObject param = new JSONObject(); + param.put("@common_user_name", custName); + param.put("@NUMBER", number); + if (bakNumbers != null && bakNumbers.length > 0) { + for (int i = 0; i < bakNumbers.length; i++) { + if (i == 3) break; + param.put("备用号码" + (i + 1), bakNumbers[i]); + } + } + param.put("custId", custId); + param.put("content", "我是省防办智能外呼系统," + content + "如需咨询请拨打02787221781"); + params.add(param); + data.put("param", params); + */ + private String taskName; + private String processId; + private String callerGroup; + private String requestId; + private int calleeType = 0; //默认0 重乎1 顺乎2 默认为0 +// private int repeatTimes = 1;//呼叫次数,CallType=0不传; CalleeType=1重乎必传; CalleeType=2顺乎并且autoCall为0必传 + private String autoCall = "1";//顺乎未接通是否重乎,开启=0; 关闭=1; CalleeType=2顺乎必传 +// private int spanSeconds = 3;//重乎间隔时间(秒),CallType=0不传; CalleeType=1重乎必传; CalleeType=2顺乎并且autoCall为0必传 + private String processType = "3"; + private String mutiTimeRange; + private List param; +// private String smsSend = "1"; //1不发短信,0发短信 +// private String smsSendType = "0"; //挂机短信0,未接通短信1,smsSend为0必传 +// private String templateId; //短信模板id,smsSend为0必传 + + @Data + public static class Cust { + @JSONField(name = "@common_user_name") + private String custName; + @JSONField(name = "@NUMBER") + private String number; + @JSONField(name = "备用号码1") + private String backNumber1; + @JSONField(name = "备用号码2") + private String backNumber2; + @JSONField(name = "备用号码3") + private String backNumber3; + private String custId; + private String content; + @JSONField(serialize = false, deserialize = false) + private List _numbers; + + public static CustBuilder builder() { + return new CustBuilder(); + } + + @Data + @Accessors(chain = true) + public static class CustBuilder { + private String custName; + private String custId; + private String content; + @JSONField(serialize = false, deserialize = false) + private List _numbers; + + public Cust build() { + Cust cust = new Cust(); + cust.setCustName(custName); + cust.setCustId(custId); + cust.setContent(content); + for (int i = 0; i < _numbers.size(); i++) { + switch (i) { + case 0: + cust.setNumber(_numbers.get(i)); + break; + case 1: + cust.setBackNumber1(_numbers.get(i)); + break; + case 2: + cust.setBackNumber2(_numbers.get(i)); + break; + case 3: + cust.setBackNumber3(_numbers.get(i)); + break; + } + } + return cust; + } + } + + } + + public void genMutiTimeRange() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + this.mutiTimeRange = sdf.format(new Date()) + "_" + sdf.format(new Date(System.currentTimeMillis() + 1000 * 60 * 60)); + } +} diff --git a/module-aicc/src/main/java/com/whdc/aicc/utils/AICCHelper.java b/module-aicc/src/main/java/com/whdc/aicc/utils/AICCHelper.java new file mode 100644 index 0000000..583f94d --- /dev/null +++ b/module-aicc/src/main/java/com/whdc/aicc/utils/AICCHelper.java @@ -0,0 +1,282 @@ +package com.whdc.aicc.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; +import com.whdc.aicc.model.aicc.*; +import com.whdc.common.utils.AESpkcs7paddingUtil; +import com.whdc.common.utils.HttpHelper; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.io.UnsupportedEncodingException; +import java.security.GeneralSecurityException; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; + +/** + * @author lyf + * @since 2025-06-19 + */ +@Component +@Slf4j +public class AICCHelper { + @Setter + @Value("${autocall.processId}") + private String processId; + @Setter + @Value("${autocall.callerGroup}") + private String callerGroup; + @Setter + @Value("${autocall.secret}") + private String secret; + @Setter + @Value("${autocall.sysUserId}") + private String sysUserId; + @Autowired + private HttpHelper httpHelper = new HttpHelper(); + + private static final AtomicBoolean isAcquiringToken = new AtomicBoolean(false); + private static volatile CountDownLatch latch = new CountDownLatch(0); + private static final AtomicReference globalToken = new AtomicReference<>(); + + public String getToken() { + if (globalToken.get() == null) { + initToken(); + } + return globalToken.get(); + } + + public void initToken() throws RuntimeException { + if (isAcquiringToken.compareAndSet(false, true)) { + latch = new CountDownLatch(1); + globalToken.set(null); + try { + String data = "{\"sysUserId\":\"" + sysUserId + "\",\"expire\":1000000}"; + String encrypt; + try { + encrypt = AESpkcs7paddingUtil.encrypt(data, secret); + } catch (Exception e) { + throw new RuntimeException(e); + } + JSONObject request = new JSONObject(); + request.put("request", encrypt); + Map headers = new HashMap<>(); +// headers.put("X-Access-Token", getToken()); + String resp = httpHelper.postJsonString("https://aicc.cuopen.net:9801/aicc-api/ssb/callout/thirdParty/login", request.toJSONString(), headers); + + TypeReference> type = new TypeReference>() { + }; + AICCCallRespWrapper AICCCallRespWrapper = JSON.parseObject(resp, type); + if (AICCCallRespWrapper == null || !AICCCallRespWrapper.isSuccess() || AICCCallRespWrapper.getResult() == null) { + log.warn("获取外呼系统token失败"); + return; + } + + AICCLogin result = AICCCallRespWrapper.getResult(); + String token = result.getToken(); +// if (token != null && !token.isEmpty()) { + globalToken.set(token); +// } + } finally { + isAcquiringToken.set(false); + latch.countDown(); + } + } else { + try { + latch.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + } + + public AICCCallRespWrapper apiUploadCallData(AICCUploadTask data) throws GeneralSecurityException, UnsupportedEncodingException { + return apiUploadCallData(data, getToken()); + } + + public AICCCallRespWrapper apiUploadCallData(AICCUploadTask data, String token) throws GeneralSecurityException, UnsupportedEncodingException { + String e; + try { + e = AESpkcs7paddingUtil.encrypt(JSON.toJSONString(data), secret); + } catch (GeneralSecurityException | UnsupportedEncodingException ex) { + throw ex; + } catch (Exception ex) { + throw new RuntimeException(ex); + } + JSONObject request = new JSONObject(); + request.put("request", e); + Map headers = new HashMap<>(); + headers.put("X-Access-Token", token); + String resp = httpHelper.postJsonString("https://aicc.cuopen.net:9801/aicc-api/ssb/callout/thirdParty/task/uploadCallData", request.toJSONString(), headers); + log.info("apiUploadCallData: {}", resp); + TypeReference> type = new TypeReference>() { + }; + AICCCallRespWrapper AICCCallRespWrapper = null; + if (!resp.contains("请求失败") && !resp.contains("网络异常")) { + try { + AICCCallRespWrapper = JSON.parseObject(resp, type); + } catch (Exception ex) { + log.warn("apiUploadCallData first time: {}", resp); + log.warn("error: ", ex); + } + } else { + log.info("apiUploadCallData first time: {}", resp); + } + + if (AICCCallRespWrapper == null || !AICCCallRespWrapper.isSuccess()) { + initToken(); + headers.put("X-Access-Token", getToken()); + resp = httpHelper.postJsonString("https://aicc.cuopen.net:9801/aicc-api/ssb/callout/thirdParty/task/uploadCallData", request.toJSONString(), headers); + if (!resp.contains("请求失败") && !resp.contains("网络异常")) { + try { + AICCCallRespWrapper = JSON.parseObject(resp, type); + } catch (Exception ex) { + log.warn("apiUploadCallData second time: {}", resp); + log.warn("error: ", ex); + } + } else { + log.info("apiUploadCallData second time: {}", resp); + } + } + + if (AICCCallRespWrapper == null || !AICCCallRespWrapper.isSuccess()) { + return null; + } + return AICCCallRespWrapper; + } + + public AICCCallRespWrapper apiGetTaskCallDetail(String requestId, String custId) { + return apiGetTaskCallDetail(requestId, custId, getToken()); + } + + public AICCCallRespWrapper apiGetTaskCallDetail(String requestId, String custId, String token) { + JSONObject request = new JSONObject(); + request.put("requestId", requestId); + request.put("custId", custId); + Map headers = new HashMap<>(); + headers.put("X-Access-Token", token); + String resp = httpHelper.postJsonString("https://aicc.cuopen.net:9801/aicc-api/ssb/callout/thirdParty/task/getTaskCallDetail", request.toJSONString(), headers); + TypeReference> type = new TypeReference>() { + }; + AICCCallRespWrapper aICCCallRespWrapper = null; + try { + aICCCallRespWrapper = JSON.parseObject(resp, type); + } catch (Exception e) { + log.warn("apiGetTaskCallDetail first time: {}", resp); + log.warn("error: ", e); + } + if (aICCCallRespWrapper == null || !aICCCallRespWrapper.isSuccess()) { + initToken(); + headers.put("X-Access-Token", getToken()); + resp = httpHelper.postJsonString("https://aicc.cuopen.net:9801/aicc-api/ssb/callout/thirdParty/task/getTaskCallDetail", request.toJSONString(), headers); + try { + aICCCallRespWrapper = JSON.parseObject(resp, type); + } catch (Exception e) { + log.warn("apiGetTaskCallDetail second time: {}", resp); + log.warn("error: ", e); + } + } + + if (aICCCallRespWrapper == null || !aICCCallRespWrapper.isSuccess()) { + log.info("获取任务详情失败:{}", resp); + return null; + } + return aICCCallRespWrapper; + } + + public AICCUploadTask newTask(String requestId, String custId, String custName, String content, List numbers) { + AICCUploadTask task = new AICCUploadTask(); + task.setTaskName(requestId); + task.setProcessId(processId); + task.setCallerGroup(callerGroup); + task.setRequestId(requestId); + task.genMutiTimeRange(); + AICCUploadTask.Cust param = AICCUploadTask.Cust.builder() + .setCustName(custName) + .setCustId(custId) + .setContent(content) + .set_numbers(numbers) + .build(); + task.setParam(Collections.singletonList(param)); + + return task; + } + +// private String sendPost(String url, JSONObject jsonData) { +// String resp = sendPost(url, jsonData.toJSONString()); +// if (resp == null) { +// resp = sendPost(url, jsonData.toJSONString()); +// } +// return resp; +// } +// +// private String sendPost(String url, JSONObject jsonData, String token) { +// String resp = sendPost(url, jsonData.toJSONString(), token); +// if (resp == null) { +// resp = sendPost(url, jsonData.toJSONString(), token); +// } +// return resp; +// } +// +// private String sendPost(String url, String jsonData) { +// return sendPost(url, jsonData, getToken()); +// } +// +// private String sendPost(String url, String jsonData, String token) { +// CloseableHttpResponse response = null; +// CloseableHttpClient httpClient = null; +// String responseContent = null; +// try { +// httpClient = HttpClients.createDefault(); +// HttpPost httpPost = new HttpPost(url); +// httpPost.addHeader("Content-Type", "application/json"); +// httpPost.addHeader("X-Access-Token", token); +// +// if (StringUtils.isNotBlank(jsonData)) { +// httpPost.setEntity(new StringEntity(jsonData, "UTF-8")); +// } +// +// log.info("请求地址: " + url); +// log.info("token: " + getToken()); +// log.info("请求参数: " + jsonData); +// +// response = httpClient.execute(httpPost); +// HttpEntity entity = response.getEntity(); +// responseContent = EntityUtils.toString(entity, "UTF-8"); +// responseContent = jsonFormat(responseContent); +// if (responseContent.length() < 200) { +// log.info("响应参数: " + responseContent); +// } +// } catch (Exception e) { +// log.error("发送请求异常", e); +// return null; +// } finally { +// try { +// if (null != response) { +// response.close(); +// } +// httpClient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return responseContent; +// } + + private static String jsonFormat(String str) { + if (JSON.isValidObject(str)) { + str = JSON.parseObject(str).toJSONString(); + } + + return str; + } +} diff --git a/module-aicc/src/main/java/com/whdc/aicc/utils/AutoCallHelper.java b/module-aicc/src/main/java/com/whdc/aicc/utils/AutoCallHelper.java new file mode 100644 index 0000000..5f24348 --- /dev/null +++ b/module-aicc/src/main/java/com/whdc/aicc/utils/AutoCallHelper.java @@ -0,0 +1,236 @@ +package com.whdc.aicc.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; +import com.whdc.aicc.model.aicc.*; +import com.whdc.common.utils.AESpkcs7paddingUtil; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; + +/** + * @author lyf + * @since 2025-06-19 + */ +@Component +@Slf4j +public class AutoCallHelper { + @Setter + @Value("${autocall.processId}") + private String processId; + @Setter + @Value("${autocall.callerGroup}") + private String callerGroup; + @Setter + @Value("${autocall.secret}") + private String secret; + @Setter + @Value("${autocall.sysUserId}") + private String sysUserId; + + private static final AtomicBoolean isAcquiringToken = new AtomicBoolean(false); + private static volatile CountDownLatch latch = new CountDownLatch(0); + private static final AtomicReference globalToken = new AtomicReference<>(); + + public String getToken() { + if (globalToken.get() == null) { + initToken(); + } + return globalToken.get(); + } + + public void initToken() throws RuntimeException { + if (isAcquiringToken.compareAndSet(false, true)) { + globalToken.set(null); + try { + String data = "{\"sysUserId\":\"" + sysUserId + "\",\"expire\":1000000}"; + String encrypt; + try { + encrypt = AESpkcs7paddingUtil.encrypt(data, secret); + } catch (Exception e) { + throw new RuntimeException(e); + } + JSONObject request = new JSONObject(); + request.put("request", encrypt); + String resp = sendPost("https://aicc.cuopen.net:9801/aicc-api/ssb/callout/thirdParty/login", request); + + TypeReference> type = new TypeReference>() { + }; + AICCCallRespWrapper AICCCallRespWrapper = JSON.parseObject(resp, type); + if (AICCCallRespWrapper == null || !AICCCallRespWrapper.isSuccess() || AICCCallRespWrapper.getResult() == null) { + log.warn("获取外呼系统token失败"); + return; + } + + AICCLogin result = AICCCallRespWrapper.getResult(); + String token = result.getToken(); + if (token != null && !token.isEmpty()) { + globalToken.set(token); + } + } finally { + isAcquiringToken.set(false); + } + } else { + try { + latch.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + } + + public AICCCallRespWrapper apiUploadCallData(AICCUploadTask data) { + return apiUploadCallData(data, getToken()); + } + + public AICCCallRespWrapper apiUploadCallData(AICCUploadTask data, String token) { + String e; + try { + e = AESpkcs7paddingUtil.encrypt(JSON.toJSONString(data), secret); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + JSONObject request = new JSONObject(); + request.put("request", e); + String resp = sendPost("https://aicc.cuopen.net:9801/aicc-api/ssb/callout/thirdParty/task/uploadCallData", request, token); + + TypeReference> type = new TypeReference>() { + }; + AICCCallRespWrapper AICCCallRespWrapper = JSON.parseObject(resp, type); + if (AICCCallRespWrapper == null || !AICCCallRespWrapper.isSuccess()) { + initToken(); + resp = sendPost("https://aicc.cuopen.net:9801/aicc-api/ssb/callout/thirdParty/task/uploadCallData", request, token); + AICCCallRespWrapper = JSON.parseObject(resp, type); + } + + if (AICCCallRespWrapper == null || !AICCCallRespWrapper.isSuccess()) { + return null; + } + return AICCCallRespWrapper; + } + + public AICCCallRespWrapper apiGetTaskCallDetail(String requestId, String custId) { + JSONObject request = new JSONObject(); + request.put("requestId", requestId); + request.put("custId", custId); + String resp = sendPost("https://aicc.cuopen.net:9801/aicc-api/ssb/callout/thirdParty/task/getTaskCallDetail", request); + + TypeReference> type = new TypeReference>() { + }; + AICCCallRespWrapper AICCCallRespWrapper = JSON.parseObject(resp, type); + if (AICCCallRespWrapper == null || !AICCCallRespWrapper.isSuccess()) { + initToken(); + resp = sendPost("https://aicc.cuopen.net:9801/aicc-api/ssb/callout/thirdParty/task/getTaskCallDetail", request); + AICCCallRespWrapper = JSON.parseObject(resp, type); + } + + if (AICCCallRespWrapper == null || !AICCCallRespWrapper.isSuccess()) { + return null; + } + return AICCCallRespWrapper; + } + + public AICCUploadTask newTask(String requestId, String custId, String custName, String content, List numbers) { + AICCUploadTask task = new AICCUploadTask(); + task.setTaskName(requestId); + task.setProcessId(processId); + task.setCallerGroup(callerGroup); + task.setRequestId(requestId); + task.genMutiTimeRange(); + AICCUploadTask.Cust param = AICCUploadTask.Cust.builder() + .setCustName(custName) + .setCustId(custId) + .setContent(content) + .set_numbers(numbers) + .build(); + task.setParam(Collections.singletonList(param)); + + return task; + } + + private String sendPost(String url, JSONObject jsonData) { + String resp = sendPost(url, jsonData.toJSONString()); + if (resp == null) { + resp = sendPost(url, jsonData.toJSONString()); + } + return resp; + } + + private String sendPost(String url, JSONObject jsonData, String token) { + String resp = sendPost(url, jsonData.toJSONString(), token); + if (resp == null) { + resp = sendPost(url, jsonData.toJSONString(), token); + } + return resp; + } + + private String sendPost(String url, String jsonData) { + return sendPost(url, jsonData, getToken()); + } + + private String sendPost(String url, String jsonData, String token) { + CloseableHttpResponse response = null; + CloseableHttpClient httpClient = null; + String responseContent = null; + try { + httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(url); + httpPost.addHeader("Content-Type", "application/json"); + httpPost.addHeader("X-Access-Token", token); + + if (StringUtils.isNotBlank(jsonData)) { + httpPost.setEntity(new StringEntity(jsonData, "UTF-8")); + } + + log.info("请求地址: " + url); + log.info("token: " + getToken()); + log.info("请求参数: " + jsonData); + + response = httpClient.execute(httpPost); + HttpEntity entity = response.getEntity(); + responseContent = EntityUtils.toString(entity, "UTF-8"); + responseContent = jsonFormat(responseContent); + if (responseContent.length() < 200) { + log.info("响应参数: " + responseContent); + } + } catch (Exception e) { + log.error("发送请求异常", e); + return null; + } finally { + try { + if (null != response) { + response.close(); + } + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return responseContent; + } + + private static String jsonFormat(String str) { + if (JSON.isValidObject(str)) { + str = JSON.parseObject(str).toJSONString(); + } + + return str; + } +} diff --git a/module-aicc/src/main/resources/mapper/AutoCallMapper.xml b/module-aicc/src/main/resources/mapper/AutoCallMapper.xml new file mode 100644 index 0000000..18377b1 --- /dev/null +++ b/module-aicc/src/main/resources/mapper/AutoCallMapper.xml @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/module-aicc/src/main/resources/mapper/AutoCallPersonMapper.xml b/module-aicc/src/main/resources/mapper/AutoCallPersonMapper.xml new file mode 100644 index 0000000..aaddd8d --- /dev/null +++ b/module-aicc/src/main/resources/mapper/AutoCallPersonMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/module-aicc/src/main/resources/mapper/AutoCallTaskMapper.xml b/module-aicc/src/main/resources/mapper/AutoCallTaskMapper.xml new file mode 100644 index 0000000..ec0807a --- /dev/null +++ b/module-aicc/src/main/resources/mapper/AutoCallTaskMapper.xml @@ -0,0 +1,31 @@ + + + + + + \ No newline at end of file diff --git a/module-aicc/src/main/resources/mapper/WarnCallMapMapper.xml b/module-aicc/src/main/resources/mapper/WarnCallMapMapper.xml new file mode 100644 index 0000000..fc82017 --- /dev/null +++ b/module-aicc/src/main/resources/mapper/WarnCallMapMapper.xml @@ -0,0 +1,31 @@ + + + + + + \ No newline at end of file diff --git a/module-common/pom.xml b/module-common/pom.xml new file mode 100644 index 0000000..515c501 --- /dev/null +++ b/module-common/pom.xml @@ -0,0 +1,102 @@ + + + 4.0.0 + + + com.whdc + fxkh-txl-parent + 1.0 + ../poms/dependency.xml + + + fxkh-txl-common + jar + 防汛抗旱通讯录API - 公共模块 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.springframework.boot + spring-boot-starter-aop + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.projectlombok + lombok + + + com.alibaba + fastjson + + + commons-beanutils + commons-beanutils + + + joda-time + joda-time + + + + + org.apache.httpcomponents + httpclient + + + org.apache.httpcomponents + httpcore + + + com.squareup.okhttp3 + okhttp + + + com.github.xiaoymin + knife4j-spring-boot-starter + + + + com.baomidou + mybatis-plus-boot-starter + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + com.github.binarywang + weixin-java-miniapp + + + + cn.afterturn + easypoi-spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + \ No newline at end of file diff --git a/module-common/src/main/java/com/whdc/common/annotation/DateTimeRange.java b/module-common/src/main/java/com/whdc/common/annotation/DateTimeRange.java new file mode 100644 index 0000000..9a4593b --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/annotation/DateTimeRange.java @@ -0,0 +1,53 @@ +package com.whdc.common.annotation; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; +import java.util.concurrent.TimeUnit; + +/** + * @author 李赛 + * @date 2022-04-27 12:08 + */ +@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = DateTimeRangeValidator.class) +@Documented +public @interface DateTimeRange { + + String message() default "{message}"; + + Class[] groups() default {}; + + Class[] payload() default {}; + + String datafmt() default "yyyy-MM-dd HH:mm:ss"; + + /** + * 起始属性字段名称 + * + * @return + */ + String startField(); + + /** + * 截止属性字段名称 + * + * @return + */ + String endField(); + + /** + * 时间间隔 + * + * @return + */ + long interval(); + + /** + * 时间间隔单位 + * + * @return + */ + TimeUnit timeUnit() default TimeUnit.HOURS; +} diff --git a/module-common/src/main/java/com/whdc/common/annotation/DateTimeRangeValidator.java b/module-common/src/main/java/com/whdc/common/annotation/DateTimeRangeValidator.java new file mode 100644 index 0000000..2222567 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/annotation/DateTimeRangeValidator.java @@ -0,0 +1,63 @@ +package com.whdc.common.annotation; + +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.lang3.StringUtils; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.concurrent.TimeUnit; + +/** + * @author 李赛 + * @date 2022-04-27 11:55 + */ +public class DateTimeRangeValidator implements ConstraintValidator { + + private String datefmt; + private String startField; + private String endField; + private long interval; + private TimeUnit timeUnit; + + @Override + public void initialize(DateTimeRange dateTimeRange) { + this.datefmt = dateTimeRange.datafmt(); + this.startField = dateTimeRange.startField(); + this.endField = dateTimeRange.endField(); + this.interval = dateTimeRange.interval(); + this.timeUnit = dateTimeRange.timeUnit(); + } + + @Override + public boolean isValid(Object obj, ConstraintValidatorContext context) { + try { + if (obj == null) { + return false; + } + + if (StringUtils.isBlank(this.startField) || StringUtils.isBlank(this.endField)) { + return false; + } + + String stmval = BeanUtils.getProperty(obj, this.startField); + String etmval = BeanUtils.getProperty(obj, this.endField); + + if (StringUtils.isBlank(stmval) || StringUtils.isBlank(etmval)) { + return false; + } + + DateFormat df = new SimpleDateFormat(this.datefmt); + Date stm = df.parse(stmval); + Date etm = df.parse(etmval); + + long dateDiff = stm.getTime() - etm.getTime(); + + return Math.abs(dateDiff) < this.timeUnit.toMillis(this.interval); + } catch (Exception e) { + return false; + } + } +} \ No newline at end of file diff --git a/module-common/src/main/java/com/whdc/common/aspect/WebLogAspect.java b/module-common/src/main/java/com/whdc/common/aspect/WebLogAspect.java new file mode 100644 index 0000000..463384b --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/aspect/WebLogAspect.java @@ -0,0 +1,86 @@ +package com.whdc.common.aspect; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.support.spring.PropertyPreFilters; +import com.whdc.common.utils.ReqUtils; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +/** + * @author 李赛 + * @date 2022-06-26 0:34 + */ + +@Aspect +@Component +@Slf4j +public class WebLogAspect { + + private void print(String fmt, Object... str) { + log.info(fmt, str); + } + + @Pointcut("execution(public * com.whdc.controller.*Controller.*(..))") + public void controllerPointcut() { + } + + @Before("controllerPointcut()") + public void doBefore(JoinPoint joinPoint) throws Throwable { + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + HttpServletRequest request = attributes.getRequest(); + Signature signature = joinPoint.getSignature(); + String name = signature.getName(); + + print("------------- 开始 -------------"); + print("请求: {} {}", name, request.getRequestURI(), request.getMethod()); + print("方法: {} {}.{}", name, signature.getDeclaringTypeName(), name); + print("地址: {} {}", name, ReqUtils.getIpAddress(request)); + + Object[] args = joinPoint.getArgs(); + Object[] arguments = new Object[args.length]; + for (int i = 0; i < args.length; i++) { + if (args[i] instanceof ServletRequest + || args[i] instanceof ServletResponse + || args[i] instanceof MultipartFile) { + continue; + } + arguments[i] = args[i]; + } + + String[] excludeProperties = {"password", "file"}; + PropertyPreFilters filters = new PropertyPreFilters(); + PropertyPreFilters.MySimplePropertyPreFilter excludeFilter = filters.addFilter(); + excludeFilter.addExcludes(excludeProperties); + print("参数: {} {}", name, JSONObject.toJSONString(arguments, excludeFilter)); + } + + @Around("controllerPointcut()") + public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { + long startTime = System.currentTimeMillis(); + Signature signature = proceedingJoinPoint.getSignature(); + String name = signature.getName(); + Object result = proceedingJoinPoint.proceed(); + + String[] excludeProperties = {"password", "file"}; + PropertyPreFilters filters = new PropertyPreFilters(); + PropertyPreFilters.MySimplePropertyPreFilter excludeFilter = filters.addFilter(); + excludeFilter.addExcludes(excludeProperties); +// print("返回结果: {}", JSONObject.toJSONString(result, excludeFilter)); + print("------------- 耗时:{} {} ms -------------", name, System.currentTimeMillis() - startTime); + return result; + } +} \ No newline at end of file diff --git a/module-common/src/main/java/com/whdc/common/config/CommonModuleConfig.java b/module-common/src/main/java/com/whdc/common/config/CommonModuleConfig.java new file mode 100644 index 0000000..21f41d9 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/config/CommonModuleConfig.java @@ -0,0 +1,20 @@ +package com.whdc.common.config; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * SMS模块配置 + * 根据配置决定是否启用SMS模块 + * + * @author lyf + * @since 2025-10-29 + */ +@Configuration +@ComponentScan(basePackages = "com.whdc.common") +public class CommonModuleConfig { + + // 在启动类上注解,扫描com.whdc.common包下的所有组件 + +} \ No newline at end of file diff --git a/module-common/src/main/java/com/whdc/common/config/InterceptorConfig.java b/module-common/src/main/java/com/whdc/common/config/InterceptorConfig.java new file mode 100644 index 0000000..0595126 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/config/InterceptorConfig.java @@ -0,0 +1,46 @@ +package com.whdc.common.config; + +import okhttp3.OkHttpClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * @author 李赛 + * @date 2022-06-26 1:09 + */ +@EnableWebMvc +@Configuration +public class InterceptorConfig implements WebMvcConfigurer { + @Bean + public OkHttpClient okHttpClient() { + return new OkHttpClient.Builder() + .build(); + } + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/**").addResourceLocations("classpath:/static/"); + registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + } + + /** + * 开启跨域 + */ + @Override + public void addCorsMappings(CorsRegistry registry) { + // 设置允许跨域的路由 + registry.addMapping("/**") + // 设置允许跨域请求的域名------------修改此行 + .allowedOriginPatterns("*") + // 是否允许证书(cookies) + .allowCredentials(true) + // 设置允许的方法 + .allowedMethods("*") + // 跨域允许时间 + .maxAge(3600); + } +} diff --git a/module-common/src/main/java/com/whdc/common/config/Knife4jConfiguration.java b/module-common/src/main/java/com/whdc/common/config/Knife4jConfiguration.java new file mode 100644 index 0000000..6bcf2bd --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/config/Knife4jConfiguration.java @@ -0,0 +1,66 @@ +package com.whdc.common.config; + +import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +/** + * @author 李赛 + * @date 2022-04-06 9:49 + */ +@EnableSwagger2 +@Configuration +public class Knife4jConfiguration { + private final OpenApiExtensionResolver openApiExtensionResolver; + + @Autowired + public Knife4jConfiguration(OpenApiExtensionResolver openApiExtensionResolver) { + this.openApiExtensionResolver = openApiExtensionResolver; + } + + + private ApiInfo getApiInfoBuilder() { + return new ApiInfoBuilder() + .title("防汛抗旱通讯录api") + .description("# 防汛抗旱通讯录api RESTful APIs") + .termsOfServiceUrl("http://219.138.108.99:19000/jszx") + .contact(new Contact("湖北纬皓端成", null, null)) + .version("1.0") + .build(); + } + + @Bean(value = "base") + public Docket base() { + return new Docket(DocumentationType.OAS_30) + .apiInfo(getApiInfoBuilder()) + //分组名称 + .groupName("v1.0") + .select() + //这里指定Controller扫描包路径 + .apis(RequestHandlerSelectors.basePackage("com.whdc.controller")) + .paths(PathSelectors.any()) + .build() + .extensions(openApiExtensionResolver.buildExtensions("v1.0")); + } + + @Bean(value = "md") + public Docket md() { + return new Docket(DocumentationType.OAS_30) + .apiInfo(getApiInfoBuilder()) + .select() + // ... + .build() + // 构建扩展插件-自定义文档 group + .extensions(openApiExtensionResolver.buildExtensions("doc-knife4j-1.0.0")) + .groupName("接口说明文档"); + } +} \ No newline at end of file diff --git a/module-common/src/main/java/com/whdc/common/config/MyBatisPlusConfig.java b/module-common/src/main/java/com/whdc/common/config/MyBatisPlusConfig.java new file mode 100644 index 0000000..0135343 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/config/MyBatisPlusConfig.java @@ -0,0 +1,34 @@ +package com.whdc.common.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author 李赛 + * @date 2022-04-08 0:33 + */ +@Configuration +@MapperScan("com.whdc.mapper") +public class MyBatisPlusConfig { + + /* 旧版本配置 + @Bean + public PaginationInterceptor paginationInterceptor(){ + return new PaginationInterceptor(); + }*/ + + /** + * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.DM)); // 分页插件 + return interceptor; + } +} + diff --git a/module-common/src/main/java/com/whdc/common/config/MybatisInterceptor.java b/module-common/src/main/java/com/whdc/common/config/MybatisInterceptor.java new file mode 100644 index 0000000..ee3d275 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/config/MybatisInterceptor.java @@ -0,0 +1,85 @@ +package com.whdc.common.config; + +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlCommandType; +import org.apache.ibatis.plugin.Interceptor; +import org.apache.ibatis.plugin.Intercepts; +import org.apache.ibatis.plugin.Invocation; +import org.apache.ibatis.plugin.Signature; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.Date; + +import static com.whdc.common.model.MyConstant.REC; + +@Slf4j +@Component +@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})}) +public class MybatisInterceptor implements Interceptor { + + @Override + public Object intercept(Invocation invocation) throws Throwable { + MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; + String sqlId = mappedStatement.getId(); + log.debug("------sqlId------" + sqlId); + SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType(); + Object parameter = invocation.getArgs()[1]; + log.debug("------sqlCommandType------" + sqlCommandType); + + if (parameter == null) { + return invocation.proceed(); + } + if (SqlCommandType.INSERT == sqlCommandType || SqlCommandType.UPDATE == sqlCommandType) { + Field[] fields = parameter.getClass().getDeclaredFields(); +// Field[] fields = oConvertUtils.getAllFields(parameter); + for (Field field : fields) { + + if (Modifier.isFinal(field.getModifiers())) { + continue; + } + +// if (field.getType().equals(String.class)) { +// field.setAccessible(true); +// Object o = field.get(parameter); +// field.setAccessible(false); +// String newVal = o == null ? "" : String.valueOf(o).trim(); +// field.setAccessible(true); +// field.set(parameter, newVal); +// field.setAccessible(false); +// } + + // 注入创建时间 + if ("createtime".equals(field.getName()) || ("createTime".equals(field.getName()))) { + field.setAccessible(true); + Object local_createDate = field.get(parameter); + field.setAccessible(false); + if (local_createDate == null || "".equals(local_createDate)) { + field.setAccessible(true); + field.set(parameter, new Date()); + field.setAccessible(false); + } + } + + // 删除标识 + if ("del".equals(field.getName())) { + field.setAccessible(true); + Object local_createDate = field.get(parameter); + field.setAccessible(false); + if (local_createDate == null || "".equals(local_createDate)) { + field.setAccessible(true); + field.set(parameter, REC); + field.setAccessible(false); + } + } + + } + } + + return invocation.proceed(); + } + +} \ No newline at end of file diff --git a/module-common/src/main/java/com/whdc/common/config/RedisConfig.java b/module-common/src/main/java/com/whdc/common/config/RedisConfig.java new file mode 100644 index 0000000..77b7450 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/config/RedisConfig.java @@ -0,0 +1,111 @@ +package com.whdc.common.config; + +/** + * Description: + * Created by XuSan on 2024/6/3. + * + * @author XuSan + * @version 1.0 + */ + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; + +import java.io.Serializable; +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + +/** + */ +@Configuration +@EnableCaching +public class RedisConfig implements Serializable { + + /** + * 申明缓存管理器,会创建一个切面(aspect)并触发Spring缓存注解的切点(pointcut) + * 根据类或者方法所使用的注解以及缓存的状态,这个切面会从缓存中获取数据,将数据添加到缓存之中或者从缓存中移除某个值 + */ + /* @Bean + public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { + return RedisCacheManager.create(redisConnectionFactory); + } + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + // 创建一个模板类 + RedisTemplate template = new RedisTemplate(); + // 将刚才的redis连接工厂设置到模板类中 + template.setConnectionFactory(factory); + // 设置key的序列化器 + template.setKeySerializer(new StringRedisSerializer()); + // 设置value的序列化器 + //使用Jackson 2,将对象序列化为JSON + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); + //json转对象类,不设置默认的会将json转成hashmap + ObjectMapper om = new ObjectMapper(); + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + jackson2JsonRedisSerializer.setObjectMapper(om); + template.setValueSerializer(jackson2JsonRedisSerializer); + + return template; + }*/ + + + /** + * 最新版,设置redis缓存过期时间 + */ +// @Bean +// public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { +// RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig() +// .entryTtl(Duration.ofDays(1)) +// .computePrefixWith(cacheName -> "caching:" + cacheName); +// +// return new CustomRedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory), defaultCacheConfig); +// } + + @Bean + public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { + return new RedisCacheManager( + RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory), + this.getRedisCacheConfigurationWithTtl( -1), // 默认策略,未配置的 key 会使用这个 + this.getRedisCacheConfigurationMap() // 指定 key 策略 + ); + } + + private Map getRedisCacheConfigurationMap() { + Map redisCacheConfigurationMap = new HashMap<>(); + + //自定义设置缓存时间 + redisCacheConfigurationMap.put("fxkh:txl:warning", this.getRedisCacheConfigurationWithTtl(120)); + + return redisCacheConfigurationMap; + } + + private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds) { + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); + ObjectMapper om = new ObjectMapper(); + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + jackson2JsonRedisSerializer.setObjectMapper(om); + RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig(); + redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith( + RedisSerializationContext + .SerializationPair + .fromSerializer(jackson2JsonRedisSerializer) + ).entryTtl(Duration.ofSeconds(seconds)); + + return redisCacheConfiguration; + } +} \ No newline at end of file diff --git a/module-common/src/main/java/com/whdc/common/config/RestTemplateConfig.java b/module-common/src/main/java/com/whdc/common/config/RestTemplateConfig.java new file mode 100644 index 0000000..b9170f9 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/config/RestTemplateConfig.java @@ -0,0 +1,60 @@ +package com.whdc.common.config; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.http.MediaType; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.client.RestTemplate; + +import java.util.Arrays; + +/** + * @author 李赛 + * @date 2022-04-22 14:13 + */ +@Configuration +public class RestTemplateConfig { + + @Order(1) + @Bean + public RestTemplate restTemplate(@Qualifier("simpleClientHttpRequestFactory") ClientHttpRequestFactory factory){ + RestTemplate restTemplate = new RestTemplate(factory); + MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); + mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList( + MediaType.APPLICATION_JSON, + MediaType.APPLICATION_OCTET_STREAM, + MediaType.TEXT_HTML)); + restTemplate.getMessageConverters().add(mappingJackson2HttpMessageConverter); + return restTemplate; + } + + @Order(2) + @Bean + public RestTemplate restTemplate() { + SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); + requestFactory.setConnectTimeout(10000); // 单位毫秒 + requestFactory.setReadTimeout(30000); // 单位毫秒 + + return new RestTemplate(requestFactory); + } + + + @Order(4) + @Bean("redisTemplate") + public RedisTemplate redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(lettuceConnectionFactory); + // 设置键和值的序列化方式,默认使用JDK的序列化方式 + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(new StringRedisSerializer()); + return template; + } + +} diff --git a/module-common/src/main/java/com/whdc/common/config/ThreadPools.java b/module-common/src/main/java/com/whdc/common/config/ThreadPools.java new file mode 100644 index 0000000..e0c718a --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/config/ThreadPools.java @@ -0,0 +1,42 @@ +package com.whdc.common.config; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.TaskScheduler; +import org.springframework.scheduling.annotation.AsyncConfigurer; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * @author XuSan + * @date 2021/1/11 16:39 + * @explain 线程池类 + */ +@Configuration +//@Slf4j +public class ThreadPools implements AsyncConfigurer { + + + // 全核心线程池 + @Bean(value = "intensivePool", destroyMethod = "shutdown") + public ExecutorService intensive() { + return Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), new ThreadFactoryBuilder() + .setNameFormat("fixed -- %d").build()); + } + + @Bean + public TaskScheduler taskScheduler() { + ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); + taskScheduler.setPoolSize(10);//不配置默认是1 + return taskScheduler; + } + + +// public static Void handleException(Throwable ex) { +// log.error("请求出现异常:" + ex.getMessage(), ex); +// return null; +// } +} diff --git a/module-common/src/main/java/com/whdc/common/config/WxMiniappConfiguration.java b/module-common/src/main/java/com/whdc/common/config/WxMiniappConfiguration.java new file mode 100644 index 0000000..f003372 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/config/WxMiniappConfiguration.java @@ -0,0 +1,56 @@ +package com.whdc.common.config; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; +import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; +import lombok.Data; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Description: + * Created by XuSan on 2024/6/3. + * 微信小程序 配置 + * + * @author XuSan + * @version 1.0 + */ +@Data +@Configuration +@ConditionalOnClass(WxMaService.class) +@ConfigurationProperties(prefix = "wx.miniapp.configs") +public class WxMiniappConfiguration { + /** + * 设置微信小程序的appId + */ + + private String appId; + + /** + * 设置微信小程序的Secret + */ + + private String secret; + + @Bean + @ConditionalOnMissingBean(WxMaService.class) + public WxMaService wxMaService() { + + WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl(); + + config.setAppid(this.getAppId()); + + config.setSecret(this.getSecret()); + + WxMaService service = new WxMaServiceImpl(); + + service.setWxMaConfig(config); + + return service; + + } + +} \ No newline at end of file diff --git a/module-common/src/main/java/com/whdc/common/exception/CustomErrorController.java b/module-common/src/main/java/com/whdc/common/exception/CustomErrorController.java new file mode 100644 index 0000000..373fc83 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/exception/CustomErrorController.java @@ -0,0 +1,68 @@ +package com.whdc.common.exception; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.web.ServerProperties; +import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController; +import org.springframework.boot.web.error.ErrorAttributeOptions; +import org.springframework.boot.web.servlet.error.DefaultErrorAttributes; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.Map; +import java.util.StringJoiner; + +/** + * 拦截全局异常,统一异常的返沪格式 + * + * @author 李赛 + * @date 2022-04-09 15:38 + */ +@Controller +@RequestMapping("${server.error.path:${error.path:/error}}") +public class CustomErrorController extends BasicErrorController { + + @Value("${server.error.path:${error.path:/error}}") + private String path; + + public CustomErrorController(ServerProperties serverProperties) { + super(new DefaultErrorAttributes(), serverProperties.getError()); + } + + /** + * 覆盖默认的JSON响应 + */ + @Override + public ResponseEntity> error(HttpServletRequest request) { + HttpStatus status = getStatus(request); + Map map = new HashMap(16); + Map originalMsgMap = getErrorAttributes(request, ErrorAttributeOptions.defaults()); + String path = (String) originalMsgMap.get("path"); + String error = (String) originalMsgMap.get("error"); + String message = (String) originalMsgMap.get("message"); + StringJoiner joiner = new StringJoiner(",", "[", "]"); + joiner.add(path).add(error).add(message); + map.put("code", status.value()); + map.put("msg", joiner.toString()); + return new ResponseEntity>(map, status); + } + + /** + * 覆盖默认的HTML响应 + */ + @Override + public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) { + //请求的状态 + HttpStatus status = getStatus(request); + response.setStatus(getStatus(request).value()); + Map model = getErrorAttributes(request, ErrorAttributeOptions.defaults()); + ModelAndView modelAndView = resolveErrorView(request, response, status, model); + //指定自定义的视图 + return (modelAndView == null ? new ModelAndView("error", model) : modelAndView); + } +} diff --git a/module-common/src/main/java/com/whdc/common/exception/MyException.java b/module-common/src/main/java/com/whdc/common/exception/MyException.java new file mode 100644 index 0000000..586d3c1 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/exception/MyException.java @@ -0,0 +1,25 @@ +package com.whdc.common.exception; + +/** + * @author 李赛 + * @date 2022-06-26 10:58 + */ + +public class MyException extends RuntimeException { + + private final String msg; + + public String getMsg() { + return msg; + } + + public MyException(String msg) { + super(msg); + this.msg = msg; + } + + public MyException(String msg, Throwable e) { + super(msg, e); + this.msg = msg; + } +} diff --git a/module-common/src/main/java/com/whdc/common/exception/MyExceptionHandler.java b/module-common/src/main/java/com/whdc/common/exception/MyExceptionHandler.java new file mode 100644 index 0000000..fc73063 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/exception/MyExceptionHandler.java @@ -0,0 +1,199 @@ +package com.whdc.common.exception; + +import com.whdc.common.utils.ResultJson; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.http.HttpStatus; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.validation.ObjectError; +import org.springframework.web.HttpMediaTypeNotSupportedException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.annotation.PostConstruct; +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.ValidationException; +import java.sql.SQLIntegrityConstraintViolationException; +import java.util.Set; + +/** + * @author 李赛 + * @date 2022-06-26 10:58 + */ +@RestControllerAdvice +@Slf4j +public class MyExceptionHandler { + + @PostConstruct + public void init() { + + } + + /** + * 保存错误日志 + * + * @param e 错误内容 + */ + private void saveLogs(Exception e) { + } + + /** + * 400 - Bad Request + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(MissingServletRequestParameterException.class) + public ResultJson handleMissingServletRequestParameterException(MissingServletRequestParameterException e) { + log.error("缺少请求参数", e); + return ResultJson.error(ResultJson.PARAM_ERROR, "缺少请求参数"); + } + + /** + * 400 - Bad Request + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(HttpMessageNotReadableException.class) + public ResultJson handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { + log.error("缺少请求参数", e); + return ResultJson.error(ResultJson.PARAM_ERROR, "参数格式错误。使用 json 格式字符串传递参数"); + } + + /** + * 400 - Bad Request--------------------- + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResultJson handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + try { +// log.error("参数验证失败 " + e.getMessage(), e); + + BindingResult result = e.getBindingResult(); + + if (result.getErrorCount() > 0) { + StringBuffer strbuf = new StringBuffer(); + for (ObjectError err : result.getAllErrors()) { + if (strbuf.length() > 0) { + strbuf.append(";"); + } + strbuf.append(err.getDefaultMessage()); + } + + return ResultJson.error(ResultJson.PARAM_ERROR, "参数验证失败:" + strbuf); + } + + return ResultJson.error(ResultJson.PARAM_ERROR, "参数验证失败"); + } catch (Exception err) { + return ResultJson.error(ResultJson.PARAM_ERROR, "参数验证失败," + err.getMessage()); + } + } + + /** + * 400 - Bad Request + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(BindException.class) + public ResultJson handleBindException(BindException e) { + BindingResult result = e.getBindingResult(); + FieldError error = result.getFieldError(); + String field = error.getField(); + String code = error.getDefaultMessage(); + String message = String.format("%s:%s", field, code); + log.error("参数绑定失败", message); + return ResultJson.error(ResultJson.PARAM_ERROR, "参数绑定失败," + message); + } + + /** + * 400 - Bad Request + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(ConstraintViolationException.class) + public ResultJson handleServiceException(ConstraintViolationException e) { + Set> violations = e.getConstraintViolations(); + ConstraintViolation violation = violations.iterator().next(); + String message = violation.getMessage(); + log.error("参数验证失败4 " + message, e); + return ResultJson.error(ResultJson.PARAM_ERROR, "参数验证失败5," + message); + } + + /** + * 400 - Bad Request + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(ValidationException.class) + public ResultJson handleValidationException(ValidationException e) { + log.error("参数验证失败6 " + e.getMessage()); + e.printStackTrace(); + return ResultJson.error(ResultJson.PARAM_ERROR, "参数验证失败7"); + } + + /** + * 405 - Method Not Allowed + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public ResultJson handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { + log.error("不支持当前请求方法", e.getMessage()); + return ResultJson.error(ResultJson.METHOD_NOT_ALLOWED, "不支持当前请求方法"); + } + + /** + * 415 - Unsupported Media Type + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(HttpMediaTypeNotSupportedException.class) + public ResultJson handleHttpMediaTypeNotSupportedException(Exception e) { + log.error("不支持当前媒体类型", e.getMessage()); + return ResultJson.error(ResultJson.NSUPPORTED_MEDIA_TYPE, "不支持当前媒体类型"); + } + + /** + * 操作数据库出现异常:名称重复,外键关联 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(DataIntegrityViolationException.class) + public ResultJson handleException(DataIntegrityViolationException e) { + log.error("操作数据库出现异常: ", e); + return ResultJson.error(ResultJson.FAIL, "操作数据库出现异常"); + } + + /** + * 通用异常 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(Exception.class) + public ResultJson handleException(Exception e) { + log.error("通用异常:" + e.getMessage(), e); + + if (e instanceof SQLIntegrityConstraintViolationException) { + return ResultJson.error(ResultJson.FAIL, "数据库主键冲突,请联系管理员"); + } else if (e instanceof org.springframework.web.servlet.NoHandlerFoundException) { + return ResultJson.error(ResultJson.FAIL, "找不到资源"); + } + + return ResultJson.error(ResultJson.SERVER_ERROR, "内部服务器错误"); + } + + /** + * 500 - Internal Server Error + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(MyException.class) + public ResultJson handleServiceException(MyException e) { + log.error("业务逻辑异常", e); + //RetryableException 无法单独捕获处理,只能简单处理一下返回值 + String msg = e.getMsg(); + if (StringUtils.isNotBlank(e.getMsg()) && e.getMsg().startsWith("Connection refused: connect executing POST")) { + msg = "连接被拒绝"; + } + return ResultJson.error(ResultJson.FAIL, msg); + } + +} diff --git a/module-common/src/main/java/com/whdc/common/model/MyConstant.java b/module-common/src/main/java/com/whdc/common/model/MyConstant.java new file mode 100644 index 0000000..eab31e8 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/model/MyConstant.java @@ -0,0 +1,26 @@ +package com.whdc.common.model; + +/** + * @author xusan + * @date 2023/4/27 9:41 + */ +public class MyConstant { + + public static final String + + // 删除 + DEL = "0", + + // 未删除 + REC = "1", + + + // redis KEY + TOKEN_KEY = "SW_TOKEN_SJQX"; + + /** + * 数据-数据服务运维员 角色编码 + */ + public static final String ROLE_PUSH = "data_zh_om"; + public static final String REDIS_KEY = "fxkh:txl:"; +} diff --git a/module-common/src/main/java/com/whdc/common/model/group/Delete.java b/module-common/src/main/java/com/whdc/common/model/group/Delete.java new file mode 100644 index 0000000..4ce1e2c --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/model/group/Delete.java @@ -0,0 +1,8 @@ +package com.whdc.common.model.group; + +/** + * @author 李赛 + * @date 2022-06-26 15:13 + */ +public interface Delete { +} diff --git a/module-common/src/main/java/com/whdc/common/model/group/Find.java b/module-common/src/main/java/com/whdc/common/model/group/Find.java new file mode 100644 index 0000000..b1e8596 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/model/group/Find.java @@ -0,0 +1,8 @@ +package com.whdc.common.model.group; + +/** + * @author 李赛 + * @date 2022-06-27 22:27 + */ +public interface Find { +} diff --git a/module-common/src/main/java/com/whdc/common/model/group/Insert.java b/module-common/src/main/java/com/whdc/common/model/group/Insert.java new file mode 100644 index 0000000..a20bf53 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/model/group/Insert.java @@ -0,0 +1,8 @@ +package com.whdc.common.model.group; + +/** + * @author 李赛 + * @date 2022-06-26 15:12 + */ +public interface Insert { +} diff --git a/module-common/src/main/java/com/whdc/common/model/group/Update.java b/module-common/src/main/java/com/whdc/common/model/group/Update.java new file mode 100644 index 0000000..db2b7b1 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/model/group/Update.java @@ -0,0 +1,8 @@ +package com.whdc.common.model.group; + +/** + * @author 李赛 + * @date 2022-06-26 15:12 + */ +public interface Update { +} diff --git a/module-common/src/main/java/com/whdc/common/strategy/SaveContext.java b/module-common/src/main/java/com/whdc/common/strategy/SaveContext.java new file mode 100644 index 0000000..6418ac6 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/strategy/SaveContext.java @@ -0,0 +1,29 @@ +package com.whdc.common.strategy; + +import com.alibaba.fastjson.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 定义环境角色(Context):用于连接上下文 + */ +@Component +public class SaveContext { + + private final Map strategyMap = new ConcurrentHashMap<>(); + + @Autowired + public SaveContext(Map strategyMap) { + this.strategyMap.putAll(strategyMap); + } + + // 新增 + public boolean syncSave(String channel, JSONObject jsonObject) { + return strategyMap.get(channel).syncSave(jsonObject); + } + + +} diff --git a/module-common/src/main/java/com/whdc/common/strategy/SyncSaveInterface.java b/module-common/src/main/java/com/whdc/common/strategy/SyncSaveInterface.java new file mode 100644 index 0000000..75cd5c4 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/strategy/SyncSaveInterface.java @@ -0,0 +1,14 @@ +package com.whdc.common.strategy; + +import com.alibaba.fastjson.JSONObject; + +/** + * @author xusan + * @date 2023/4/20 16:28 + */ + +public interface SyncSaveInterface { + + boolean syncSave(JSONObject jsonObject); + +} diff --git a/module-common/src/main/java/com/whdc/common/utils/AESpkcs7paddingUtil.java b/module-common/src/main/java/com/whdc/common/utils/AESpkcs7paddingUtil.java new file mode 100644 index 0000000..f796063 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/utils/AESpkcs7paddingUtil.java @@ -0,0 +1,184 @@ +package com.whdc.common.utils; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.codec.binary.Base64; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.io.UnsupportedEncodingException; +import java.security.GeneralSecurityException; +import java.security.Security; + + +public class AESpkcs7paddingUtil { + + /** + * 密钥算法 + */ + private static final String KEY_ALGORITHM = "AES"; + + /** + * 加密/解密算法 / 工作模式 / 填充方式 + * Java 6支持PKCS5Padding填充方式 + * Bouncy Castle支持PKCS7Padding填充方式 + */ + private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS7Padding"; + + static { + //如果是PKCS7Padding填充方式,则必须加上下面这行 + Security.addProvider(new BouncyCastleProvider()); + } + + /** + * 生成密钥 + * + * @return 密钥 + * @throws Exception + */ + public static String generateKey() throws Exception { + //实例化密钥生成器 + KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM); + /** + * 设置AES密钥长度 + * AES要求密钥长度为128位或192位或256位,java默认限制AES密钥长度最多128位 + * 如需192位或256位,则需要到oracle官网找到对应版本的jdk下载页,在"Additional Resources"中找到 + * "Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files",点击[DOWNLOAD]下载 + * 将下载后的local_policy.jar和US_export_policy.jar放到jdk安装目录下的jre/lib/security/目录下,替换该目录下的同名文件 + */ + kg.init(128); + //生成密钥 + SecretKey secretKey = kg.generateKey(); + //获得密钥的字符串形式 + return Base64.encodeBase64String(secretKey.getEncoded()); + } + + /** + * AES加密 + * + * @param source 源字符串 + * @param key 密钥 + * @return 加密后的密文 + * @throws Exception + */ + public static String encrypt(String source, String key) throws GeneralSecurityException, UnsupportedEncodingException { + + byte[] sourceBytes = source.getBytes("UTF-8"); + byte[] keyBytes = key.getBytes("UTF-8"); + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM, "BC"); + cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keyBytes, KEY_ALGORITHM)); + byte[] decrypted = cipher.doFinal(sourceBytes); + return Base64.encodeBase64String(decrypted); + + } + + /** + * AES解密 + * + * @param encryptStr 加密后的密文 + * @param key 密钥 + * @return 源字符串 + * @throws Exception + */ + public static String decrypt(String encryptStr, String key) { + try { + byte[] sourceBytes = Base64.decodeBase64(encryptStr); + final byte[] keyBytes = key.getBytes("UTF-8"); + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM, "BC"); + cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyBytes, KEY_ALGORITHM)); + byte[] decoded = cipher.doFinal(sourceBytes); + return new String(decoded, "UTF-8"); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static void main(String[] args) throws Exception { + String data = "{\"sysUserId\":\"HBSL01\",\"expire\":1000000}"; + String encrypt = encrypt(data, "yxt@2024-1234567"); + System.out.println(encrypt); + String request = "{\"request\":\"" + encrypt + "\"}"; + String resp = HttpUtil.sendPost("https://aicc.cuopen.net:9801/aicc-api/ssb/callout/thirdParty/login", request); + System.out.println(resp); + + /* + 挂断是无人接听 + */ + +// genTask(); +// genQueryTask(); +// String request = "{\n" + +// " \"requestId\": \"hbsl1750130919921\",\n" + +// " \"custId\": \"hbsl-zj\"\n" + +// "}"; +// JSONObject header = new JSONObject(); +// header.put("X-Access-Token", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Ik5TQkRKSzIwMjUiLCJ0ZW5hbnRJZCI6IjE5MTY1NDI5IiwiZXhwIjoxNzUwNDI5OTAzfQ.RvsTL5L8jPl6GqiQq344jBP5i-v6vuQt-kARsvUvuyY"); +// String resp = HttpUtil.sendPost("https://aicc.cuopen.net:9801/aicc-api/ssb/callout/thirdParty/task/getTaskCallDetail", request, header); +// AICCCallRespDetail autoCallDetail = JSON.parseObject(resp, AICCCallRespDetail.class); +// autoCallDetail.getResult().getData().getRecords().forEach(System.out::println); + + +// AutoCallHelper helper = new AutoCallHelper(); +// helper.initToken(); +// String token = helper.getToken(); +// genTask(); + } + + private static void genQueryTask() throws Exception { + String requestId = "hbsl1750130186416"; + String custId = "detail2c9ab2f08709s438018722de2ebf001f"; + String data = "{\"requestId\":\"" + requestId + "\",\"custId\":\"" + custId + "\"}"; + System.out.println(data); + String e = encrypt(data, "yxt@2024-1234567"); + System.out.println(e); + } + + private static void genTask() throws Exception { + String taskName = "hbsl" + System.currentTimeMillis(); + String processId = "1934801506242949122"; +// String processId = "1934876091344777218"; + String requestId = taskName; + String callerGroup = "02160980358"; +// String callerGroup = "01080945234"; + String content = "这里是湖北省防汛抗旱指挥部办公室,咸宁市2025年06月15日02时26分58秒发布暴雨橙色预警信号:过去6小时最大降水出现在青山镇(青山水库)为54.6毫米。预计今天夜间,崇阳南部将出现暴雨到大暴雨,累计降雨量将达100毫米以上,并伴有雷暴大风,山区山洪、地质灾害、城乡积涝、中小河流洪水风险高,请加强防范。"; +// String content = "咸宁市2025年06月15日02时26分58秒发布暴雨橙色预警信号"; + JSONObject data = new JSONObject(); + data.put("taskName", taskName); + data.put("processId", processId); + data.put("callerGroup", callerGroup); + data.put("requestId", requestId); + data.put("calleeType", 2); + data.put("repeatTimes", 2); + data.put("autoCall", "0"); + data.put("spanSeconds", 60); + data.put("processType", "3"); + data.put("mutiTimeRange", "2025-06-17 10:00:00_2025-06-17 21:00:00"); + JSONArray params = new JSONArray(); + JSONObject param = new JSONObject(); + param.put("@common_user_name", "李"); +// param.put("@NUMBER", "15671545233"); + param.put("@NUMBER", "15671545233"); + param.put("备用号码1", "18162570850"); +// param.put("备用号码1", "13933930962"); +// param.put("备用号码2", "15697168180"); + param.put("custId", "abo70652-abo70653-abo70654"); +// param.put("address", "{}"); + param.put("content", content); + params.add(param); + data.put("param", params); + System.out.println(data); + + String e = encrypt(data.toJSONString(), "yxt@2024-1234567"); + + JSONObject request = new JSONObject(); + request.put("request", e); + JSONObject header = new JSONObject(); + header.put("X-Access-Token", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Ik5TQkRKSzIwMjUiLCJ0ZW5hbnRJZCI6IjE5MTY1NDI5IiwiZXhwIjoxNzUwNDI5OTAzfQ.RvsTL5L8jPl6GqiQq344jBP5i-v6vuQt-kARsvUvuyY"); + HttpUtil.sendPost("https://aicc.cuopen.net:9801/aicc-api/ssb/callout/thirdParty/task/uploadCallData", request.toJSONString(), header); + + } +} \ No newline at end of file diff --git a/module-common/src/main/java/com/whdc/common/utils/AdinfoUtils.java b/module-common/src/main/java/com/whdc/common/utils/AdinfoUtils.java new file mode 100644 index 0000000..cd1a4b7 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/utils/AdinfoUtils.java @@ -0,0 +1,247 @@ +package com.whdc.common.utils; + +import com.whdc.common.exception.MyException; +import org.apache.commons.lang3.StringUtils; + +import java.util.Objects; + + +/** + * Description: + * Created by XuSan on 2024/3/14. + * + * @author XuSan + * @version 1.0 + */ +public class AdinfoUtils { + + /** + * 根据行政区划等级获取模糊查询的行政区划代码 + * + * @param adcd + * @param adlevel + * @return + */ + public static String likeAdcd(String adcd, Integer adlevel) { + +// // 判断行政区划和行政区划等级是否匹配 +// validateAdcdAndAdlevel(adcd, adlevel); + + + + if (adlevel > 5) { + adlevel = 5; + } + + switch (adlevel) { + case 0: + if (adcd.length() < 2){ + return adcd; + } + return adcd.substring(0, 2); + case 1: + if (adcd.length() < 4){ + return adcd; + } + return adcd.substring(0, 4); + case 2: + if (adcd.length() < 6){ + return adcd; + } + return adcd.substring(0, 6); + case 3: + if (adcd.length() < 9){ + return adcd; + } + return adcd.substring(0, 9); + case 4: + if (adcd.length() < 12){ + return adcd; + } + return adcd.substring(0, 12); + case 5: + return adcd; + default: + throw new MyException("不支持该行政区划等级"); + } + } + + /** + * 根据行政区划等级获取模糊查询的行政区划代码 + * + * @param adcd + * @param adlevel + * @return + */ + public static String getParentAdcd(String adcd, Integer adlevel) { + + if (Objects.isNull(adlevel)){ + adlevel = getAdlevel(adcd); + } + + if (adlevel > 5) { + adlevel = 5; + } + + switch (adlevel) { + case 0: + return adcd.substring(0, 2) + "0000000000000"; + case 1: + return adcd.substring(0, 4) + "00000000000"; + case 2: + return adcd.substring(0, 6) + "000000000"; + case 3: + return adcd.substring(0, 9) + "000000"; + case 4: + return adcd.substring(0, 12) + "000"; + case 5: + return adcd; + default: + throw new MyException("不支持该行政区划等级"); + } + } + + /** + * 根据行政区划等级获取模糊查询的行政区划代码 + * + * @param adlevel + * @return + */ + public static String getAdcdRight( Integer adlevel) { + + + + if (adlevel > 5) { + adlevel = 5; + } + + switch (adlevel) { + case 0: + return "0000000000000"; + case 1: + return "00000000000"; + case 2: + return "000000000"; + case 3: + return "000000"; + case 4: + return "000"; + case 5: + return ""; + default: + throw new MyException("不支持该行政区划等级"); + } + } + + /** + * 根据行政区划等级获取和行政区划代码 + * + * @param adcd + * @param adlevel + * @return + */ + public static void validateAdcdAndAdlevel(String adcd, Integer adlevel) { + + // 避免重复代码,提取为私有方法 + validateAdcd(adcd, adlevel, 2); + validateAdcd(adcd, adlevel, 4); + validateAdcd(adcd, adlevel, 6); + validateAdcd(adcd, adlevel, 9); + validateAdcd(adcd, adlevel, 12); + + } + + /** + * 验证行政区划代码的子串是否与给定的等级匹配 + * + * @param adcd 行政区划代码 + * @param adlevel 参数行政区划等级 + * @param startIndex 子串的开始索引 + * @throws MyException 如果行政区划代码子串不匹配给定的等级,则抛出异常 + */ + private static void validateAdcd(String adcd, Integer adlevel, int startIndex) throws MyException { + + if (StringUtils.isBlank(adcd) || adcd.length() < startIndex) { + throw new MyException("行政区划编码错误 " + adcd); + } + +// String subAdcd = adcd.substring(startIndex); + + int adlevelBySubAdcd = getAdlevelBySubAdcd(adcd,startIndex); + + if (adlevel != adlevelBySubAdcd || adlevel+1 != adlevelBySubAdcd || adlevel-1 != adlevelBySubAdcd) { + throw new MyException("行政区划编码和行政区划等级不匹配"); + } + } + + /** + * 根据行政区划代码获取行政区划等级 + * + * @param adcd 行政区划代码 + * @return + */ + public static int getAdlevel(String adcd) { + + if (StringUtils.isBlank(adcd) || adcd.length() != 15) { + throw new MyException("行政区划编码错误 " + adcd); + } + + // 避免重复代码,提取为私有方法 + int subAdcd = getAdlevelBySubAdcd(adcd, 2); + if (5 != subAdcd) { + return subAdcd; + } + subAdcd = getAdlevelBySubAdcd(adcd, 4); + if (5 != subAdcd) { + return subAdcd; + } + subAdcd = getAdlevelBySubAdcd(adcd, 6); + if (5 != subAdcd) { + return subAdcd; + } + subAdcd = getAdlevelBySubAdcd(adcd, 9); + if (5 != subAdcd) { + return subAdcd; + } + subAdcd = getAdlevelBySubAdcd(adcd, 12); + return subAdcd; + } + + + /** + * 根据行政区划代码子串获取行政区划等级 + * + * @param adcd + * @return + */ + public static int getAdlevelBySubAdcd(String adcd, int startIndex) { + + String subAdcd = adcd.substring(startIndex); + + // 根据行政区划分析出的行政区划等级 + int expectedLevel = 0; + + switch (subAdcd) { + case "0000000000000": // 省 + break; + case "00000000000": // 市 + expectedLevel = 1; + break; + case "000000000": // 县 + expectedLevel = 2; + break; + case "000000": // 镇 + expectedLevel = 3; + break; + case "000": // 村 + expectedLevel = 4; + break; + default: + // 村 + expectedLevel = 5; + } + + return expectedLevel; + } + +} diff --git a/module-common/src/main/java/com/whdc/common/utils/DataUtils.java b/module-common/src/main/java/com/whdc/common/utils/DataUtils.java new file mode 100644 index 0000000..affd474 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/utils/DataUtils.java @@ -0,0 +1,129 @@ +package com.whdc.common.utils; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * @author 李赛 + * @date 2022-07-22 8:46 + */ +@Slf4j +public class DataUtils { + + public static final BigDecimal MIN_VALUE = BigDecimal.valueOf(0.001); + + + private static Map extension2Scheme = new HashMap(); + + static { + extension2Scheme.put("jpg", "data:image/jpg;base64,"); + extension2Scheme.put("jpeg", "data:image/jpeg;base64,"); + extension2Scheme.put("png", "data:image/png;base64,"); + extension2Scheme.put("gif", "data:image/gif;base64,"); + extension2Scheme.put("icon", "data:image/x-icon;base64,"); + } + + /** + * 标准差σ=sqrt(s^2) + * 结果精度:scale + * 牛顿迭代法求大数开方 + * + * @param value + * @param scale + * @return + */ + public static BigDecimal sqrt(BigDecimal value, int scale) { + BigDecimal num2 = BigDecimal.valueOf(2); + int precision = 100; + MathContext mc = new MathContext(precision, RoundingMode.HALF_UP); + BigDecimal deviation = value; + int cnt = 0; + while (cnt < precision) { + deviation = (deviation.add(value.divide(deviation, mc))).divide(num2, mc); + cnt++; + } + deviation = deviation.setScale(scale, BigDecimal.ROUND_HALF_UP); + return deviation; + } + + public static String File2Base64(String filepath) { + if (StringUtils.isBlank(filepath)) { + return null; + } + File file1 = new File(filepath); + + if (!file1.exists()) { + return null; + } + + int lastPointIndex = filepath.lastIndexOf("."); + String type = filepath.substring(lastPointIndex + 1); + + if (!extension2Scheme.containsKey(type.toLowerCase())) { + System.out.println("文件类型错误 " + type); + return null; + } + + try (FileInputStream inputStream = new FileInputStream(file1)) { + byte[] buffer = new byte[inputStream.available()]; + if (inputStream.read(buffer) == -1) { + inputStream.close(); + } + + return extension2Scheme.get(type.toLowerCase()) + Base64.getEncoder().encodeToString(buffer); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static void DelFile(String filepath) { + File file1 = new File(filepath); + + System.out.println("清理图片缓存:" + filepath + (file1.delete() ? "成功" : "失败")); + } + + + public static Void handleException(Throwable ex) { + log.error("请求出现异常:" + ex.getMessage(), ex); + return null; + } + + public static String handleExceptionStr(Throwable ex) { + log.error("请求出现异常:" + ex.getMessage(), ex); + return null; + } + + public static Integer handleExceptionInt(Throwable ex) { + log.error("请求出现异常:" + ex.getMessage(), ex); + return null; + } + + + /** + * 高程 + * @param elValue + * @return + */ + public static BigDecimal gcFormat(BigDecimal elValue){ + if (Objects.isNull(elValue)){ + return null; + } + + if (BigDecimal.ZERO.equals(elValue)){ + return MIN_VALUE; + } + return elValue; + } + +} diff --git a/module-common/src/main/java/com/whdc/common/utils/DateUtils.java b/module-common/src/main/java/com/whdc/common/utils/DateUtils.java new file mode 100644 index 0000000..068bdd4 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/utils/DateUtils.java @@ -0,0 +1,142 @@ +package com.whdc.common.utils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; + +/** + * @author 李赛 + * @date 2022-06-26 1:01 + */ +public class DateUtils { + /** + * 时间格式(yyyy-MM-dd HH:mm:ss) + */ + public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; + public final static String DATE_PATTERN = "yyyy年MM月dd日"; + public final static String DATE_PATTERN1 = "yyyy-MM-dd"; + public final static String DATE_PATTERN_HM = "HH:mm"; + + + public static final ThreadLocal sdfhmsS = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + } + }; + + public static final ThreadLocal sdfYMDh = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm")); + + public static final ThreadLocal sdfhms = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat(DATE_TIME_PATTERN); + } + }; + public static final ThreadLocal sdfymd = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat(DATE_PATTERN); + } + }; + public static final ThreadLocal sdf_utc = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + } + }; + public static final ThreadLocal sdf_utc_sss = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + } + }; + + public static final ThreadLocal sdf_Str = ThreadLocal.withInitial(() -> new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy")); + + + + public static LocalDateTime strToLDT(String str,String format){ + return LocalDateTime.parse(str, DateTimeFormatter.ofPattern(format)); + } + + public static String dateToStr(Date date){ + return sdfhms.get().format(date); + } + + public static String dateToStr(LocalDateTime date){ + return dateToStr(date,DATE_TIME_PATTERN); + } + public static String dateToStr(LocalDateTime date,String format){ + return date.format(DateTimeFormatter.ofPattern(format)); + } + + public static Date dateToStr(String dateString){ + try { + return sdf_Str.get().parse(dateString); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + public static Date dateToStrYMDHds(String dateString){ + try { + return sdfhms.get().parse(dateString); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + + public static String dateToStr(Date date, ThreadLocal format){ + if (Objects.isNull(date)){ + return null; + } + return format.get().format(date); + } + + /** + * mongo 日期查询isodate + * + * @param dateStr + * @return + */ + public static Date dateToISODate(String dateStr) throws ParseException { + //T代表后面跟着时间,Z代表UTC统一时间 + Date date = formatD(dateStr); + SimpleDateFormat format = sdfhms.get(); + format.setCalendar(new GregorianCalendar(new SimpleTimeZone(0, "GMT"))); + String isoDate = format.format(date); + return format.parse(isoDate); + } + + public static Date formatD(String dateStr) throws ParseException { + return formatD(dateStr, DATE_TIME_PATTERN); + } + + public static Date formatD(String dateStr, String format) throws ParseException { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format); + + return simpleDateFormat.parse(dateStr); + } + + public static Date standardize(Date date, boolean stm) { + Calendar c = Calendar.getInstance(); + c.setTime(date); + if (stm) { + c.set(Calendar.HOUR_OF_DAY, 0); + c.set(Calendar.MINUTE, 0); + c.set(Calendar.SECOND, 0); + c.set(Calendar.MILLISECOND, 0); + } else { + c.set(Calendar.HOUR_OF_DAY, 23); + c.set(Calendar.MINUTE, 59); + c.set(Calendar.SECOND, 59); + c.set(Calendar.MILLISECOND, 999); + } + return c.getTime(); + } + + + public static void main(String[] args) throws ParseException { + +// System.out.println(dateToISODate("2021-11-05T13:00:00Z")); + System.out.println(dateToStr(LocalDateTime.now())); + + } +} diff --git a/module-common/src/main/java/com/whdc/common/utils/ExcelCommon.java b/module-common/src/main/java/com/whdc/common/utils/ExcelCommon.java new file mode 100644 index 0000000..bfd6b45 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/utils/ExcelCommon.java @@ -0,0 +1,124 @@ +package com.whdc.common.utils; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.ExcelImportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.ImportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.net.URLEncoder; +import java.util.List; +import java.util.Map; + +/** + * Description: + * Created by XuSan on 2024/3/18. + * + * @author XuSan + * @version 1.0 + */ + + +public class ExcelCommon { + public static void exportExcel(List list, String title, String sheetName, Class pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) { + ExportParams exportParams = new ExportParams(title, sheetName); + exportParams.setCreateHeadRows(isCreateHeader); + defaultExport(list, pojoClass, fileName, response, exportParams); + + } + + public static void exportExcel(List list, String title, String sheetName, Class pojoClass, String fileName, HttpServletResponse response) { + defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName)); + } + + public static void exportExcel(List> list, String fileName, HttpServletResponse response) { + defaultExport(list, fileName, response); + } + + private static void defaultExport(List list, Class pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) { + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list); + downLoadExcel(fileName, response, workbook); + } + + private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) { + try { + response.setCharacterEncoding("UTF-8"); + response.setHeader("content-Type", "application/vnd.ms-excel"); + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); +// "attachment;filename=" + URLEncoder.encode(fileName, "iso8859-1")); + workbook.write(response.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); + } + + } + + private static void defaultExport(List> list, String fileName, HttpServletResponse response) { + Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF); + if (workbook != null) ; + downLoadExcel(fileName, response, workbook); + } + + public static List importExcel(String filePath, Integer titleRows, Integer headerRows, Class pojoClass) { + if (StringUtils.isBlank(filePath)) { + return null; + } + ImportParams params = new ImportParams(); + params.setTitleRows(titleRows); + params.setHeadRows(headerRows); + List list = null; + list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params); + return list; + } + public static List importExcel(String filePath, Integer startSheetIndex, Integer titleRows, Integer headerRows, Class pojoClass) { + if (StringUtils.isBlank(filePath)) { + return null; + } + ImportParams params = new ImportParams(); + params.setTitleRows(titleRows); + params.setHeadRows(headerRows); + params.setStartSheetIndex(startSheetIndex); + List list = null; + list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params); + return list; + } + + public static List importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class pojoClass) { + if (file == null) { + return null; + } + ImportParams params = new ImportParams(); + params.setTitleRows(titleRows); + params.setHeadRows(headerRows); + List list = null; + try { + list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params); + } catch (Exception e) { + e.printStackTrace(); + } + return list; + } + public static List importExcel(MultipartFile file, Integer startSheetIndex, Integer titleRows, Integer headerRows, Class pojoClass) { + if (file == null) { + return null; + } + ImportParams params = new ImportParams(); + params.setTitleRows(titleRows); + params.setHeadRows(headerRows); + params.setStartSheetIndex(startSheetIndex); + List list = null; + try { + list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params); + } catch (Exception e) { + e.printStackTrace(); + } + return list; + } +} diff --git a/module-common/src/main/java/com/whdc/common/utils/HttpHelper.java b/module-common/src/main/java/com/whdc/common/utils/HttpHelper.java new file mode 100644 index 0000000..bbc3957 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/utils/HttpHelper.java @@ -0,0 +1,235 @@ +package com.whdc.common.utils; + +import lombok.extern.slf4j.Slf4j; +import okhttp3.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.Map; + +/** + * @author lyf + * @since 2025-06-25 + */ +@Slf4j +@Component +public class HttpHelper { + @Autowired + private OkHttpClient okHttpClient = new OkHttpClient.Builder().build(); + +// public @NotNull String get(@NotNull String url, @Nullable Map params, @Nullable Map headers) { +// if (url.isEmpty()) { +// return "url为空"; +// } +// +// Request.Builder requestBuilder = new Request.Builder() +// .url(url) +// .get(); +// +// //header +// if (headers != null) { +// for (Map.Entry entry : headers.entrySet()) { +// String key = entry.getKey(); +// String value = entry.getValue(); +// if (key != null && value != null) { +// requestBuilder.header(key, value); +// } +// } +// } +// //doGet +// Request request = requestBuilder.build(); +// +// return doGet(request); +// } +// +// private @NotNull String doGet(Request request) { +// try (Response response = okHttpClient.newCall(request).execute()) { +// if (response.isSuccessful() && response.body() != null) { +// return response.body().string(); +// } else { +// return "请求失败:" + response; +// } +// } catch (IOException e) { +// return "网络异常:" + e.getMessage(); +// } +// } + + public @NotNull String postJsonString(@NotNull String url, @Nullable String json, @Nullable Map headers) { + return postJsonString(url, json, headers, StandardCharsets.UTF_8); + } + + public @NotNull String postJsonString(@NotNull String url, @Nullable String json, @Nullable Map headers, @NotNull Charset charset) { + if (url.isEmpty()) { + return "url为空"; + } + if (json == null) { + json = "{}"; + } + + //mediatype + MediaType mediaType = MediaType.get("application/json"); + //payload + RequestBody requestBody = RequestBody.create(json, mediaType); + //builder + Request.Builder requestBuilder = new Request.Builder() + .url(url) + .header("Content-Type", mediaType + ";charset=" + charset.name()) + .post(requestBody); + //header + if (headers != null) { + for (Map.Entry entry : headers.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + if (key != null && value != null) { + requestBuilder.header(key, value); + } + } + } + Request request = requestBuilder.build(); + //post + String resp = doPost(request); + if (resp.contains("请求失败") || resp.contains("网络异常")) { + log.warn("请求失败request:{}", request); + log.warn("请求失败request header:{}", headers); + log.warn("请求失败request payload:{}", json); + } + return resp; + } + + public @NotNull String postFormData(@NotNull String url, @Nullable Map params, @Nullable Map headers) { + return postFormData(url, params, headers, StandardCharsets.UTF_8); + } + + public @NotNull String postFormData(@NotNull String url, @Nullable Map params, @Nullable Map headers, @NotNull Charset charset) { + if (url.isEmpty()) { + return "url为空"; + } + + //mediatype + MediaType mediaType = MultipartBody.FORM; + //payload + MultipartBody.Builder bodyBuilder = new MultipartBody.Builder() + .setType(MultipartBody.FORM); + if (params != null) { + for (Map.Entry entry : params.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + if (key == null || value == null) { + continue; + } + if (value instanceof String) { + bodyBuilder.addFormDataPart(key, (String) value); + } else if (value instanceof File) { + File file = (File) value; + RequestBody fileBody = RequestBody.create(file, MediaType.get("application/octet-stream")); + bodyBuilder.addFormDataPart(key, file.getName(), fileBody); + } else { + return "不支持的参数类型"; + } + } + } + RequestBody requestBody = bodyBuilder.build(); + //builder + Request.Builder requestBuilder = new Request.Builder() + .url(url) + .header("Content-Type", mediaType + ";charset=" + charset.name()) + .post(requestBody); + //header + if (headers != null) { + for (Map.Entry entry : headers.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + if (key != null && value != null) { + requestBuilder.header(key, value); + } + } + } + //post + Request request = requestBuilder.build(); + + String resp = doPost(request); + if (resp.contains("请求失败") || resp.contains("网络异常")) { + log.warn("请求失败request:{}", request); + log.warn("请求失败request header:{}", headers); + log.warn("请求失败request payload:{}", params); + } + return resp; + } + + public @NotNull String postFormUrlEncoded(@NotNull String url, @Nullable Map params, @Nullable Map headers) { + return postFormUrlEncoded(url, params, headers, StandardCharsets.UTF_8); + } + + public @NotNull String postFormUrlEncoded(@NotNull String url, @Nullable Map params, @Nullable Map headers, @NotNull Charset charset) { + if (url.isEmpty()) { + return "url为空"; + } + + //mediatype + MediaType mediaType = MediaType.get("application/x-www-form-urlencoded"); + //payload + FormBody.Builder bodyBuilder = new FormBody.Builder(charset); + if (params != null) { + for (Map.Entry entry : params.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + if (key != null && value != null) { + try { + // Manually encode using GBK + String encodedValue = URLEncoder.encode(value.toString(), "GBK"); + bodyBuilder.addEncoded(key, encodedValue); + } catch (Exception e) { + return "参数encode错误"; + } + } + } + } + RequestBody formBody = bodyBuilder.build(); + //builder + Request.Builder requestBuilder = new Request.Builder() + .url(url) + .header("Content-Type", mediaType + ";charset=" + charset.name()) + .post(formBody); + //header + if (headers != null) { + for (Map.Entry entry : headers.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + if (key != null && value != null) { + requestBuilder.header(key, value); + } + } + } + //post + Request request = requestBuilder.build(); + + String resp = doPost(request); + if (resp.contains("请求失败") || resp.contains("网络异常")) { + log.warn("请求失败request:{}", request); + log.warn("请求失败request header:{}", headers); + log.warn("请求失败request payload:{}", params); + } + return resp; + } + + private @NotNull String doPost(Request request) { + try (Response response = okHttpClient.newCall(request).execute()) { + if (response.isSuccessful() && response.body() != null) { + return response.body().string(); + } else { + log.warn("请求失败response:{}", response); + return "请求失败:" + response; + } + } catch (IOException e) { + return "网络异常:" + e.getMessage(); + } + } + +} diff --git a/module-common/src/main/java/com/whdc/common/utils/HttpUtil.java b/module-common/src/main/java/com/whdc/common/utils/HttpUtil.java new file mode 100644 index 0000000..5542768 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/utils/HttpUtil.java @@ -0,0 +1,434 @@ +package com.whdc.common.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.whdc.common.exception.MyException; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.web.client.RestTemplate; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Objects; + + +@Slf4j +public class HttpUtil { + + + private static final RestTemplate REST_TEMPLATE = new RestTemplate(); + + public static String doGetThrEx(String url, JSONObject json) { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add(HttpHeaders.CONTENT_TYPE, "application/json"); + + if (Objects.nonNull(json)){ + StringBuilder sb = new StringBuilder(); + for (String key : json.keySet()) { + if (sb.length() > 0) { + sb.append("&"); + } + sb.append(key).append("=").append(json.get(key)); + } + + url += "?" + sb; + String token = json.getString("token"); + if (StringUtils.isNotBlank(token)){ + httpHeaders.add("X-Access-Token", token); + } + } + + org.springframework.http.HttpEntity requestEntity = new org.springframework.http.HttpEntity<>(json, httpHeaders); + return REST_TEMPLATE.exchange(url, HttpMethod.GET, requestEntity, String.class).getBody(); + } + + public static String doGet(String url, JSONObject json) { + try { + return doGetThrEx(url, json); + } catch (Exception e) { + throw new MyException("请求异常:" + e.getMessage(), e); + } + } + + public static String get(String _url) { + InputStream is = null; + BufferedReader br = null; + HttpURLConnection conn = null; + String jstr = null; + try { + + log.info("请求地址: " + _url); + + URL url = new URL(_url); + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + conn.setConnectTimeout(5000); + conn.setReadTimeout(5000); + conn.connect(); + if (conn.getResponseCode() == 200) { + is = conn.getInputStream(); + if (is != null) { + br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + StringBuffer sb = new StringBuffer(); + String tmp = ""; + while ((tmp = br.readLine()) != null) { + sb.append(tmp); + } + jstr = sb.toString(); + +// log.info("响应参数: " + jstr); + + jstr = jsonFormat(jstr); + + + return jstr; + } + } else if (conn.getResponseCode() == 500) { + is = conn.getErrorStream(); + if (is != null) { + br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + StringBuffer sb = new StringBuffer(); + String tmp = ""; + while ((tmp = br.readLine()) != null) { + sb.append(tmp); + } + jstr = sb.toString(); + if (jstr.contains("Token失效,请重新登录")) { // 第三方token失效处理 + return "{\"code\": 301,\"extMessage\":\"Token失效,请重新登录\"}"; + } + } + } + } catch (Exception ignore) { + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ignore) { + } + } + if (is != null) { + try { + is.close(); + } catch (IOException ignore) { + } + } + if (conn != null) { + try { + conn.disconnect(); + } catch (Exception ignore) { + } + } + } + return null; + } + + + public static String getBySetCookie(String _url,String cookie) { + InputStream is = null; + BufferedReader br = null; + HttpURLConnection conn = null; + String jstr = null; + try { + + log.info("请求地址: " + _url); + + URL url = new URL(_url); + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + + if (StringUtils.isNotBlank(cookie)){ + // 设置cookie + conn.setRequestProperty("Cookie", cookie); + } + + conn.setConnectTimeout(5000); + conn.setReadTimeout(5000); + conn.connect(); + if (conn.getResponseCode() == 200) { + is = conn.getInputStream(); + if (is != null) { + br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + StringBuffer sb = new StringBuffer(); + String tmp = ""; + while ((tmp = br.readLine()) != null) { + sb.append(tmp); + } + jstr = sb.toString(); + +// log.info("响应参数: " + jstr); + + jstr = jsonFormat(jstr); + + + return jstr; + } + } else if (conn.getResponseCode() == 500) { + is = conn.getErrorStream(); + if (is != null) { + br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + StringBuffer sb = new StringBuffer(); + String tmp = ""; + while ((tmp = br.readLine()) != null) { + sb.append(tmp); + } + jstr = sb.toString(); + if (jstr.contains("Token失效,请重新登录")) { // 第三方token失效处理 + return "{\"code\": 301,\"extMessage\":\"Token失效,请重新登录\"}"; + } + } + } + } catch (Exception ignore) { + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ignore) { + } + } + if (is != null) { + try { + is.close(); + } catch (IOException ignore) { + } + } + if (conn != null) { + try { + conn.disconnect(); + } catch (Exception ignore) { + } + } + } + return null; + } + + + public static String get(String _url, String authorization) { + InputStream is = null; + BufferedReader br = null; + HttpURLConnection conn = null; + String jstr = null; + try { + + log.info("请求地址: " + _url); + + URL url = new URL(_url); + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestProperty("Authorization", authorization); + conn.setRequestMethod("GET"); + conn.setConnectTimeout(50000); + conn.setReadTimeout(50000); + conn.connect(); + if (conn.getResponseCode() == 200) { + is = conn.getInputStream(); + if (is != null) { + br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + StringBuffer sb = new StringBuffer(); + String tmp = ""; + while ((tmp = br.readLine()) != null) { + sb.append(tmp); + } + jstr = sb.toString(); + +// log.info("响应参数: " + jstr); + + jstr = jsonFormat(jstr); + + return jstr; + } + } else if (conn.getResponseCode() == 500) { + is = conn.getErrorStream(); + if (is != null) { + br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + StringBuffer sb = new StringBuffer(); + String tmp = ""; + while ((tmp = br.readLine()) != null) { + sb.append(tmp); + } + jstr = sb.toString(); + if (jstr.contains("Token失效,请重新登录")) { // 第三方token失效处理 + return "{\"code\": 301,\"extMessage\":\"Token失效,请重新登录\"}"; + } + } + } + } catch (Exception ignore) { + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ignore) { + } + } + if (is != null) { + try { + is.close(); + } catch (IOException ignore) { + } + } + if (conn != null) { + try { + conn.disconnect(); + } catch (Exception ignore) { + } + } + } + return null; + } + + + public static String get(String _url, String token, String forward) { + InputStream is = null; + BufferedReader br = null; + HttpURLConnection conn = null; + String jstr = null; + try { + + log.info("请求地址: " + _url); + + URL url = new URL(_url); + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestProperty("X-Access-Token", token); + conn.setRequestProperty("url", forward); + conn.setRequestMethod("GET"); + conn.setConnectTimeout(50000); + conn.setReadTimeout(50000); + conn.connect(); + if (conn.getResponseCode() == 200) { + is = conn.getInputStream(); + if (is != null) { + br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + StringBuffer sb = new StringBuffer(); + String tmp = ""; + while ((tmp = br.readLine()) != null) { + sb.append(tmp); + } + jstr = sb.toString(); + +// log.info("响应参数: " + jstr); + + jstr = jsonFormat(jstr); + + + return jstr; + } + } else if (conn.getResponseCode() == 500) { + is = conn.getErrorStream(); + if (is != null) { + br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + StringBuffer sb = new StringBuffer(); + String tmp = ""; + while ((tmp = br.readLine()) != null) { + sb.append(tmp); + } + jstr = sb.toString(); + if (jstr.contains("Token失效,请重新登录")) { // 第三方token失效处理 + return "{\"code\": 301,\"extMessage\":\"Token失效,请重新登录\"}"; + } + } + } + } catch (Exception ignore) { + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ignore) { + } + } + if (is != null) { + try { + is.close(); + } catch (IOException ignore) { + } + } + if (conn != null) { + try { + conn.disconnect(); + } catch (Exception ignore) { + } + } + } + return null; + } + + + /** + * @param url + * @param jsonData + * @return + */ + public static String sendPost(String url, String jsonData) { + return sendPost(url, jsonData, null); + } + + public static String sendPost(String url, String jsonData, JSONObject header) { + CloseableHttpResponse response = null; + CloseableHttpClient httpClient = null; + String responseContent = null; + try { + httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(url); + httpPost.addHeader("Content-Type", "application/json"); + if (Objects.nonNull(header)) { + for (String key : header.keySet()) { +// httpPost.addHeader("X-Access-Token", token); + httpPost.addHeader(key, header.getString(key)); + } + } + + if (StringUtils.isNotBlank(jsonData)){ + httpPost.setEntity(new StringEntity(jsonData, "UTF-8")); + } + + log.info("请求地址: " + url); + log.info("请求header: " + header); + log.info("请求参数: " + jsonData); + + + response = httpClient.execute(httpPost); + HttpEntity entity = response.getEntity(); + responseContent = EntityUtils.toString(entity, "UTF-8"); + + responseContent = jsonFormat(responseContent); + + if (responseContent.length() < 200) { + log.info("响应参数: " + responseContent); + } + + } catch (Exception e) { + log.error("发送请求异常", e); + throw new MyException("发送请求异常", e); + } finally { + try { + if (null != response) { + response.close(); + } + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return responseContent; + } + + private static String jsonFormat(String str) { + + if (JSON.isValidObject(str)) { + str = JSON.parseObject(str).toJSONString(); + } + + return str; + } +} diff --git a/module-common/src/main/java/com/whdc/common/utils/JsonUtils.java b/module-common/src/main/java/com/whdc/common/utils/JsonUtils.java new file mode 100644 index 0000000..7b06ffe --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/utils/JsonUtils.java @@ -0,0 +1,31 @@ +package com.whdc.common.utils; + +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; + +/** + * @author xusan + * @date 2023/4/17 16:44 + */ +public class JsonUtils { + + public static boolean isJson(String str) { + + if (StringUtils.isBlank(str)){ + return false; + } + try { + JSONObject.parseObject(str); + return true; + } catch (Exception e) { + return false; + } + } + + public static void updateJson(JSONObject jsonObject,String key){ + String data = jsonObject.getString("DATA"); + if (StringUtils.isNotBlank(data) && StringUtils.isBlank(jsonObject.getString(key))){ + jsonObject.put(key,data); + } + } +} diff --git a/module-common/src/main/java/com/whdc/common/utils/NumUtils.java b/module-common/src/main/java/com/whdc/common/utils/NumUtils.java new file mode 100644 index 0000000..9f81719 --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/utils/NumUtils.java @@ -0,0 +1,25 @@ +package com.whdc.common.utils; + +import org.apache.commons.lang3.StringUtils; + +import java.util.regex.Pattern; + +/** + * @author xusan + * @date 2023/4/11 15:03 + */ +public class NumUtils { + + public static Pattern isNumber = Pattern.compile("^-?\\d+(\\.\\d+)?$"); + + public static boolean isNumber(String number) { + // 非空校验 + if (StringUtils.isEmpty(number)) { + return false; + } + // 数字校验(可以包含小数,可以是1,9,-1,1.1,-1.1,不能是+1.1,+1) + // 这个支持+1.1,+1 + // Pattern pattern = Pattern.compile("[+-]?[@-9]+(\\\\.[0-9]+)?"); + return isNumber.matcher(number).matches(); + } +} diff --git a/module-common/src/main/java/com/whdc/common/utils/RedisConfUtils.java b/module-common/src/main/java/com/whdc/common/utils/RedisConfUtils.java new file mode 100644 index 0000000..b6b6a9c --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/utils/RedisConfUtils.java @@ -0,0 +1,113 @@ +package com.whdc.common.utils; + +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import java.util.Collection; +import java.util.Objects; +import java.util.Set; + +/** + * @author xusan + * @date 2023/4/13 14:19 + */ +public class RedisConfUtils { + + public static StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + + + public static void setStringRedisSerializer(RedisTemplate redisTemplate) { + if (!Objects.isNull(redisTemplate)) { + + if (!(redisTemplate.getKeySerializer() instanceof StringRedisSerializer)) { + redisTemplate.setKeySerializer(stringRedisSerializer); + } + } + } + + + public static void setDefaultRedisSerializer(RedisTemplate redisTemplate) { + if (!Objects.isNull(redisTemplate)) { + + if (redisTemplate.getKeySerializer() instanceof StringRedisSerializer) { + redisTemplate.setKeySerializer(redisTemplate.getHashKeySerializer()); + } + } + + } + + public static void setStringRedisSeria(RedisTemplate redisTemplate) { + if (!Objects.isNull(redisTemplate)) { + + if (!(redisTemplate.getKeySerializer() instanceof StringRedisSerializer)) { + redisTemplate.setKeySerializer(stringRedisSerializer); + } + } + } + + + public static void setDefaultRedisSeria(RedisTemplate redisTemplate) { + if (!Objects.isNull(redisTemplate)) { + + if (redisTemplate.getKeySerializer() instanceof StringRedisSerializer) { + redisTemplate.setKeySerializer(redisTemplate.getHashKeySerializer()); + } + } + + } + + + public static Object get(String key, RedisTemplate redisTemplate) { + try { + setStringRedisSerializer(redisTemplate); + return redisTemplate.opsForValue().get(key); + } finally { + setDefaultRedisSerializer(redisTemplate); + } + } + + public static void set(String key, Object o, RedisTemplate redisTemplate) { + try { + setStringRedisSerializer(redisTemplate); + redisTemplate.opsForValue().set(key, o); + } finally { + setDefaultRedisSerializer(redisTemplate); + } + } + + public static Set getKeys(String key, RedisTemplate redisTemplate) { + try { + setStringRedisSerializer(redisTemplate); + return redisTemplate.keys(key + "*"); + } finally { + setDefaultRedisSerializer(redisTemplate); + } + } + + public static Boolean hasKey(String key, RedisTemplate redisTemplate) { + try { + setStringRedisSerializer(redisTemplate); + return redisTemplate.hasKey(key); + } finally { + setDefaultRedisSerializer(redisTemplate); + } + } + + public static void delete(String key, RedisTemplate redisTemplate) { + try { + setStringRedisSeria(redisTemplate); + redisTemplate.delete(key); + } finally { + setDefaultRedisSeria(redisTemplate); + } + } + + public static void delete(Collection keys, RedisTemplate redisTemplate) { + try { + setStringRedisSeria(redisTemplate); + redisTemplate.delete(keys); + } finally { + setDefaultRedisSeria(redisTemplate); + } + } +} diff --git a/module-common/src/main/java/com/whdc/common/utils/ReqUtils.java b/module-common/src/main/java/com/whdc/common/utils/ReqUtils.java new file mode 100644 index 0000000..00b88da --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/utils/ReqUtils.java @@ -0,0 +1,128 @@ +package com.whdc.common.utils; + +import javax.servlet.http.HttpServletRequest; + +public class ReqUtils { + private static final String dbPath = null; + + /** + * 获取用户真实IP地址,不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址, + * 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢? + * 答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。 + * 如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100 + * 用户真实IP为: 192.168.1.110 + * + * @param request + * @return + */ + public static String getIpAddress(HttpServletRequest request) {// 获取客户端ip地址 + String clientIp = request.getHeader("x-forwarded-for"); + + if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) { + clientIp = request.getHeader("Proxy-Client-IP"); + } + if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) { + clientIp = request.getHeader("WL-Proxy-Client-IP"); + } + if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) { + clientIp = request.getRemoteAddr(); + } + /* + * 对于获取到多ip的情况下,找到公网ip. + */ + String sIP = null; + if (clientIp != null && !clientIp.contains("unknown") && clientIp.indexOf(",") > 0) { + String[] ipsz = clientIp.split(","); + for (String anIpsz : ipsz) { + if (!isInnerIP(anIpsz.trim())) { + sIP = anIpsz.trim(); + break; + } + } + /* + * 如果多ip都是内网ip,则取第一个ip. + */ + if (null == sIP) { + sIP = ipsz[0].trim(); + } + clientIp = sIP; + } + if (clientIp != null && clientIp.contains("unknown")) { + clientIp = clientIp.replaceAll("unknown,", ""); + clientIp = clientIp.trim(); + } + if ("".equals(clientIp) || null == clientIp) { + clientIp = "127.0.0.1"; + } + return clientIp; + } + + /** + * 判断IP是否是内网地址 + * + * @param ipAddress ip地址 + * @return 是否是内网地址 + */ + public static boolean isInnerIP(String ipAddress) { + boolean isInnerIp; + long ipNum = getIpNum(ipAddress); + /** + 私有IP:A类 10.0.0.0-10.255.255.255 + B类 172.16.0.0-172.31.255.255 + C类 192.168.0.0-192.168.255.255 + 当然,还有127这个网段是环回地址 + **/ + long aBegin = getIpNum("10.0.0.0"); + long aEnd = getIpNum("10.255.255.255"); + + long bBegin = getIpNum("172.16.0.0"); + long bEnd = getIpNum("172.31.255.255"); + + long cBegin = getIpNum("192.168.0.0"); + long cEnd = getIpNum("192.168.255.255"); + isInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd) + || ipAddress.equals("127.0.0.1"); + return isInnerIp; + } + + private static long getIpNum(String ipAddress) { + String[] ip = ipAddress.split("\\."); + long a = Integer.parseInt(ip[0]); + long b = Integer.parseInt(ip[1]); + long c = Integer.parseInt(ip[2]); + long d = Integer.parseInt(ip[3]); + + return a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d; + } + + private static boolean isInner(long userIp, long begin, long end) { + return (userIp >= begin) && (userIp <= end); + } + + public static String getRealIP(HttpServletRequest request) { + // 获取客户端ip地址 + String clientIp = request.getHeader("x-forwarded-for"); + + if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) { + clientIp = request.getRemoteAddr(); + } + + String[] clientIps = clientIp.split(","); + if (clientIps.length <= 1) return clientIp.trim(); + + // 判断是否来自CDN + if (isComefromCDN(request)) { + if (clientIps.length >= 2) return clientIps[clientIps.length - 2].trim(); + } + + return clientIps[clientIps.length - 1].trim(); + } + + private static boolean isComefromCDN(HttpServletRequest request) { + String host = request.getHeader("host"); + return host.contains("www.189.cn") || + host.contains("shouji.189.cn") || + host.contains("image2.chinatelecom-ec.com") || + host.contains("image1.chinatelecom-ec.com"); + } +} diff --git a/module-common/src/main/java/com/whdc/common/utils/ResultJson.java b/module-common/src/main/java/com/whdc/common/utils/ResultJson.java new file mode 100644 index 0000000..6f8e85a --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/utils/ResultJson.java @@ -0,0 +1,171 @@ +package com.whdc.common.utils; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.springframework.stereotype.Component; + +import java.io.Serializable; +import java.util.Date; + +@ApiModel(description = "数据传输对象") +@Component +@SuppressWarnings("all") +public class ResultJson implements Serializable { + + private static final long serialVersionUID = 1L; + /** + * 成功 + */ + public static final Integer SUCCESS = 200; + private static final String SUCCESS_MSG = "success"; + + /** + * 失败 + */ + public static final Integer FAIL = 900; + private static final String FAIL_MSG = "fail"; + + public static final Integer PARAM_ERROR = 400; // 失败、参数错误等 + public static final Integer UNAUTHORIZED = 401; // 用户验证失败,或者用户验证信息过期 + public static final Integer PERMISSION_DENIED = 403; // 没有权限 + public static final Integer NOT_FOUND = 404; // 未找到资源 + public static final Integer METHOD_NOT_ALLOWED = 405; // 不支持的类型 + public static final Integer NSUPPORTED_MEDIA_TYPE = 415; // 不支持的媒体 + public static final Integer NOT_ALLOWED = 405; // 请求太频繁,同一个用户(token)、同一个url、同样的请求参数,请求间隔小于0.5秒 + public static final Integer SERVER_ERROR = 500; // 后台错误 + public static final Integer SRC_TIMEOUT = 504; // 请求资源超时 + + + @ApiModelProperty("数据消息") + private String msg; + + @ApiModelProperty("传输状态码(200=成功;400=参数错误; 500=后端错误;900=失败)") + private Integer code; + + @ApiModelProperty("传输数据") + private T data; + + @ApiModelProperty("接口响应时间戳") + private String restm; // 接口响应时间戳。如果有缓存,则该时间表示最后接口响应时间 + + public static ResultJson error() { + return error(FAIL, "未知异常,请联系管理员"); + } + + public static ResultJson error(String msg) { + return error(FAIL, msg); + } + + public static ResultJson error(int code, String msg) { + ResultJson r = new ResultJson(); + r.setCode(code); + r.setMsg(msg); + r.setRestm(DateUtils.sdfhmsS.get().format(new Date())); + return r; + } + + public static ResultJson error(int code, String msg, Object data) { + ResultJson r = new ResultJson(); + r.setCode(code); + r.setMsg(msg); + r.setData(data); + r.setRestm(DateUtils.sdfhmsS.get().format(new Date())); + return r; + } + + public static ResultJson ok(Integer code, String msg) { + ResultJson r = new ResultJson(); + r.setMsg(msg); + r.setCode(code); + r.setRestm(DateUtils.sdfhmsS.get().format(new Date())); + return r; + } + + public static ResultJson ok() { + ResultJson r = new ResultJson(); + r.setCode(SUCCESS); + r.setMsg(SUCCESS_MSG); + r.setRestm(DateUtils.sdfhmsS.get().format(new Date())); + return r; + } + + public static ResultJson ok(Object data) { + ResultJson r = new ResultJson(); + r.setCode(SUCCESS); + r.setMsg(SUCCESS_MSG); + r.setData(data); + r.setRestm(DateUtils.sdfhmsS.get().format(new Date())); + return r; + } + + public static ResultJson ok(Object data, String msg) { + ResultJson r = new ResultJson(); + r.setData(data); + r.setCode(SUCCESS); + r.setMsg(msg); + r.setRestm(DateUtils.sdfhmsS.get().format(new Date())); + return r; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public static Integer getSUCCESS() { + return SUCCESS; + } + + public static String getSuccessMsg() { + return SUCCESS_MSG; + } + + public static Integer getFAIL() { + return FAIL; + } + + public static String getFailMsg() { + return FAIL_MSG; + } + + public String getRestm() { + return restm; + } + + public void setRestm(String restm) { + this.restm = restm; + } + + @Override + public String toString() { + return "ResultJson{" + + "msg='" + msg + "'" + + ", code=" + code + + ", data=" + data + + ", restm=" + restm + + '}'; + } +} diff --git a/module-common/src/main/java/com/whdc/common/utils/SymmetricEncryption.java b/module-common/src/main/java/com/whdc/common/utils/SymmetricEncryption.java new file mode 100644 index 0000000..f35117a --- /dev/null +++ b/module-common/src/main/java/com/whdc/common/utils/SymmetricEncryption.java @@ -0,0 +1,55 @@ +package com.whdc.common.utils; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.security.SecureRandom; +import java.util.Base64; + +/** + * Description: + * Created by XuSan on 2024/6/13. + * + * @author XuSan + * @version 1.0 + */ + +public class SymmetricEncryption { + private static final String ALGORITHM = "AES"; + private static final int KEY_SIZE = 128; + + public static void main(String[] args) throws Exception { + String encryptedData = encrypt("82402321", "0492716ae0314f0496d62e0de215059a"); + String decryptedData = decrypt("lJM1xLd93ghNeWVTNNjjJw==", "4e1f078b917d4c7ca3e7eec1f683d3c2"); + + System.out.println("Original Data: " + 82402321); + System.out.println("Encrypted Data: " + encryptedData); + System.out.println("Decrypted Data: " + decryptedData); + } + + public static String encrypt(String data, String password) throws Exception { + SecretKey key = generateKey(password); + Cipher cipher = Cipher.getInstance(ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, key); + byte[] encryptedData = cipher.doFinal(data.getBytes()); + return Base64.getEncoder().encodeToString(encryptedData); + } + + public static String decrypt(String encryptedData, String password) throws Exception { + SecretKey key = generateKey(password); + Cipher cipher = Cipher.getInstance(ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, key); + byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData)); + return new String(decryptedData); + } + + private static SecretKey generateKey(String password) throws Exception { + KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM); + SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); + secureRandom.setSeed(password.getBytes()); + keyGenerator.init(KEY_SIZE, secureRandom); +// keyGenerator.init(KEY_SIZE, new SecureRandom(password.getBytes())); + return new SecretKeySpec(keyGenerator.generateKey().getEncoded(), ALGORITHM); + } +} \ No newline at end of file diff --git a/module-legacy/pom.xml b/module-legacy/pom.xml new file mode 100644 index 0000000..f433121 --- /dev/null +++ b/module-legacy/pom.xml @@ -0,0 +1,127 @@ + + + 4.0.0 + + + com.whdc + fxkh-txl-parent + 1.0 + ../poms/dependency.xml + + + fxkh-txl-legacy + jar + 防汛抗旱通讯录API - 启动模块 + + + + + com.whdc + fxkh-txl-sms + ${project.version} + + + + + org.springframework.boot + spring-boot-starter + + + + + com.baomidou + mybatis-plus-boot-starter + + + com.github.jeffreyning + mybatisplus-plus + + + + + com.dameng + DmJdbcDriver18 + + + com.dameng + DmDialect-for-hibernate4.0 + + + com.alibaba + druid + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.apache.commons + commons-pool2 + + + + + org.springframework.boot + spring-boot-starter-cache + + + + + com.itextpdf + kernel + + + com.itextpdf + io + + + com.itextpdf + forms + + + com.itextpdf + layout + + + com.itextpdf + svg + + + + + cn.dev33 + sa-token-spring-boot-starter + + + cn.dev33 + sa-token-dao-redis-jackson + + + + com.github.binarywang + weixin-java-miniapp + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/FxkhTxlApiApplication.java b/module-legacy/src/main/java/com/whdc/legacy/FxkhTxlApiApplication.java new file mode 100644 index 0000000..584aa68 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/FxkhTxlApiApplication.java @@ -0,0 +1,42 @@ +package com.whdc.legacy; + +import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; +import com.whdc.common.config.CommonModuleConfig; +import com.whdc.sms.config.SmsModuleConfig; +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.BeansException; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Import; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +/** + * @author 李赛 + * @date 2022-06-26 0:17 + */ +@Slf4j +@EnableWebMvc +@EnableKnife4j +@EnableCaching +@EnableScheduling +@SpringBootApplication +@MapperScan("com.whdc.**.mapper") +@EnableTransactionManagement +@Import({SmsModuleConfig.class, CommonModuleConfig.class}) +public class FxkhTxlApiApplication { + + public static void main(String[] args) { + try { + SpringApplication.run(FxkhTxlApiApplication.class, args); + + System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>> 启动完成 <<<<<<<<<<<<<<<<<<<<<<<<<<<"); + } catch (BeansException e) { + e.printStackTrace(); + log.error(e.getMessage(), e); + } + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/component/MyPostConstruct.java b/module-legacy/src/main/java/com/whdc/legacy/component/MyPostConstruct.java new file mode 100644 index 0000000..e2024ca --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/component/MyPostConstruct.java @@ -0,0 +1,212 @@ +package com.whdc.legacy.component; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.whdc.legacy.model.dto.ApiDto; +import com.whdc.legacy.model.entity.QXWarning; +import com.whdc.legacy.model.entity.ShAddressBook; +import com.whdc.legacy.model.vo.QXWarningVO; +import com.whdc.legacy.model.vo.WarningData; +import com.whdc.legacy.service.IQXWarningService; +import com.whdc.legacy.service.ShAddressBookService; +import com.whdc.common.utils.DateUtils; +import com.whdc.common.utils.HttpUtil; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpStatus; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Profile; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.GetMapping; + +import javax.annotation.PostConstruct; +import java.time.LocalDateTime; +import java.util.Comparator; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import static com.whdc.legacy.controller.QXWarnController.QX_TEMP_REDIS_KEY; + +/** + * @author 李赛 + * @date 2022-07-17 15:33 + */ +@Component +@Slf4j +@ConditionalOnProperty( + name = "enableSchedules.qxwarning", + havingValue = "true" +) +public class MyPostConstruct { + + @Autowired + private ShAddressBookService shAddressBookService; + + @Value("${getGroupWarning}") + public String getGroupWarning; + @PostConstruct + public void initCache() { + log.debug("加载缓存"); + + // 预警初始化 + QXWarningInit(); + } + + @Autowired + private IQXWarningService service; + + + @Autowired + private RedisTemplate stringRedisTemplate; + + + @Async + @ApiOperation(value = "预警数据同步接口", notes = "预警数据同步接口") + @GetMapping("/syncData") + @Scheduled(cron ="*/20 * * * * ?") + public void syncData() { + LocalDateTime now = LocalDateTime.now(); + sync(DateUtils.dateToStr(now.minusHours(1)),DateUtils.dateToStr(now.plusHours(1))); +// sync(null,null); + } + + /** + * 预警初始化 + */ + private void QXWarningInit(){ + long count = service.count(); + if (count > 0){ + return; + } + + LocalDateTime now = LocalDateTime.now(); + sync(DateUtils.dateToStr(now.minusYears(1)),DateUtils.dateToStr(now)); + } + + public void sync(String stm,String etm) { + log.info("预警数据同步开始!!!"); + ApiDto apiDto = new ApiDto(); + if (StringUtils.isNotBlank(stm)){ + log.info("开始时间 " + stm); + apiDto.setStartTime(stm); + } + if (StringUtils.isNotBlank(etm)){ + log.info("结束时间 " + etm); + apiDto.setEndTime(etm); + } + + apiDto.setFilter(Lists.newArrayList()); + + String str = HttpUtil.sendPost(getGroupWarning, JSON.toJSONString(apiDto)); +// String str = HttpUtil.sendPost("http://127.0.0.1:20000/shzh/met/zyqxfw/api/warning/getGroupWarning", JSON.toJSONString(apiDto)); + JSONObject json = JSON.parseObject(str); + if (json != null && json.getInteger("code") == HttpStatus.SC_OK) { + List data = json.getJSONArray("data").toJavaList(WarningData.class); + List warningList = getList(data); + log.info("预警数据同步获取数据条数 " + warningList.size()); + List warnIds = warningList.stream().map(QXWarningVO::getWarnid).collect(Collectors.toList()); + + List list = service.lambdaQuery().in(QXWarning::getWarnid, warnIds).list(); + log.info("预警数据同步已存预警 " + list.size()); + + Set dbWarnSet = list.stream().map(QXWarning::getWarnid).collect(Collectors.toSet()); + + List adds = Lists.newArrayList(); + for (QXWarningVO warningVO : warningList) { + if (!dbWarnSet.contains(warningVO.getWarnid())) { + QXWarning qxwarning = new QXWarning(); + qxwarning.setCreateTime(DateUtils.dateToStrYMDHds(warningVO.getCreateTime())); + qxwarning.setPublishTime(DateUtils.dateToStrYMDHds(warningVO.getPublishTime())); + qxwarning.setStartTime(DateUtils.dateToStrYMDHds(warningVO.getStartTime())); + qxwarning.setEndTime(DateUtils.dateToStrYMDHds(warningVO.getEndTime())); + qxwarning.setWarnSignalType(warningVO.getWarnSignalType()); + qxwarning.setWarnSignalLevel(warningVO.getWarnSignalLevel()); + qxwarning.setPublishUnit(warningVO.getPublishUnit()); + qxwarning.setContent(warningVO.getContent()); + qxwarning.setWarnid(warningVO.getWarnid()); + qxwarning.setCtnm(warningVO.getCtnm()); + qxwarning.setCnnm(warningVO.getCnnm()); + + stringRedisTemplate.opsForValue().set(QX_TEMP_REDIS_KEY + qxwarning.getWarnid(),JSON.toJSONString(warningVO)); + adds.add(qxwarning); + + } + } + + + if (CollectionUtils.isNotEmpty(adds)) { + log.info("预警数据同步待添加预警 " + adds.size()); + if (this.service.saveBatch(adds)) { + log.info("添加成功 " + adds.size()); + } + } + } + + log.info("预警数据同步执行完成!!!"); + + } + private List getList(List data) { + + List respList = Lists.newArrayList(); + for (WarningData datum : data) {//最外层的列表 + String ctnm = datum.getEffectArea();//市级范围 + for (WarningData.TypeList typeList : datum.getTypeList()) {//里面的 + // 预警类型 + String type = typeList.getType(); + List warnList = typeList.getWarnList(); + + for (WarningData.Warning warning : warnList) { + String cnnm = warning.getEffectArea(); + QXWarningVO vo = new QXWarningVO(); + String publishUnit = warning.getPublishUnit(); +// vo.setTitle(publishUnit + "发布" + type + "预警"); + vo.setCtnm(ctnm);//市级名称 + vo.setCnnm(cnnm);//县级名称 + vo.setPublishUnit(publishUnit);//发布单位 + vo.setPublishTime(warning.getPublishTime());//预警发布时间 + vo.setWarnSignalType(warning.getWarnSignalType());//预警类型 + vo.setWarnSignalLevel(warning.getWarnSignalLevel());//预警级别 + vo.setContent(warning.getContent());//预警内容 + vo.setWarnid(warning.getId()); + vo.setCreateTime(warning.getCreateTime()); + vo.setStartTime(warning.getStartTime()); + vo.setEndTime(warning.getEndTime()); + respList.add(vo); + } + } + } + + respList = respList.stream().filter(o -> "暴雨".equals(o.getWarnSignalType()) || "雷雨大风".equals(o.getWarnSignalType())).collect(Collectors.toList()); + respList = respList.stream().filter(o -> "红色".equals(o.getWarnSignalLevel()) || "橙色".equals(o.getWarnSignalLevel())).collect(Collectors.toList()); + return respList.stream().sorted(Comparator.comparing(QXWarningVO::getPublishTime).reversed()) + .collect(Collectors.toList()); + } + + + + + @Async + @ApiOperation(value = "恢复山洪负责人抽查状态定时任务", notes = "预警数据同步接口") + @GetMapping("/recoveryShAddressBookSpotCheck") + @Scheduled(cron = "0 0 0 * * ?") + public void recoveryShAddressBookSpotCheck() { + boolean update = shAddressBookService.lambdaUpdate() + .set(ShAddressBook::getIsSpotCheck, 0) + .set(ShAddressBook::getCallStatus, 0) + .eq(ShAddressBook::getIsSpotCheck, 1) + .eq(ShAddressBook::getDel, 1) + .update(); + log.info("恢复山洪负责人抽查状态定时任务执行结果: " + update); + } + + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/AbUdRController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/AbUdRController.java new file mode 100644 index 0000000..1274e0e --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/AbUdRController.java @@ -0,0 +1,100 @@ +package com.whdc.legacy.controller; + + +import com.whdc.legacy.model.entity.AbUdR; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import com.whdc.legacy.service.IAbUdRService; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author xusan + * @date 2024-05-11 + */ +@Slf4j +@Api(tags = "用户单位字典关联表 - Controller") +@RestController +@RequestMapping("/abudr") +public class AbUdRController { + + @Autowired + private IAbUdRService service; + + + + @ApiOperation(value = "查询所有") + @PostMapping(value = "find") + public ResultJson find(@RequestBody AbUdR dto) { + + return ResultJson.ok(service.find(dto)); + + } + + @ApiOperation(value = "分页查询") + @PostMapping(value = "page") + public ResultJson page(@RequestBody AbUdR dto) { + + return ResultJson.ok(service.page(dto)); + + } + + + @ApiOperation(value = "添加") + @PostMapping(value = "save") + public ResultJson insert(@RequestBody @Validated(Insert.class) AbUdR model) { + + if (CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(AbUdR::getAdId,String.valueOf(model.getAdId()).trim()) + .eq(AbUdR::getDictId,String.valueOf(model.getDictId() ).trim()) + .list()) + ){ + return ResultJson.error("重复新增"); + } + + return ResultJson.ok(service.save(model)); + + } + + @ApiOperation(value = "修改") + @PostMapping(value = "edit") + public ResultJson update(@RequestBody @Validated(Update.class) AbUdR model) { + + if (CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(AbUdR::getAdId,String.valueOf(model.getAdId()).trim()) + .eq(AbUdR::getDictId,String.valueOf(model.getDictId() ).trim()) + .list()) + ){ + return ResultJson.error("重复修改"); + } + + return ResultJson.ok(service.updateById(model)); + } + + + @ApiOperation(value = "删除") + @GetMapping(value = "del/{id}") + public ResultJson delete(@PathVariable("id") Integer id) { + + + if (Objects.isNull(service.getById(id))) { + + return ResultJson.error("当前数据不存在"); + + } + + return ResultJson.ok(service.removeById(id)); + + } + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/AddressBookCityController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/AddressBookCityController.java new file mode 100644 index 0000000..704c955 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/AddressBookCityController.java @@ -0,0 +1,185 @@ +package com.whdc.legacy.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.whdc.legacy.mapper.AddressBookCityMapper; +import com.whdc.legacy.model.dto.AddressBookCityDto; +import com.whdc.legacy.model.entity.AddressBookCity; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import com.whdc.legacy.service.IAddressBookCityService; +import com.whdc.common.utils.ExcelCommon; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; + +import static com.whdc.legacy.model.MyConstant.DEL; +import static com.whdc.legacy.model.MyConstant.REC; + +/** + * Description: + * Created by XuSan on 2024/8/21. + * + * @author XuSan + * @version 1.0 + */ +@Slf4j +@Api(tags = "市级责任人通讯录 - Controller") +@RestController +@RequestMapping("/addressbookCity") +@Transactional +public class AddressBookCityController { + + @Autowired + private AddressBookCityMapper thisMapper; + + @Autowired + private IAddressBookCityService thisService; + + + @ApiOperation(value = "分页查询") + @PostMapping(value = "page") + public ResultJson page(@RequestBody AddressBookCityDto dto) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + if (!Objects.isNull(dto.getName())) { + query.like(AddressBookCity::getName, dto.getName()); + } + if (!Objects.isNull(dto.getUnit())) { + query.like(AddressBookCity::getUnit, dto.getUnit()); + } + if (!Objects.isNull(dto.getPhone())) { + query.like(AddressBookCity::getPhone, dto.getPhone()); + } + query.eq(AddressBookCity::getDel, REC); + query.orderByAsc(AddressBookCity::getId); + return ResultJson.ok(thisMapper.selectPage(dto.getPage(), query)); + + } + + @ApiOperation(value = "添加") + @PostMapping(value = "save") + public ResultJson insert(@RequestBody @Validated(Insert.class) AddressBookCity model) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(AddressBookCity::getName, model.getName()); + query.eq(AddressBookCity::getPhone, model.getPhone()); + query.eq(AddressBookCity::getDel, REC); + + if (thisMapper.selectCount(query) > 0) { + return ResultJson.error("当前名字,手机号已存在"); + } + model.setId(null); + return ResultJson.ok(thisMapper.insert(model) == 1); + + } + + @ApiOperation(value = "修改") + @PostMapping(value = "edit") + public ResultJson update(@RequestBody @Validated(Update.class) AddressBookCity model) { + + AddressBookCity obj = thisMapper.selectById(model.getId()); + if (Objects.isNull(obj)) { + return ResultJson.error("当前数据不存在"); + } + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(AddressBookCity::getName, model.getName()); + query.eq(AddressBookCity::getPhone, model.getPhone()); + query.eq(AddressBookCity::getDel, REC); + query.ne(AddressBookCity::getId, model.getId()); + + if (thisMapper.selectCount(query) > 0) { + return ResultJson.error("当前名字,手机号已存在"); + } + + return ResultJson.ok(thisMapper.updateById(model) == 1); + } + + + @ApiOperation(value = "删除") + @GetMapping(value = "del/{id}") + public ResultJson delete(@PathVariable("id") Integer id) { + + + if (Objects.isNull(thisMapper.selectById(id))) { + + return ResultJson.error("当前数据不存在"); + + } + + return ResultJson.ok(thisMapper.deleteById(id) == 1); + + } + + + @ApiOperation(value = "导出") + @PostMapping(value = "download") + public void download(HttpServletResponse response,@RequestBody AddressBookCityDto dto) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + if (!Objects.isNull(dto.getName())) { + query.like(AddressBookCity::getName, dto.getName()); + } + if (!Objects.isNull(dto.getUnit())) { + query.like(AddressBookCity::getUnit, dto.getUnit()); + } + if (!Objects.isNull(dto.getPhone())) { + query.like(AddressBookCity::getPhone, dto.getPhone()); + } + query.eq(AddressBookCity::getDel, REC); + query.orderByAsc(AddressBookCity::getId); + List list = thisMapper.selectList(query); + + AtomicInteger i = new AtomicInteger(1); + list.forEach(o -> o.setId(i.getAndIncrement())); + ExcelCommon.exportExcel(list, + null, "市级责任人通讯录", AddressBookCity.class, "市级责任人通讯录" + LocalDateTime.now() + ".xlsx", + response); + } + + @ApiOperation(value = "导入") + @PostMapping(value = "Import") + public ResultJson Import(MultipartFile file) { + + List appends = ExcelCommon.importExcel(file, 0, 1, AddressBookCity.class); + + if (CollectionUtils.isNotEmpty(appends)) { + long count = appends.stream().filter(o -> StringUtils.isEmpty(o.getName()) || StringUtils.isEmpty(o.getPhone())) + .count(); + if (count > 0) { + return ResultJson.error("姓名和手机号不能为空"); + } + + boolean update = thisService.lambdaUpdate().set(AddressBookCity::getDel, DEL) + .eq(AddressBookCity::getDel, REC) + .update(); + if (!update) { + log.info("更新失败"); + } + + appends.forEach(o -> o.setId(null) + .setName(StringUtils.deleteWhitespace(o.getName())) + .setPhone(StringUtils.deleteWhitespace(o.getPhone())) + .setUnit(StringUtils.deleteWhitespace(o.getUnit())) + .setPosition(StringUtils.deleteWhitespace(o.getPosition())) + .setComments(StringUtils.deleteWhitespace(o.getComments())) + ); + + boolean data = thisService.saveBatch(appends); + if (data) { + return ResultJson.ok("上传成功"); + } + } + return ResultJson.error("上传失败"); + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/AddressBookController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/AddressBookController.java new file mode 100644 index 0000000..e1c0dbf --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/AddressBookController.java @@ -0,0 +1,829 @@ +package com.whdc.legacy.controller; + + +import cn.dev33.satoken.stp.StpUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.common.exception.MyException; +import com.whdc.legacy.model.dto.AddressBookDto; +import com.whdc.legacy.model.entity.AbUdR; +import com.whdc.legacy.model.entity.AddressBook; +import com.whdc.legacy.model.entity.Organization; +import com.whdc.legacy.model.entity.User; +import com.whdc.legacy.model.enums.Role; +import com.whdc.legacy.model.enums.VersionsType; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import com.whdc.legacy.model.vo.AdcdTree; +import com.whdc.legacy.model.vo.AddressBookVo; +import com.whdc.legacy.model.vo.ExcelABVo; +import com.whdc.legacy.model.vo.ExcelDataVo; +import com.whdc.common.utils.ExcelCommon; +import com.whdc.common.utils.ResultJson; +import com.whdc.legacy.service.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.DigestUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; + +import static com.whdc.legacy.model.MyConstant.REDIS_KEY; +import static com.whdc.legacy.service.impl.AdinfoServiceImpl.TREE_ALL; + +/** + * @author xusan + * @date 2024-05-11 + */ +@Slf4j +@Api(tags = "通讯录 - Controller") +@RestController +@RequestMapping("/addressbook") +@Transactional +public class AddressBookController { + + public static final String ADDRESS_BOOK_REDIS_KEY = REDIS_KEY + "addressbook"; + public static final String ADDRESS_BOOK_TEMP_REDIS_KEY = ADDRESS_BOOK_REDIS_KEY + "temp:"; + + @Autowired + private IAddressBookService service; + + @Autowired + private IUserService userService; + + @Autowired + private IAdinfoService adinfoService; + + @Autowired + private IVersionsService versionsService; + + @Autowired + private IOrganizationService organizationsService; + + @Autowired + private IAbUdRService abUdRService; + + @Autowired + private RedisTemplate redisTemplate; + + +// @ApiOperation(value = "查询所有") +// @PostMapping(value = "find") +// public ResultJson find(@RequestBody AddressBook dto) { +// +// return ResultJson.ok(service.find(dto)); +// +// } + + @ApiOperation(value = "分页查询") + @PostMapping(value = "page") + public ResultJson page(@RequestBody AddressBookDto dto) { + dto.setUserId(String.valueOf(StpUtil.getLoginId())); + IPage page = service.page(dto); + +// return ResultJson.ok(JSON.parseObject(JSON.toJSONString(page).replaceAll("null",""))); + return ResultJson.ok(page); + + } + + + @ApiOperation(value = "添加") + @PostMapping(value = "save") + @CacheEvict(value = ADDRESS_BOOK_REDIS_KEY, allEntries = true) + public ResultJson insert(@RequestBody @Validated(Insert.class) AddressBook model) { + User user = userService.getRole(Integer.valueOf(String.valueOf(StpUtil.getLoginId()))); + + switch (Objects.requireNonNull(Role.getByName(user.getRole()))) { + case R000: + return ResultJson.error("权限不足"); + case R001: + case R099: + if (Integer.parseInt(model.getRole()) > Integer.parseInt(user.getRole())) { + return ResultJson.error("权限不足!"); + } + break; + default: + return ResultJson.error("权限不足!!"); + } + + if (StringUtils.isNotBlank(model.getRole())) { + switch (Objects.requireNonNull(Role.getByName(user.getRole()))) { + case R000: + case R001: + case R099: + break; + default: + return ResultJson.error("权限不匹配"); + } + if (Integer.parseInt(user.getRole()) < Integer.parseInt(model.getRole())) { + return ResultJson.error("权限不足!"); + } + } + + if (CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(AddressBook::getName, String.valueOf(model.getName()).trim()) + .list()) + ) { + return ResultJson.error("该名称重复"); + } + + if (StringUtils.isNotBlank(model.getPhone()) && CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(AddressBook::getPhone, model.getPhone().trim()) + .list()) + ) { + return ResultJson.error("该手机号已存在"); + } + + + model.setId(null); + boolean save = service.save(model); + + // 添加日志 + String adcd = model.getAdcd(); + versionsService.saveInfo(model, VersionsType.ADD, adcd); + + if (save) { + redisTemplate.delete(ADDRESS_BOOK_REDIS_KEY + "*"); + // 没有手机号用名字注册 + //"省防指".equals(organizationsService.getById(model.getOrganization()).getName()) + // && + if (StringUtils.isBlank(model.getPhone())) { + if (StringUtils.isNotBlank(model.getTel())) { + userService.register(model.getTel(), model.getId(), model.getRole()); + } else { + userService.register(model.getName(), model.getId(), model.getRole()); + } + + } else { + userService.register(model.getPhone(), model.getId(), model.getRole()); + } + + if (StringUtils.isNotBlank(adcd)) { + List list = abUdRService.lambdaQuery().eq(AbUdR::getDictId, model.getAdcd()) + .select(AbUdR::getSort) + .orderByDesc(AbUdR::getSort) + .list(); + Integer sort = 0; + if (CollectionUtils.isNotEmpty(list)) { + AbUdR abUdR = list.get(0); + sort = abUdR.getSort() + 1; + } + abUdRService.save(new AbUdR(model.getId(), adcd.replaceFirst("000000", ""), ++sort, model.getType())); + } else { + List list = abUdRService.lambdaQuery().eq(AbUdR::getDictId, model.getOrganization()) + .select(AbUdR::getSort) + .orderByDesc(AbUdR::getSort) + .list(); + Integer sort = 0; + if (CollectionUtils.isNotEmpty(list)) { + AbUdR abUdR = list.get(0); + sort = abUdR.getSort() + 1; + } + // 添加关联关系` + abUdRService.save(new AbUdR(model.getId(), model.getOrganization(), sort, model.getType())); + } + } + + return ResultJson.ok(save); + + } + + @ApiOperation(value = "修改") + @PostMapping(value = "edit") + @CacheEvict(value = ADDRESS_BOOK_REDIS_KEY, allEntries = true) + public ResultJson update(@RequestBody @Validated(Update.class) AddressBook model) { + + Integer loginId = Integer.valueOf(String.valueOf(StpUtil.getLoginId())); + User user = userService.getRole(loginId); + + switch (Objects.requireNonNull(Role.getByName(user.getRole()))) { + case R000: { + // 不是修改自己 + if (!model.getId().equals(user.getAbId())) { + return ResultJson.error("权限不足"); + } + } + ; + case R001: + case R099: + if (Integer.parseInt(model.getRole()) > Integer.parseInt(user.getRole())) { + return ResultJson.error("权限不足!"); + } + break; + default: + return ResultJson.error("权限不足!!"); + } + + if (StringUtils.isNotBlank(model.getRole())) { + switch (Objects.requireNonNull(Role.getByName(user.getRole()))) { + case R000: + case R001: + case R099: + break; + default: + return ResultJson.error("权限不匹配"); + } + if (Integer.parseInt(user.getRole()) < Integer.parseInt(model.getRole())) { + return ResultJson.error("权限不足!"); + } + } + AddressBook byId = service.getById(model.getId()); + if (Objects.isNull(byId)) { + return ResultJson.error("当前数据不存在"); + } + + if (CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(AddressBook::getName, String.valueOf(model.getName()).trim()) + .ne(AddressBook::getId, model.getId()) + .list()) + ) { + return ResultJson.error("该名称重复"); + } + + if (StringUtils.isNotBlank(model.getPhone()) && CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(AddressBook::getPhone, model.getPhone().trim()) + .ne(AddressBook::getId, model.getId()) + .list()) + ) { + return ResultJson.error("该手机号已存在"); + } + +// List list = versionsService.lambdaQuery() +// .eq(Versions::getAbId, model.getId()) +// .list(); +// Integer version = 0; +// if (CollectionUtils.isNotEmpty(list)){ +// version = list +// .stream().map(Versions::getVersion) +// .max(Comparator.comparing(Integer::intValue)) +// .get(); +// }else{ +// log.info("当前数据在进行修改但无相关记录;" + model.getId()); +// } +// // 添加日志 +// versionsService.save(new Versions(null, JSON.toJSONString(model),model.getId(),++version,model.getCreateId(),new Date(), VersionsType.UPDATE.getName())); + String adcd = model.getAdcd(); + if (StringUtils.isBlank(adcd)) { + adcd = byId.getAdcd(); + } + model.setRole(user.getRole()); + versionsService.saveInfo(model, VersionsType.UPDATE, adcd); + boolean data = service.updateById(model); + if (data) { + + redisTemplate.delete(ADDRESS_BOOK_REDIS_KEY + "*"); + + + String organization = model.getOrganization(); + if (StringUtils.isNotBlank(model.getAdcd())) { + organization = model.getAdcd().replaceFirst("000000", ""); + } + Integer sort = model.getSort(); + if (0 != sort) { + boolean update = abUdRService.lambdaUpdate() + .set(AbUdR::getSort, sort) + .set(AbUdR::getDictId, organization) + .eq(AbUdR::getAdId, model.getId()) + .update(); + log.info("修改abUdR: " + update); + } + + User one = userService.lambdaQuery().eq(User::getAbId, model.getId()).one(); + if (Objects.nonNull(one)) { + // 没有就创建账号 + if (StringUtils.isBlank(model.getPhone())) { + if (StringUtils.isNotBlank(model.getTel())) { + if (!one.getUsername().equals(model.getTel())) { + one.setUsername(model.getTel()) + .updateById(); + } + } else { + if (!one.getUsername().equals(model.getName())) { + one.setUsername(model.getName()) + .updateById(); + } + } + + } else { + if (!one.getUsername().equals(model.getPhone())) { + one.setUsername(model.getPhone()) + .updateById(); + } + } + } else { + // 没有就创建账号 + if (StringUtils.isBlank(model.getPhone())) { + if (StringUtils.isNotBlank(model.getTel())) { + userService.register(model.getTel(), model.getId(), model.getRole()); + } else { + userService.register(model.getName(), model.getId(), model.getRole()); + } + + } else { + userService.register(model.getPhone(), model.getId(), model.getRole()); + } + } + } + + return ResultJson.ok(data); + } + + @ApiOperation(value = "修改权限") + @PostMapping(value = "updateRole") + public ResultJson updateRole(@RequestBody @Validated(Update.class) AddressBook model) { + + Integer loginId = Integer.valueOf(String.valueOf(StpUtil.getLoginId())); + User user = userService.getRole(loginId); + + switch (Objects.requireNonNull(Role.getByName(user.getRole()))) { + case R000: + case R001: + case R099: { + if (Integer.parseInt(model.getRole()) > Integer.parseInt(user.getRole())) { + return ResultJson.error("权限不足"); + } + break; + } + default: + return ResultJson.error("权限不足!!"); + } + + AddressBook byId = service.getById(model.getId()); + if (Objects.isNull(byId)) { + return ResultJson.error("当前数据不存在"); + } + + +// List list = versionsService.lambdaQuery() +// .eq(Versions::getAbId, model.getId()) +// .list(); +// Integer version = 0; +// if (CollectionUtils.isNotEmpty(list)){ +// version = list +// .stream().map(Versions::getVersion) +// .max(Comparator.comparing(Integer::intValue)) +// .get(); +// }else{ +// log.info("当前数据在进行修改但无相关记录;" + model.getId()); +// } +// // 添加日志 +// versionsService.save(new Versions(null, JSON.toJSONString(model),model.getId(),++version,model.getCreateId(),new Date(), VersionsType.UPDATE_ROLE.getName())); + byId.setOname(model.getOname()); + byId.setRole(model.getRole()); + + try { + Thread.sleep(100); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + versionsService.saveInfo(byId, VersionsType.UPDATE_ROLE, byId.getAdcd()); + + + // 只修改角色 + + boolean update = userService.lambdaUpdate() + .set(User::getRole, model.getRole()) + .eq(User::getAbId, model.getId()) + .update(); + return ResultJson.ok(update); + } + + + @ApiOperation(value = "设置白名单") + @PostMapping(value = "setWhitelists") + public ResultJson setWhitelists(@RequestBody @Validated(Update.class) AddressBook model) { + + Integer loginId = Integer.valueOf(String.valueOf(StpUtil.getLoginId())); + User user = userService.getRole(loginId); + + switch (Objects.requireNonNull(Role.getByName(user.getRole()))) { + case R000: + case R001: + return ResultJson.error("权限不足"); + case R099: { + break; + } + default: + return ResultJson.error("权限不足!!"); + } + + AddressBook byId = service.getById(model.getId()); + if (Objects.isNull(byId)) { + return ResultJson.error("当前数据不存在"); + } + + byId.setIsPass(model.getIsPass()); + versionsService.saveInfo(model, VersionsType.WHITE, byId.getAdcd()); + + + boolean update = service.lambdaUpdate() + .set(AddressBook::getIsPass, model.getIsPass()) + .eq(AddressBook::getId, model.getId()) + .update(); + if (!update) { + throw new MyException("操作数据库失败"); + } + return ResultJson.ok(update); + } + + + @ApiOperation(value = "删除") + @GetMapping(value = "del/{id}") + @CacheEvict(value = ADDRESS_BOOK_REDIS_KEY, allEntries = true) + public ResultJson delete(@PathVariable("id") Integer id) { + + Integer loginId = Integer.valueOf(String.valueOf(StpUtil.getLoginId())); + User user = userService.getRole(loginId); + AddressBook model = service.getById(id); + + if (Objects.isNull(model)) { + return ResultJson.error("当前数据不存在"); + } + + User delUser = userService.lambdaQuery() + .eq(User::getAbId, model.getId()) + .one(); + + switch (Objects.requireNonNull(Role.getByName(user.getRole()))) { + case R000: + case R001: + case R099: + if (Integer.parseInt(delUser.getRole()) > Integer.parseInt(user.getRole())) { + return ResultJson.error("权限不足"); + } + break; + default: + return ResultJson.error("权限不足!!"); + } + + +// List list = versionsService.lambdaQuery() +// .eq(Versions::getAbId, model.getId()) +// .list(); +// Integer version = 0; +// if (CollectionUtils.isNotEmpty(list)){ +// version = list +// .stream().map(Versions::getVersion) +// .max(Comparator.comparing(Integer::intValue)) +// .get(); +// }else{ +// log.info("当前数据在进行修改但无相关记录;" + model.getId()); +// } +// // 添加日志 +// versionsService.save(new Versions(null, JSON.toJSONString(model),model.getId(),++version,model.getCreateId(),new Date(), VersionsType.DEL.getName())); + versionsService.saveInfo(model, VersionsType.DEL, model.getAdcd()); + + + return ResultJson.ok(service.removeById(id)); + } + + + @ApiOperation(value = "查询详情") + @GetMapping(value = "get/{id}") + public ResultJson get(@PathVariable("id") Integer id) { + + AddressBook byId = service.getById(id); + if (byId != null) { + if (StringUtils.isNotBlank(byId.getOrganization())) { + Organization byId2 = organizationsService.getById(byId.getOrganization()); + if (byId2 != null) { + byId.setOname(byId2.getName()); + } + } + } + return ResultJson.ok(byId); + } + + @ApiOperation(value = "查询用户详情") + @GetMapping(value = "getByUser/{userId}") + public ResultJson getByUser(@PathVariable("userId") Integer userId) { + User byId = userService.getById(userId); + if (Objects.isNull(byId)) { + return ResultJson.error("该用户不存在"); + } +// return ResultJson.ok(JSON.parseObject(JSON.toJSONString(service.getById(byId.getAbId())).replaceAll("null",""))); + AddressBook byId1 = service.getById(byId.getAbId()); + if (byId1 != null) { + if (StringUtils.isNotBlank(byId1.getOrganization())) { + Organization byId2 = organizationsService.getById(byId1.getOrganization()); + if (byId2 != null) { + byId1.setOname(byId2.getName()); + } + } + byId1.setRole(byId.getRole()); + } + return ResultJson.ok(byId1); + } + + + @ApiOperation(value = "查询行政区划联系人") + @GetMapping(value = "getAdcdUser") + public ResultJson> getAdcdUser() { + + List tree = adinfoService.tree(TREE_ALL, TREE_ALL); + + if (CollectionUtils.isEmpty(tree)) { + throw new MyException("当前行政区划不存在"); + } + +// List addressBooks = service.lambdaQuery().isNotNull(AddressBook::getAdcd) +// .list(); + List addressBooks = service.lambdaQuery().likeLeft(AddressBook::getAdcd, "000000000") + .list(); + + if (CollectionUtils.isEmpty(addressBooks)) { + throw new MyException("行政区划责任人为空"); + } + + Map> abMap = addressBooks.stream().collect(Collectors.groupingBy(AddressBook::getAdcd, Collectors.toList())); + + // 行政区划责任人数据 + List data = Lists.newArrayList(); + + for (int i = 0; i < tree.size(); i++) { + AdcdTree t = tree.get(i); +// String adcd = t.getAdcd(); + String cityAdnm = t.getAdnm(); +// List books = abMap.get(adcd); +// if (CollectionUtils.isEmpty(books)) { +// continue; +// } +// books.forEach(b -> { +// if (StringUtils.isNotBlank(finalAdnm)) { +// if (cityAdnm.equals(finalAdnm)) { +// data.add(new ExcelABVo(cityAdnm, cityAdnm, b.getName(), b.getPosition(), b.getPhone())); +// } +// } else { +// data.add(new ExcelABVo(cityAdnm, cityAdnm, b.getName(), b.getPosition(), b.getPhone())); +// } +// }); + + List children = t.getChildren(); + if (CollectionUtils.isNotEmpty(children)) { + for (int i1 = 1; i1 < children.size(); i1++) { + AdcdTree tc = children.get(i1); + String tcAdcd = tc.getAdcd(); + String tcCityAdnm = tc.getAdnm(); + List tcBooks = abMap.get(tcAdcd); + if (CollectionUtils.isEmpty(tcBooks)) { + continue; + } + tcBooks.forEach(b -> { + data.add(new ExcelABVo(cityAdnm, tcCityAdnm, b.getName(), b.getPosition(), b.getPhone())); + }); + } + } + + } + + if (CollectionUtils.isEmpty(data)) { + throw new MyException("当前行政区划责任人为空"); + } + return ResultJson.ok(data); + + } + +// @ApiOperation(value = "通过行政区划下载excel") +// @GetMapping(value = "getExcel/{adnm}") + public void getExcel(@PathVariable("adnm") + @ApiParam(value = "名称,all: 查询全部") + String adnm, HttpServletResponse response) { + + // 查询全部标识 + if ("all".equals(adnm)) { + adnm = ""; + } + + List tree = adinfoService.tree(TREE_ALL, TREE_ALL); + + if (CollectionUtils.isEmpty(tree)) { + throw new MyException("当前行政区划不存在"); + } + +// List addressBooks = service.lambdaQuery().isNotNull(AddressBook::getAdcd) +// .list(); + List addressBooks = service.lambdaQuery().likeLeft(AddressBook::getAdcd, "000000000") + .list(); + + if (CollectionUtils.isEmpty(addressBooks)) { + throw new MyException("行政区划责任人为空"); + } + + Map> abMap = addressBooks.stream().collect(Collectors.groupingBy(AddressBook::getAdcd, Collectors.toList())); + + // 行政区划责任人数据 + List data = Lists.newArrayList(); + + String finalAdnm = adnm; + for (int i = 0; i < tree.size(); i++) { + AdcdTree t = tree.get(i); +// String adcd = t.getAdcd(); + String cityAdnm = t.getAdnm(); +// List books = abMap.get(adcd); +// if (CollectionUtils.isEmpty(books)) { +// continue; +// } +// books.forEach(b -> { +// if (StringUtils.isNotBlank(finalAdnm)) { +// if (cityAdnm.equals(finalAdnm)) { +// data.add(new ExcelABVo(cityAdnm, cityAdnm, b.getName(), b.getPosition(), b.getPhone())); +// } +// } else { +// data.add(new ExcelABVo(cityAdnm, cityAdnm, b.getName(), b.getPosition(), b.getPhone())); +// } +// }); + + List children = t.getChildren(); + if (CollectionUtils.isNotEmpty(children)) { + for (int i1 = 1; i1 < children.size(); i1++) { + AdcdTree tc = children.get(i1); + String tcAdcd = tc.getAdcd(); + String tcCityAdnm = tc.getAdnm(); + List tcBooks = abMap.get(tcAdcd); + if (CollectionUtils.isEmpty(tcBooks)) { + continue; + } + tcBooks.forEach(b -> { + if (StringUtils.isNotBlank(finalAdnm)) { + if (cityAdnm.equals(finalAdnm) || tcCityAdnm.equals(finalAdnm)) { + data.add(new ExcelABVo(cityAdnm, tcCityAdnm, b.getName(), b.getPosition(), b.getPhone())); + } + } else { + data.add(new ExcelABVo(cityAdnm, tcCityAdnm, b.getName(), b.getPosition(), b.getPhone())); + } + }); + } + } + + } + + if (CollectionUtils.isEmpty(data)) { + throw new MyException("当前行政区划责任人为空"); + } + + ExcelCommon.exportExcel(data, + null, "防汛抗旱通讯录", ExcelABVo.class, "防汛抗旱通讯录_" + LocalDateTime.now() + ".xlsx", + response); + } + +// @ApiOperation(value = "解析文件数据") +// @PostMapping(value = "getExcelData") + public ResultJson getExcelData(MultipartFile file) { + + List appends = ExcelCommon.importExcel(file, 0, 1, ExcelABVo.class); + + ExcelDataVo excelDataVo = new ExcelDataVo(); + excelDataVo.setList(appends); + if (CollectionUtils.isNotEmpty(appends)){ + String key = UUID.randomUUID().toString().replaceAll("-", ""); + redisTemplate.opsForValue().set(ADDRESS_BOOK_TEMP_REDIS_KEY + key, JSON.toJSONString(appends), 30, TimeUnit.MINUTES); + excelDataVo.setKey(key); + } + + return ResultJson.ok(excelDataVo); + } +// @ApiOperation(value = "行政区划联系人导入") +// @PostMapping(value = "uploadExcel") + public ResultJson uploadExcel(@RequestBody ExcelDataVo data) { + +// List appends = ExcelCommon.importExcel(file, 0, 1, ExcelABVo.class); + String s = redisTemplate.opsForValue().get(ADDRESS_BOOK_TEMP_REDIS_KEY + data.getKey()); + if (StringUtils.isBlank(s)){ + throw new MyException("文件已过期"); + } + List appends = JSON.parseArray(s, ExcelABVo.class); + + if (CollectionUtils.isEmpty(appends)) { + throw new MyException("文件为空"); + } + + Set set = appends.stream().map(vo -> vo.getName() + "_" + vo.getPhone()).collect(Collectors.toSet()); + if (set.size() != appends.size()){ + throw new MyException("联系人重复"); + } + + List tree = adinfoService.tree(TREE_ALL, TREE_ALL); + + List abs = Lists.newArrayList(); + + appends.forEach(vo -> { + String phone = vo.getPhone(); + String name = vo.getName(); + String position = vo.getPosition(); + String city = vo.getCity(); + String county = vo.getCounty(); + AddressBook e = new AddressBook(); + e.setName(name) + .setPhone(phone) + .setAdcd(getAdcd(tree, city, county)) + .setPosition(position); + abs.add(e); + }); + + // 原数据删除 + removeAdcd(); + + + if (!service.saveBatch(abs)) { + throw new MyException("表格数据新增失败"); + } + List users = Lists.newArrayList(); + List abUdRs = Lists.newArrayList(); + + AtomicReference sort = new AtomicReference<>(0); + // 新增关联数据 + abs.forEach(a -> { + String phone = a.getPhone(); + if (StringUtils.isNotBlank(phone)){ + User user = new User(); + String salt = UUID.randomUUID().toString().replaceAll("-", ""); + user + .setUsername(phone) + .setAbId(a.getId()) + .setRole("1") + .setSalt(salt) + .setPassword(DigestUtils.md5DigestAsHex((salt + "Fxkh@123456").getBytes())); + users.add(user); + } + + AbUdR au = new AbUdR(); + Integer i = sort.get() + 1; + au.setType("1") + .setAdId(a.getId()) + .setDictId(a.getAdcd().replaceFirst("000000", "")) + .setSort(i); + abUdRs.add(au); + sort.set(i); + }); + + if (!userService.saveBatch(users)) { + throw new MyException("用户数据新增失败"); + } + + if (!abUdRService.saveBatch(abUdRs)) { + throw new MyException("关联数据新增失败"); + } + return ResultJson.ok("数据新增成功"); + } + + private String getAdcd(List tree, String city, String county) { + for (AdcdTree a : tree) { + if (a.getAdnm().equals(city)) { + List children = a.getChildren(); + if (a.getAdnm().equals(county)) { + county = "市本级"; + } + for (AdcdTree b : children) { + if (b.getAdnm().equals(county)) { + return b.getAdcd(); + } + } + } + } + throw new MyException("当前市行政区划匹配失败"); + } + + + private void removeAdcd() { + List addressBooks = service.lambdaQuery().likeLeft(AddressBook::getAdcd, "000000000") + .list(); + boolean r1 = service.removeBatchByIds(addressBooks); + if (!r1) { + throw new MyException("通讯录数据删除失败"); + } + List abIds = addressBooks.stream().map(AddressBook::getId).collect(Collectors.toList()); + LambdaQueryWrapper aurQueryWrapper = new LambdaQueryWrapper<>(); + aurQueryWrapper.in(AbUdR::getAdId, abIds); + boolean remove1 = abUdRService.remove(aurQueryWrapper); + if (!remove1) { + throw new MyException("关联数据删除失败"); + } + LambdaQueryWrapper userQueryWrapper = new LambdaQueryWrapper<>(); + userQueryWrapper.in(User::getAbId, abIds); + boolean remove2 = userService.remove(userQueryWrapper); + if (!remove2) { + throw new MyException("用户账号删除失败"); + } + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/AdinfoController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/AdinfoController.java new file mode 100644 index 0000000..c248a87 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/AdinfoController.java @@ -0,0 +1,163 @@ +package com.whdc.legacy.controller; + + +import com.whdc.legacy.model.entity.Adinfo; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import com.whdc.legacy.model.vo.AdcdTree; +import com.whdc.legacy.service.IAdinfoService; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import static com.whdc.legacy.service.impl.AdinfoServiceImpl.TREE_ALL; + +/** + * @author xusan + * @date 2024-05-11 + */ +@Slf4j +@Api(tags = "行政区划基础信息 - Controller") +@RestController +@RequestMapping("/adinfo") +public class AdinfoController { + + @Autowired + private IAdinfoService service; + + + + @ApiOperation(value = "查询所有") + @PostMapping(value = "find") + public ResultJson find(@RequestBody Adinfo dto) { + + return ResultJson.ok(service.find(dto)); + + } + + @ApiOperation(value = "分页查询") + @PostMapping(value = "page") + public ResultJson page(@RequestBody Adinfo dto) { + + return ResultJson.ok(service.page(dto)); + + } + + + @GetMapping("/tree/{adcdOradnm}") + @ApiOperation(value = "树型查询") + public ResultJson> tree(@PathVariable("adcdOradnm") + @ApiParam(value = "编码或名称,all: 查询全部") + String adcdOradnm) { + + + List list = service.tree(TREE_ALL, TREE_ALL); + // 查询全部标识 + if ("all".equals(adcdOradnm)) { + return ResultJson.ok(list); + }else{ + return ResultJson.ok(list.stream().filter(item -> item.getAdnm().equals(adcdOradnm)).collect(Collectors.toList())); + } + + } + + @GetMapping("/getCountys/{adnm}") + @ApiOperation(value = "通过市名获取县") + public ResultJson> getCountys(@PathVariable("adnm") + @ApiParam(value = "名称") + String adnm) { + + + Adinfo one = service.lambdaQuery() + .like(Adinfo::getAdnm, adnm) + .one(); + if (Objects.isNull(one)){ + return ResultJson.error("当前行政区划不存在"); + } + String adcd = one.getAdcd(); + + // 确保查的是县 + List list = service.lambdaQuery() + .likeRight(Adinfo::getAdcd, adcd.substring(0,4)) + .ne(Adinfo::getAdcd,adcd.substring(0,4) + "00000000000") + .list(); + if (CollectionUtils.isNotEmpty(list)){ + return ResultJson.ok(list.stream().map(ad -> { + if ("市辖区".equals(ad.getAdnm())){ + Adinfo adinfo = service.lambdaQuery().eq(Adinfo::getAdcd, ad.getAdcd().substring(0, 4) + "00000000000") + .one(); + if (Objects.nonNull(adinfo)){ + ad.setAdnm(adinfo.getAdnm()); + } + } + return ad; + }).sorted(Comparator.comparing(Adinfo::getAdcd)).collect(Collectors.toList())); + } + return ResultJson.ok(list); + + } + + + @ApiOperation(value = "添加") + @PostMapping(value = "save") + public ResultJson insert(@RequestBody @Validated(Insert.class) Adinfo model) { + + if (CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(Adinfo::getAdcd,String.valueOf(model.getAdcd()).trim()) + .or() + .eq(Adinfo::getAdnm,String.valueOf(model.getAdnm()).trim()) + .list()) + ){ + return ResultJson.error("该名称或编码重复"); + } + + return ResultJson.ok(service.save(model)); + + } + + @ApiOperation(value = "修改") + @PostMapping(value = "edit") + public ResultJson update(@RequestBody @Validated(Update.class) Adinfo model) { + + if (CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(Adinfo::getAdcd,String.valueOf(model.getAdcd()).trim()) + .or() + .eq(Adinfo::getAdnm,String.valueOf(model.getAdnm()).trim()) + .list()) + ){ + return ResultJson.error("该名称重复"); + } + + return ResultJson.ok(service.updateById(model)); + } + + + @ApiOperation(value = "删除") + @GetMapping(value = "del/{id}") + public ResultJson delete(@PathVariable("id") Integer id) { + + + if (Objects.isNull(service.getById(id))) { + + return ResultJson.error("当前数据不存在"); + + } + + return ResultJson.ok(service.removeById(id)); + + } + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/FcController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/FcController.java new file mode 100644 index 0000000..3be692f --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/FcController.java @@ -0,0 +1,110 @@ +package com.whdc.legacy.controller; + + +import cn.dev33.satoken.stp.StpUtil; +import com.whdc.legacy.model.dto.FcDto; +import com.whdc.legacy.model.entity.Fc; +import com.whdc.legacy.model.group.Find; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import com.whdc.legacy.model.vo.FcVo; +import com.whdc.legacy.service.IFcService; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author xusan + * @date 2024-05-11 + */ +@Slf4j +@Api(tags = "置顶和常用联系人 - Controller") +@RestController +@RequestMapping("/fc") +public class FcController { + + @Autowired + private IFcService service; + + + +// @ApiOperation(value = "查询所有") +// @PostMapping(value = "find") + public ResultJson find(@RequestBody Fc dto) { + + return ResultJson.ok(service.find(dto)); + + } + +// @ApiOperation(value = "分页查询") +// @PostMapping(value = "page") + public ResultJson page(@RequestBody @Validated(Find.class) FcDto dto) { + + return ResultJson.ok(service.page(dto)); + + } + + + @ApiOperation(value = "添加") + @PostMapping(value = "save") + public ResultJson insert(@RequestBody @Validated(Insert.class) Fc model) { + + if (CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(Fc::getUserId,String.valueOf(StpUtil.getLoginId()).trim()) + .eq(Fc::getAbId,String.valueOf(model.getAbId()).trim()) + .eq(Fc::getType,model.getType().trim()) + .list()) + ){ + return ResultJson.error("该数据已存在"); + } + + model.setUserId(Integer.valueOf(String.valueOf(StpUtil.getLoginId()))); + + return ResultJson.ok(service.save(model)); + + } + + @ApiOperation(value = "修改") + @PostMapping(value = "edit") + public ResultJson update(@RequestBody @Validated(Update.class) Fc model) { + + if (CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(Fc::getUserId,String.valueOf(StpUtil.getLoginId()).trim()) + .eq(Fc::getAbId,String.valueOf(model.getAbId()).trim()) + .eq(Fc::getType,String.valueOf(model.getType()).trim()) + .ne(Fc::getId, model.getId()) + .list()) + ){ + return ResultJson.error("该排序已添加"); + } + model.setUserId(Integer.valueOf(String.valueOf(StpUtil.getLoginId()))); + + return ResultJson.ok(service.updateById(model)); + } + + + @ApiOperation(value = "删除") + @GetMapping(value = "del/{id}") + public ResultJson delete(@PathVariable("id") Integer id) { + + + if (Objects.isNull(service.getById(id))) { + + return ResultJson.error("当前数据不存在"); + + } + + return ResultJson.ok(service.removeById(id)); + + } + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/LoginInfoController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/LoginInfoController.java new file mode 100644 index 0000000..e91e118 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/LoginInfoController.java @@ -0,0 +1,87 @@ +package com.whdc.legacy.controller; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.legacy.model.dto.FindPageDto; +import com.whdc.legacy.model.dto.LoginInfoDto; +import com.whdc.legacy.model.entity.LoginInfo; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import com.whdc.legacy.service.ILoginInfoService; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.Objects; + +/** + * @author xusan + * @date 2024-05-11 + */ +@Slf4j +@Api(tags = "登录日志 - Controller") +@RestController +@RequestMapping("/logininfo") +public class LoginInfoController { + + @Autowired + private ILoginInfoService service; + + + + @ApiOperation(value = "查询所有") + @PostMapping(value = "find") + public ResultJson find(@RequestBody LoginInfo dto) { + + return ResultJson.ok(service.find(dto)); + + } + + @ApiOperation(value = "分页查询") + @PostMapping(value = "page") + public ResultJson page(@RequestBody LoginInfoDto dto) { + + IPage page = service.page(dto); + return ResultJson.ok(page); + + } + + + @ApiOperation(value = "添加") + @PostMapping(value = "save") + public ResultJson insert(@RequestBody @Validated(Insert.class) LoginInfo model) { + model.setCreateTime(new Date()); + return ResultJson.ok(service.save(model)); + + } + +// @ApiOperation(value = "修改") +// @PostMapping(value = "edit") + public ResultJson update(@RequestBody @Validated(Update.class) LoginInfo model) { + + return ResultJson.ok(service.updateById(model)); + } + + +// @ApiOperation(value = "删除") +// @GetMapping(value = "del/{id}") + public ResultJson delete(@PathVariable("id") Integer id) { + + + if (Objects.isNull(service.getById(id))) { + + return ResultJson.error("当前数据不存在"); + + } + + return ResultJson.ok(service.removeById(id)); + + } + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/OrganizationController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/OrganizationController.java new file mode 100644 index 0000000..ab1d3de --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/OrganizationController.java @@ -0,0 +1,167 @@ +package com.whdc.legacy.controller; + + +import cn.dev33.satoken.stp.StpUtil; +import com.whdc.legacy.model.entity.Organization; +import com.whdc.legacy.model.entity.UnitDict; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import com.whdc.legacy.model.vo.AdcdTree; +import com.whdc.legacy.model.vo.FcCommVo; +import com.whdc.legacy.service.IOrganizationService; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @author xusan + * @date 2024-05-11 + */ +@Slf4j +@Api(tags = "组织表 - Controller") +@RestController +@RequestMapping("/organization") +public class OrganizationController { + + @Autowired + private IOrganizationService service; + + + + @ApiOperation(value = "查询所有") + @PostMapping(value = "find") + public ResultJson find(HttpServletRequest request) { + List organizations = service.findByUserId(String.valueOf(StpUtil.getLoginId()),request.getHeader("adcd")); + return ResultJson.ok(findFcCommVo(organizations)); + + } + + private List findFcCommVo(List organizations){ + ArrayList list = new ArrayList<>(); + if (CollectionUtils.isEmpty(organizations)){ + return list; + } + + for (Organization o : organizations) { + FcCommVo fcCommVo = new FcCommVo(); + List adinfoList = o.getAdinfoList(); + fcCommVo.setAdinfo(findAdcdTree(adinfoList)); + List unitDicts = o.getUnitDicts(); + fcCommVo.setUds(findUds(unitDicts)); + fcCommVo.setId(String.valueOf(o.getId())) + .setName(o.getName()) + .setSort(o.getSort()) + .setFsort(o.getFsort()) + .setFcid(o.getFcid()) + .setType("0"); + list.add(fcCommVo); + } + + return list; + } + private List findAdcdTree(List adinfoList){ + + ArrayList list = new ArrayList<>(); + if (CollectionUtils.isEmpty(adinfoList)){ + return list; + } + for (AdcdTree o : adinfoList) { + FcCommVo fcCommVo = new FcCommVo(); + fcCommVo.setId(o.getAdcd()) + .setName(o.getAdnm()) + .setAdlevel(o.getAdlevel()) + .setType("4"); + fcCommVo.setAdinfo(findAdcdTree(o.getChildren())); + list.add(fcCommVo); + } + + return list; + } + + private List findUds(List unitDicts){ + ArrayList list = new ArrayList<>(); + if (CollectionUtils.isEmpty(unitDicts)){ + return list; + } + for (UnitDict o : unitDicts) { + FcCommVo fcCommVo = new FcCommVo(); + fcCommVo.setId(String.valueOf(o.getId())) + .setName(o.getName()) + .setSort(o.getSort()) + .setFsort(o.getFsort()) + .setFcid(o.getFcid()) + .setType("1"); + list.add(fcCommVo); + } + + return list; + } + +// @ApiOperation(value = "分页查询") +// @PostMapping(value = "page") + public ResultJson page(@RequestBody Organization dto) { + + return ResultJson.ok(service.page(dto)); + + } + + + @ApiOperation(value = "添加") + @PostMapping(value = "save") + public ResultJson insert(@RequestBody @Validated(Insert.class) Organization model) { + + if (CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(Organization::getName,String.valueOf(model.getName()).trim()) + .list()) + ){ + return ResultJson.error("该名称重复"); + } + + return ResultJson.ok(service.save(model)); + + } + + @ApiOperation(value = "修改") + @PostMapping(value = "edit") + public ResultJson update(@RequestBody @Validated(Update.class) Organization model) { + + if (CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(Organization::getName,String.valueOf(model.getName()).trim()) + .ne(Organization::getId, model.getId()) + .list()) + ){ + return ResultJson.error("该名称重复"); + } + + return ResultJson.ok(service.updateById(model)); + } + + + @ApiOperation(value = "删除") + @GetMapping(value = "del/{id}") + public ResultJson delete(@PathVariable("id") Integer id) { + + + if (Objects.isNull(service.getById(id))) { + + return ResultJson.error("当前数据不存在"); + + } + + return ResultJson.ok(service.removeById(id)); + + } + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/QXWarnController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/QXWarnController.java new file mode 100644 index 0000000..d5fad92 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/QXWarnController.java @@ -0,0 +1,1126 @@ +package com.whdc.legacy.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Sets; +import com.whdc.common.exception.MyException; +import com.whdc.legacy.model.dto.ApiDto; +import com.whdc.legacy.model.dto.GroupWarningDto; +import com.whdc.legacy.model.dto.WarnDppleDto; +import com.whdc.legacy.model.entity.WarningResponder; +import com.whdc.legacy.model.entity.QXWarning; +import com.whdc.legacy.model.entity.WarnMsgFB; +import com.whdc.common.utils.DateUtils; +import com.whdc.common.utils.ExcelCommon; +import com.whdc.common.utils.HttpUtil; +import com.whdc.common.utils.ResultJson; +import com.whdc.legacy.model.vo.*; +import com.whdc.legacy.service.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpStatus; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +import static com.whdc.legacy.controller.WarningController.THIS_REDIS_KEY; +import static com.whdc.legacy.model.MyConstant.REDIS_KEY; + +//湖北省防汛抗旱调度系统-气象预警 +@Slf4j +@Api(tags = "气象预警 - Controller") +@RestController +@RequestMapping("/qxwarning") +public class QXWarnController { + + public static final String QX_TEMP_REDIS_KEY = REDIS_KEY + "warning:temp:"; + + + @Autowired + private IAddressBookService addressBookService; + @Autowired + private IWarningResponderService warningResponderService; + @Autowired + private IAdinfoService adinfoService; + @Autowired + private IWarnMsgFBService warnMsgFBService; + @Autowired + private IQXWarningService service; + + @Autowired + private RedisTemplate stringRedisTemplate; + + @Value("${getGroupWarning}") + public String getGroupWarning; + + @ApiOperation(value = "新增") + @PostMapping(value = "/add") + public ResultJson insert(@RequestBody @Validated QXWarning dto) { + + //根据warnid是否重复 + if (CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(QXWarning::getWarnid, dto.getWarnid()).list() + ) + ) { + return ResultJson.error("该名称或编码重复"); + } + + boolean save = service.save(dto); + return ResultJson.ok(save); + } + + // @Async + @ApiOperation(value = "预警数据同步接口", notes = "预警数据同步接口") + @PostMapping("/syncData") +// @Scheduled(cron ="0 0/5 * * * ?") + public void syncData(@RequestBody GroupWarningDto dto) { + log.info("预警数据同步开始!!!"); + ApiDto apiDto = new ApiDto(); + if (StringUtils.isNotBlank(dto.getStartTime())) { + apiDto.setStartTime(dto.getStartTime()); + } + if (StringUtils.isNotBlank(dto.getEndTime())) { + apiDto.setEndTime(dto.getEndTime()); + } + apiDto.setFilter(Lists.newArrayList()); + + String str = HttpUtil.sendPost(getGroupWarning, JSON.toJSONString(apiDto)); +// String str = HttpUtil.sendPost("http://127.0.0.1:20000/shzh/met/zyqxfw/api/warning/getGroupWarning", JSON.toJSONString(apiDto)); + JSONObject json = JSON.parseObject(str); + if (json != null && json.getInteger("code") == HttpStatus.SC_OK) { + List data = json.getJSONArray("data").toJavaList(WarningData.class); + List warningList = getList(data, null, null, null); + log.info("预警数据同步获取数据条数 " + warningList.size()); + List warnIds = warningList.stream().map(QXWarningVO::getWarnid).collect(Collectors.toList()); + + List list = service.lambdaQuery().in(QXWarning::getWarnid, warnIds).list(); + log.info("预警数据同步已存预警 " + list.size()); + + Set dbWarnSet = list.stream().map(QXWarning::getWarnid).collect(Collectors.toSet()); + + List adds = Lists.newArrayList(); + for (QXWarningVO warningVO : warningList) { + if (!dbWarnSet.contains(warningVO.getWarnid())) { + QXWarning qxwarning = new QXWarning(); + qxwarning.setCreateTime(DateUtils.dateToStrYMDHds(warningVO.getCreateTime())); + qxwarning.setPublishTime(DateUtils.dateToStrYMDHds(warningVO.getPublishTime())); + qxwarning.setStartTime(DateUtils.dateToStrYMDHds(warningVO.getStartTime())); + qxwarning.setEndTime(DateUtils.dateToStrYMDHds(warningVO.getEndTime())); + qxwarning.setWarnSignalType(warningVO.getWarnSignalType()); + qxwarning.setWarnSignalLevel(warningVO.getWarnSignalLevel()); + qxwarning.setPublishUnit(warningVO.getPublishUnit()); + qxwarning.setContent(warningVO.getContent()); + qxwarning.setWarnid(warningVO.getWarnid()); + qxwarning.setCtnm(warningVO.getCtnm()); + qxwarning.setCnnm(warningVO.getCnnm()); + adds.add(qxwarning); + + } + } + + if (CollectionUtils.isNotEmpty(adds)) { + log.info("预警数据同步待添加预警 " + adds.size()); + if (this.service.saveBatch(adds)) { + log.info("添加成功 " + adds.size()); + } + } + } + + log.info("预警数据同步执行完成!!!"); + + } + + /** + * 气象预警-正在生效的预警信息 + * + * @param + * @return + */ + @ApiOperation(value = "气象预警-正在生效的预警信息") + @PostMapping("/getGroupWarning") + public ResultJson> getGroupWarning() { + + Set tempKeys = stringRedisTemplate.keys(QX_TEMP_REDIS_KEY + "*"); + if (CollectionUtils.isNotEmpty(tempKeys)) { + List data = Lists.newArrayList(); + tempKeys.forEach(o -> { + String value = stringRedisTemplate.opsForValue().get(o); + QXWarningVO qxWarningVO = JSON.parseObject(value, QXWarningVO.class); + data.add(qxWarningVO); + }); + if (CollectionUtils.isNotEmpty(data)) { + + return ResultJson.ok(data.stream().sorted(Comparator.comparing(QXWarningVO::getPublishTime).reversed()).collect(Collectors.toList())); + } + } + + List data = service.find(); + if (CollectionUtils.isEmpty(data)) { + return ResultJson.ok(data); + } + Set keys = stringRedisTemplate.keys(THIS_REDIS_KEY + ":WARNID:*"); + data.forEach(o -> { + Integer warnid = o.getWarnid(); + String key = THIS_REDIS_KEY + ":WARNID:" + warnid; + if (!keys.contains(key)) { + data.get(0).setPlay(true); + stringRedisTemplate.opsForValue().set(key, String.valueOf(warnid)); + } + }); + + + return ResultJson.ok(data); + } +// +// /** +// * 气象预警-正在生效的预警信息 +// * +// * @param dto +// * @return +// */ +// @ApiOperation(value = "气象预警-正在生效的预警信息") +// @PostMapping("/getGroupWarning") +//// @Cacheable(value = THIS_REDIS_KEY, key = "#root.method.name+':'+#dto.toString()") +// public ResultJson> getGroupWarning( +// @RequestBody GroupWarningDto dto) { +// +// ApiDto apiDto = new ApiDto(); +// apiDto.setStartTime(dto.getStartTime());//!!!!!!需要注释掉!!!!!! +// apiDto.setEndTime(dto.getEndTime());//!!!!!!需要注释掉!!!!!! +// apiDto.setPageNumber(dto.getPageNumber()); +// apiDto.setPageSize(dto.getPageSize()); +// ArrayList filter = Lists.newArrayList(); +// String publishUnit = dto.getPublishUnit(); +// String warnSignalLevel = dto.getWarnSignalLevel(); +// String warnSignalType = dto.getWarnSignalType(); +// apiDto.setFilter(filter); +// System.out.println(apiDto); +// String str = HttpUtil.sendPost(getGroupWarning, JSON.toJSONString(apiDto)); +//// String str = HttpUtil.sendPost("http://127.0.0.1:20000/shzh/met/zyqxfw/api/warning/getGroupWarning", JSON.toJSONString(apiDto)); +// JSONObject json = JSON.parseObject(str); +// if (json != null && json.getInteger("code") == HttpStatus.SC_OK) { +// List data = json.getJSONArray("data").toJavaList(WarningData.class); +// List warningList = getList(data, publishUnit, warnSignalLevel, warnSignalType); +// //将warningList存起来 +// for (int i = 0; i < warningList.size(); i++) { +// DateTimeFormatter SECOND_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); +// QXWarningVO warningVO = warningList.get(i); +// QXWarning qxwarning = new QXWarning(); +// qxwarning.setCreateTime(Date.from(LocalDateTime.parse(warningVO.getCreateTime(), SECOND_FORMATTER).atZone(ZoneId.systemDefault()).toInstant())); +// qxwarning.setPublishTime(Date.from(LocalDateTime.parse(warningVO.getPublishTime(), SECOND_FORMATTER).atZone(ZoneId.systemDefault()).toInstant())); +// qxwarning.setStartTime(Date.from(LocalDateTime.parse(warningVO.getStartTime(), SECOND_FORMATTER).atZone(ZoneId.systemDefault()).toInstant())); +// qxwarning.setEndTime(Date.from(LocalDateTime.parse(warningVO.getEndTime(), SECOND_FORMATTER).atZone(ZoneId.systemDefault()).toInstant())); +// qxwarning.setWarnSignalType(warningVO.getWarnSignalType()); +// qxwarning.setWarnSignalLevel(warningVO.getWarnSignalLevel()); +// qxwarning.setPublishUnit(warningVO.getPublishUnit()); +// qxwarning.setContent(warningVO.getContent()); +// qxwarning.setWarnid(warningVO.getWarnid()); +// qxwarning.setCtnm(warningVO.getCtnm()); +// qxwarning.setCnnm(warningVO.getCnnm()); +// insert(qxwarning); +// } +// warningList = warningList.stream().filter(o -> o.getStatus().equals("0")).collect(Collectors.toList()); +// return ResultJson.ok(warningList); +// } +// +// return ResultJson.ok(json); +// } + + /** + * 获取联系人 + */ + @ApiOperation(value = "获取预警信息的防御责任人") + @PostMapping("/getDpple") + @Cacheable(value = THIS_REDIS_KEY, key = "#root.method.name+':'+#dto.toString()") + public ResultJson> getDpple( + @RequestBody WarnDppleDto dto) { + List warnDpples = new ArrayList<>(); + String[] cnnms = dto.getCnnm().split(","); + for (int i = 0; i < cnnms.length; i++) { + String cnnm = cnnms[i]; + String cnnm2 = cnnm.replace("县", "").replace("区", ""); + +// String adcd = adinfoService.getAdcdByAdnm2(cnnm2);//根据区县的名字找到对应的adcd +// System.out.println(adcd); + if (StringUtils.isNotBlank(cnnm2)) { + List dpples = warningResponderService.getListByAdnm2(cnnm2); + System.out.println("dpple个数:" + dpples.size()); + for (WarningResponder dpple : dpples) { + dpple.decryptPhone(); + WarnDppleVO warndpple = new WarnDppleVO(); + warndpple.setCtnm(dto.getCtnm()); + warndpple.setCnnm(cnnm); + warndpple.setName(dpple.getName()); + warndpple.setPosition(dpple.getPosition()); + warndpple.setPhone(dpple.getPhone()); + warndpple.setLevel(dpple.getLevel()); + warnDpples.add(warndpple); + } + } else { + log.info("当前行政区划不存在: " + dto.getCnnm()); + } + } + return ResultJson.ok(warnDpples); + } + + /** + * 确认处理完成 + */ + @ApiOperation(value = "确认处理完成") + @PostMapping("/confirmHandle") + public ResultJson> confirmHandle( + @RequestBody WarnMsgFB dto) { + //根据warnid和phone判断是否重复 + if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty( + warnMsgFBService.lambdaQuery() + .eq(WarnMsgFB::getWarnid, dto.getWarnid()) + .eq(WarnMsgFB::getCalledPhone, String.valueOf(dto.getCalledPhone())).list() + ) + ) { + return ResultJson.error("该名称或编码重复"); + } + +// if (dto.getCallTime() == null) { +// dto.setCallTime(dto.getHandleTime()); +// } + + boolean save = warnMsgFBService.save(dto); + + log.info("warnId " + dto.getWarnid()); + if (Boolean.FALSE.equals(stringRedisTemplate.delete(QX_TEMP_REDIS_KEY + dto.getWarnid()))) { + log.error("缓存删除失败: " + dto.getWarnid()); + } + return ResultJson.ok(save); + } + + /** + * 历史气象预警统计 + * + * @param dto + * @return + */ + @ApiOperation(value = "历史气象预警统计") + @PostMapping("/getHistoryStats") + @Cacheable(value = THIS_REDIS_KEY, key = "#root.method.name+':'+#dto.toString()") + public ResultJson getHistoryStats(@RequestBody GroupWarningDto dto) { + WarnStatsVO warnStatsVO = new WarnStatsVO(); + int dayWarnNum = 0;//日预警个数 + int weekWarnNum = 0;//周预警个数 + int monthWarnNum = 0;//月预警个数 + int yearWarnNum = 0;//年预警个数 + List warnList = new ArrayList<>(); + + //当前时间 + Calendar startCalendarDay = Calendar.getInstance(); + int year = startCalendarDay.get(Calendar.YEAR); + int month = startCalendarDay.get(Calendar.MONTH) + 1; //第一个月从0开始,所以得到月份+1 + int day = startCalendarDay.get(Calendar.DAY_OF_MONTH); + int hour = startCalendarDay.get(Calendar.HOUR_OF_DAY); + int minute = startCalendarDay.get(Calendar.MINUTE); + int second = startCalendarDay.get(Calendar.SECOND); + String nowTime = zerofill(year) + "-" + zerofill(month) + "-" + zerofill(day) + " " + + zerofill(hour) + ":" + zerofill(minute) + ":" + zerofill(second); + System.out.println(nowTime); + //当前时间往前24小时——今日预警统计 + String dayStartTime = zerofill(year) + "-" + zerofill(month) + "-" + zerofill(day) + " " + + "00" + ":" + "00" + ":" + "00"; + System.out.println(dayStartTime); + + ApiDto dayDto = new ApiDto(); + dayDto.setStartTime(dayStartTime); + dayDto.setEndTime(nowTime); + dayDto.setPageNumber(dto.getPageNumber()); + dayDto.setPageSize(99999); + ArrayList filter = Lists.newArrayList(); + String publishUnit = dto.getPublishUnit(); + String warnSignalLevel = dto.getWarnSignalLevel(); + String warnSignalType = dto.getWarnSignalType(); + dayDto.setFilter(filter); + String daystr = HttpUtil.sendPost(getGroupWarning, JSON.toJSONString(dayDto)); +// String str = HttpUtil.sendPost("http://127.0.0.1:20000/shzh/met/zyqxfw/api/warning/getGroupWarning", JSON.toJSONString(apiDto)); + JSONObject dayjson = JSON.parseObject(daystr); + if (dayjson != null && dayjson.getInteger("code") == HttpStatus.SC_OK) { + List data = dayjson.getJSONArray("data").toJavaList(WarningData.class); +// return ResultJson.ok(getCount(data, publishUnit, warnSignalLevel, warnSignalType)); +// List listWarnStats = getCount(data, publishUnit, warnSignalLevel, warnSignalType); +// System.out.println("日统计:"+listWarnStats.size()); +// for(WarningHistoryListVo warnList:listWarnStats){ +// System.out.println("日统计-:"+warnList.getSumCount()+"个"); +// } + dayWarnNum = getCount2(data); + System.out.println("日统计:" + dayWarnNum + "个"); + } + //当前时间往前7天——本周预警统计 + int day_of_week = startCalendarDay.get(Calendar.DAY_OF_WEEK); + int weekminus = day_of_week == 0 ? 7 : day_of_week - 1; + Calendar weekStartDay = Calendar.getInstance(); + weekStartDay.add(Calendar.DAY_OF_YEAR, (weekminus - 1) * (-1)); + String weekStartTime = CalendarDayStartToString(weekStartDay); + System.out.println(weekStartTime); + ApiDto weekDto = new ApiDto(); + weekDto.setStartTime(weekStartTime); + weekDto.setEndTime(nowTime); + weekDto.setPageNumber(dto.getPageNumber()); + weekDto.setPageSize(99999); + weekDto.setFilter(filter); + String weekstr = HttpUtil.sendPost(getGroupWarning, JSON.toJSONString(weekDto)); + JSONObject weekjson = JSON.parseObject(weekstr); + System.out.println("weekstr:" + weekjson); + if (weekjson != null && weekjson.getInteger("code") == HttpStatus.SC_OK) { + List data = weekjson.getJSONArray("data").toJavaList(WarningData.class); +// return ResultJson.ok(getCount(data, publishUnit, warnSignalLevel, warnSignalType)); +// List listWarnStats = getCount(data, publishUnit, warnSignalLevel, warnSignalType); +// System.out.println("周统计:"+listWarnStats.size()); +// for(WarningHistoryListVo warnList:listWarnStats){ +// System.out.println("周统计-:"+warnList.getSumCount()+"个"); +// } + weekWarnNum = getCount2(data); + System.out.println("周统计:" + weekWarnNum + "个"); + } + //当前时间往前30天——本月预警统计 + int day_of_month = startCalendarDay.get(Calendar.DAY_OF_MONTH); + Calendar monthStartDay = Calendar.getInstance(); + int monthdayminus = day_of_month - 1; + monthStartDay.add(Calendar.DAY_OF_YEAR, monthdayminus * (-1)); + String monthStartTime = CalendarDayStartToString(monthStartDay); + System.out.println(monthStartTime); + ApiDto monthDto = new ApiDto(); + monthDto.setStartTime(monthStartTime); + monthDto.setEndTime(nowTime); + monthDto.setPageNumber(dto.getPageNumber()); + monthDto.setPageSize(99999); + monthDto.setFilter(filter); + String monthstr = HttpUtil.sendPost(getGroupWarning, JSON.toJSONString(monthDto)); + JSONObject monthjson = JSON.parseObject(monthstr); + System.out.println("monthstr:" + monthjson); + if (monthjson != null && monthjson.getInteger("code") == HttpStatus.SC_OK) { + List data = monthjson.getJSONArray("data").toJavaList(WarningData.class); +// return ResultJson.ok(getCount(data, publishUnit, warnSignalLevel, warnSignalType)); +// List listWarnStats = getCount(data, publishUnit, warnSignalLevel, warnSignalType); +// System.out.println("月统计:"+listWarnStats.size()); +// for(WarningHistoryListVo warnList:listWarnStats){ +// System.out.println("月统计-:"+warnList.getSumCount()+"个"); +// } + monthWarnNum = getCount2(data); + System.out.println("月统计:" + monthWarnNum + "个"); + } + //当前时间往前360天——全年预警数 + int day_of_year = startCalendarDay.get(Calendar.DAY_OF_YEAR); + Calendar yearStartDay = Calendar.getInstance(); + int yeardayminus = day_of_year - 1; + yearStartDay.add(Calendar.DAY_OF_YEAR, yeardayminus * (-1)); + String yearStartTime = CalendarDayStartToString(yearStartDay); + System.out.println(yearStartTime); + ApiDto yearDto = new ApiDto(); + yearDto.setStartTime(yearStartTime); + yearDto.setEndTime(nowTime); + yearDto.setPageNumber(dto.getPageNumber()); + yearDto.setPageSize(99999); + yearDto.setFilter(filter); + String yearstr = HttpUtil.sendPost(getGroupWarning, JSON.toJSONString(yearDto)); + JSONObject yearjson = JSON.parseObject(yearstr); +// System.out.println("yearstr:" + yearjson); + if (yearjson != null && yearjson.getInteger("code") == HttpStatus.SC_OK) { + List data = yearjson.getJSONArray("data").toJavaList(WarningData.class); +//// return ResultJson.ok(getCount(data, publishUnit, warnSignalLevel, warnSignalType)); +// List listWarnStats = getCount(data, publishUnit, warnSignalLevel, warnSignalType); +// System.out.println("年统计:"+listWarnStats.size()); +// for(WarningHistoryListVo warnList:listWarnStats){ +// System.out.println("年统计-:"+warnList.getSumCount()+"个"); +// } + yearWarnNum = getCount2(data); + System.out.println("年统计:" + yearWarnNum + "个"); + + + } + warnStatsVO.setDayWarnNum(dayWarnNum); + warnStatsVO.setWeekWarnNum(weekWarnNum); + warnStatsVO.setMonthWarnNum(monthWarnNum); + warnStatsVO.setYearWarnNum(yearWarnNum); + + //查找最近10条数据,放到warnList属性上 +// List qxWarningList = getLatestTen(data); + + + return ResultJson.ok(warnStatsVO); + } + + /** + * 历史气象预警统计 + * + * @param dto + * @return + */ + @ApiOperation(value = "历史气象预警查询") + @PostMapping("/getHistoryWarning") + @Cacheable(value = THIS_REDIS_KEY, key = "#root.method.name+':'+#dto.toString()") + public ResultJson getHistoryWarning(@RequestBody GroupWarningDto dto) { +// List warnList = new ArrayList<>(); +// HistoryWarnsVO historyWarnsVO = new HistoryWarnsVO(); +// ApiDto apiDto = new ApiDto(); +// apiDto.setStartTime(dto.getStartTime());//一年的起始时间 +// apiDto.setEndTime(dto.getEndTime());//当前时间 +// apiDto.setPageNumber(dto.getPageNumber());//第几页 +// apiDto.setPageSize(dto.getPageSize());//一页10个 +// ArrayList filter = Lists.newArrayList(); +// +// int pageNumber = dto.getPageNumber(); +// int pageSize = dto.getPageSize(); +// +// String publishUnit = dto.getPublishUnit(); +// String warnSignalLevel = dto.getWarnSignalLevel(); +// String warnSignalType = dto.getWarnSignalType(); +// apiDto.setFilter(filter); +// String str = HttpUtil.sendPost(getGroupWarning, JSON.toJSONString(apiDto)); +//// String str = HttpUtil.sendPost("http://127.0.0.1:20000/shzh/met/zyqxfw/api/warning/getGroupWarning", JSON.toJSONString(apiDto)); +// JSONObject json = JSON.parseObject(str); +// if (json != null && json.getInteger("code") == HttpStatus.SC_OK) { +// List data = json.getJSONArray("data").toJavaList(WarningData.class); +// int count = getCount2(data); +// System.out.println("历史预警数量:" + data.size()); +// System.out.println("历史预警数量2:" + count); +// historyWarnsVO.setCount(count); +// //查找最近10条数据,放到warnList属性上 +// List qxWarningList = null; +// //getLatestTen(data); +// if (Objects.isNull(pageNumber) || Objects.isNull(pageSize)) { +// System.out.println("pageNumber和pageSize有至少一个为null"); +// qxWarningList = getLatestTen(data); +// } else { +// System.out.println("pageNumber和pageSize全不为null"); +// System.out.println("pageNumber:" + pageNumber); +// System.out.println("pageSize:" + pageSize); +// qxWarningList = getPageWarning(data, pageNumber, pageSize); +// } +// historyWarnsVO.setWarnList(qxWarningList); +// return ResultJson.ok(historyWarnsVO); +// } +// +// return ResultJson.ok(""); + + return ResultJson.ok(service.page(dto)); + + } + + /** + * 历史气象预警统计 + * + * @param dto + * @return + */ + @ApiOperation(value = "历史气象预警导出") + @PostMapping("/getHistoryWarning/download") + public void getHistoryWarningDownload(@RequestBody @Validated GroupWarningDto dto, HttpServletResponse response) { + + if (LocalDate.parse(dto.getStartTime().split(" ")[0]).plusDays(90).compareTo(LocalDate.parse(dto.getEndTime().split(" ")[0])) < 0){ + throw new MyException("时间差不能超过90天"); + } + + List list = service.list(dto); + + if (CollectionUtils.isNotEmpty(list)){ + ExcelCommon.exportExcel(list, + null, "历史气象预警", QXWarning.class, "历史气象预警.xlsx", + response); + + }else{ + throw new MyException("没有查询到数据"); + } + + + } + + /** + * 历史7天暴雨预警叫应信息统计 + * + * @param dto + * @return + */ + @ApiOperation(value = "历史n天暴雨预警叫应信息统计") + @PostMapping("/getFBStats") + @Cacheable(value = THIS_REDIS_KEY, key = "#root.method.name+':'+#dto.toString()") + public ResultJson getFeedBackStats(@RequestBody GroupWarningDto dto) { + String startTime = dto.getStartTime(); + String endTime = dto.getEndTime(); + if (Objects.isNull(startTime) && Objects.isNull(endTime)) { + //当前时间 + Calendar startCalendarDay = Calendar.getInstance(); + int year = startCalendarDay.get(Calendar.YEAR); + int month = startCalendarDay.get(Calendar.MONTH) + 1; //第一个月从0开始,所以得到月份+1 + int day = startCalendarDay.get(Calendar.DAY_OF_MONTH); + int hour = startCalendarDay.get(Calendar.HOUR_OF_DAY); + int minute = startCalendarDay.get(Calendar.MINUTE); + int second = startCalendarDay.get(Calendar.SECOND); + String nowTime = zerofill(year) + "-" + zerofill(month) + "-" + zerofill(day) + " " + + "08" + ":" + "00" + ":" + "00"; + System.out.println(nowTime); + ArrayList filter = Lists.newArrayList(); + FBStatsVO fbStatsVO = null; + //当前时间往前7天——本周预警统计 + int day_of_week = startCalendarDay.get(Calendar.DAY_OF_WEEK); + int weekminus = day_of_week == 0 ? 7 : day_of_week - 1; + Calendar weekStartDay = Calendar.getInstance(); + weekStartDay.add(Calendar.DAY_OF_YEAR, (weekminus - 1) * (-1)); + String weekStartTime = CalendarDayStartToString2(weekStartDay); +// Calendar weekStartDay = Calendar.getInstance(); +// weekStartDay.add(Calendar.DAY_OF_YEAR, 37*(-1)); +// String weekStartTime = CalendarDayStartToString(weekStartDay); + System.out.println(weekStartTime); + ApiDto weekDto = new ApiDto(); + weekDto.setStartTime(weekStartTime); + weekDto.setEndTime(nowTime); + weekDto.setPageNumber(dto.getPageNumber()); + weekDto.setPageSize(99999); + weekDto.setFilter(filter); + String weekstr = HttpUtil.sendPost(getGroupWarning, JSON.toJSONString(weekDto)); + JSONObject weekjson = JSON.parseObject(weekstr); + System.out.println("weekstr:" + weekjson); + if (weekjson != null && weekjson.getInteger("code") == HttpStatus.SC_OK) { + List data = weekjson.getJSONArray("data").toJavaList(WarningData.class); +// return ResultJson.ok(getCount(data, publishUnit, warnSignalLevel, warnSignalType)); +// List listWarnStats = getCount(data, publishUnit, warnSignalLevel, warnSignalType); +// System.out.println("周统计:"+listWarnStats.size()); +// for(WarningHistoryListVo warnList:listWarnStats){ +// System.out.println("周统计-:"+warnList.getSumCount()+"个"); +// } + fbStatsVO = getCount3(data); + fbStatsVO.setStartTime(weekDto.getStartTime());//Date.from(LocalDateTime.parse(weekDto.getStartTime(), SECOND_FORMATTER).atZone(ZoneId.systemDefault()).toInstant()) + fbStatsVO.setEndTime(weekDto.getEndTime());//Date.from(LocalDateTime.parse(weekDto.getEndTime(), SECOND_FORMATTER).atZone(ZoneId.systemDefault()).toInstant()) +// System.out.println("周统计:"+weekWarnNum +"个"); + return ResultJson.ok(fbStatsVO); + } + } else { + ApiDto searchDto = new ApiDto(); + ArrayList filter = Lists.newArrayList(); + searchDto.setStartTime(startTime); + searchDto.setEndTime(endTime); + searchDto.setPageNumber(dto.getPageNumber()); + searchDto.setPageSize(99999); + searchDto.setFilter(filter); + String searchstr = HttpUtil.sendPost(getGroupWarning, JSON.toJSONString(searchDto)); + JSONObject searchjson = JSON.parseObject(searchstr); + System.out.println("searchjson:" + searchjson); + FBStatsVO fbStatsVO = null; + if (searchjson != null && searchjson.getInteger("code") == HttpStatus.SC_OK) { + List data = searchjson.getJSONArray("data").toJavaList(WarningData.class); + fbStatsVO = getCount3(data); + fbStatsVO.setStartTime(startTime); + fbStatsVO.setEndTime(endTime); + return ResultJson.ok(fbStatsVO); + } + } + return null; + } + + private FBStatsVO getCount3(List data) { + int sum = 0; + FBStatsVO fbStats = new FBStatsVO(); +// Set cnCallList = new ArrayList<>(); + Set cnOrgCallList = new HashSet<>(); + Set cnRedCallList = new HashSet<>(); + int orgfbSum = 0; + int redfbSum = 0; + List warnList = Lists.newArrayList();//汇总 + for (WarningData datum : data) { + for (WarningData.TypeList typeList : datum.getTypeList()) { + warnList.addAll(typeList.getWarnList()); + } + } + List list = warnList.stream().filter(o -> "暴雨".equals(o.getWarnSignalType())).collect(Collectors.toList()); + //统计暴雨橙色预警 + List orgList = list.stream().filter(o -> "橙色".equals(o.getWarnSignalLevel())).collect(Collectors.toList()); + //统计暴雨红色预警 + List redList = list.stream().filter(o -> "红色".equals(o.getWarnSignalLevel())).collect(Collectors.toList()); + //暴雨橙色预警个数 + fbStats.setOrgWarnSum(orgList.size()); + //暴雨红色预警个数 + fbStats.setRedWarnSum(redList.size()); + //查询叫应信息:根据warnid查询——暴雨橙色预警 + //根据预警id,查找有没有呼叫过 + for (WarningData.Warning warning : orgList) { + List msgfbList = warnMsgFBService.find(new WarnMsgFB().setWarnid(warning.getId()));//查询msgfb + String cn = warning.getEffectArea(); + String[] cnList = cn.split(","); + for (int i = 0; i < cnList.length; i++) { + cnOrgCallList.add(cnList[i]); + } + orgfbSum += msgfbList.size(); + } + fbStats.setCallOrgSum(orgfbSum); + fbStats.setCnOrgCallList(new ArrayList<>(cnOrgCallList)); + //查询叫应信息:根据warnid查询——暴雨红色预警 + //根据预警id,查找有没有呼叫过 + for (WarningData.Warning warning : redList) { + List msgfbList = warnMsgFBService.find(new WarnMsgFB().setWarnid(warning.getId()));//查询msgfb + String cn = warning.getEffectArea(); + String[] cnList = cn.split(","); + for (int i = 0; i < cnList.length; i++) { + cnRedCallList.add(cnList[i]); + } + redfbSum += msgfbList.size(); + } + fbStats.setCallOrgSum(redfbSum); + fbStats.setCnOrgCallList(new ArrayList<>(cnRedCallList)); + return fbStats; + } + + private List getPageWarning(List data, int pageNumber, int pageSize) { + List qxWarningVOS = new ArrayList<>(); +// List warnList = Lists.newArrayList();//汇总 + List warnList = Lists.newArrayList();//汇总 + for (WarningData datum : data) { + String ctnm = datum.getEffectArea();//市级范围 + + for (WarningData.TypeList typeList : datum.getTypeList()) {//里面的 + // 预警类型 + String type = typeList.getType(); + List warnListOrigin = typeList.getWarnList(); +// warnList = warnListFilter(warnList, reqPublishUnit, reqWarnSignalLevel, reqWarnSignalType); + for (WarningData.Warning warning : warnListOrigin) { + String cnnm = warning.getEffectArea(); + QXWarningVO vo = new QXWarningVO(); + String publishUnit = warning.getPublishUnit(); +// vo.setTitle(publishUnit + "发布" + type + "预警"); + vo.setCtnm(ctnm);//市级名称 + vo.setCnnm(cnnm);//县级名称 + vo.setPublishUnit(publishUnit);//发布单位 + vo.setPublishTime(warning.getPublishTime());//预警发布时间 + vo.setWarnSignalType(warning.getWarnSignalType());//预警类型 + vo.setWarnSignalLevel(warning.getWarnSignalLevel());//预警级别 + vo.setContent(warning.getContent());//预警内容 + vo.setWarnid(warning.getId()); +// vo.setAdnm(publishUnit.replace("气象台", "")); + String adnm = publishUnit.replace("气象台", ""); + +// String adcd = adinfoService.getAdcdByAdnm2(adnm); +// if (StringUtils.isNotBlank(adcd)){ +//// vo.setAddressBooks(addressBookService.getListByAdnm(adcd)); +// }else{ +// log.info("当前行政区划不存在: " + adnm); +// } + warnList.add(vo); + } + } + } + List dataList2 = warnList.stream().sorted(Comparator.comparing(QXWarningVO::getPublishTime).reversed()).collect(Collectors.toList()); + dataList2 = dataList2.stream().filter(o -> "暴雨".equals(o.getWarnSignalType()) || "雷雨大风".equals(o.getWarnSignalType())).collect(Collectors.toList()); + dataList2 = dataList2.stream().filter(o -> "红色".equals(o.getWarnSignalLevel()) || "橙色".equals(o.getWarnSignalLevel())).collect(Collectors.toList()); + if (dataList2.size() >= (pageNumber - 1) * pageSize && dataList2.size() >= pageNumber * pageSize) { + for (int i = (pageNumber - 1) * pageSize; i < pageNumber * pageSize; i++) { + QXWarningVO qxWarningVO = dataList2.get(i); + //根据预警id,查找有没有呼叫过 + List msgfbList = warnMsgFBService.find(new WarnMsgFB().setWarnid(qxWarningVO.getWarnid()));//warning + if (msgfbList.size() > 0) { + qxWarningVO.setStatus("1"); + } else { + qxWarningVO.setStatus("0"); + } + qxWarningVOS.add(qxWarningVO); + } + } else if (dataList2.size() >= (pageNumber - 1) * pageSize && dataList2.size() < pageNumber * pageSize) { + for (int i = (pageNumber - 1) * pageSize; i < dataList2.size(); i++) { + QXWarningVO qxWarningVO = dataList2.get(i); + //根据预警id,查找有没有呼叫过 + List msgfbList = warnMsgFBService.find(new WarnMsgFB().setWarnid(qxWarningVO.getWarnid()));//warning + if (msgfbList.size() > 0) { + qxWarningVO.setStatus("1"); + } else { + qxWarningVO.setStatus("0"); + } + qxWarningVOS.add(qxWarningVO); + } + } else { + + } + return qxWarningVOS; + } + + private List getLatestTen(List data) { + List qxWarningVOS = new ArrayList<>(); +// List warnList = Lists.newArrayList();//汇总 + List warnList = Lists.newArrayList();//汇总 + for (WarningData datum : data) { + String ctnm = datum.getEffectArea();//市级范围 + + for (WarningData.TypeList typeList : datum.getTypeList()) {//里面的 + // 预警类型 + String type = typeList.getType(); + List warnListOrigin = typeList.getWarnList(); +// warnList = warnListFilter(warnList, reqPublishUnit, reqWarnSignalLevel, reqWarnSignalType); + for (WarningData.Warning warning : warnListOrigin) { + String cnnm = warning.getEffectArea(); + QXWarningVO vo = new QXWarningVO(); + String publishUnit = warning.getPublishUnit(); +// vo.setTitle(publishUnit + "发布" + type + "预警"); + vo.setCtnm(ctnm);//市级名称 + vo.setCnnm(cnnm);//县级名称 + vo.setPublishUnit(publishUnit);//发布单位 + vo.setPublishTime(warning.getPublishTime());//预警发布时间 + vo.setWarnSignalType(warning.getWarnSignalType());//预警类型 + vo.setWarnSignalLevel(warning.getWarnSignalLevel());//预警级别 + vo.setContent(warning.getContent());//预警内容 + vo.setWarnid(warning.getId()); +// vo.setAdnm(publishUnit.replace("气象台", "")); + String adnm = publishUnit.replace("气象台", ""); + +// String adcd = adinfoService.getAdcdByAdnm2(adnm); +// if (StringUtils.isNotBlank(adcd)){ +//// vo.setAddressBooks(addressBookService.getListByAdnm(adcd)); +// }else{ +// log.info("当前行政区划不存在: " + adnm); +// } + warnList.add(vo); + } + } + } + List dataList2 = warnList.stream().sorted(Comparator.comparing(QXWarningVO::getPublishTime).reversed()).collect(Collectors.toList()); + dataList2 = dataList2.stream().filter(o -> "暴雨".equals(o.getWarnSignalType()) || "雷雨大风".equals(o.getWarnSignalType())).collect(Collectors.toList()); + dataList2 = dataList2.stream().filter(o -> "红色".equals(o.getWarnSignalLevel()) || "橙色".equals(o.getWarnSignalLevel())).collect(Collectors.toList()); + if (dataList2.size() >= 10) { + for (int i = 0; i < 10; i++) { +// System.out.println("时间:"+dataList2.get(i).getPublishTime()); +// QXWarningVO qxWarningVO = new QXWarningVO(); +// qxWarningVO.setPublishTime(dataList2.get(i).getPublishTime()); +// qxWarningVOS.add(qxWarningVO); + QXWarningVO qxWarningVO = dataList2.get(i); + //根据预警id,查找有没有呼叫过 + List msgfbList = warnMsgFBService.find(new WarnMsgFB().setWarnid(qxWarningVO.getWarnid()));//warning + if (msgfbList.size() > 0) { + qxWarningVO.setStatus("1"); + } else { + qxWarningVO.setStatus("0"); + } +// qxWarningVO.setStatus(); + qxWarningVOS.add(qxWarningVO); + } + } else { + qxWarningVOS = dataList2; + } + return qxWarningVOS; +// respList.stream().sorted(Comparator.comparing(WarningListVo::getPublishTime).reversed()).collect(Collectors.toList()) + } + + /** + * 正在生效预警 + * + * @param data + * @return + */ + private List getList(List data, + String reqPublishUnit, + String reqWarnSignalLevel, + String reqWarnSignalType) { + + List respList = Lists.newArrayList(); + for (WarningData datum : data) {//最外层的列表 + String ctnm = datum.getEffectArea();//市级范围 + for (WarningData.TypeList typeList : datum.getTypeList()) {//里面的 + // 预警类型 + String type = typeList.getType(); + List warnList = typeList.getWarnList(); + + warnList = warnListFilter(warnList, reqPublishUnit, reqWarnSignalLevel, reqWarnSignalType); + for (WarningData.Warning warning : warnList) { + String cnnm = warning.getEffectArea(); + QXWarningVO vo = new QXWarningVO(); + String publishUnit = warning.getPublishUnit(); +// vo.setTitle(publishUnit + "发布" + type + "预警"); + vo.setCtnm(ctnm);//市级名称 + vo.setCnnm(cnnm);//县级名称 + vo.setPublishUnit(publishUnit);//发布单位 + vo.setPublishTime(warning.getPublishTime());//预警发布时间 + vo.setWarnSignalType(warning.getWarnSignalType());//预警类型 + vo.setWarnSignalLevel(warning.getWarnSignalLevel());//预警级别 + vo.setContent(warning.getContent());//预警内容 + vo.setWarnid(warning.getId()); + vo.setCreateTime(warning.getCreateTime()); + vo.setStartTime(warning.getStartTime()); + vo.setEndTime(warning.getEndTime()); +// vo.setAdnm(publishUnit.replace("气象台", "")); + String adnm = publishUnit.replace("气象台", ""); + //根据预警id,查找有没有呼叫过 + List msgfbList = warnMsgFBService.find(new WarnMsgFB().setWarnid(warning.getId()));//warning + if (msgfbList.size() > 0) { + vo.setStatus("1"); + } else { + vo.setStatus("0"); + } +// String adcd = adinfoService.getAdcdByAdnm2(adnm); +// if (StringUtils.isNotBlank(adcd)){ +//// vo.setAddressBooks(addressBookService.getListByAdnm(adcd)); +// }else{ +// log.info("当前行政区划不存在: " + adnm); +// } + respList.add(vo); + } + } + } + + respList = respList.stream().filter(o -> "暴雨".equals(o.getWarnSignalType()) || "雷雨大风".equals(o.getWarnSignalType())).collect(Collectors.toList()); + respList = respList.stream().filter(o -> "红色".equals(o.getWarnSignalLevel()) || "橙色".equals(o.getWarnSignalLevel())).collect(Collectors.toList()); + return respList.stream().sorted(Comparator.comparing(QXWarningVO::getPublishTime).reversed()) + .collect(Collectors.toList()); + } + + /** + * 正在生效预警 + * + * @return + */ + private List warnListFilter(List warnList, + String publishUnit, + String warnSignalLevel, + String warnSignalType + ) { + if (StringUtils.isNotBlank(publishUnit)) { + HashSet set = Sets.newHashSet(publishUnit.split(",")); + if (CollectionUtils.isNotEmpty(set)) { + warnList = warnList.stream() + .filter(w -> + set.contains(w.getPublishUnit().split("气象")[0]) + ).collect(Collectors.toList()); + } + } + + + if (StringUtils.isNotBlank(warnSignalLevel)) { + HashSet set = Sets.newHashSet(warnSignalLevel.split(",")); + if (CollectionUtils.isNotEmpty(set)) { + warnList = warnList.stream() + .filter(w -> + set.contains(w.getWarnSignalLevel()) + ).collect(Collectors.toList()); + } + } + + + if (StringUtils.isNotBlank(warnSignalType)) { + HashSet set = Sets.newHashSet(warnSignalType.split(",")); + if (CollectionUtils.isNotEmpty(set)) { + warnList = warnList.stream() + .filter(w -> + set.contains(w.getWarnSignalType()) + ).collect(Collectors.toList()); + } + } + + return warnList; + } + + static String zerofill(int number) { + return String.valueOf(number).length() > 1 ? String.valueOf(number) : "0" + String.valueOf(number); + } + + static String CalendarDayStartToString(Calendar calendarTime) { + int year = calendarTime.get(Calendar.YEAR); + int month = calendarTime.get(Calendar.MONTH) + 1; //第一个月从0开始,所以得到月份+1 + int day = calendarTime.get(Calendar.DAY_OF_MONTH); + int hour = calendarTime.get(Calendar.HOUR_OF_DAY); + int minute = calendarTime.get(Calendar.MINUTE); + int second = calendarTime.get(Calendar.SECOND); + return zerofill(year) + "-" + zerofill(month) + "-" + zerofill(day) + " " + + "00" + ":" + "00" + ":" + "00"; + } + + //统计函数 + private int getCount2(List data) { + int sum = 0; + DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + List warnList = Lists.newArrayList();//汇总 + for (WarningData datum : data) { + for (WarningData.TypeList typeList : datum.getTypeList()) { + warnList.addAll(typeList.getWarnList()); + } + } + warnList = warnList.stream().filter(o -> { + LocalDate date = LocalDate.parse(o.getPublishTime(), format); + return date.isAfter(LocalDate.parse("2024-04-28 08:00:00", format)); + }).collect(Collectors.toList()); + warnList = warnList.stream().filter(o -> "暴雨".equals(o.getWarnSignalType()) || "雷雨大风".equals(o.getWarnSignalType())).collect(Collectors.toList()); + warnList = warnList.stream().filter(o -> "红色".equals(o.getWarnSignalLevel()) || "橙色".equals(o.getWarnSignalLevel())).collect(Collectors.toList()); + return warnList.size(); + } + + static String CalendarDayStartToString2(Calendar calendarTime) { + int year = calendarTime.get(Calendar.YEAR); + int month = calendarTime.get(Calendar.MONTH) + 1; //第一个月从0开始,所以得到月份+1 + int day = calendarTime.get(Calendar.DAY_OF_MONTH); + int hour = calendarTime.get(Calendar.HOUR_OF_DAY); + int minute = calendarTime.get(Calendar.MINUTE); + int second = calendarTime.get(Calendar.SECOND); + return zerofill(year) + "-" + zerofill(month) + "-" + zerofill(day) + " " + + "00" + ":" + "08" + ":" + "00"; + } + + /** + * https://shdata.cloudowr.cn/sysuser/dologin + * https://shdata.cloudowr.cn/shwarn/msg/totalquery?stm=2024-06-01&etm=2024-06-12 + * + * @return + */ + @ApiOperation(value = "预警统计") + @GetMapping(value = "/statistics/{stm}/{etm}") + public ResultJson totalquery(@PathVariable("stm") @ApiParam(name = "stm", value = "开始时间, yyyy-MM-dd") String stmStr, + @PathVariable("etm") @ApiParam(name = "etm", value = "结束时间, yyyy-MM-dd") String etmStr) { + + DateTimeFormatter pattern = DateTimeFormatter.ofPattern(DateUtils.DATE_TIME_PATTERN); + LocalDateTime stm = LocalDateTime.parse(stmStr, DateTimeFormatter.ofPattern(DateUtils.DATE_TIME_PATTERN)); + LocalDateTime etm = LocalDateTime.parse(etmStr, DateTimeFormatter.ofPattern(DateUtils.DATE_TIME_PATTERN)); + + QXWarnStatisticsVo vo = new QXWarnStatisticsVo(); + + String s = HttpUtil.sendPost("https://shdata.cloudowr.cn/sysuser/dologin", "{\"phone\":\"18888888888\",\"password\":\"18888888888\"}"); + + String userobj = null; + JSONObject jsonObject = JSON.parseObject(s); + if (jsonObject != null && jsonObject.getInteger("ok") == 1) { + userobj = jsonObject.getString("results"); + } + + String str = HttpUtil.getBySetCookie("https://shdata.cloudowr.cn/shwarn/msg/totalquery?stm=" + stm.toLocalDate().toString() + "&etm=" + etm.toLocalDate().toString(), + "userobj=" + userobj); + JSONObject json = JSON.parseObject(str); + if (json != null && json.getInteger("ok") == 1) { + TotalQueryVo data = json.getJSONObject("results").toJavaObject(TotalQueryVo.class); + StringBuilder warnStr = new StringBuilder(); + warnStr.append(stm.getYear()).append("年").append(stm.getMonthValue()).append("月").append(stm.getDayOfMonth()).append("日至") + .append(etm.getYear()).append("年").append(etm.getMonthValue()).append("月").append(etm.getDayOfMonth()).append("日,湖北省"); + + List yjtj = data.getYjtj(); + TotalQueryVo.Summary summary = data.getSummary(); + + + long sum = yjtj.stream().mapToLong(TotalQueryVo.Yjtj::getCount).sum(); + long wbSum = yjtj.stream().mapToLong(TotalQueryVo.Yjtj::getWbcount).sum(); + + List page = data.getPage(); + long yjrs = page.stream().mapToLong(TotalQueryVo.Page::getYjrs).sum(); + long rs = page.stream().mapToLong(TotalQueryVo.Page::getRs).sum(); + + long dxzs = page.stream().mapToLong(TotalQueryVo.Page::getYj).sum() + + page.stream().mapToLong(TotalQueryVo.Page::getZdy).sum() + + page.stream().mapToLong(TotalQueryVo.Page::getQt).sum() + + page.stream().mapToLong(TotalQueryVo.Page::getGb).sum(); + + List outlist = data.getSsdxtj().getOutlist(); + + long szdxls = outlist.stream().filter(o -> !"420000000000".equals(o.getAdcd())).mapToLong(TotalQueryVo.Outlist::getSum).sum(); + long szdxlsAll = outlist.stream().mapToLong(TotalQueryVo.Outlist::getSum).sum(); + + + TotalQueryVo.Syw syw = data.getSyw(); + TotalQueryVo.Sgxpt sgxpt = data.getSgxpt(); + + warnStr.append(yjtj.size()).append("个县共产生山洪预警").append(sum).append("次,") + .append("对外发布预警").append(wbSum).append("次,") + .append("共发送山洪预警短信").append(summary.getYj()).append("条,") + .append("涉及防汛责任人").append(yjrs).append("人次,") + .append("另发送防洪警示短信").append(dxzs - summary.getYj()).append("条,") + .append("涉及防汛责任人").append(rs - yjrs).append("人次;") + .append("市级平台共发送防洪警示短信").append(szdxls).append("条,") + .append("涉及防汛责任人").append(szdxls).append("人次;") + .append("省级平台共发送防洪警示、运维提示短信").append(syw.getSum() + sgxpt.getCNT() + szdxlsAll).append("条,") + .append("涉及防汛责任人").append(syw.getRs() + sgxpt.getRS() + szdxlsAll).append("人次。") + ; + vo.setShWarnStr(warnStr.toString()); + } + + List list = service.getWarnAndMsg(stm.format(pattern), etm.format(pattern)); + if (CollectionUtils.isNotEmpty(list)) { + StringBuilder warnStr = new StringBuilder(); + + warnStr.append(stm.getYear()).append("年").append(stm.getMonthValue()).append("月").append(stm.getDayOfMonth()).append("日至") + .append(etm.getYear()).append("年").append(etm.getMonthValue()).append("月").append(etm.getDayOfMonth()).append("日,"); + +// List qxWarnings = service.lambdaQuery().between(QXWarning::getPublishTime, stm, etm).list(); + + Map> map = list.stream() + .collect(Collectors.groupingBy(QXWarning::getWarnSignalLevel)); + List orange = map.get("橙色"); + List red = map.get("红色"); + + if (CollectionUtils.isNotEmpty(orange) && CollectionUtils.isNotEmpty(red)) { + warnStr.append("我省共产生橙色气象预警").append(orange.size()).append("次,电话叫应"); + Map> orangeList = orange.stream().collect(Collectors.groupingBy(QXWarning::getCtnm, Collectors.toList())); + + List oraCnnms = Lists.newArrayList(); + orangeList.forEach((k, v) -> { + warnStr.append(getCnnmStr(v, oraCnnms)); + }); + + warnStr.setCharAt(warnStr.length() - 1, '等'); + warnStr.append(oraCnnms.size()).append("个县市区,").append(orange.stream().filter(o -> Objects.nonNull(o.getCallTime())).count()).append("次。"); + + warnStr.append("红色气象预警").append(red.size()).append("次,电话叫应"); + Map> redList = red.stream().collect(Collectors.groupingBy(QXWarning::getCtnm, Collectors.toList())); + + List redCnnms = Lists.newArrayList(); + redList.forEach((k, v) -> { + warnStr.append(getCnnmStr(v, redCnnms)); + }); + warnStr.setCharAt(warnStr.length() - 1, '等'); + warnStr.append(redCnnms.size()).append("个县市区,").append(red.stream().filter(o -> Objects.nonNull(o.getCallTime())).count()).append("次。"); + + + } else if (CollectionUtils.isNotEmpty(orange) && CollectionUtils.isEmpty(red)) { + warnStr.append("我省共产生橙色气象预警").append(orange.size()).append("次,电话叫应"); + Map> orangeList = orange.stream().collect(Collectors.groupingBy(QXWarning::getCtnm, Collectors.toList())); + + List oraCnnms = Lists.newArrayList(); + + orangeList.forEach((k, v) -> { + warnStr.append(getCnnmStr(v, oraCnnms)); + }); + + warnStr.setCharAt(warnStr.length() - 1, '等'); + warnStr.append(oraCnnms.size()).append("个县市区,").append(orange.stream().filter(o -> Objects.nonNull(o.getCallTime())).count()).append("次。"); + + } else if (CollectionUtils.isNotEmpty(red) && CollectionUtils.isEmpty(orange)) { + warnStr.append("我省共产生红色气象预警").append(red.size()).append("次,电话叫应"); + Map> redList = red.stream().collect(Collectors.groupingBy(QXWarning::getCtnm, Collectors.toList())); + + List redCnnms = Lists.newArrayList(); + redList.forEach((k, v) -> { + warnStr.append(getCnnmStr(v, redCnnms)); + }); + warnStr.setCharAt(warnStr.length() - 1, '等'); + warnStr.append(redCnnms.size()).append("个县市区,").append(red.stream().filter(o -> Objects.nonNull(o.getCallTime())).count()).append("次。"); + } + + vo.setByWarnStr(warnStr.toString()); + } + + return ResultJson.ok(vo); + + } + + private StringBuilder getCnnmStr(List list, List cnnms) { + List lists = list.stream().map(QXWarning::getCnnm).distinct().collect(Collectors.toList()); + + HashSet cnnmSet = Sets.newHashSet(); + for (String str : lists) { + String[] split = str.split(","); + cnnmSet.addAll(Arrays.asList(split)); + } + StringBuilder builder = new StringBuilder(); + cnnmSet.forEach(s -> builder.append(s).append("、")); + cnnms.addAll(cnnmSet); + return builder; + } +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/ShAddressBookController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/ShAddressBookController.java new file mode 100644 index 0000000..b00470c --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/ShAddressBookController.java @@ -0,0 +1,326 @@ +package com.whdc.legacy.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.common.exception.MyException; +import com.whdc.legacy.model.dto.ShAddressBookDto; +import com.whdc.legacy.model.entity.ShAddressBook; +import com.whdc.legacy.model.group.Update; +import com.whdc.legacy.model.vo.AdcdTree; +import com.whdc.legacy.model.vo.ShAddressBookVo; +import com.whdc.legacy.service.ShAddressBookService; +import com.whdc.common.utils.ExcelCommon; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.Pattern; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +import static com.whdc.legacy.model.MyConstant.DEL; +import static com.whdc.legacy.model.MyConstant.REC; + +/** + * 描述: 山洪责任人通讯录 + * author: xusan + * date: 2024-07-29 17:27:25 + */ +@Api(tags = "山洪责任人通讯录") +@RestController +@RequestMapping(value = "/shAddressBook") +public class ShAddressBookController { + + @Autowired + private ShAddressBookService service; + + + @ApiOperation(value = "修改") + @PostMapping("/update") + public ResultJson update(@Validated(Update.class) @RequestBody ShAddressBook dto) { + ShAddressBook dbData = service.getById(dto.getId()); + if (Objects.isNull(dbData)){ + throw new MyException("当前数据不存在"); + } + + boolean result; + // 判断是新增还是修改 名字相同是修改 + if (StringUtils.isNotBlank(dto.getName()) && StringUtils.isNotBlank(dbData.getName()) && !dto.getName().equals(dbData.getName())){ + dbData + .setName(dto.getName()) + .setPhone(dto.getPhone()) + .setPosition(dto.getPosition()); + result = service.updateById(dbData); + }else{ + // 删除原数据 + boolean update = service.lambdaUpdate().set(ShAddressBook::getDel, DEL) + .eq(ShAddressBook::getId, dto.getId()) + .update(); + if (!update){ + throw new MyException("修改原数据失败"); + } + // 新增 + dbData.setId(null) + .setName(dto.getName()) + .setPhone(dto.getPhone()) + .setPosition(dto.getPosition()); + result = service.save(dbData); + } + + + return ResultJson.ok(result ? dto : null); + } + + @ApiOperation(value = "抽查") + @PostMapping("/setSpotCheck/{spotCheck}") + public ResultJson setSpotCheck(@RequestBody List ids, + @PathVariable + @ApiParam("是否抽查:0:不抽查,1:抽查") + @Pattern(message = "仅支持 0 或者 1", regexp = "[01]") + Integer spotCheck + ) { + if (CollectionUtils.isEmpty(ids)){ + throw new MyException("当前选中数据为空"); + } + if (service.lambdaQuery().in(ShAddressBook::getId, ids).count() != ids.size()){ + throw new MyException("当前选中数据有误"); + } + + boolean update = service.lambdaUpdate() + .set(ShAddressBook::getIsSpotCheck, spotCheck) + .in(ShAddressBook::getId, ids) + .update(); + + return ResultJson.ok(update); + } + + + + @ApiOperation(value = "分页 (行政责任人分页查询 type1:行政责任人,包保责任人分页查询 type1:包保责任人,今日抽查分页查询 isSpotCheck:1 )") + @PostMapping("/page") + public ResultJson> page(@RequestBody ShAddressBookDto dto) { +// +// LambdaQueryChainWrapper query = service.lambdaQuery(); +// +// String type1 = dto.getType1(); +// if (StringUtils.isNotBlank(type1)) { +// query.eq(ShAddressBook::getType1, type1); +// } +// +// String type2 = dto.getType2(); +// +// if (StringUtils.isNotBlank(type2)) { +// query.eq(ShAddressBook::getType2, type2); +// } +// +// String isSpotCheck = dto.getIsSpotCheck(); +// +// if (StringUtils.isNotBlank(isSpotCheck)) { +// query.eq(ShAddressBook::getIsSpotCheck, isSpotCheck); +// } +// +// String city = dto.getCity(); +// +// if (StringUtils.isNotBlank(city)) { +// query.eq(ShAddressBook::getCity, city); +// } +// +// String county = dto.getCounty(); +// +// if (StringUtils.isNotBlank(county)) { +// query.eq(ShAddressBook::getCounty, county); +// } +// +// String area = dto.getArea(); +// +// if (StringUtils.isNotBlank(area)) { +// query.eq(ShAddressBook::getArea, area); +// } +// +// String village = dto.getVillage(); +// +// if (StringUtils.isNotBlank(village)) { +// query.eq(ShAddressBook::getVillage, village); +// } +// +// String name = dto.getName(); +// +// if (StringUtils.isNotBlank(name)) { +// query.like(ShAddressBook::getName, name); +// } +// +// String land = dto.getLand(); +// +// if (StringUtils.isNotBlank(land)) { +// query.like(ShAddressBook::getLand, land); +// } +// +// String phone = dto.getPhone(); +// +// if (StringUtils.isNotBlank(phone)) { +// query.like(ShAddressBook::getPhone, phone); +// } +// +// query.orderByAsc(ShAddressBook::getSort); +// +// return ResultJson.ok(service.page(dto.getPage(), query)); + return ResultJson.ok(service.page(dto)); + } + + + @ApiOperation(value = "导出 (行政责任人分页查询 type1:行政责任人,包保责任人分页查询 type1:包保责任人,今日抽查分页查询 isSpotCheck:1 )") + @PostMapping("/export") + public void export(@RequestBody ShAddressBookDto dto,HttpServletResponse response) { + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + + String type1 = dto.getType1(); + if (StringUtils.isNotBlank(type1)) { + query.eq(ShAddressBook::getType1, type1); + } + + String type2 = dto.getType2(); + + if (StringUtils.isNotBlank(type2)) { + query.eq(ShAddressBook::getType2, type2); + } + + String isSpotCheck = dto.getIsSpotCheck(); + + if (StringUtils.isNotBlank(isSpotCheck)) { + query.eq(ShAddressBook::getIsSpotCheck, isSpotCheck); + } + + String city = dto.getCity(); + + if (StringUtils.isNotBlank(city)) { + query.eq(ShAddressBook::getCity, city); + } + + String county = dto.getCounty(); + + if (StringUtils.isNotBlank(county)) { + query.eq(ShAddressBook::getCounty, county); + } + + String area = dto.getArea(); + + if (StringUtils.isNotBlank(area)) { + query.eq(ShAddressBook::getArea, area); + } + + String village = dto.getVillage(); + + if (StringUtils.isNotBlank(village)) { + query.eq(ShAddressBook::getVillage, village); + } + + String name = dto.getName(); + + if (StringUtils.isNotBlank(name)) { + query.like(ShAddressBook::getName, name); + } + + String land = dto.getLand(); + + if (StringUtils.isNotBlank(land)) { + query.like(ShAddressBook::getLand, land); + } + + String phone = dto.getPhone(); + + if (StringUtils.isNotBlank(phone)) { + query.like(ShAddressBook::getPhone, phone); + } + + String callStatus = dto.getCallStatus(); + + if (StringUtils.isNotBlank(phone)) { + if ("1".equals(callStatus)){ + query.eq(ShAddressBook::getCallStatus, callStatus); + }else{ + query.ne(ShAddressBook::getCallStatus, 1); + } + } + + query + .eq(ShAddressBook::getDel, REC) + .orderByAsc(ShAddressBook::getSort); + + List list = service.list(query); + AtomicInteger integer = new AtomicInteger(1); + list = list.stream().map(o->o.setSort(integer.getAndIncrement())) + .collect(Collectors.toList()); + ExcelCommon.exportExcel(list, + null, "山洪责任人通讯录", ShAddressBook.class, "山洪责任人通讯录.xlsx", + response); + } + + + + @ApiOperation(value = "下载模板") + @GetMapping("/downloadTemplate") + public void downloadTemplate(HttpServletResponse response) { + ExcelCommon.exportExcel(Lists.newArrayList(), + null, "山洪责任人通讯录", ShAddressBook.class, "山洪责任人通讯录模板.xlsx", + response); + } + + @ApiOperation(value = "上传") + @PostMapping("/upload/{type1}") + public ResultJson upload( + @PathVariable("type1") + @ApiParam(name = "type1", value = "责任人类型, 0:行政责任人,1:包保责任人") + @Pattern(message = "仅支持 0 或者 1", regexp = "[01]") + String type1, + MultipartFile file) { + List appends = ExcelCommon.importExcel(file, 0, 1, ShAddressBook.class); + + service.updateAll(type1, appends); + + return ResultJson.ok(); + } + + + + @GetMapping("/tree") + @ApiOperation(value = "树型查询") + public ResultJson> tree() { + + List list = service.tree(); + + return ResultJson.ok(list); + + } + + + @ApiOperation(value = "抽查责任人批量匹配") + @PostMapping("/importBatchMatch") + public ResultJson importBatchMatch(MultipartFile file) { + List shAddressBooks = ExcelCommon.importExcel(file, 0, 1, ShAddressBookVo.class); + if (CollectionUtils.isEmpty(shAddressBooks)) { + throw new MyException("文件解析数据为空"); + } + Map map = service.importBatchMatch(shAddressBooks); + return ResultJson.ok(map); + } + + @ApiOperation(value = "下载批量匹配模板") + @GetMapping("/downloadMatchTemplate") + public void downloadMatchTemplate(HttpServletResponse response) { + ExcelCommon.exportExcel(Lists.newArrayList(), null, "责任人", ShAddressBookVo.class, "责任人批量匹配模板.xlsx", response); + } + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/ShCallWordController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/ShCallWordController.java new file mode 100644 index 0000000..bbb936c --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/ShCallWordController.java @@ -0,0 +1,97 @@ +package com.whdc.legacy.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.common.exception.MyException; +import com.whdc.legacy.model.dto.ShCallWordDto; +import com.whdc.legacy.model.entity.ShCallWord; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import com.whdc.legacy.service.ShCallWordService; +import com.whdc.legacy.service.ShPeriodService; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 描述: 备注 + * author: xusan + * date: 2024-07-29 17:27:25 + */ +@Api(tags = "备注") +@RestController +@RequestMapping(value="/shCallWord") +public class ShCallWordController { + + @Autowired + private ShCallWordService service; + + @Autowired + private ShPeriodService shPeriodService; + + + @ApiOperation(value = "新增") + @PostMapping("/insert") + public ResultJson insert(@Validated(Insert.class) @RequestBody ShCallWord dto) { + if (Objects.nonNull(dto.getShPeriodId()) && Objects.isNull(shPeriodService.getById(dto.getShPeriodId()))){ + throw new MyException("当前防汛周期不存在"); + } + dto.setId(null); + dto.setCreateTime(new Date()); + boolean result = service.save(dto); + return ResultJson.ok(result ? dto : null); + } + + @ApiOperation(value = "修改") + @PostMapping("/update") + public ResultJson update(@Validated(Update.class) @RequestBody ShCallWord dto) { + if (Objects.isNull(service.getById(dto.getId()))){ + throw new MyException("当前数据不存在"); + } + if (Objects.nonNull(dto.getShPeriodId()) && Objects.isNull(shPeriodService.getById(dto.getShPeriodId()))){ + throw new MyException("当前防汛周期不存在"); + } + dto.setCreateTime(null); + boolean result = service.updateById(dto); + return ResultJson.ok(result ? dto : null); + } + + @ApiOperation(value = "删除") + @GetMapping("/del/{id}") + public ResultJson del(@Schema(name = "id") @PathVariable("id") Serializable id) { + return ResultJson.ok(service.removeById(id)); + } + + @ApiOperation(value = "列表") + @PostMapping("/list") + public ResultJson> list(@RequestBody ShCallWordDto dto) { + return ResultJson.ok(service.list(dto)); + } + + @ApiOperation(value = "分页") + @PostMapping("/page") + public ResultJson> page(@RequestBody ShCallWordDto dto) { +// LambdaQueryChainWrapper query = service.lambdaQuery(); +// if (Objects.nonNull(dto.getStm()) && Objects.nonNull(dto.getEtm())){ +// query.between(ShCallWord::getCreateTime,dto.getStm(),dto.getEtm()); +// } +// +// if (StringUtils.isNotBlank(dto.getShAbType1())){ +// query.eq(ShCallWord::getShAbType1,dto.getShAbType1()); +// } +// +// query.orderByDesc(ShCallWord::getCreateTime); +// +// return ResultJson.ok(service.page(dto.getPage(),query)); + return ResultJson.ok(service.page(dto)); + } + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/ShCallsController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/ShCallsController.java new file mode 100644 index 0000000..1dedcf3 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/ShCallsController.java @@ -0,0 +1,223 @@ +package com.whdc.legacy.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.whdc.common.exception.MyException; +import com.whdc.legacy.model.dto.ShCallsDto; +import com.whdc.legacy.model.entity.ShAddressBook; +import com.whdc.legacy.model.entity.ShCallWord; +import com.whdc.legacy.model.entity.ShCalls; +import com.whdc.legacy.model.enums.CallType; +import com.whdc.legacy.model.enums.CallingType; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.vo.ShCallsExcelVo; +import com.whdc.legacy.model.vo.ShCallsVo; +import com.whdc.legacy.service.ShAddressBookService; +import com.whdc.legacy.service.ShCallsService; +import com.whdc.common.utils.DateUtils; +import com.whdc.common.utils.ExcelCommon; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + * 描述: 抽查日志 + * author: xusan + * date: 2024-07-29 17:27:25 + */ +@Api(tags = "抽查日志") +@RestController +@RequestMapping(value="/shCalls") +public class ShCallsController { + + @Autowired + private ShCallsService service; + + @Autowired + private ShAddressBookService shAddressBookService; + + + @ApiOperation(value = "新增") + @PostMapping("/insert") + public ResultJson insert(@Validated(Insert.class) @RequestBody ShCalls dto) { + if (shAddressBookService.lambdaQuery().eq(ShAddressBook::getId, dto.getShAbId()).count() != 1){ + throw new MyException("当前通讯录不存在"); + } + + if (StringUtils.isNotBlank(dto.getCallType()) && "0".equals(dto.getCallType())){ + boolean update = shAddressBookService.lambdaUpdate() + .set(ShAddressBook::getCallStatus, 1) + .eq(ShAddressBook::getId, dto.getShAbId()) + .update(); + if (!update){ + throw new MyException("更新通讯录状态失败"); + } + dto.setStatus("1"); + }else{ + dto.setStatus("0"); + } + dto.setId(null); + boolean result = service.save(dto); + return ResultJson.ok(result ? dto : null); + } + + @ApiOperation(value = "列表") + @PostMapping("/list") + public ResultJson> list(@RequestBody ShCallsDto dto) { + LambdaQueryChainWrapper query = service.lambdaQuery(); + if (Objects.nonNull(dto.getDate())){ + + query.between(ShCalls::getCallTime, dto.getDate() + " 00:00:00",dto.getDate() + " 23:59:59"); + }else{ + if (StringUtils.isNotBlank(dto.getCallTime())){ + String dateStr = dto.getCallTime().split(" ")[0]; + query.between(ShCalls::getCallTime, dateStr + " 00:00:00",dateStr + " 23:59:59"); + } + } + if (Objects.nonNull(dto.getShAbId())){ + query.eq(ShCalls::getShAbId, dto.getShAbId()); + }else{ + throw new MyException("山洪通讯录编号不能为空"); + } + query.orderByDesc(ShCalls::getCallTime); + return ResultJson.ok(query.list()); + } + + @ApiOperation(value = "抽查日志分页") + @PostMapping("/page") + public ResultJson> page(@RequestBody ShCallsDto dto) { + return ResultJson.ok(service.page(dto)); + } + + @ApiOperation(value = "综述") + @PostMapping("/statistics") + public ResultJson statistics(@RequestBody @Validated ShCallsDto dto) { + + List list = service.listVo(dto); + + String dateStr = LocalDate.parse(dto.getDate(),DateTimeFormatter.ofPattern(DateUtils.DATE_PATTERN1)) + .format(DateTimeFormatter.ofPattern(DateUtils.DATE_PATTERN)); + List citys = list.stream().map(ShCallsVo::getCity).distinct().filter(StringUtils::isNotBlank).collect(Collectors.toList()); + List countys = list.stream().map(ShCallsVo::getCounty).distinct().filter(StringUtils::isNotBlank).collect(Collectors.toList()); + +// return ResultJson.ok(String.format("%%抽查了%%个市(%%)%%个县(%%)县乡村山洪灾害防御责任人和包保责任人共计%%人。", + return ResultJson.ok(String.format("%s抽查了%d个市(%s)%d个县(%s)县乡村山洪灾害防御责任人和包保责任人共计%d人。", + dateStr, + citys.size(), + StringUtils.join(citys, ","), + countys.size(), + StringUtils.join(countys, ","), + list.stream().map(ShCallsVo::getPhone).distinct().filter(StringUtils::isNotBlank).count() + )); + } + + + + @ApiOperation(value = "抽查日志导出") + @PostMapping("/export") + public void export(@RequestBody ShCallsDto dto, HttpServletResponse response) { + + List list = service.list(dto); + + List excels = Lists.newArrayList(); + AtomicInteger i = new AtomicInteger(1); + list.forEach(item -> { + List calls = item.getList(); + if (CollectionUtils.isNotEmpty(calls)){ + Map> dateCalls = calls.stream() +// .filter(o-> Objects.nonNull(o.getCallTime())) + .collect(Collectors.groupingBy(o -> DateUtils.dateToStr(o.getCallTime(), DateUtils.sdfymd), Collectors.toList())); + dateCalls.forEach((k,v) ->{ + + ShCallsExcelVo excel = new ShCallsExcelVo(); + excel.setDateStr(k); + excel.setType2(item.getType2()); + excel.setName(item.getName()); + excel.setPhone(item.getPhone()); + excel.setPosition(item.getPosition()); + excel.setCity(item.getCity()); + excel.setCounty(item.getCounty()); + excel.setLand(item.getLand()); + excel.setCallStatus(item.getCallStatus()); + long count = v.stream().map(ShCalls::getKnow).filter("是"::equals) + .count(); + if (count > 0){ + excel.setKnow("是"); + }else{ + excel.setKnow("否"); + } + + long count1 = v.stream().filter(o -> Objects.nonNull(o.getStatus()) && "1".equals(o.getStatus())).count(); + if (count1 > 0){ + excel.setCallStatus("是"); + }else { + excel.setCallStatus("否"); + } + + excel.setTimeStr(StringUtils.join(v.stream().map(o ->{ + String type = o.getType(); + if (StringUtils.isNotBlank(type)){ + CallType callType = CallType.getByName(type); + if (Objects.nonNull(callType)){ + type = callType.getValue(); + } + }else{ + type = "未填写"; + } + String callType = o.getCallType(); + if (StringUtils.isNotBlank(callType)){ + CallingType callingType = CallingType.getByName(callType); + if (Objects.nonNull(callingType)){ + callType = callingType.getValue(); + } + }else{ + callType = "未填写"; + } + return DateUtils.dateToStr(o.getCallTime(),ThreadLocal.withInitial(() -> new SimpleDateFormat(DateUtils.DATE_PATTERN_HM))) + " " + type + " " + callType; + }).distinct().collect(Collectors.toList()), ",")); + + excel.setRemark(StringUtils.join(v.stream().map(ShCalls::getRemark).distinct().collect(Collectors.toList()), "/n")); + + excels.add(excel); + }); + } + }); + + + List data = excels.stream().sorted(Comparator.comparing(ShCallsExcelVo::getDateStr).reversed()).collect(Collectors.toList()); + data.forEach(o->o.setId(i.getAndIncrement())); + ExcelCommon.exportExcel(data, + null, "抽查日志", ShCallsExcelVo.class, "抽查日志.xlsx", + response); + } + + @ApiOperation(value = "日志日期统计") + @PostMapping("/logDateStatistics") + public ResultJson> logDateStatistics(@RequestBody @Validated ShCallsDto dto) { + if (StringUtils.isBlank(dto.getStiStartTime()) || StringUtils.isBlank(dto.getStiEndTime())) { + throw new MyException("开始时间和结束时间参数必填!"); + } + Map retMap = service.logDateStatistics(dto); + return ResultJson.ok(retMap); + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/ShPeriodController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/ShPeriodController.java new file mode 100644 index 0000000..52c6bb2 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/ShPeriodController.java @@ -0,0 +1,92 @@ +package com.whdc.legacy.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.common.exception.MyException; +import com.whdc.legacy.model.dto.ShPeriodDto; +import com.whdc.legacy.model.entity.ShPeriod; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import com.whdc.legacy.service.ShPeriodService; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.Serializable; +import java.util.List; + +/** + * 描述: 防汛周期 + * author: xusan + * date: 2024-07-29 17:27:25 + */ +@Api(tags = "防汛周期") +@RestController +@RequestMapping(value="/shPeriod") +public class ShPeriodController { + + @Autowired + private ShPeriodService service; + + + @ApiOperation(value = "新增") + @PostMapping("/insert") + public ResultJson insert(@Validated(Insert.class) @RequestBody ShPeriod dto) { + if (service.lambdaQuery().eq(ShPeriod::getName, dto.getName()).count() > 0){ + throw new MyException("名称重复"); + } + dto.setId(null); + boolean result = service.save(dto); + return ResultJson.ok(result ? dto : null); + } + + @ApiOperation(value = "修改") + @PostMapping("/update") + public ResultJson update(@Validated(Update.class) @RequestBody ShPeriod dto) { + if (service.lambdaQuery() + .eq(ShPeriod::getName, dto.getName()) + .ne(ShPeriod::getId, dto.getId()) + .count() > 0){ + throw new MyException("名称重复"); + } + dto.setCreateTime(null); + boolean result = service.updateById(dto); + return ResultJson.ok(result ? dto : null); + } + + @ApiOperation(value = "删除") + @GetMapping("/del/{id}") + public ResultJson del(@Schema(name = "id") @PathVariable("id") Serializable id) { + return ResultJson.ok(service.removeById(id)); + } + +// @ApiOperation(value = "列表") +// @PostMapping("/list") + public ResultJson> list() { + return ResultJson.ok(service.lambdaQuery().list()); + } + + @ApiOperation(value = "分页") + @PostMapping("/page") + public ResultJson> page(@RequestBody ShPeriodDto dto) { +// LambdaQueryChainWrapper query = service.lambdaQuery(); +// if (Objects.nonNull(dto.getStm()) && Objects.nonNull(dto.getEtm())){ +// query.between(ShPeriod::getCreateTime,dto.getStm(),dto.getEtm()); +// } +// +// if (StringUtils.isNotBlank(dto.getName())){ +// query.eq(ShPeriod::getName,dto.getName()); +// } +// +// query.orderByDesc(ShPeriod::getCreateTime); +// +// return ResultJson.ok(service.page(dto.getPage(),query)); + return ResultJson.ok(service.page(dto)); + } + + + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/TestController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/TestController.java new file mode 100644 index 0000000..02f4529 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/TestController.java @@ -0,0 +1,27 @@ +package com.whdc.legacy.controller; + +import com.whdc.common.utils.ResultJson; +import com.whdc.sms.service.ISmsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Collections; + +/** + * @author lyf + * @since 2025-10-29 + */ +@RestController +@RequestMapping("/test") +public class TestController { + @Autowired + private ISmsService smsService; + + @GetMapping("/sms") + public ResultJson testSms() { + String result = smsService.send(Collections.singletonList("15671545233"), "测试短信"); + return ResultJson.ok(result); + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/UnitDictController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/UnitDictController.java new file mode 100644 index 0000000..f45ccf4 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/UnitDictController.java @@ -0,0 +1,130 @@ +package com.whdc.legacy.controller; + + +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.whdc.legacy.model.entity.Organization; +import com.whdc.legacy.model.entity.UnitDict; +import com.whdc.legacy.model.group.Find; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import com.whdc.legacy.service.IOrganizationService; +import com.whdc.legacy.service.IUnitDictService; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author xusan + * @date 2024-05-11 + */ +@Slf4j +@Api(tags = "单位字典表 - Controller") +@RestController +@RequestMapping("/unitdict") +public class UnitDictController { + + @Autowired + private IUnitDictService service; + @Autowired + private IOrganizationService organizationService; + + + @ApiOperation(value = "查询所有") + @PostMapping(value = "find") + public ResultJson find(@RequestBody @Validated(Find.class) UnitDict dto) { + + if (Objects.isNull(organizationService.getById( dto.getOId()))) { + return ResultJson.error("组织类型Id不存在"); + } + + + LambdaQueryChainWrapper query = service.lambdaQuery(); + String name = dto.getName(); + if (StringUtils.isNotBlank(name)) { + query.like(UnitDict::getName, name); + } + query.eq(UnitDict::getOId, dto.getOId()); + + query.orderByAsc(UnitDict::getSort); + return ResultJson.ok(query.list()); + + + } + +// @ApiOperation(value = "分页查询") +// @PostMapping(value = "page") + public ResultJson page(@RequestBody UnitDict dto) { + + return ResultJson.ok(service.page(dto)); + + } + + + @ApiOperation(value = "添加") + @PostMapping(value = "save") + public ResultJson insert(@RequestBody @Validated(Insert.class) UnitDict model) { + + if (Objects.isNull(organizationService.getById( model.getOId()))) { + return ResultJson.error("组织类型Id不存在"); + } + + if (CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(UnitDict::getName, String.valueOf(model.getName()).trim()) + .eq(UnitDict::getOId, String.valueOf(model.getOId()).trim()) + .list()) + ) { + return ResultJson.error("该名称重复"); + } + + return ResultJson.ok(service.save(model)); + + } + + @ApiOperation(value = "修改") + @PostMapping(value = "edit") + public ResultJson update(@RequestBody @Validated(Update.class) UnitDict model) { + + + if (Objects.isNull(organizationService.getById( model.getOId()))) { + return ResultJson.error("组织类型Id不存在"); + } + + if (CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(UnitDict::getName, String.valueOf(model.getName()).trim()) + .eq(UnitDict::getOId, String.valueOf(model.getOId()).trim()) + .ne(UnitDict::getId, model.getId()) + .list()) + ) { + return ResultJson.error("该名称重复"); + } + + return ResultJson.ok(service.updateById(model)); + } + + + @ApiOperation(value = "删除") + @GetMapping(value = "del/{id}") + public ResultJson delete(@PathVariable("id") Integer id) { + + + if (Objects.isNull(service.getById(id))) { + + return ResultJson.error("当前数据不存在"); + + } + + return ResultJson.ok(service.removeById(id)); + + } + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/UserController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/UserController.java new file mode 100644 index 0000000..b3c6598 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/UserController.java @@ -0,0 +1,240 @@ +package com.whdc.legacy.controller; + + +import cn.dev33.satoken.stp.StpUtil; +import com.whdc.legacy.model.dto.LoginDto; +import com.whdc.legacy.model.dto.UserDto; +import com.whdc.legacy.model.dto.VxLoginDto; +import com.whdc.legacy.model.entity.User; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import com.whdc.legacy.model.vo.AuthToken; +import com.whdc.legacy.model.vo.LoginVo; +import com.whdc.legacy.service.IUserService; +import com.whdc.legacy.service.impl.UserServiceImpl; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.lang.reflect.InvocationTargetException; +import java.util.Objects; + +import static com.whdc.legacy.service.impl.UserServiceImpl.getPassword; + +/** + * @author xusan + * @date 2024-05-11 + */ +@Slf4j +@Api(tags = "用户表 - Controller") +@RestController +@RequestMapping("/user") +public class UserController { + + @Autowired + private IUserService service; + + + @ApiOperation(value = "登录", notes = "登录后,从 tokenInfo 中获取 token 相关信息。headers[tokenName] = tokenValue ") + @PostMapping("doLogin") + public ResultJson doLogin(@RequestBody @Validated LoginDto obj) throws InvocationTargetException, IllegalAccessException { + LoginVo loginVo = service.login(obj); + + if (loginVo == null || loginVo.getId() == null) { + return ResultJson.error("登录失败"); + } else { + StpUtil.login(loginVo.getId()); // 使用 user id 登录 + // 获取 Token 相关参数 + loginVo.setTokenInfo(new AuthToken(StpUtil.getTokenInfo())); + + // 更新最后登录时间 + service.updateLastDate(loginVo.getId()); + + return ResultJson.ok(loginVo); + } + } + + + @ApiOperation(value = "wx登录", notes = "登录后,从 tokenInfo 中获取 token 相关信息。headers[tokenName] = tokenValue ") + @PostMapping("wxLogin") + public ResultJson wxLogin(@RequestBody @Validated VxLoginDto obj) throws InvocationTargetException, IllegalAccessException { + LoginVo loginVo = service.wxLogin(obj); + + if (loginVo == null || loginVo.getId() == null) { + return ResultJson.error("登录失败"); + } else { + StpUtil.login(loginVo.getId()); // 使用 user id 登录 + // 获取 Token 相关参数 + loginVo.setTokenInfo(new AuthToken(StpUtil.getTokenInfo())); + + // 更新最后登录时间 + service.updateLastDate(loginVo.getId()); + + return ResultJson.ok(loginVo); + } + } + + + @ApiOperation(value = "wxOpenid登录", notes = "登录后,从 tokenInfo 中获取 token 相关信息。headers[tokenName] = tokenValue ") + @GetMapping("wxLogin/{openid}") + public ResultJson getWxLogin(@PathVariable("openid") String openid) throws InvocationTargetException, IllegalAccessException { + LoginVo loginVo = service.wxLogin(openid); + + if (loginVo == null || loginVo.getId() == null) { + return ResultJson.error("登录失败"); + } else { + StpUtil.login(loginVo.getId()); // 使用 user id 登录 + // 获取 Token 相关参数 + loginVo.setTokenInfo(new AuthToken(StpUtil.getTokenInfo())); + + // 更新最后登录时间 + service.updateLastDate(loginVo.getId()); + + return ResultJson.ok(loginVo); + } + } + + @ApiOperation(value = "查询登录状态") + @PostMapping("isLogin") + public ResultJson isLogin() { + return ResultJson.ok(StpUtil.getTokenInfo()); + } + + @ApiOperation(value = "按id踢人下线") + @PostMapping("kickout/{id}") + public ResultJson kickout(@PathVariable String id) { + StpUtil.kickout(id); + return ResultJson.ok("将用户[" + id + "]踢下线"); + } + + @ApiOperation(value = "登出") + @PostMapping("logout") + public ResultJson logout() { + StpUtil.logout(); + return ResultJson.ok(); + } +// @ApiOperation(value = "查询所有") +// @PostMapping(value = "find") + public ResultJson find(@RequestBody User dto) { + + return ResultJson.ok(service.find(dto)); + + } + +// @ApiOperation(value = "分页查询") +// @PostMapping(value = "page") + public ResultJson page(@RequestBody User dto) { + + return ResultJson.ok(service.page(dto)); + + } + + +// @ApiOperation(value = "注册") +// @PostMapping(value = "register") + public ResultJson insert(@RequestBody @Validated(Insert.class) User model) { + + if (CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(User::getUsername,String.valueOf(model.getUsername()).trim()) + .list()) + ){ + return ResultJson.error("该名称重复"); + } + + + + return ResultJson.ok(service.register(model)); + + } + +// @ApiOperation(value = "修改") +// @PostMapping(value = "edit") + public ResultJson update(@RequestBody @Validated(Update.class) User model) { + + if (CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(User::getUsername,String.valueOf(model.getUsername()).trim()) + .ne(User::getId, model.getId()) + .list()) + ){ + return ResultJson.error("用户名重复"); + } + + return ResultJson.ok(service.updateById(model)); + } + + + @ApiOperation(value = "删除") + @GetMapping(value = "del/{id}") + public ResultJson delete(@PathVariable("id") Integer id) { + + + if (Objects.isNull(service.getById(id))) { + + return ResultJson.error("当前数据不存在"); + + } + + return ResultJson.ok(service.removeById(id)); + + } + + @ApiOperation(value = "修改密码") + @PostMapping(value = "updatePw") + public ResultJson updatePwd(@RequestBody UserDto dto) { + + return service.updatePwd(dto); + + } + + @ApiOperation(value = "忘记密码") + @GetMapping(value = "forgotPassword/{username}") + public ResultJson updatePwd(@PathVariable("username") String username) { + User one = service.lambdaQuery().eq(User::getUsername, username) + .one(); + + if (Objects.isNull(service.getById(one))) { + + return ResultJson.error("当前数据不存在"); + + } + + one.setPassword(getPassword(one.getSalt(), UserServiceImpl.DEFAULT_PASSWORD)); + + return ResultJson.ok(one.updateById() + " " + UserServiceImpl.DEFAULT_PASSWORD); + + } + + + @ApiOperation(value = "发送验证码") + @GetMapping(value = "pushCode/{phone}") + public ResultJson pushCode(@PathVariable("phone") String phone) { + + return ResultJson.ok(service.pushCode(phone)); + + } + + @ApiOperation(value = "手机验证码登录") + @GetMapping(value = "loginByCode/{phone}/{code}") + public ResultJson loginByCode(@PathVariable("phone") String phone,@PathVariable("code") String code) throws InvocationTargetException, IllegalAccessException { + + LoginVo loginVo = service.loginByCode(phone, code.toUpperCase()); + StpUtil.login(loginVo.getId()); // 使用 user id 登录 + // 获取 Token 相关参数 + loginVo.setTokenInfo(new AuthToken(StpUtil.getTokenInfo())); + + // 更新最后登录时间 + service.updateLastDate(loginVo.getId()); + + return ResultJson.ok(loginVo); + + } + + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/VersionsController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/VersionsController.java new file mode 100644 index 0000000..3df2b0b --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/VersionsController.java @@ -0,0 +1,77 @@ +package com.whdc.legacy.controller; + + +import com.whdc.legacy.model.dto.CommDto; +import com.whdc.legacy.model.entity.Versions; +import com.whdc.legacy.service.IVersionsService; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.Objects; + +/** + * @author xusan + * @date 2024-05-11 + */ +@Slf4j +@Api(tags = "通讯录日志 - Controller") +@RestController +@RequestMapping("/versions") +public class VersionsController { + + @Autowired + private IVersionsService service; + + + // @ApiOperation(value = "查询所有") +// @PostMapping(value = "find") + public ResultJson find(@RequestBody Versions dto) { + + return ResultJson.ok(service.find(dto)); + + } + + @ApiOperation(value = "分页查询") + @PostMapping(value = "page") + public ResultJson page(@RequestBody CommDto dto, HttpServletRequest request) { + if (StringUtils.isBlank(dto.getAdcd())){ + dto.setAdcd(request.getHeader("adcd")); + } + return ResultJson.ok(service.page(dto)); + + } + + @ApiOperation(value = "通过版本号查询") + @GetMapping(value = "getByV/{abId}/{version}") + public ResultJson getByV(@PathVariable("abId") Integer abId, @PathVariable("version") Integer version) { + if (version < 0) { + return ResultJson.error("版本号不能小于0"); + } + return ResultJson.ok(service.lambdaQuery() + .eq(Versions::getAbId, abId) + .eq(Versions::getVersion, version).one()); + + } + + + @ApiOperation(value = "删除") + @GetMapping(value = "del/{id}") + public ResultJson delete(@PathVariable("id") Integer id) { + + + if (Objects.isNull(service.getById(id))) { + + return ResultJson.error("当前数据不存在"); + + } + + return ResultJson.ok(service.removeById(id)); + + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/WarnMsgFBController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/WarnMsgFBController.java new file mode 100644 index 0000000..c2fbac5 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/WarnMsgFBController.java @@ -0,0 +1,135 @@ +package com.whdc.legacy.controller; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.whdc.legacy.model.entity.WarningResponder; +import com.whdc.legacy.model.entity.QXWarning; +import com.whdc.legacy.model.entity.WarnMsgFB; +import com.whdc.legacy.model.vo.ExcelOldDataVo; +import com.whdc.legacy.service.IWarningResponderService; +import com.whdc.legacy.service.IQXWarningService; +import com.whdc.legacy.service.IWarnMsgFBService; +import com.whdc.common.utils.ExcelCommon; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +@Api(tags = "预警叫应 - Controller") +@RestController +@RequestMapping("/warnmsgfb") +public class WarnMsgFBController { + @Autowired + private IWarnMsgFBService service; + @Autowired + private IQXWarningService qxService; + + @Autowired + private IWarningResponderService oldService; + //增 + @ApiOperation(value = "新增") + @PostMapping(value = "/add") + public ResultJson insert(@RequestBody @Validated WarnMsgFB dto) { + + //根据warnid和phone判断是否重复 + if (CollectionUtils.isNotEmpty( + service.lambdaQuery() + .eq(WarnMsgFB::getWarnid,dto.getWarnid()) + .eq(WarnMsgFB::getCalledPhone,String.valueOf(dto.getCalledPhone())).list() + ) + ){ + return ResultJson.error("该名称或编码重复"); + } + + boolean save = service.save(dto); + return ResultJson.ok(save); + } + //删 + //改 + //查 + @ApiOperation(value = "查询所有") + @PostMapping(value = "/find") + public ResultJson find(@RequestBody WarnMsgFB dto) { + + return ResultJson.ok(service.find(dto)); + + } + + + @ApiOperation(value = "解析文件数据") + @PostMapping(value = "getExcelData") + public ResultJson getExcelData(MultipartFile file) { + + List warnMsgs = ExcelCommon.importExcel(file,0, 1, WarnMsgFB.class); + List qxWarns = ExcelCommon.importExcel(file,1, 0, 1, QXWarning.class); + Map> qxByID = qxWarns.stream().collect(Collectors.groupingBy(QXWarning::getEffectId, Collectors.toList())); + + List olds = oldService.list(); + Map> txlByName = olds.stream().collect(Collectors.groupingBy(WarningResponder::getName, Collectors.toList())); + + warnMsgs.forEach(o -> { + List qxWarnings = qxByID.get(o.getEffectId()); + if (CollectionUtils.isNotEmpty(qxWarnings)){ + QXWarning qxWarning = qxWarnings.get(0); + o.setHandleTime(qxWarning.getHandleTime()) + .setPublishTime(qxWarning.getPublishTime()) + .setWarnid(qxWarning.getWarnid()); + String name = o.getCalledPerson(); + List txl = txlByName.get(name); + if (CollectionUtils.isNotEmpty(txl)){ + o.setCalledPhone(txl.get(0).getPhone()); + }else{ + o.setCalledPhone(null); + } + } + }); + + + + List warns = warnMsgs.stream().map(WarnMsgFB::getWarnid).collect(Collectors.toList()); + + List list = service.lambdaQuery().in(WarnMsgFB::getWarnid, warns).list(); + + Map> map = list.stream().collect(Collectors.groupingBy(WarnMsgFB::getWarnid, Collectors.toList())); + + List warnDb = Lists.newArrayList(); + for (WarnMsgFB warn : warnMsgs) { + Integer warnid = warn.getWarnid(); + if (!map.containsKey(warnid)){ + warnDb.add(warn); + } + } + if (CollectionUtils.isNotEmpty(warnDb)){ + service.saveBatch(warnDb); + } + + + List qxwarns = qxWarns.stream().map(QXWarning::getWarnid).collect(Collectors.toList()); + List qxlist = qxService.lambdaQuery().in(QXWarning::getWarnid, qxwarns).list(); + Map> qxmap = qxlist.stream().collect(Collectors.groupingBy(QXWarning::getWarnid, Collectors.toList())); + + List qxDb = Lists.newArrayList(); + for (QXWarning qxWarn : qxWarns) { + Integer warnid = qxWarn.getWarnid(); + if (!qxmap.containsKey(warnid)){ + qxDb.add(qxWarn); + } + } + if (CollectionUtils.isNotEmpty(qxDb)){ + qxService.saveBatch(qxDb); + } + return ResultJson.ok(); + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/WarningController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/WarningController.java new file mode 100644 index 0000000..c5747ac --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/WarningController.java @@ -0,0 +1,486 @@ +package com.whdc.legacy.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Sets; +import com.whdc.common.exception.MyException; +import com.whdc.legacy.model.dto.ApiDto; +import com.whdc.legacy.model.dto.GroupWarningDto; +import com.whdc.legacy.model.vo.AdcdTree; +import com.whdc.legacy.model.vo.WarningData; +import com.whdc.legacy.model.vo.WarningHistoryListVo; +import com.whdc.legacy.model.vo.WarningListVo; +import com.whdc.legacy.service.IAddressBookService; +import com.whdc.legacy.service.IAdinfoService; +import com.whdc.common.utils.HttpUtil; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpStatus; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.*; +import java.util.stream.Collectors; + +import static com.whdc.legacy.model.MyConstant.REDIS_KEY; +import static com.whdc.legacy.service.impl.AdinfoServiceImpl.TREE_ALL; + +/** + * Description: + * Created by XuSan on 2024/5/23. + * + * @author XuSan + * @version 1.0 + */ +@Slf4j +@Api(tags = "预警 - Controller") +@RestController +@RequestMapping("/warning") +public class WarningController { + + public static final String THIS_REDIS_KEY = REDIS_KEY + "warning"; + + + @Value("${getGroupWarning}") + public String getGroupWarning; + + @Autowired + private IAddressBookService addressBookService; + + @Autowired + private IAdinfoService adinfoService; + + /** + * 气象预警 + * + * @param dto + * @return + */ + @ApiOperation(value = "气象预警") + @PostMapping("/getGroupWarning") + public ResultJson> getGroupWarning( + @RequestBody GroupWarningDto dto) { + + ApiDto apiDto = new ApiDto(); + apiDto.setStartTime(dto.getStartTime()); + apiDto.setEndTime(dto.getEndTime()); + apiDto.setPageNumber(dto.getPageNumber()); + apiDto.setPageSize(dto.getPageSize()); + ArrayList filter = Lists.newArrayList(); + + String publishUnit = dto.getPublishUnit(); +// if (StringUtils.isNotBlank(publishUnit)) { +// String[] split = publishUnit.split(","); +// if (split.length > 1) { +// String str = "("; +// for (String s : split) { +// str += s + ","; +// } +// str = str.substring(0, str.length() - 1) + ")"; +// filter.add(new ApiDto.Filter("publishUnit", "in " + str, "")); +// +// } else { +// filter.add(new ApiDto.Filter("publishUnit", "like", String.format("%s%s%s", "%", publishUnit, "%"))); +// } +// } + String warnSignalLevel = dto.getWarnSignalLevel(); +// if (StringUtils.isNotBlank(warnSignalLevel)) { +// String[] split = warnSignalLevel.split(","); +// if (split.length > 1) { +// String str = "("; +// for (String s : split) { +// str += s + ","; +// } +// str = str.substring(0, str.length() - 1) + ")"; +// filter.add(new ApiDto.Filter("warnSignalLevel", "in " + str, "")); +// +// } else { +// filter.add(new ApiDto.Filter("warnSignalLevel", "like", String.format("%s%s%s", "%", warnSignalLevel, "%"))); +// } +// } + String warnSignalType = dto.getWarnSignalType(); +// if (StringUtils.isNotBlank(warnSignalType)) { +// String[] split = warnSignalType.split(","); +// if (split.length > 1) { +// String str = "("; +// for (String s : split) { +// str += s + ","; +// } +// str = str.substring(0, str.length() - 1) + ")"; +// filter.add(new ApiDto.Filter("warnSignalType", "in " + str, "")); +// +// } else { +// filter.add(new ApiDto.Filter("warnSignalType", "like", String.format("%s%s%s", "%", warnSignalType, "%"))); +// } +// } + + apiDto.setFilter(filter); +// String str = HttpUtil.sendPost(getGroupWarning, JSON.toJSONString(apiDto)); + String str = HttpUtil.sendPost("http://127.0.0.1:20000/shzh/met/zyqxfw/api/warning/getGroupWarning", JSON.toJSONString(apiDto)); + JSONObject json = JSON.parseObject(str); + if (json != null && json.getInteger("code") == HttpStatus.SC_OK) { + List data = json.getJSONArray("data").toJavaList(WarningData.class); + + return ResultJson.ok(getList(data, publishUnit, warnSignalLevel, warnSignalType)); + } + + return ResultJson.ok(json); + } + + /** + * 历史气象预警统计 + * + * @param dto + * @return + */ + @ApiOperation(value = "历史气象预警统计") + @PostMapping("/getHistoryGroupWarning") +// @Cacheable(value = THIS_REDIS_KEY, key = "#root.method.name+':'+#dto.toString()") + public ResultJson> getHistoryGroupWarning(@RequestBody GroupWarningDto dto) { + + ApiDto apiDto = new ApiDto(); + apiDto.setStartTime(dto.getStartTime()); + apiDto.setEndTime(dto.getEndTime()); + apiDto.setPageNumber(dto.getPageNumber()); + apiDto.setPageSize(dto.getPageSize()); + ArrayList filter = Lists.newArrayList(); + + String publishUnit = dto.getPublishUnit(); +// if (StringUtils.isNotBlank(publishUnit)) { +// String[] split = publishUnit.split(","); +// if (split.length > 1) { +// String str = "("; +// for (String s : split) { +// str += s + ","; +// } +// str = str.substring(0, str.length() - 1) + ")"; +// filter.add(new ApiDto.Filter("publishUnit", "in " + str, "")); +// +// } else { +// filter.add(new ApiDto.Filter("publishUnit", "like", String.format("%s%s%s", "%", publishUnit, "%"))); +// } +// } + String warnSignalLevel = dto.getWarnSignalLevel(); +// if (StringUtils.isNotBlank(warnSignalLevel)) { +// String[] split = warnSignalLevel.split(","); +// if (split.length > 1) { +// String str = "("; +// for (String s : split) { +// str += s + ","; +// } +// str = str.substring(0, str.length() - 1) + ")"; +// filter.add(new ApiDto.Filter("warnSignalLevel", "in " + str, "")); +// +// } else { +// filter.add(new ApiDto.Filter("warnSignalLevel", "like", String.format("%s%s%s", "%", warnSignalLevel, "%"))); +// } +// } + String warnSignalType = dto.getWarnSignalType(); +// if (StringUtils.isNotBlank(warnSignalType)) { +// String[] split = warnSignalType.split(","); +// if (split.length > 1) { +// String str = "("; +// for (String s : split) { +// str += s + ","; +// } +// str = str.substring(0, str.length() - 1) + ")"; +// filter.add(new ApiDto.Filter("warnSignalType", "in " + str, "")); +// +// } else { +// filter.add(new ApiDto.Filter("warnSignalType", "like", String.format("%s%s%s", "%", warnSignalType, "%"))); +// } +// } + + + apiDto.setFilter(filter); + String str = HttpUtil.sendPost(getGroupWarning, JSON.toJSONString(apiDto)); +// String str = HttpUtil.sendPost("http://127.0.0.1:20000/shzh/met/zyqxfw/api/warning/getGroupWarning", JSON.toJSONString(apiDto)); + JSONObject json = JSON.parseObject(str); + if (json != null && json.getInteger("code") == HttpStatus.SC_OK) { + List data = json.getJSONArray("data").toJavaList(WarningData.class); + return ResultJson.ok(getCount(data, publishUnit, warnSignalLevel, warnSignalType)); + } + + return ResultJson.ok(json); + } + + /** + * 正在生效预警 + * + * @param data + * @return + */ + private List getList(List data, + String reqPublishUnit, + String reqWarnSignalLevel, + String reqWarnSignalType) { + + List respList = Lists.newArrayList(); + for (WarningData datum : data) { + for (WarningData.TypeList typeList : datum.getTypeList()) { + // 预警类型 + String type = typeList.getType(); + List warnList = typeList.getWarnList(); + + warnList = warnListFilter(warnList, reqPublishUnit, reqWarnSignalLevel, reqWarnSignalType); + + for (WarningData.Warning warning : warnList) { + WarningListVo vo = new WarningListVo(); + String publishUnit = warning.getPublishUnit(); + vo.setTitle(publishUnit + "发布" + type + "预警"); + vo.setPublishTime(warning.getPublishTime()); + vo.setContent(warning.getContent()); + vo.setWarnSignalType(warning.getWarnSignalType()); + vo.setWarnSignalLevel(warning.getWarnSignalLevel()); + vo.setAdnm(publishUnit.replace("气象台", "")); + String adnm = publishUnit.replace("气象台", ""); + + if ("恩施州".equals(adnm)){ + adnm = "恩施土家族苗族自治州"; + } + if ("武汉经济技术开发区".equals(adnm)){ + adnm = "经济技术开发区(汉南区)"; + } + + String adcd = adinfoService.getAdcdByAdnm(adnm); + if (StringUtils.isNotBlank(adcd)){ + vo.setAddressBooks(addressBookService.getListByAdnm(adcd)); + }else{ + log.info("当前行政区划不存在: " + adnm); + } + respList.add(vo); + } + } + } + + + return respList.stream().sorted(Comparator.comparing(WarningListVo::getPublishTime).reversed()) + .collect(Collectors.toList()); + } + + /** + * 正在生效预警 + * + * @return + */ + private List warnListFilter(List warnList, + String publishUnit, + String warnSignalLevel, + String warnSignalType + ) { + if (StringUtils.isNotBlank(publishUnit)) { + HashSet set = Sets.newHashSet(publishUnit.split(",")); + if (CollectionUtils.isNotEmpty(set)) { + warnList = warnList.stream() + .filter(w -> + set.contains(w.getPublishUnit().split("气象")[0]) + ).collect(Collectors.toList()); + } + } + + + if (StringUtils.isNotBlank(warnSignalLevel)) { + HashSet set = Sets.newHashSet(warnSignalLevel.split(",")); + if (CollectionUtils.isNotEmpty(set)) { + warnList = warnList.stream() + .filter(w -> + set.contains(w.getWarnSignalLevel()) + ).collect(Collectors.toList()); + } + } + + + if (StringUtils.isNotBlank(warnSignalType)) { + HashSet set = Sets.newHashSet(warnSignalType.split(",")); + if (CollectionUtils.isNotEmpty(set)) { + warnList = warnList.stream() + .filter(w -> + set.contains(w.getWarnSignalType()) + ).collect(Collectors.toList()); + } + } + + return warnList; + } + + private List getCount(List data, + String publishUnit, + String warnSignalLevel, + String reqWarnSignalType + ) { + + List warnList = Lists.newArrayList(); + for (WarningData datum : data) { + for (WarningData.TypeList typeList : datum.getTypeList()) { + warnList.addAll(typeList.getWarnList()); + } + } + + warnList = warnListFilter(warnList, publishUnit, warnSignalLevel, reqWarnSignalType); + + Map> warnMap = warnList.stream() + .collect(Collectors + .groupingBy(WarningData.Warning::getPublishUnit, Collectors.toList())); + + + List voList = Lists.newArrayList(); + + warnMap.forEach((k, v) -> { + WarningHistoryListVo vo = new WarningHistoryListVo(); + vo.setEffectArea(k.split("气象")[0]); + vo.setWarnSignalType("暴雨"); + + +// List typeList = Lists.newArrayList(); + + // 类型 只要暴雨 + Map> types = v.stream() +// .filter(o -> "暴雨".equals(o.getWarnSignalType())) + .filter(o -> "橙色".equals(o.getWarnSignalLevel()) || "红色".equals(o.getWarnSignalLevel())) + .collect(Collectors + .groupingBy(WarningData.Warning::getWarnSignalType, Collectors.toList())); + +// Set warnSignalType = Sets.newHashSet("雷电", "暴雨", "大风", "冰雹", "雷雨大风"); + types.forEach((kt, vt) -> { + +// WarningHistoryListVo voType = new WarningHistoryListVo(); +// voType.setWarnSignalType(kt); +// warnSignalType.remove(kt); + // 等级分组 + Map levels = vt.stream() + .collect(Collectors.groupingBy(WarningData.Warning::getWarnSignalLevel, Collectors.counting())); + + levels.forEach((k1, v1) -> { + switch (k1) { + case "红色": +// voType.setRedCount(v1.intValue()); + vo.setRedCount(v1.intValue() + vo.getRedCount()); + break; + case "橙色": +// voType.setOraCount(v1.intValue()); + vo.setOraCount(v1.intValue() + vo.getOraCount()); + break; + case "黄色": +// voType.setYelCount(v1.intValue()); + vo.setYelCount(v1.intValue() + vo.getYelCount()); + break; + case "蓝色": +// voType.setBluCount(v1.intValue()); + vo.setBluCount(v1.intValue() + vo.getBluCount()); + break; + default: + throw new MyException("当前预警等级不存在: " + k1); + } + }); +// voType.setSumCount(vt.size()); +// typeList.add(voType); + + }); + + // 保证完整数据 +// warnSignalType.forEach(kt -> { +// WarningHistoryListVo voType = new WarningHistoryListVo(); +// voType.setWarnSignalType(kt); +// typeList.add(voType); +// }); + +// vo.setChild(typeList); + vo.setSumCount(vo.getRedCount() + vo.getOraCount() + vo .getYelCount() + vo.getBluCount()); + voList.add(vo); + }); + + + // 进行行政区划匹配 + if (CollectionUtils.isNotEmpty(voList)) { + List tree = adinfoService.tree(TREE_ALL, TREE_ALL); + Map> areaMap = voList.stream() + .collect(Collectors + .groupingBy(WarningHistoryListVo::getEffectArea, Collectors.toList())); + + return setAll(getAdcdByWhlVo(tree, areaMap)); + } + + return setAll(voList); + } + + private List setAll(List vos) { + if (CollectionUtils.isNotEmpty(vos)) { + WarningHistoryListVo vo = new WarningHistoryListVo(); + vo.setWarnSignalType("暴雨"); + vo.setEffectArea("总计"); + int oraSum = vos.stream().mapToInt(WarningHistoryListVo::getOraCount).sum(); + vo.setOraCount(oraSum); + int redSum = vos.stream().mapToInt(WarningHistoryListVo::getRedCount).sum(); + vo.setRedCount(redSum); + int bluSum = vos.stream().mapToInt(WarningHistoryListVo::getBluCount).sum(); + vo.setBluCount(bluSum); + int yelSum = vos.stream().mapToInt(WarningHistoryListVo::getYelCount).sum(); + vo.setYelCount(yelSum); + vo.setSumCount(oraSum + redSum + bluSum + yelSum); + vos.add(0, vo); + } + return vos; + } + + private List getAdcdByWhlVo(List tree, Map> areaMap) { + List respList = Lists.newArrayList(); + + for (AdcdTree adcdTree : tree) { + String adnm = adcdTree.getAdnm(); + + if ("恩施土家族苗族自治州".equals(adnm)){ + adnm = "恩施州"; + adcdTree.setAdnm(adnm); + } + + List children = adcdTree.getChildren(); + + List vos = areaMap.remove(adnm); + if (CollectionUtils.isNotEmpty(vos)) { + WarningHistoryListVo vo = vos.get(0); + List childList = Lists.newArrayList(); + + if (CollectionUtils.isNotEmpty(children)) { + // 第一个是市级单位 + for (int i = 1; i < children.size(); i++) { + AdcdTree t = children.get(i); + String adnm1 = t.getAdnm(); + if ("经济技术开发区(汉南区)".equals(adnm1)){ + adnm1 = "武汉经济技术开发区"; + } + List vos1 = areaMap.remove(adnm1); + if (CollectionUtils.isNotEmpty(vos1)) { + childList.addAll(vos1); + } + } + } + + vo.setAreaChild(childList); + respList.add(vo); + } + + } + + areaMap.keySet().forEach(s -> System.out.println("未匹配行政区划: " + s)); + + return respList; + } + + +// public static void main(String[] args) { +// GroupWarningDto dto = new GroupWarningDto(); +// dto.setStartTime("2024-01-01 00:00:00"); +// dto.setEndTime("2024-06-20 23:00:00"); +// System.out.println(new WarningController().getHistoryGroupWarning(dto)); +// } + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/controller/WarningResponderController.java b/module-legacy/src/main/java/com/whdc/legacy/controller/WarningResponderController.java new file mode 100644 index 0000000..5a862f7 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/controller/WarningResponderController.java @@ -0,0 +1,260 @@ +package com.whdc.legacy.controller; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.whdc.common.exception.MyException; +import com.whdc.legacy.model.dto.WarningResponderDto; +import com.whdc.legacy.model.entity.WarningResponder; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import com.whdc.legacy.model.vo.ExcelDataVo; +import com.whdc.legacy.model.vo.ExcelOldDataVo; +import com.whdc.legacy.service.IWarningResponderService; +import com.whdc.common.utils.ExcelCommon; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import static com.whdc.legacy.model.MyConstant.REDIS_KEY; + +/** + * Description: + * Created by XuSan on 2024/6/11. + * + * @author XuSan + * @version 1.0 + */ +@Slf4j +@Api(tags = "web通讯录 - Controller") +@RestController +@RequestMapping({"/addressbookOld", "/warningResponder"}) +@Transactional +public class WarningResponderController { + + @Autowired + private IWarningResponderService service; + + public static final String ADDRESS_BOOK_REDIS_KEY = REDIS_KEY + "addressbookOld"; + public static final String ADDRESS_BOOK_TEMP_REDIS_KEY = ADDRESS_BOOK_REDIS_KEY + "temp:"; + + @Autowired + private RedisTemplate redisTemplate; + + + + @ApiOperation(value = "查询所有联系人") + @PostMapping(value = "find") + // @Cacheable(value = ADDRESS_BOOK_REDIS_KEY, key = "#root.method.name+':'+#dto.toString()") + public ResultJson> find(@RequestBody WarningResponderDto dto) { + + LambdaQueryChainWrapper query = service.lambdaQuery(); + + String name = dto.getName(); + if (StringUtils.isNotBlank(name)){ + query.like(WarningResponder::getName, name); + } + + String phone = dto.getPhone(); + if (StringUtils.isNotBlank(phone)){ + query.like(WarningResponder::getPhone, phone); + } + // 添加默认排序 + query.orderByAsc(WarningResponder::getCtnm).orderByAsc(WarningResponder::getCnnm).orderByAsc(WarningResponder::getName); + List data = query.list(); + + data = data.stream().map(vo -> vo.setLevelLabel(dictMappingReverse(vo.getLevel())).decryptPhone()).collect(Collectors.toList()); + + return ResultJson.ok(data); + + } + + + @ApiOperation(value = "下载excel") + @GetMapping(value = "downloadExcel") + public void downloadExcel( HttpServletResponse response) { + + List list = service.lambdaQuery() + .list(); + for (WarningResponder o : list) { + o.decryptPhone(); + } + list.stream().forEach(vo -> vo.setLevelLabel(dictMappingReverse(vo.getLevel()))); + ExcelCommon.exportExcel(list, + null, "防汛抗旱通讯录", WarningResponder.class, "湖北省防汛抗旱通信录模版" + LocalDateTime.now() + ".xlsx", + response); + } + + @ApiOperation(value = "解析文件数据") + @PostMapping(value = "getExcelData") + public ResultJson getExcelData(MultipartFile file) { + + List appends = ExcelCommon.importExcel(file, 0, 1, WarningResponder.class); + + ExcelOldDataVo excelDataVo = new ExcelOldDataVo(); + if (CollectionUtils.isNotEmpty(appends)){ + appends = appends.stream().filter(vo -> + StringUtils.isNotBlank(vo.getName()) + && StringUtils.isNotBlank(vo.getCtnm()) + && StringUtils.isNotBlank(vo.getCnnm()) + ).collect(Collectors.toList()); + String key = UUID.randomUUID().toString().replaceAll("-", ""); + redisTemplate.opsForValue().set(ADDRESS_BOOK_TEMP_REDIS_KEY + key, JSON.toJSONString(appends), 30, TimeUnit.MINUTES); + excelDataVo.setKey(key); + excelDataVo.setList(appends); + } + + return ResultJson.ok(excelDataVo); + } + @ApiOperation(value = "联系人导入") + @PostMapping(value = "uploadExcel") + @CacheEvict(value = ADDRESS_BOOK_REDIS_KEY, allEntries = true) + public ResultJson uploadExcel(@RequestBody ExcelDataVo data) { + + String s = redisTemplate.opsForValue().get(ADDRESS_BOOK_TEMP_REDIS_KEY + data.getKey()); + if (StringUtils.isBlank(s)){ + throw new MyException("文件已过期"); + } + List appends = JSON.parseArray(s, WarningResponder.class); + + if (CollectionUtils.isEmpty(appends)) { + throw new MyException("文件数据为空"); + } + +// Set set = appends.stream().map(vo -> vo.getName() + "_" + vo.getPhone()).collect(Collectors.toSet()); +// if (set.size() != appends.size()){ +// throw new MyException("联系人重复"); +// } + + boolean r1 = service.remove(Wrappers.emptyWrapper()); + if (!r1) { + throw new MyException("通讯录数据删除失败"); + } + + // 新增创建时间 + Date date = new Date(); + + appends = appends.stream().map(vo -> vo.setCreateTime(date).setLevel(dictMapping(vo.getLevelLabel())).encryptPhone()) + .collect(Collectors.toList()); + + if (!service.saveBatch(appends)) { + throw new MyException("表格数据新增失败"); + } + + return ResultJson.ok("数据新增成功"); + } + + private Integer dictMapping(String label) { + if (label == null) { + return null; + } + switch (label) { + case "分管副市(县)长": + return 1; + case "常务副市(县)长": + return 2; + case "市(县)长": + return 3; + case "书记": + return 4; + default: + return null; + } + } + + private String dictMappingReverse(Integer level) { + if (level == null) { + return null; + } + switch (level) { + case 1: + return "分管副市(县)长"; + case 2: + return "常务副市(县)长"; + case 3: + return "市(县)长"; + case 4: + return "书记"; + default: + return null; + } + } + + @ApiOperation(value = "添加") + @PostMapping(value = "save") + public ResultJson insert(@RequestBody @Validated(Insert.class) WarningResponder model) { + // 暂时不做数据唯一性校验 + // if (CollectionUtils.isNotEmpty( + // service.lambdaQuery() + // .list()) + // ) { + // return ResultJson.error("重复新增"); + // } + model.setCreateTime(new Date()).encryptPhone(); + return ResultJson.ok(service.save(model)); + + } + + @ApiOperation(value = "修改") + @PostMapping(value = "edit") + public ResultJson update(@RequestBody @Validated(Update.class) WarningResponder model) { + // 暂时不做数据唯一性校验 + // if (CollectionUtils.isNotEmpty( + // service.lambdaQuery() + // .list()) + // ) { + // return ResultJson.error("重复修改"); + // } + model.encryptPhone(); + return ResultJson.ok(service.updateById(model)); + } + + + @ApiOperation(value = "删除") + @GetMapping(value = "del/{id}") + public ResultJson delete(@PathVariable("id") Integer id) { + if (Objects.isNull(service.getById(id))) { + return ResultJson.error("当前数据不存在"); + } + return ResultJson.ok(service.removeById(id)); + } + + + @ApiOperation(value = "预警呼叫等级") + @GetMapping(value = "getWarnCallLevelDict") + public ResultJson getWarnCallLevelDict() { + Map dictMap = new LinkedHashMap<>(); + dictMap.put(4, "书记"); + dictMap.put(3, "市(县)长"); + dictMap.put(2, "常务副市(县)长"); + dictMap.put(1, "分管副市(县)长"); + return ResultJson.ok(dictMap); + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/AbUdRMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/AbUdRMapper.java new file mode 100644 index 0000000..d793b86 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/AbUdRMapper.java @@ -0,0 +1,20 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; +import com.whdc.legacy.model.entity.AbUdR; + + +import java.util.List; +/** + * @author xusan + * @date 2024-05-11 + */ +public interface AbUdRMapper extends BaseMapper { + + IPage page(@Param("page") IPage page, @Param("dto") AbUdR dto); + + List find(@Param("dto") AbUdR dto); + + } \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/AddressBookCityMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/AddressBookCityMapper.java new file mode 100644 index 0000000..22b4dce --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/AddressBookCityMapper.java @@ -0,0 +1,15 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.whdc.legacy.model.entity.AddressBookCity; + +/** + * @author xusan + * @date 2024-05-11 + */ +public interface AddressBookCityMapper extends BaseMapper { + + + + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/AddressBookMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/AddressBookMapper.java new file mode 100644 index 0000000..cbd564f --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/AddressBookMapper.java @@ -0,0 +1,27 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.legacy.model.dto.AddressBookDto; +import com.whdc.legacy.model.entity.AddressBook; +import com.whdc.legacy.model.vo.AddressBookVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author xusan + * @date 2024-05-11 + */ +public interface AddressBookMapper extends BaseMapper { + + IPage page(@Param("page") IPage page, @Param("dto") AddressBookDto dto); + + List find(@Param("dto") AddressBook dto); + + List getListByAdnm(@Param("adcd") String adcd); + AddressBookVo getVoById(@Param("id") Integer id); + + AddressBookVo getVoByOpenid(@Param("id") String id); + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/AdinfoMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/AdinfoMapper.java new file mode 100644 index 0000000..d7bf57b --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/AdinfoMapper.java @@ -0,0 +1,23 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; +import com.whdc.legacy.model.entity.Adinfo; + + +import java.util.List; +/** + * @author xusan + * @date 2024-05-11 + */ +public interface AdinfoMapper extends BaseMapper { + + IPage page(@Param("page") IPage page, @Param("dto") Adinfo dto); + + List find(@Param("dto") Adinfo dto); + + List selectByCdOrNm(@Param("adcd") String adcd, @Param("adnm") String adnm); + + Adinfo selectAdcdByAdnm(@Param("adnm") String adnm); + } \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/FcMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/FcMapper.java new file mode 100644 index 0000000..70a9774 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/FcMapper.java @@ -0,0 +1,22 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.legacy.model.dto.FcDto; +import com.whdc.legacy.model.vo.FcVo; +import org.apache.ibatis.annotations.Param; +import com.whdc.legacy.model.entity.Fc; + + +import java.util.List; +/** + * @author xusan + * @date 2024-05-11 + */ +public interface FcMapper extends BaseMapper { + + IPage page(@Param("page") IPage page, @Param("dto") FcDto dto); + + List find(@Param("dto") Fc dto); + + } \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/LoginInfoMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/LoginInfoMapper.java new file mode 100644 index 0000000..a65e99c --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/LoginInfoMapper.java @@ -0,0 +1,22 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.legacy.model.dto.FindPageDto; +import com.whdc.legacy.model.dto.LoginInfoDto; +import org.apache.ibatis.annotations.Param; +import com.whdc.legacy.model.entity.LoginInfo; + + +import java.util.List; +/** + * @author xusan + * @date 2024-05-11 + */ +public interface LoginInfoMapper extends BaseMapper { + + IPage page(@Param("page") IPage page, @Param("dto") LoginInfoDto dto); + + List find(@Param("dto") LoginInfo dto); + + } \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/OrganizationMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/OrganizationMapper.java new file mode 100644 index 0000000..ce9e701 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/OrganizationMapper.java @@ -0,0 +1,20 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; +import com.whdc.legacy.model.entity.Organization; + + +import java.util.List; +/** + * @author xusan + * @date 2024-05-11 + */ +public interface OrganizationMapper extends BaseMapper { + + IPage page(@Param("page") IPage page, @Param("dto") Organization dto); + + List findByUserId(@Param("userId") String userId); + + } \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/QXWarningMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/QXWarningMapper.java new file mode 100644 index 0000000..7dfe951 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/QXWarningMapper.java @@ -0,0 +1,22 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.legacy.model.dto.GroupWarningDto; +import com.whdc.legacy.model.entity.QXWarning; +import com.whdc.legacy.model.vo.QXWarningVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface QXWarningMapper extends BaseMapper { + List find(@Param("dto") QXWarning dto); + List findByMsgIsNull(); + List findByAutoMsgIsNull(); + + IPage page(@Param("page") IPage page, @Param("dto") GroupWarningDto dto); + + List list(@Param("dto") GroupWarningDto dto); + + List getWarnAndMsg(@Param("stm") String stm, @Param("etm") String etm); +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/ShAddressBookMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/ShAddressBookMapper.java new file mode 100644 index 0000000..a1b6d94 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/ShAddressBookMapper.java @@ -0,0 +1,19 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.legacy.model.dto.ShAddressBookDto; +import com.whdc.legacy.model.entity.ShAddressBook; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 描述: 山洪责任人通讯录 + * author: xusan + * date: 2024-07-29 17:27:25 + */ +@Mapper +public interface ShAddressBookMapper extends BaseMapper { + IPage page(@Param("page") IPage page, @Param("dto") ShAddressBookDto dto); + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/ShCallWordMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/ShCallWordMapper.java new file mode 100644 index 0000000..704aaa8 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/ShCallWordMapper.java @@ -0,0 +1,24 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.legacy.model.dto.ShCallWordDto; +import com.whdc.legacy.model.entity.ShCallWord; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 描述: 备注 + * author: xusan + * date: 2024-07-29 17:27:25 + */ +@Mapper +public interface ShCallWordMapper extends BaseMapper { + + IPage page(@Param("page") IPage page, @Param("dto") ShCallWordDto dto); + + List page(@Param("dto") ShCallWordDto dto); + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/ShCallsMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/ShCallsMapper.java new file mode 100644 index 0000000..457e659 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/ShCallsMapper.java @@ -0,0 +1,27 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.legacy.model.dto.ShCallsDto; +import com.whdc.legacy.model.entity.ShAddressBook; +import com.whdc.legacy.model.entity.ShCalls; +import com.whdc.legacy.model.vo.ShCallsVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 描述: 抽查日志 + * author: xusan + * date: 2024-07-29 17:27:25 + */ +@Mapper +public interface ShCallsMapper extends BaseMapper { + + IPage page(@Param("page") IPage page, @Param("dto") ShCallsDto dto); + + List list(@Param("dto") ShCallsDto dto); + List listVo(@Param("dto") ShCallsDto dto); + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/ShPeriodMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/ShPeriodMapper.java new file mode 100644 index 0000000..506698a --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/ShPeriodMapper.java @@ -0,0 +1,20 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.legacy.model.dto.ShPeriodDto; +import com.whdc.legacy.model.entity.ShPeriod; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 描述: 防汛周期 + * author: xusan + * date: 2024-07-29 17:27:25 + */ +@Mapper +public interface ShPeriodMapper extends BaseMapper { + + IPage page(@Param("page") IPage page, @Param("dto") ShPeriodDto dto); + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/UnitDictMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/UnitDictMapper.java new file mode 100644 index 0000000..8cc5332 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/UnitDictMapper.java @@ -0,0 +1,23 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.legacy.model.entity.Organization; +import org.apache.ibatis.annotations.Param; +import com.whdc.legacy.model.entity.UnitDict; + + +import java.util.List; +/** + * @author xusan + * @date 2024-05-11 + */ +public interface UnitDictMapper extends BaseMapper { + + IPage page(@Param("page") IPage page, @Param("dto") UnitDict dto); + + List find(@Param("dto") UnitDict dto); + + List findByUserId(@Param("userId") String userId); + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/UserMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/UserMapper.java new file mode 100644 index 0000000..de8d576 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/UserMapper.java @@ -0,0 +1,23 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.legacy.model.vo.LoginVo; +import org.apache.ibatis.annotations.Param; +import com.whdc.legacy.model.entity.User; + + +import java.util.List; +/** + * @author xusan + * @date 2024-05-11 + */ +public interface UserMapper extends BaseMapper { + + IPage page(@Param("page") IPage page, @Param("dto") User dto); + + List find(@Param("dto") User dto); + + LoginVo findByLoginName(@Param("username") String username); + + } \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/VersionsMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/VersionsMapper.java new file mode 100644 index 0000000..dc32026 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/VersionsMapper.java @@ -0,0 +1,21 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.legacy.model.dto.CommDto; +import org.apache.ibatis.annotations.Param; +import com.whdc.legacy.model.entity.Versions; + + +import java.util.List; +/** + * @author xusan + * @date 2024-05-11 + */ +public interface VersionsMapper extends BaseMapper { + + IPage page(@Param("page") IPage page, @Param("dto") CommDto dto); + + List find(@Param("dto") Versions dto); + + } \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/WarnMsgFBMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/WarnMsgFBMapper.java new file mode 100644 index 0000000..8946eec --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/WarnMsgFBMapper.java @@ -0,0 +1,15 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.whdc.legacy.model.entity.WarnMsgFB; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface WarnMsgFBMapper extends BaseMapper { + List selectByWarnid(@Param("warnid") Integer warnid); + + List find(@Param("dto") WarnMsgFB dto); + + List selectByWarnidAndCalledPhone(@Param("warnid") Integer warnid, @Param("calledPhone") String calledPhone); +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/mapper/WarningResponderMapper.java b/module-legacy/src/main/java/com/whdc/legacy/mapper/WarningResponderMapper.java new file mode 100644 index 0000000..2665cfb --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/mapper/WarningResponderMapper.java @@ -0,0 +1,20 @@ +package com.whdc.legacy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.whdc.legacy.model.entity.WarningResponder; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author xusan + * @date 2024-05-11 + */ +public interface WarningResponderMapper extends BaseMapper { + + + List getListByAdnm2(@Param("adnm") String adnm); + + List listByCnnmAndLevelOrderByLevelAsc(@Param("cnnm") String cnnm, @Param("levels") List levels); + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/MyConstant.java b/module-legacy/src/main/java/com/whdc/legacy/model/MyConstant.java new file mode 100644 index 0000000..40b86e2 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/MyConstant.java @@ -0,0 +1,26 @@ +package com.whdc.legacy.model; + +/** + * @author xusan + * @date 2023/4/27 9:41 + */ +public class MyConstant { + + public static final String + + // 删除 + DEL = "0", + + // 未删除 + REC = "1", + + + // redis KEY + TOKEN_KEY = "SW_TOKEN_SJQX"; + + /** + * 数据-数据服务运维员 角色编码 + */ + public static final String ROLE_PUSH = "data_zh_om"; + public static final String REDIS_KEY = "fxkh:txl:"; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/AdcdDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/AdcdDto.java new file mode 100644 index 0000000..1a3dfb3 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/AdcdDto.java @@ -0,0 +1,18 @@ +package com.whdc.legacy.model.dto; + +import com.whdc.legacy.model.group.Find; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author xusan + * @date 2023年3月20日08:57:22 + */ +@Data +public class AdcdDto { + + @ApiModelProperty(value = "行政区划编号") + private String adcd; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/AddressBookCityDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/AddressBookCityDto.java new file mode 100644 index 0000000..3c8ee8b --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/AddressBookCityDto.java @@ -0,0 +1,41 @@ +package com.whdc.legacy.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Author xusan + * @Date 2024/5/13 10:17 + * @Notes + **/ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "市县通讯录") +public class AddressBookCityDto extends FindPageDto { + + + /** + * 职务 + */ + @Schema(description = "职务") + private String unit; + + + /** + * 名字 + */ + @Schema(description = "姓名") + private String name; + + + /** + * 手机号 + */ + @Schema(description = "电话") + private String phone; + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/AddressBookDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/AddressBookDto.java new file mode 100644 index 0000000..d11a0cd --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/AddressBookDto.java @@ -0,0 +1,35 @@ +package com.whdc.legacy.model.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author xusan + * @date 2023年3月20日08:57:22 + */ +@Data +public class AddressBookDto extends CommDto{ + + @ApiModelProperty(value = "用户单位id 或 组织id") + private String dictId; + + @ApiModelProperty(value = "0:组织,1:单位") + private String type; + + @ApiModelProperty(value = "0:常用联系人,1:置顶联系人") + private String ftype; + + @ApiModelProperty(value = "行政区划") + private String adcd; + + @ApiModelProperty(value = "行政区划级别 0省,1市,2县,3镇,4村,5组 ,(点击树查询下级, 点击查询按钮查询本级)", example = "0") + private Integer adlevel; + + @ApiModelProperty(value = "登录用户id") + private String userId; + + @ApiModelProperty(value = "搜索框模糊查询") + private String allLikeStr; + + private String v; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/ApiDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/ApiDto.java new file mode 100644 index 0000000..d7a96cb --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/ApiDto.java @@ -0,0 +1,48 @@ +package com.whdc.legacy.model.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @Author xusan + * @Date 2023/7/4 10:28 + * @Notes + **/ +@Data +public class ApiDto { + + @ApiModelProperty(value = "开始时间, 格式应为:yyyy-MM-dd HH:mm:ss", dataType = "java.lang.String", example = "2023-06-15 08:00:00") + private String startTime; + + @ApiModelProperty(value = "结束时间, 格式应为:yyyy-MM-dd HH:mm:ss", dataType = "java.lang.String", example = "2023-06-15 08:00:00") + private String endTime; + + @ApiModelProperty(value = "页数", dataType = "java.lang.Integer", example = "1") + private Integer pageNumber = 1; + + @ApiModelProperty(value = "条数", dataType = "java.lang.Integer", example = "10") + private Integer pageSize = 10; + + @ApiModelProperty(value = "过滤条件", dataType = "java.lang.Array", example = "[]") + private List filter; + + @AllArgsConstructor + @NoArgsConstructor + @Data + public static class Filter { + + @ApiModelProperty(value = "查询列名 publishUnit:发布单位,warnSignalType:类型,warnSignalLevel:级别", dataType = "java.lang.String", example = "publishUnit") + private String name; + + @ApiModelProperty(value = "查询类型", dataType = "java.lang.String", example = "like") + private String condition; + + @ApiModelProperty(value = "值", dataType = "java.lang.String", example = "%1%") + private String value; + + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/AutoCallDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/AutoCallDto.java new file mode 100644 index 0000000..66f992f --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/AutoCallDto.java @@ -0,0 +1,24 @@ +package com.whdc.legacy.model.dto; + +import com.whdc.legacy.model.dto.FindPageDto; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * Description: + * Created by XuSan on 2024/7/31. + * + * @author XuSan + * @version 1.0 + */ +@Data +@Accessors(chain = true) +public class AutoCallDto { + + private String stm; + private String etm; + + private Boolean callIsPut; + + private FindPageDto page; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/CallPutDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/CallPutDto.java new file mode 100644 index 0000000..3d1cf9f --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/CallPutDto.java @@ -0,0 +1,11 @@ +package com.whdc.legacy.model.dto; + + +import lombok.Data; + +import java.util.List; + +@Data +public class CallPutDto { + List taskIds; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/CommDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/CommDto.java new file mode 100644 index 0000000..da706b9 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/CommDto.java @@ -0,0 +1,34 @@ +package com.whdc.legacy.model.dto; + +import com.whdc.legacy.model.dto.FindPageDto; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author xusan + * @Date 2024/5/14 15:17 + * @Notes + **/ +@Data +public class CommDto extends FindPageDto { + + + @ApiModelProperty(value = "用户名称") + private String name; + + @ApiModelProperty(value = "用户手机号") + private String phone; + + @ApiModelProperty(value = "通讯录编号") + private String abId; + + @ApiModelProperty(value = "0:添加用户,1:修改用户,2:修改权限,3:删除用户") + private String type; + + @ApiModelProperty(value = "版本号") + private Integer version; + + @ApiModelProperty(value = "行政区划编码") + private String adcd; + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/FcDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/FcDto.java new file mode 100644 index 0000000..83ebee4 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/FcDto.java @@ -0,0 +1,32 @@ +package com.whdc.legacy.model.dto; + +import com.whdc.legacy.model.dto.FindPageDto; +import com.whdc.legacy.model.group.Find; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author xusan + * @date 2023年3月20日08:57:22 + */ +@Data +public class FcDto extends FindPageDto { + + @ApiModelProperty(value = "用户id") + @NotNull(message = "用户id不能为空", groups = {Find.class}) + private String userId; + + @ApiModelProperty(value = "类型 0:常用联系人,1:置顶联系人") + @NotNull(message = "类型不能为空", groups = {Find.class}) + private String type; + + @ApiModelProperty(value = "联系人名称") + private String name; + + @ApiModelProperty(value = "联系人手机号") + private String phone; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/FindPageDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/FindPageDto.java new file mode 100644 index 0000000..36feb87 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/FindPageDto.java @@ -0,0 +1,31 @@ +package com.whdc.legacy.model.dto; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Pattern; + +@Data +public class FindPageDto { + + @ApiModelProperty(value = "当前页", example = "1") + private Integer pageNumber = 1; + + @ApiModelProperty(value = "每页条数", example = "10") + private Integer pageSize = 10; + + @ApiModelProperty(value = "是否统计总数。数据量大时,为了提高查询效率,可以将该字段置为 false", example = "10") + private Boolean searchCount = true; + + @ApiModelProperty(value = "排序字段") + private String sortField; + + @ApiModelProperty(value = "排序顺序", example = "asc") + @Pattern(message = "排序顺序,仅支持 asc 或者 desc", regexp = "asc|desc") + private String sortOrder = "asc"; + + public Page getPage() { + return new Page(pageNumber, pageSize, searchCount); + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/GroupWarningDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/GroupWarningDto.java new file mode 100644 index 0000000..4a2ae03 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/GroupWarningDto.java @@ -0,0 +1,41 @@ +package com.whdc.legacy.model.dto; + +import com.whdc.legacy.model.dto.FindPageDto; +import com.whdc.legacy.model.group.Update; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +/** + * Description: + * Created by XuSan on 2024/5/23. + * + * @author XuSan + * @version 1.0 + */ +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Data +public class GroupWarningDto extends FindPageDto { + + @ApiModelProperty(value = "开始时间, 格式应为:yyyy-MM-dd HH:mm:ss", dataType = "java.lang.String", example = "2023-06-15 08:00:00") + @NotNull(message = "开始时间不能为空") + private String startTime; + + @ApiModelProperty(value = "结束时间, 格式应为:yyyy-MM-dd HH:mm:ss", dataType = "java.lang.String", example = "2023-06-15 08:00:00") + @NotNull(message = "结束时间不能为空") + private String endTime; + + @ApiModelProperty(value = "发布单位") + private String publishUnit; + + @ApiModelProperty(value = "类型") + private String warnSignalType; + + @ApiModelProperty(value = "级别") + private String warnSignalLevel; + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/LoginDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/LoginDto.java new file mode 100644 index 0000000..78bb70a --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/LoginDto.java @@ -0,0 +1,21 @@ +package com.whdc.legacy.model.dto; + +import io.swagger.annotations.ApiParam; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +/** + * @author 李赛 + * @date 2022-07-01 1:21 + */ +@Data +public class LoginDto { + @ApiParam(value = "登录名") + @NotEmpty(message = "登录名不能为空") + private String loginName; + + @ApiParam(value = "密码") + @NotEmpty(message = "密码不能为空") + private String password; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/LoginInfoDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/LoginInfoDto.java new file mode 100644 index 0000000..7f1a32b --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/LoginInfoDto.java @@ -0,0 +1,22 @@ +package com.whdc.legacy.model.dto; + +import com.whdc.legacy.model.dto.FindPageDto; +import com.whdc.legacy.model.group.Find; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author xusan + * @date 2023年3月20日08:57:22 + */ +@Data +public class LoginInfoDto extends FindPageDto { + + @ApiModelProperty(value = "用户id") + private String createId; + + @ApiModelProperty(value = "0:密码登录 1:验证码登录") + private String type; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/ShAddressBookDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/ShAddressBookDto.java new file mode 100644 index 0000000..d6f6008 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/ShAddressBookDto.java @@ -0,0 +1,55 @@ +package com.whdc.legacy.model.dto; + +import com.whdc.legacy.model.dto.FindPageDto; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Author xusan + * @Date 2024/5/13 10:17 + * @Notes + **/ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "山洪责任人分页查询") +public class ShAddressBookDto extends FindPageDto { + + @ApiModelProperty(value = "责任人电话") + private String phone; + + @ApiModelProperty(value = "责任人姓名") + private String name; + + @Schema(description = "负责区域") + private String land; + + @ApiModelProperty(value = "责任人类型1 行政责任人,包保责任人") + private String type1; + + @ApiModelProperty(value = "责任人类型2 县级行政责任人,乡级行政责任人,村级行政责任人, 包保县干部,包保乡干部") + private String type2; + + @Schema(description = "市") + private String city; + + @Schema(description = "县") + private String county; + + @Schema(description = "行政村") + private String village; + + @Schema(description = "乡") + private String area; + + @Schema(description = "是否抽查:0:不抽查,1:抽查") + private String isSpotCheck; + + @Schema(description = "是否接听0:否,1是") + private String callStatus; + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/ShCallWordDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/ShCallWordDto.java new file mode 100644 index 0000000..4145186 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/ShCallWordDto.java @@ -0,0 +1,33 @@ +package com.whdc.legacy.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * Description: + * Created by XuSan on 2024/7/31. + * + * @author XuSan + * @version 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "备注内容配置分页查询") +public class ShCallWordDto extends FindPageDto { + + + @ApiModelProperty(value = "开始时间") + private String stm; + + @ApiModelProperty(value = "结束时间") + private String etm; + + @Schema(description="责任人类型1 行政责任人,包保责任人") + private String shAbType1; + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/ShCallsDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/ShCallsDto.java new file mode 100644 index 0000000..330fb68 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/ShCallsDto.java @@ -0,0 +1,45 @@ +package com.whdc.legacy.model.dto; + +import com.whdc.legacy.model.dto.ShAddressBookDto; +import com.whdc.common.utils.DateUtils; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; + +/** + * Description: + * Created by XuSan on 2024/7/30. + * + * @author XuSan + * @version 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "山洪责任人抽查分页查询") +public class ShCallsDto extends ShAddressBookDto { + + @ApiModelProperty(value = "抽查日期 格式: " + DateUtils.DATE_PATTERN1) + @NotNull(message = "日期不能为空") + private String date; + + @Schema(description="是否接听0:否,1是") + private String status; + + @Schema(description="抽查日期") + private String callTime; + + @Schema(description="山洪通讯录编号") + private Integer shAbId; + + @Schema(description="统计抽查开始日期") + private String stiStartTime; + + @Schema(description="统计抽查结束日期") + private String stiEndTime; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/ShPeriodDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/ShPeriodDto.java new file mode 100644 index 0000000..b2f52ac --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/ShPeriodDto.java @@ -0,0 +1,34 @@ +package com.whdc.legacy.model.dto; + +import com.whdc.legacy.model.dto.FindPageDto; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * Description: + * Created by XuSan on 2024/7/31. + * + * @author XuSan + * @version 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "防汛周期配置分页查询") +public class ShPeriodDto extends FindPageDto { + + + @ApiModelProperty(value = "开始时间") + private String stm; + + @ApiModelProperty(value = "结束时间") + private String etm; + + @Schema(description="防汛周期") + private String name; + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/SmsHolidayPageDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/SmsHolidayPageDto.java new file mode 100644 index 0000000..94476d5 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/SmsHolidayPageDto.java @@ -0,0 +1,28 @@ +package com.whdc.legacy.model.dto; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 节日短信分页查询DTO + * + * @author lyf + * @since 2025-09-26 + */ +@Data +public class SmsHolidayPageDto { + + @ApiModelProperty(value = "当前页", example = "1") + private Integer pageNumber = 1; + + @ApiModelProperty(value = "每页条数", example = "10") + private Integer pageSize = 10; + + @ApiModelProperty(value = "主题名称") + private String subjectName; + + public Page getPage() { + return new Page(pageNumber, pageSize); + } +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/SmsLogPageDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/SmsLogPageDto.java new file mode 100644 index 0000000..db2e01f --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/SmsLogPageDto.java @@ -0,0 +1,42 @@ +package com.whdc.legacy.model.dto; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 短信日志分页查询DTO + * + * @author lyf + * @since 2025-09-26 + */ +@Data +public class SmsLogPageDto { + + @ApiModelProperty(value = "当前页", example = "1") + private Integer pageNumber = 1; + + @ApiModelProperty(value = "每页条数", example = "10") + private Integer pageSize = 10; + + @ApiModelProperty(value = "开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date stm; + + @ApiModelProperty(value = "结束时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date etm; + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "电话号码") + private String phone; + + public Page getPage() { + return new Page(pageNumber, pageSize); + } +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/SmsSpecialistPageDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/SmsSpecialistPageDto.java new file mode 100644 index 0000000..1a9b9fd --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/SmsSpecialistPageDto.java @@ -0,0 +1,34 @@ +package com.whdc.legacy.model.dto; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 专家通讯录分页查询DTO + * + * @author lyf + * @since 2025-09-26 + */ +@Data +public class SmsSpecialistPageDto { + + @ApiModelProperty(value = "当前页", example = "1") + private Integer pageNumber = 1; + + @ApiModelProperty(value = "每页条数", example = "10") + private Integer pageSize = 10; + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "电话号码") + private String phone; + + @ApiModelProperty(value = "状态 1:有效 0:无效") + private Integer status; + + public Page getPage() { + return new Page(pageNumber, pageSize); + } +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/UserDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/UserDto.java new file mode 100644 index 0000000..ad9c667 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/UserDto.java @@ -0,0 +1,27 @@ +package com.whdc.legacy.model.dto; + +import io.swagger.annotations.ApiParam; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +/** + * @author 李赛 + * @date 2022-07-01 1:21 + */ +@Data +public class UserDto { + + + @ApiParam(value = "用户编号") + @NotEmpty(message = "用户编号不能为空") + private String id; + + @ApiParam(value = "旧密码") + @NotEmpty(message = "旧密码不能为空") + private String oldPassword; + + @ApiParam(value = "新密码") + @NotEmpty(message = "新密码不能为空") + private String newPassword; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/UserRoleDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/UserRoleDto.java new file mode 100644 index 0000000..dcc829e --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/UserRoleDto.java @@ -0,0 +1,31 @@ +package com.whdc.legacy.model.dto; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.whdc.legacy.model.group.Update; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * Description: + * Created by XuSan on 2024/5/29. + * + * @author XuSan + * @version 1.0 + */ +@Data +public class UserRoleDto { + + + @ApiModelProperty(value = "0:普通管理员,1:政区管理员,99:系统管理员") + @NotEmpty(message = "权限不能为空", groups = { Update.class}) + private String role; + + + @TableField("AB_ID") + @ApiModelProperty(value = "通讯录id") + @NotNull(message = "通讯录id不能为空", groups = { Update.class}) + private Integer abId; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/VxLoginDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/VxLoginDto.java new file mode 100644 index 0000000..4e354b7 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/VxLoginDto.java @@ -0,0 +1,22 @@ +package com.whdc.legacy.model.dto; + +import io.swagger.annotations.ApiParam; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +/** + * @author 李赛 + * @date 2022-07-01 1:21 + */ +@Data +public class VxLoginDto { + + @ApiParam(value = "微信编码") + @NotEmpty(message = "微信编码不能为空") + private String wxcode; + + @ApiParam(value = "手机编码") + @NotEmpty(message = "手机编码不能为空") + private String phoneCode; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/WarnDppleDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/WarnDppleDto.java new file mode 100644 index 0000000..02d0112 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/WarnDppleDto.java @@ -0,0 +1,51 @@ +package com.whdc.legacy.model.dto; + +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiParam; +import lombok.Data; + +@Data +public class WarnDppleDto { + @ApiModelProperty(value = "发布时间") + private String publishTime; + + @ApiModelProperty(value = "发布单位") + private String publishUnit; + + @ApiParam(value = "预警类型") + @ApiModelProperty(value = "预警类型", dataType = "java.lang.String") + private String warnSignalType; + + @ApiParam(value = "预警级别") + @ApiModelProperty(value = "预警级别", dataType = "java.lang.String") + private String warnSignalLevel; + +// @ApiParam(value = "行政区划") +// @ApiModelProperty(value = "行政区划", dataType = "java.lang.String") +// private String adnm; + + @ApiParam(value = "区县名称") + @ApiModelProperty(value = "区县名称", dataType = "java.lang.String") + private String cnnm; + + @ApiParam(value = "市名称") + @ApiModelProperty(value = "市名称", dataType = "java.lang.String") + private String ctnm; + + @ApiModelProperty(value = "预警内容") + private String content; + + @ApiParam(value = "状态") + @ApiModelProperty(value = "状态", dataType = "java.lang.String") + private String status; + + @ApiParam(value = "预警信息id") + @ApiModelProperty(value = "预警信息id", dataType = "java.lang.String") + private Integer warnid; + + @ApiModelProperty(value = "页数", dataType = "java.lang.Integer", example = "1") + private Integer pageNumber = 1; + + @ApiModelProperty(value = "条数", dataType = "java.lang.Integer", example = "999") + private Integer pageSize = 999; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/dto/WarningResponderDto.java b/module-legacy/src/main/java/com/whdc/legacy/model/dto/WarningResponderDto.java new file mode 100644 index 0000000..60d11d7 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/dto/WarningResponderDto.java @@ -0,0 +1,18 @@ +package com.whdc.legacy.model.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author xusan + * @date 2023年3月20日08:57:22 + */ +@Data +public class WarningResponderDto { + + @ApiModelProperty(value = "名字") + private String name; + + @ApiModelProperty(value = "手机号") + private String phone; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/AbUdR.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/AbUdR.java new file mode 100644 index 0000000..8740df8 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/AbUdR.java @@ -0,0 +1,46 @@ +package com.whdc.legacy.model.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; + + +/** + * @author xusan + * @date 2024-05-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "用户单位字典关联表") +@TableName("FXKH_TXL.AB_UD_R") +@AllArgsConstructor +@NoArgsConstructor +public class AbUdR extends Model implements Serializable { + private static final long serialVersionUID = 1L; + + @TableField("AD_ID") + @ApiModelProperty(value = "联系人id") + private Integer adId; + + @TableField("DICT_ID") + @ApiModelProperty(value = "字典id") + private String dictId; + + @TableField("SORT") + @ApiModelProperty(value = "序号") + private Integer sort; + + @TableField("TYPE") + @ApiModelProperty(value = "0:组织,1:单位,2:行政区划") + private String type; +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/AddressBook.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/AddressBook.java new file mode 100644 index 0000000..50f3fea --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/AddressBook.java @@ -0,0 +1,120 @@ +package com.whdc.legacy.model.entity; + +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.baomidou.mybatisplus.extension.activerecord.Model; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + + +/** + * @author xusan + * @date 2024-05-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "通讯录") +@TableName("FXKH_TXL.ADDRESS_BOOK") +public class AddressBook extends Model implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID",type = IdType.AUTO) + @ApiModelProperty(value = "id") + @NotNull(message = "id不能为空" , groups = {Update.class}) + private Integer id; + + + @NotEmpty(message = "姓名不能为空", groups = {Insert.class,Update.class}) + @TableField("NAME") + @ApiModelProperty(value = "姓名") + private String name; + + @TableField("PHONE") + @ApiModelProperty(value = "手机号") + private String phone; + + @TableField("TEL") + @ApiModelProperty(value = "电话") + private String tel; + + @TableField("ADCD") + @ApiModelProperty(value = "行政区划") + private String adcd; + + @TableField("FAXES") + @ApiModelProperty(value = "传真") + private String faxes; + + @TableField("ORGANIZATION") + @ApiModelProperty(value = "组织") + private String organization; + + @TableField(exist = false) + @ApiModelProperty(value = "组织名称") + private String oname; + + @TableField("POSITION") + @ApiModelProperty(value = "职务") + private String position; + + @TableField("RESPONSIBILITY") + @ApiModelProperty(value = "职责") + private String responsibility; + + @TableField("COMMENTS") + @ApiModelProperty(value = "备注") + private String comments; + + @TableField("URL") + @ApiModelProperty(value = "图片路径") + private String url; + + @TableField("SORT") + @ApiModelProperty(value = "序号") + private Integer sort; + + @TableField("V") + @ApiModelProperty(value = "版本") + private Integer v; + + @TableField(exist = false) + @ApiModelProperty(value = "创建人id") + private String createId; + + @TableField(exist = false) + @ApiModelProperty(value = "权限 0:普通管理员,1:政区管理员,99:系统管理员") + @NotEmpty(message = "权限不能为空", groups = {Insert.class}) + private String role; + + @TableField(exist = false) + @ApiModelProperty(value = "0:组织,1:单位") + private String type; + + @TableField("IS_PASS") + @ApiModelProperty(value = "是否放行, 放行:true,拦截:false") + private Boolean isPass; + + @TableField("OPENID") + @ApiModelProperty(value = "openid") + private String openid; + + /** + * 责任人级别 + */ + @TableField(value = "level") + @Schema(description = "1,2,3,4") + private Integer level; +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/AddressBookCity.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/AddressBookCity.java new file mode 100644 index 0000000..dbfd020 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/AddressBookCity.java @@ -0,0 +1,98 @@ +package com.whdc.legacy.model.entity; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import com.baomidou.mybatisplus.annotation.*; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** + * Description: + * Created by XuSan on 2024/8/21. + * + * @author XuSan + * @version 1.0 + */ +@Schema(description = "市县责任人通讯录") +@Data +@Accessors(chain = true) +@TableName(value = "FXKH_TXL.ADDRESS_BOOK_CITY",autoResultMap = true) +public class AddressBookCity implements Serializable { + + + public final static String thisTableName = "AddressBookCity"; + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + @Schema(description = "主键id") + @NotNull(message = "主键id不能为空",groups = Update.class) + @Excel(name = "序号", width = 20,orderNum = "0") + private Integer id; + + /** + * 职务 + */ + @TableField(value = "UNIT") + @Schema(description = "职务") + @Size(max = 50, message = "职务最大长度要小于 50") + @Excel(name = "单位", width = 40,orderNum = "1") + private String unit; + + + /** + * 名字 + */ + @TableField(value = "name") + @Schema(description = "姓名") + @Size(max = 50, message = "名字最大长度要小于 50") + @NotEmpty(message = "姓名不能为空",groups = {Insert.class,Update.class}) + @Excel(name = "姓名", width = 20,orderNum = "2") + private String name; + + /** + * 职务 + */ + @TableField(value = "position") + @Schema(description = "职务") + @Size(max = 50, message = "职务最大长度要小于 50") + @Excel(name = "职务", width = 20,orderNum = "3") + private String position; + + /** + * 手机号 + */ + @TableField(value = "phone") + @Schema(description = "电话") + @Size(max = 50, message = "电话最大长度要小于 50") + @NotEmpty (message = "电话不能为空",groups = {Insert.class,Update.class}) + @Excel(name = "电话", width = 20,orderNum = "4") + private String phone; + + /** + * 备注 + */ + @TableField(value = "COMMENTS",updateStrategy = FieldStrategy.IGNORED) + @Schema(description = "备注") + @Size(max = 50, message = "备注最大长度要小于 50") + @Excel(name = "备注", width = 20,orderNum = "4") + private String comments; + + /** + * 备注 + */ + @TableField(value = "DEL") + @Schema(description = "删除标识:1:未删除,0:已删除") + private String del; + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/Adinfo.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/Adinfo.java new file mode 100644 index 0000000..1d9be0e --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/Adinfo.java @@ -0,0 +1,39 @@ +package com.whdc.legacy.model.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import java.io.Serializable; + + +/** + * @author xusan + * @date 2024-05-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "行政区划基础信息") +@TableName("FXKH_TXL.ADINFO") +public class Adinfo extends Model implements Serializable { + private static final long serialVersionUID = 1L; + + @NotEmpty(message = "政区编码不能为空", groups = {Insert.class,Update.class}) + @TableField("ADCD") + @ApiModelProperty(value = "政区编码") + private String adcd; + + @NotEmpty(message = "政区名称不能为空", groups = {Insert.class,Update.class}) + @TableField("ADNM") + @ApiModelProperty(value = "政区名称") + private String adnm; +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/Fc.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/Fc.java new file mode 100644 index 0000000..2bf2cc3 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/Fc.java @@ -0,0 +1,51 @@ +package com.whdc.legacy.model.entity; + +import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode;import lombok.experimental.Accessors; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull;import java.io.Serializable; + + +/** + * @author xusan + * @date 2024-05-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "置顶") +@TableName("FXKH_TXL.FC") +public class Fc extends Model implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID",type = IdType.AUTO) + @ApiModelProperty(value = "id") + @NotNull(message = "id不能为空" , groups = {Update.class}) + private Integer id; + + + @TableField("USER_ID") + @ApiModelProperty(value = "用户编号") + private Integer userId; + + @NotNull(message = "关联编号不能为空", groups = {Insert.class,Update.class}) + @TableField("AB_ID") + @ApiModelProperty(value = "关联编号") + private Integer abId; + + @TableField("SORT") + @ApiModelProperty(value = "序号") + private Integer sort; + + @TableField("TYPE") + @ApiModelProperty(value = "0:常用联系人,1:置顶联系人,2: 组织置顶,3: 单位置顶,4: 行政区划置顶") + @NotNull(message = "排序类型不能为空", groups = {Insert.class,Update.class}) + private String type; +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/LoginInfo.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/LoginInfo.java new file mode 100644 index 0000000..d38ff22 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/LoginInfo.java @@ -0,0 +1,59 @@ +package com.whdc.legacy.model.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + + +/** + * @author xusan + * @date 2024-05-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "登录日志") +@TableName("FXKH_TXL.LOGIN_INFO") +public class LoginInfo extends Model implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + @ApiModelProperty(value = "id") + @NotNull(message = "id不能为空", groups = {Update.class}) + private Integer id; + + + @TableField("IP") + @ApiModelProperty(value = "") + private String ip; + + @TableField("CREATE_ID") + @ApiModelProperty(value = "新增人id") + @NotNull(message = "id不能为空", groups = {Insert.class}) + private String createId; + + @TableField("CREATE_TIME") + @ApiModelProperty(value = "新增时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @NotEmpty(message = "0:密码登录 1:验证码登录不能为空", groups = {Insert.class, Update.class}) + @TableField("TYPE") + @ApiModelProperty(value = "0:密码登录 1:验证码登录") + private String type; +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/Organization.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/Organization.java new file mode 100644 index 0000000..1190439 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/Organization.java @@ -0,0 +1,75 @@ +package com.whdc.legacy.model.entity; + +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.baomidou.mybatisplus.extension.activerecord.Model; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import com.whdc.legacy.model.vo.AdcdTree; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + + +/** + * @author xusan + * @date 2024-05-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "组织表") +@TableName("FXKH_TXL.ORGANIZATION") +public class Organization extends Model implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID",type = IdType.AUTO) + @ApiModelProperty(value = "id") + @NotNull(message = "id不能为空" , groups = {Update.class}) + private Integer id; + + +// @NotEmpty(message = "编号不能为空", groups = {Insert.class,Update.class}) +// @TableField("OBJ_ID") +// @ApiModelProperty(value = "编号") +// private String objId; + + @NotEmpty(message = "名称不能为空", groups = {Insert.class,Update.class}) + @TableField("NAME") + @ApiModelProperty(value = "名称") + private String name; + + @TableField("SORT") + @ApiModelProperty(value = "序号") + private Integer sort; + + @TableField(exist = false) + @ApiModelProperty(value = "置顶排序序号") + private Integer fsort; + + @TableField(exist = false) + @ApiModelProperty(value = "置顶id") + private Integer fcid; + + @TableField(exist = false) + @ApiModelProperty(value = "置顶类型") + private String type; + + @TableField(exist = false) + @ApiModelProperty(value = "单位") + private List unitDicts; + + @TableField(exist = false) + @ApiModelProperty(value = "行政区划") + private List adinfoList; + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/QXWarning.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/QXWarning.java new file mode 100644 index 0000000..584d2e8 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/QXWarning.java @@ -0,0 +1,119 @@ +package com.whdc.legacy.model.entity; + +import cn.afterturn.easypoi.excel.annotation.Excel; +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 com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiParam; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + +@Data +@Accessors(chain = true) // chain = true 实现链式调用 +@ApiModel(value = "QXWARNING 对象", description = "气象预警表") +@JsonInclude(JsonInclude.Include.NON_NULL) // 表示序列化非null属性 +@TableName("FXKH_TXL.QXWARNING") +public class QXWarning { + @TableId(value = "ID",type = IdType.AUTO) + @ApiModelProperty(value = "id") + private Integer id; + + @TableField("CREATE_TIME") + @ApiModelProperty(value = "预警信息生成时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @Excel(width = 25,name = "预警信息发布时间",exportFormat = "yyyy-MM-dd HH:mm:ss",orderNum = "3") + @TableField("PUBLISH_TIME") + @ApiModelProperty(value = "预警信息发布时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date publishTime; + + @TableField("START_TIME") + @ApiModelProperty(value = "预警信息开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date startTime; + + @TableField("END_TIME") + @ApiModelProperty(value = "预警信息结束时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date endTime; + + @Excel(width = 25,name = "预警类型",orderNum = "4") + @ApiParam(value = "预警类型") + @ApiModelProperty(value = "预警类型", dataType = "java.lang.String") + private String warnSignalType; + + @Excel(width = 25,name = "预警级别",orderNum = "5") + @ApiParam(value = "预警级别") + @ApiModelProperty(value = "预警级别", dataType = "java.lang.String") + private String warnSignalLevel; + + @Excel(width = 25,name = "发布单位",orderNum = "2") + @ApiParam(value = "发布单位") + @ApiModelProperty(value = "发布单位", dataType = "java.lang.String") + private String publishUnit; + + @Excel(width = 40,name = "预警内容",orderNum = "6") + @ApiParam(value = "预警内容") + @ApiModelProperty(value = "预警内容", dataType = "java.lang.String") + private String content; + + @TableField("WARNID") + @ApiModelProperty(value = "预警信息ID") + private Integer warnid; + + @Excel(width = 25,name = "市级",orderNum = "0") + @TableField("CTNM") + @ApiModelProperty(value = "预警市名称", dataType = "java.lang.String") + private String ctnm; + + @Excel(width = 40,name = "县级",orderNum = "1") + @TableField("CNNM") + @ApiModelProperty(value = "预警县名称", dataType = "java.lang.String") + private String cnnm; + + @TableField(exist = false) + @ApiModelProperty(value = "预警通知时间") + @Excel(width = 25,name = "呼叫时间",exportFormat = "yyyy-MM-dd HH:mm:ss",orderNum = "9") + private Date callTime; + + @TableField(exist = false) + @ApiModelProperty(value = "预警信息处理时间", dataType = "java.lang.String") + @Excel(width = 25,name = "处理时间",exportFormat = "yyyy-MM-dd HH:mm:ss",orderNum = "8") + private Date handleTime; + + @TableField(exist = false) + private String effectId; + + @TableField(exist = false) + @Excel(width = 25,name = "状态",orderNum = "7") + private String status; + + @TableField(exist = false) + @ApiModelProperty(value="被呼叫人姓名") + @Excel(width = 25,name = "被叫人",orderNum = "10") + private String calledPerson; + + @TableField(exist = false) + @ApiModelProperty(value="被呼叫人职务") + @Excel(width = 25,name = "职务",orderNum = "11") + private String calledPosition; + + @TableField(exist = false) + @ApiModelProperty(value="被呼叫人手机号") + @Excel(width = 25,name = "职务",orderNum = "12") + private String calledPhone; + + @TableField(exist = false) + @ApiModelProperty(value="呼叫人姓名") + @Excel(width = 25,name = "呼叫人",orderNum = "13") + private String callPerson; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/ShAddressBook.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/ShAddressBook.java new file mode 100644 index 0000000..554250f --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/ShAddressBook.java @@ -0,0 +1,170 @@ +package com.whdc.legacy.model.entity; + + +import cn.afterturn.easypoi.excel.annotation.Excel; +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.whdc.legacy.model.entity.ShCalls; +import com.whdc.legacy.model.group.Update; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.List; + +/** + * 描述: 山洪责任人通讯录 + * author: xusan + * date: 2024-07-29 17:27:25 + */ +@Schema(description = "山洪责任人通讯录") +@Data +@Accessors(chain = true) +@TableName(value = "FXKH_TXL.SH_ADDRESS_BOOK",autoResultMap = true) +public class ShAddressBook implements Serializable { + + public final static String thisTableName = "ShAddressBook"; + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + @Schema(description = "主键id") + @NotNull(message = "主键id不能为空",groups = Update.class) + @Size(max = 4, message = "主键id最大长度要小于 4") + private Integer id; + + /** + * 乡 + */ + @TableField(value = "area") + @Schema(description = "乡") + @Size(max = 50, message = "乡最大长度要小于 50") + @Excel(name = "乡", width = 20,orderNum = "3") + private String area; + + /** + * 职务 + */ + @TableField(value = "position") + @Schema(description = "职务") + @Size(max = 50, message = "职务最大长度要小于 50") + @Excel(name = "职务", width = 20,orderNum = "7") + private String position; + + /** + * 村 + */ + @TableField(value = "village") + @Schema(description = "行政村") + @Size(max = 50, message = "行政村最大长度要小于 50") + @Excel(name = "行政村", width = 20,orderNum = "4") + private String village; + + /** + * 名字 + */ + @TableField(value = "name") + @Schema(description = "责任人姓名") + @Size(max = 50, message = "名字最大长度要小于 50") + @Excel(name = "责任人姓名", width = 20,orderNum = "6") + private String name; + + /** + * 责任人类型 县级,乡级,村级, 县干部,乡干部 + */ + @TableField(value = "type2") + @Schema(description = "责任人类型2 县级,乡级,村级, 县干部,乡干部") + @Size(max = 50, message = "责任人类型2 县级,乡级,村级, 县干部,乡干部最大长度要小于 50") + @Excel(name = "责任人类型", width = 20,orderNum = "5") + private String type2; + + /** + * 手机号 + */ + @TableField(value = "phone") + @Schema(description = "手机号") + @Size(max = 50, message = "手机号最大长度要小于 50") + @Excel(name = "手机号", width = 20,orderNum = "8") + private String phone; + + /** + * 市 + */ + @TableField(value = "city") + @Schema(description = "市") + @Size(max = 50, message = "市最大长度要小于 50") + @Excel(name = "市", width = 20,orderNum = "1") + private String city; + + /** + * 县 + */ + @TableField(value = "county") + @Schema(description = "县") + @Size(max = 50, message = "县最大长度要小于 50") + @Excel(name = "县", width = 20,orderNum = "2") + private String county; + + /** + * 责任人类型1 行政责任人,包保责任人 + */ + @TableField(value = "type1") + @Schema(description = "责任人类型1 行政责任人,包保责任人") + @Size(max = 50, message = "责任人类型1 行政责任人,包保责任人最大长度要小于 50") + private String type1; + + /** + * 负责区域 + */ + @TableField(value = "land") + @Schema(description = "负责区域") + @Size(max = 50, message = "负责区域最大长度要小于 50") + private String land; + + /** + * 顺序 + */ + @TableField(value = "sort") + @Schema(description = "顺序排序") + @Excel(name = "序号", width = 20,orderNum = "0") + private Integer sort; + + /** + * 是否抽查 + */ + @TableField(value = "is_spot_check") + @Schema(description = "是否抽查:0:不抽查,1:抽查") + private String isSpotCheck; + + /** + * 是否接听 + */ + @TableField(value = "call_status") + @Schema(description = "是否接听0:否,1是") + private String callStatus; + + /** + * 是否接听 + */ + @TableField(value = "del") + @Schema(description = "是否删除0:是,1:否") + private String del; + + @TableField(exist = false) + List list; + + /** + * 责任人级别 + */ + @TableField(value = "level") + @Schema(description = "1,2,3,4") + private Integer level; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/ShCallWord.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/ShCallWord.java new file mode 100644 index 0000000..69fecaa --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/ShCallWord.java @@ -0,0 +1,73 @@ +package com.whdc.legacy.model.entity; + + +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 com.whdc.legacy.model.group.Update; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.Date; + +/** +* 描述: 备注 +* author: xusan +* date: 2024-07-29 17:27:25 +*/ +@Schema(description="备注") +@Data +@TableName("FXKH_TXL.SH_CALL_WORD") +public class ShCallWord implements Serializable { + + public final static String thisTableName = "ShCallWord"; + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value="id", type= IdType.AUTO) + @Schema(description="主键id") + @NotNull(message = "主键id不能为空",groups = Update.class) + @Size(max = 4,message = "主键id最大长度要小于 4") + private Integer id; + + /** + * 防汛周期ID + */ + @TableField(value="sh_period_id") + @Schema(description="防汛周期ID") + @Size(max = 4,message = "防汛周期ID最大长度要小于 4") + private Integer shPeriodId; + + /** + * 备注内容 + */ + @TableField(value="word") + @Schema(description="备注内容") + @Size(max = 2000,message = "备注内容最大长度要小于 2000") + private String word; + + /** + * 责任人类型1 行政责任人,包保责任人 + */ + @TableField(value="sh_ab_type1") + @Schema(description="责任人类型1 行政责任人,包保责任人") + @Size(max = 50,message = "责任人类型1 行政责任人,包保责任人最大长度要小于 50") + private String shAbType1; + + /** + * 责任人类型1 行政责任人,包保责任人 + */ + @TableField(value="create_time") + @Schema(description="创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/ShCalls.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/ShCalls.java new file mode 100644 index 0000000..ca8adc2 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/ShCalls.java @@ -0,0 +1,107 @@ +package com.whdc.legacy.model.entity; + + +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 com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.Date; + +/** +* 描述: 抽查日志 +* author: xusan +* date: 2024-07-29 17:27:25 +*/ +@Schema(description="抽查日志") +@Data +@TableName("FXKH_TXL.SH_CALLS") +public class ShCalls implements Serializable { + + public final static String thisTableName = "ShCalls"; + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value="id", type= IdType.AUTO) + @Schema(description="id") + @Size(max = 4,message = "id最大长度要小于 4") + private Integer id; + + /** + * 是否接听0:否,1是 + */ + @TableField(value="status") + @Schema(description="是否接听0:否,1是") + @Size(max = 2,message = "是否接听0:否,1是最大长度要小于 2") + private String status; + + /** + * 山洪通讯录编号 + */ + @TableField(value="sh_ab_id") + @Schema(description="山洪通讯录编号") + @NotNull(message = "山洪通讯录编号不能为空", groups = {Insert.class, Update.class}) + @Size(max = 4,message = "山洪通讯录编号最大长度要小于 4") + private Integer shAbId; + + /** + * 知晓本人为山洪责任人, 0:否,1:是 + */ + @TableField(value="know") + @Schema(description="知晓本人为山洪责任人, 0:否,1:是") + @Size(max = 2,message = "知晓本人为山洪责任人, 0:否,1:是最大长度要小于 2") + @Pattern(message = "知晓本人为山洪责任人, 0:否,1:是", regexp = "[01]") + @NotNull(message = "知晓本人为山洪责任人不能为空", groups = {Insert.class, Update.class}) + private String know; + + /** + * 抽查时间 + */ + @TableField(value="call_time") + @Schema(description="抽查时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @NotNull(message = "抽查时间不能为空", groups = {Insert.class, Update.class}) + private Date callTime; + + /** + * 叫应状态: 0:接通,1:拒接,2:忙线 + */ + @TableField(value="call_type") + @Schema(description="叫应状态: 0:接通,1:拒接,2:忙线") + @Size(max = 2,message = "叫应状态: 0:接通,1:拒接,2:忙线最大长度要小于 2") + @Pattern(message = "叫应状态: 0:接通,1:拒接,2:忙线", regexp = "[012]") + @NotNull(message = "叫应状态不能为空", groups = {Insert.class, Update.class}) + private String callType; + + /** + * 通话类型: 0:拨打,1:回拨 + */ + @TableField(value="type") + @Schema(description="通话类型: 0:拨打,1:回拨") + @Size(max = 2,message = "通话类型: 0:拨打,1:回拨最大长度要小于 2") + @Pattern(message = "通话类型: 0:拨打,1:回拨", regexp = "[01]") + @NotNull(message = "通话类型不能为空", groups = {Insert.class, Update.class}) + private String type; + + /** + * 叫应备注 + */ + @TableField(value="remark") + @Schema(description="叫应备注") + @Size(max = 500,message = "叫应备注") + @NotNull(message = "叫应备注不能为空", groups = {Insert.class, Update.class}) + private String remark; + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/ShPeriod.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/ShPeriod.java new file mode 100644 index 0000000..0f86074 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/ShPeriod.java @@ -0,0 +1,55 @@ +package com.whdc.legacy.model.entity; + + +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.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.Date; + +/** +* 描述: 防汛周期 +* author: xusan +* date: 2024-07-29 17:27:25 +*/ +@Schema(description="防汛周期") +@Data +@TableName("FXKH_TXL.SH_PERIOD") +public class ShPeriod implements Serializable { + + public final static String thisTableName = "ShPeriod"; + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value="id", type= IdType.AUTO) + @Schema(description="主键id") + @Size(max = 4,message = "主键id最大长度要小于 4") + private Integer id; + + /** + * 新增时间 + */ + @TableField(value="create_time") + @Schema(description="新增时间") + @Size(max = 8,message = "新增时间最大长度要小于 8") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + /** + * 防汛周期 + */ + @TableField(value="name") + @Schema(description="防汛周期") + @Size(max = 50,message = "防汛周期最大长度要小于 50") + private String name; + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/UnitDict.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/UnitDict.java new file mode 100644 index 0000000..6803be1 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/UnitDict.java @@ -0,0 +1,69 @@ +package com.whdc.legacy.model.entity; + +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.baomidou.mybatisplus.extension.activerecord.Model; +import com.whdc.legacy.model.group.Find; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + + +/** + * @author xusan + * @date 2024-05-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "单位字典表") +@TableName("FXKH_TXL.UNIT_DICT") +public class UnitDict extends Model implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID",type = IdType.AUTO) + @ApiModelProperty(value = "id") + @NotNull(message = "id不能为空" , groups = {Update.class}) + private Integer id; + + + @NotEmpty(message = "名称不能为空", groups = {Insert.class,Update.class}) + @TableField("NAME") + @ApiModelProperty(value = "名称") + private String name; + + @NotNull(message = "序号不能为空", groups = {Insert.class,Update.class}) + @TableField("SORT") + @ApiModelProperty(value = "序号") + private Integer sort; + + @NotEmpty(message = "组织类型Id不能为空", groups = {Insert.class,Update.class, Find.class}) + @TableField("O_ID") +// @ApiModelProperty(value = "1:省防指,2: 省防办,3: 省防指成员单位,4: 市、县防指、防办, 5: 主要湖泊及涉湖泵站,6:重要提防,7: 主要蓄滞洪区,8: 大型水库大坝") + @ApiModelProperty(value = "组织类型Id") + private Integer OId; + + @TableField(exist = false) + @ApiModelProperty(value = "置顶排序") + private Integer fsort; + + + @TableField(exist = false) + @ApiModelProperty(value = "置顶id") + private Integer fcid; + + + @TableField(exist = false) + @ApiModelProperty(value = "置顶类型") + private String type = "3"; +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/User.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/User.java new file mode 100644 index 0000000..ceabb7f --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/User.java @@ -0,0 +1,69 @@ +package com.whdc.legacy.model.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + + +/** + * @author xusan + * @date 2024-05-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "用户表") +@TableName("FXKH_TXL.USERS") +public class User extends Model implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + @ApiModelProperty(value = "id") +// @NotNull(message = "id不能为空" , groups = {Update.class}) + private Integer id; + + @NotEmpty(message = "用户名不能为空", groups = {Insert.class, Update.class}) + @TableField("USERNAME") + @ApiModelProperty(value = "用户名") + private String username; + + + @NotEmpty(message = "密码不能为空", groups = {Insert.class, Update.class}) + @TableField("PASSWORD") + @ApiModelProperty(value = "密码") + private String password; + + @TableField("SALT") + @ApiModelProperty(value = "盐值") + private String salt; + + @TableField("AB_ID") + @ApiModelProperty(value = "通讯录id") + @NotNull(message = "通讯录id不能为空", groups = {Insert.class, Update.class}) + private Integer abId; + + @TableField("LAST_DATE") + @ApiModelProperty(value = "最后登录时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date lastLoginDate; + + @TableField("ROLE") + @ApiModelProperty(value = "0:普通管理员,1:政区管理员,99:系统管理员") + private String role; + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/Versions.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/Versions.java new file mode 100644 index 0000000..daf6d91 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/Versions.java @@ -0,0 +1,80 @@ +package com.whdc.legacy.model.entity; + +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.baomidou.mybatisplus.extension.activerecord.Model; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.whdc.legacy.model.group.Update; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + + +/** + * @author xusan + * @date 2024-05-11 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "通讯录操作日志") +@TableName("FXKH_TXL.AB_INFO") +public class Versions extends Model implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID",type = IdType.AUTO) + @ApiModelProperty(value = "id") + @NotNull(message = "id不能为空" , groups = {Update.class}) + private Integer id; + + + @TableField("JSON") + @ApiModelProperty(value = "数据") + private String json; + + @TableField("AB_ID") + @ApiModelProperty(value = "通讯录编号") + private Integer abId; + + @TableField("VERSION") + @ApiModelProperty(value = "版本号") + private Integer version; + + @TableField("ADCD") + @ApiModelProperty(value = "行政区划") + private String adcd; + + @TableField("CREATE_ID") + @ApiModelProperty(value = "新增人id") + private String createId; + + @TableField("CREATE_TIME") + @ApiModelProperty(value = "新增时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @TableField("TYPE") + @ApiModelProperty(value = "0:添加用户,1:修改用户,2:修改权限,3:删除用户") + private String type; + + @TableField(exist = false) + @ApiModelProperty(value = "姓名") + private String name; + + @TableField(exist = false) + @ApiModelProperty(value = "手机号") + private String phone; + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/WarnMsgFB.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/WarnMsgFB.java new file mode 100644 index 0000000..6ac047a --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/WarnMsgFB.java @@ -0,0 +1,74 @@ +package com.whdc.legacy.model.entity; + +import cn.afterturn.easypoi.excel.annotation.Excel; +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 com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + +@Data +@Accessors(chain = true) // chain = true 实现链式调用 +@ApiModel(value = "WARNMSG_FEEDBACK 对象", description = "预警消息叫应反馈表") +@JsonInclude(JsonInclude.Include.NON_NULL) // 表示序列化非null属性 +@TableName("FXKH_TXL.WARNMSG_FEEDBACK") +public class WarnMsgFB { + + @TableId(value = "ID",type = IdType.AUTO) + @ApiModelProperty(value = "id") + private Integer id; + + @TableField("WARNID") + @ApiModelProperty(value = "预警信息ID") + @Excel(name = "warnid") + private Integer warnid; + + @TableField("PUBLISH_TIME") + @ApiModelProperty(value = "预警信息发布时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "publishTime") + private Date publishTime; + + @TableField("HANDLE_TIME") + @ApiModelProperty(value = "预警信息处理时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "handleTime") + private Date handleTime; + + @TableField("CALL_TIME") + @ApiModelProperty(value = "预警信息呼叫时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "Call_Time") + private Date callTime; + + @TableField("CALLED_PERSON") + @ApiModelProperty(value="被呼叫人姓名") + @Excel(name = "Call_Name") + private String calledPerson; + + @TableField("CALLED_POSITION") + @ApiModelProperty(value="被呼叫人职务") + @Excel(name = "Call_Deparment") + private String calledPosition; + + @TableField("CALLED_PHONE") + @ApiModelProperty(value="被呼叫人手机号") + @Excel(name = "Call_Telephone") + private String calledPhone; + + @TableField("CALL_PERSON") + @ApiModelProperty(value="呼叫人姓名") + @Excel(name = "Call_User") + private String callPerson; + + @TableField(exist = false) + @Excel(name = "Effect_Id") + private String effectId; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/entity/WarningResponder.java b/module-legacy/src/main/java/com/whdc/legacy/model/entity/WarningResponder.java new file mode 100644 index 0000000..b320244 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/entity/WarningResponder.java @@ -0,0 +1,147 @@ +package com.whdc.legacy.model.entity; + +import cn.afterturn.easypoi.excel.annotation.Excel; +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.baomidou.mybatisplus.extension.activerecord.Model; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.whdc.common.exception.MyException; +import com.whdc.legacy.model.group.Update; +import com.whdc.common.utils.SymmetricEncryption; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; +import java.util.UUID; + +/** + * Description: + * Created by XuSan on 2024/6/11. + * + * @author XuSan + * @version 1.0 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@ApiModel(description = "预警责任人") +@TableName("FXKH_TXL.ADDRESS_BOOK_OLD") +@Slf4j +public class WarningResponder extends Model implements Serializable { + + + @TableId(value = "ID",type = IdType.AUTO) + @ApiModelProperty(value = "id") + @NotNull(message = "id不能为空" , groups = {Update.class}) + private Integer id; + + @Excel(name = "市", width = 20) + @TableField("CTNM") + @ApiModelProperty(value = "市") + private String ctnm; + + @Excel(name = "区县", width = 20) + @TableField("CNNM") + @ApiModelProperty(value = "区县") + private String cnnm; + + @Excel(name = "姓名", width = 20) + @TableField("NAME") + @ApiModelProperty(value = "姓名") + private String name; + + @Excel(name = "职务", width = 50) + @TableField("POSITION") + @ApiModelProperty(value = "职务") + private String position; + + @Excel(name = "手机号", width = 30) + @TableField("PHONE") + @ApiModelProperty(value = "手机号") + private String phone; + + @TableField("SALT") + @ApiModelProperty(value = "盐") + private String salt; + +// @Excel(name = "创建时间") + @TableField("CREATE_TIME") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty(value = "创建时间") + private Date createTime; + + public WarningResponder encryptPhone(){ + if (StringUtils.isBlank(this.salt)){ + this.salt = UUID.randomUUID().toString().replaceAll("-", ""); + } + try { + if (StringUtils.isNotBlank(this.phone)){ + this.phone = SymmetricEncryption.encrypt(this.phone,this.salt); + } + } catch (Exception e) { + log.info(phone + " " + salt); + throw new MyException("加密失败",e); + } + return this; + } + + public WarningResponder decryptPhone(){ + try { + if (StringUtils.isNotBlank(this.phone) && StringUtils.isNotBlank(this.salt)){ + this.phone = SymmetricEncryption.decrypt(this.phone,this.salt); + } + }catch (Exception e){ + log.info(phone + " " + salt); + throw new MyException("解密失败",e); + } + return this; + } + + public static void main(String[] args) { + WarningResponder a = new WarningResponder(); + //徐 18507181623 13545369643移动 + //文 18627085672 13707166566移动苹果 + //梁 18507191089 + //18507181673,陆 + //18607181767。孔 + //18507181586,韩 + //18507191372 王书坦 + //18671662204 杨胜利 + //舒康18607181321 + //18607181503 冯阳 + //18607181960 汪登 + //18607181633 张梁 + //18607181867 陶亚明 + //18607251280 熊胜 + //18507191276 李陶 + //18607251169 王锐 + //杨喆 18872619396 15327337261 + a.setPhone("15327337261"); + a.encryptPhone(); + System.out.println(a.salt); + System.out.println(a.phone); + } + + /** + * 责任人级别 + */ + @TableField(value = "LEVEL", fill = FieldFill.UPDATE) + private Integer level; + + /** + * 责任人级别 + */ + @TableField(exist = false) + @Excel(name = "预警呼叫等级", width = 20) + private String levelLabel; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/enums/CallType.java b/module-legacy/src/main/java/com/whdc/legacy/model/enums/CallType.java new file mode 100644 index 0000000..557071f --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/enums/CallType.java @@ -0,0 +1,72 @@ +package com.whdc.legacy.model.enums; + +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * @author xusan + * @date 2022/7/14 16:55 + * 通话类型枚举类 + */ +public enum CallType { + + R000("0", "拨打"), + R001("1", "回拨"), + R099("99", "系统管理员"); + + + private String name; + private String value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + private CallType(String name, String value) { + this.name = name; + this.value = value; + } + + public static Map map() { + Map map = new HashMap<>(); + CallType[] values = CallType.values(); + for (CallType e : values) { + map.put(e.getValue(), e); + } + return map; + } + + public static Map mapName() { + Map map = new HashMap<>(); + CallType[] values = CallType.values(); + for (CallType e : values) { + map.put(e.getName(), e); + } + return map; + } + + public static CallType getByValue(String value) { + if (Objects.isNull(value)) return null; + return map().get(value); + } + + public static CallType getByName(String name) { + if (StringUtils.isEmpty(name)) return null; + return mapName().get(name); + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/enums/CallingType.java b/module-legacy/src/main/java/com/whdc/legacy/model/enums/CallingType.java new file mode 100644 index 0000000..49f6a58 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/enums/CallingType.java @@ -0,0 +1,72 @@ +package com.whdc.legacy.model.enums; + +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * @author xusan + * @date 2022/7/14 16:55 + * 通话类型枚举类 + */ +public enum CallingType { + + R000("0", "接通"), + R001("1", "拒接"), + R099("2", "忙线"); + + + private String name; + private String value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + private CallingType(String name, String value) { + this.name = name; + this.value = value; + } + + public static Map map() { + Map map = new HashMap<>(); + CallingType[] values = CallingType.values(); + for (CallingType e : values) { + map.put(e.getValue(), e); + } + return map; + } + + public static Map mapName() { + Map map = new HashMap<>(); + CallingType[] values = CallingType.values(); + for (CallingType e : values) { + map.put(e.getName(), e); + } + return map; + } + + public static CallingType getByValue(String value) { + if (Objects.isNull(value)) return null; + return map().get(value); + } + + public static CallingType getByName(String name) { + if (StringUtils.isEmpty(name)) return null; + return mapName().get(name); + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/enums/Role.java b/module-legacy/src/main/java/com/whdc/legacy/model/enums/Role.java new file mode 100644 index 0000000..44a32dd --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/enums/Role.java @@ -0,0 +1,72 @@ +package com.whdc.legacy.model.enums; + +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * @author xusan + * @date 2022/7/14 16:55 + * 通讯录操作类型枚举类 + */ +public enum Role { + + R000("0", "普通管理员"), + R001("1", "政区管理员"), + R099("99", "系统管理员"); + + + private String name; + private String value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + private Role(String name, String value) { + this.name = name; + this.value = value; + } + + public static Map map() { + Map map = new HashMap<>(); + Role[] values = Role.values(); + for (Role e : values) { + map.put(e.getValue(), e); + } + return map; + } + + public static Map mapName() { + Map map = new HashMap<>(); + Role[] values = Role.values(); + for (Role e : values) { + map.put(e.getName(), e); + } + return map; + } + + public static Role getByValue(String value) { + if (Objects.isNull(value)) return null; + return map().get(value); + } + + public static Role getByName(String name) { + if (StringUtils.isEmpty(name)) return null; + return mapName().get(name); + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/enums/VersionsType.java b/module-legacy/src/main/java/com/whdc/legacy/model/enums/VersionsType.java new file mode 100644 index 0000000..af83a0d --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/enums/VersionsType.java @@ -0,0 +1,74 @@ +package com.whdc.legacy.model.enums; + +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * @author xusan + * @date 2022/7/14 16:55 + * 通讯录操作类型枚举类 + */ +public enum VersionsType { + + ADD("0", "添加用户"), + UPDATE("1", "修改用户"), + UPDATE_ROLE("2", "修改权限"), + DEL("3", "删除用户"), + WHITE("4", "设置白名单"); + + + private String name; + private String value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + private VersionsType(String name, String value) { + this.name = name; + this.value = value; + } + + public static Map map() { + Map map = new HashMap<>(); + VersionsType[] values = VersionsType.values(); + for (VersionsType e : values) { + map.put(e.getValue(), e); + } + return map; + } + + public static Map mapName() { + Map map = new HashMap<>(); + VersionsType[] values = VersionsType.values(); + for (VersionsType e : values) { + map.put(e.getName(), e); + } + return map; + } + + public static VersionsType getByValue(String value) { + if (Objects.isNull(value)) return null; + return map().get(value); + } + + public static VersionsType getByName(String name) { + if (StringUtils.isEmpty(name)) return null; + return mapName().get(name); + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/group/Delete.java b/module-legacy/src/main/java/com/whdc/legacy/model/group/Delete.java new file mode 100644 index 0000000..f0666ef --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/group/Delete.java @@ -0,0 +1,8 @@ +package com.whdc.legacy.model.group; + +/** + * @author 李赛 + * @date 2022-06-26 15:13 + */ +public interface Delete { +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/group/Find.java b/module-legacy/src/main/java/com/whdc/legacy/model/group/Find.java new file mode 100644 index 0000000..8c2aa65 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/group/Find.java @@ -0,0 +1,8 @@ +package com.whdc.legacy.model.group; + +/** + * @author 李赛 + * @date 2022-06-27 22:27 + */ +public interface Find { +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/group/Insert.java b/module-legacy/src/main/java/com/whdc/legacy/model/group/Insert.java new file mode 100644 index 0000000..38a0704 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/group/Insert.java @@ -0,0 +1,8 @@ +package com.whdc.legacy.model.group; + +/** + * @author 李赛 + * @date 2022-06-26 15:12 + */ +public interface Insert { +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/group/Update.java b/module-legacy/src/main/java/com/whdc/legacy/model/group/Update.java new file mode 100644 index 0000000..8b2ccc4 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/group/Update.java @@ -0,0 +1,8 @@ +package com.whdc.legacy.model.group; + +/** + * @author 李赛 + * @date 2022-06-26 15:12 + */ +public interface Update { +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/AdcdTree.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/AdcdTree.java new file mode 100644 index 0000000..ef33e3b --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/AdcdTree.java @@ -0,0 +1,28 @@ +package com.whdc.legacy.model.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) // chain = true 实现链式调用 +public class AdcdTree { + + @ApiModelProperty(value = "行政区划代码") + private String adcd; + + private Integer sort; + + @ApiModelProperty(value = "行政区划名称") + private String adnm; + + @ApiModelProperty(value = "行政区划级别 0省,1市,2县,3镇,4村,5组 ,(点击树查询下级, 点击查询按钮查询本级)", example = "0") + private Integer adlevel; + + @ApiModelProperty("下属行政区") + private List children; + + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/AddressBookVo.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/AddressBookVo.java new file mode 100644 index 0000000..dd9252c --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/AddressBookVo.java @@ -0,0 +1,42 @@ +package com.whdc.legacy.model.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.whdc.legacy.model.entity.AddressBook; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Author xusan + * @Date 2024/5/13 10:17 + * @Notes + **/ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "常用联系人置顶联系人通讯录") +public class AddressBookVo extends AddressBook{ + + + @TableField(exist = false) + @ApiModelProperty(value = "常用联系人置顶联系人序号") + private Integer fsort; + + @TableField(exist = false) + @ApiModelProperty(value = "常用联系人id") + private Integer fcid; + + @TableField(exist = false) + @ApiModelProperty(value = "组织名称") + private String oname; + + @TableField(exist = false) + @ApiModelProperty(value = "行政区划名称") + private String adnm; + + @TableField(exist = false) + @ApiModelProperty(value = "0:常用联系人,1:置顶联系人,2: 组织置顶,3: 单位置顶,4: 行政区划置顶") + private Integer ftype; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/AuthToken.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/AuthToken.java new file mode 100644 index 0000000..38864ce --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/AuthToken.java @@ -0,0 +1,44 @@ +package com.whdc.legacy.model.vo; + +import cn.dev33.satoken.stp.SaTokenInfo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.apache.commons.beanutils.BeanUtils; + +import java.lang.reflect.InvocationTargetException; + +/** + * 原 SaTokenInfo 再 swagger 中没有对应的说明,这里复制一份,加上说明 + * + * @author 李赛 + * @date 2022-07-18 8:10 + * { + * "tokenName": "satoken", // token名称 + * "tokenValue": "e67b99f1-3d7a-4a8d-bb2f-e888a0805633", // token值 + * "isLogin": true, // 此token是否已经登录 + * "loginId": "10001", // 此token对应的LoginId,未登录时为null + * "loginType": "login", // 账号类型标识 + * "tokenTimeout": 2591977, // token剩余有效期 (单位: 秒) + * "sessionTimeout": 2591977, // User-Session剩余有效时间 (单位: 秒) + * "tokenSessionTimeout": -2, // Token-Session剩余有效时间 (单位: 秒) + * "tokenActivityTimeout": -1, // token剩余无操作有效时间 (单位: 秒) + * "loginDevice": "default-device" // 登录设备类型 + * } + */ +@Data +@ApiModel("授权 token 信息") +public class AuthToken extends SaTokenInfo { + @ApiModelProperty("token 名称") + public String tokenName; + + @ApiModelProperty("token 值") + public String tokenValue; + + @ApiModelProperty("token 剩余有效期 (单位: 秒)") + public long tokenTimeout; + + public AuthToken(SaTokenInfo info) throws InvocationTargetException, IllegalAccessException { + BeanUtils.copyProperties(this, info); + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/ExcelABVo.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/ExcelABVo.java new file mode 100644 index 0000000..4c895d9 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/ExcelABVo.java @@ -0,0 +1,42 @@ +package com.whdc.legacy.model.vo; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Description: + * Created by XuSan on 2024/5/28. + * + * @author XuSan + * @version 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ExcelABVo { + + @Excel(name = "市", width = 20) + @ApiModelProperty(value = "市") + private String city; + + @Excel(name = "区县", width = 20) + @ApiModelProperty(value = "区县") + private String county; + + @Excel(name = "姓名", width = 20) + @ApiModelProperty(value = "姓名") + private String name; + + @Excel(name = "职务", width = 50) + @ApiModelProperty(value = "职务") + private String position; + + @Excel(name = "手机号", width = 30) + @ApiModelProperty(value = "手机号") + private String phone; + + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/ExcelDataVo.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/ExcelDataVo.java new file mode 100644 index 0000000..b432077 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/ExcelDataVo.java @@ -0,0 +1,28 @@ +package com.whdc.legacy.model.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * Description: + * Created by XuSan on 2024/5/28. + * + * @author XuSan + * @version 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ExcelDataVo { + + @ApiModelProperty(value = "数据") + private List list; + + @ApiModelProperty(value = "键") + private String key; + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/ExcelOldDataVo.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/ExcelOldDataVo.java new file mode 100644 index 0000000..d2acc2c --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/ExcelOldDataVo.java @@ -0,0 +1,29 @@ +package com.whdc.legacy.model.vo; + +import com.whdc.legacy.model.entity.WarningResponder; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * Description: + * Created by XuSan on 2024/5/28. + * + * @author XuSan + * @version 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ExcelOldDataVo { + + @ApiModelProperty(value = "数据") + private List list; + + @ApiModelProperty(value = "键") + private String key; + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/FBStatsVO.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/FBStatsVO.java new file mode 100644 index 0000000..2d9aba2 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/FBStatsVO.java @@ -0,0 +1,17 @@ +package com.whdc.legacy.model.vo; + +import lombok.Data; + +import java.util.List; + +@Data +public class FBStatsVO { + private int orgWarnSum;//暴雨黄色预警次数 + private int redWarnSum;//暴雨红色预警次数 + private List cnOrgCallList;//叫应的县列表-暴雨黄色预警 + private int callOrgSum;//叫应次数-暴雨黄色预警 + private List cnRedCallList;//叫应的县列表-暴雨红色预警 + private int callRedSum;//叫应次数-暴雨红色预警 + private String startTime;//起始时间 + private String endTime;//终止时间 +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/FcCommVo.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/FcCommVo.java new file mode 100644 index 0000000..a8705d5 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/FcCommVo.java @@ -0,0 +1,57 @@ +package com.whdc.legacy.model.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.whdc.legacy.model.entity.AddressBook; +import com.whdc.legacy.model.group.Find; +import com.whdc.legacy.model.group.Insert; +import com.whdc.legacy.model.group.Update; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Author xusan + * @Date 2024/5/13 10:17 + * @Notes + **/ +@Data +@Accessors(chain = true) +@ApiModel(description = "置顶") +public class FcCommVo { + + @ApiModelProperty(value = "id") + private String id; + + @ApiModelProperty(value = "名称") + private String name; + + @ApiModelProperty(value = "序号") + private Integer sort; + + @ApiModelProperty(value = "置顶排序") + private Integer fsort; + + @ApiModelProperty(value = "置顶id") + private Integer fcid; + + @ApiModelProperty(value = "置顶类型 2: 组织 3: 单位 4:行政区划") + private String type; + + @ApiModelProperty(value = "行政区划级别 0省,1市,2县,3镇,4村,5组 ,(点击树查询下级, 点击查询按钮查询本级)", example = "0") + private Integer adlevel; + + @ApiModelProperty(value = "行政区划") + List adinfo; + + @ApiModelProperty(value = "单位") + List uds; + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/FcVo.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/FcVo.java new file mode 100644 index 0000000..8ff8a0d --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/FcVo.java @@ -0,0 +1,26 @@ +package com.whdc.legacy.model.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.whdc.legacy.model.entity.AddressBook; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Author xusan + * @Date 2024/5/13 10:17 + * @Notes + **/ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "常用联系人置顶联系人通讯录") +public class FcVo extends AddressBook{ + + + @TableField("FSORT") + @ApiModelProperty(value = "常用联系人置顶联系人序号") + private Integer fsort; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/HistoryWarnsVO.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/HistoryWarnsVO.java new file mode 100644 index 0000000..9d86eaa --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/HistoryWarnsVO.java @@ -0,0 +1,12 @@ +package com.whdc.legacy.model.vo; + +import com.whdc.legacy.model.vo.QXWarningVO; +import lombok.Data; + +import java.util.List; + +@Data +public class HistoryWarnsVO { + private int count; + List warnList; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/LoginVo.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/LoginVo.java new file mode 100644 index 0000000..06380ec --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/LoginVo.java @@ -0,0 +1,52 @@ +package com.whdc.legacy.model.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.whdc.legacy.model.vo.AuthToken; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * @author 李赛 + * @date 2022-07-01 1:22 + */ +@Data +@Accessors(chain = true) // chain = true 实现链式调用 +@JsonInclude(JsonInclude.Include.NON_NULL) // 表示序列化非null属性 +public class LoginVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键ID") + private Integer id; + + @ApiModelProperty(value = "类型") + private Integer type; + + @ApiModelProperty(value = "登录名") + private String loginName; + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "vx openid") + private String openid; + + @ApiModelProperty(value = "token 信息") + private AuthToken tokenInfo; + + @ApiModelProperty(value = "角色") + private String role; + + + @ApiModelProperty(value = "行政区划级别 0省,1市,2县,3镇,4村,5组 ,(点击树查询下级, 点击查询按钮查询本级)", example = "0") + private Integer adlevel; + + @ApiModelProperty(value = "行政区划编码") + private String adcd; + + @ApiModelProperty(value = "组织单位名称") + private String oname; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/QXWarnStatisticsVo.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/QXWarnStatisticsVo.java new file mode 100644 index 0000000..8412239 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/QXWarnStatisticsVo.java @@ -0,0 +1,21 @@ +package com.whdc.legacy.model.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * Description: + * Created by XuSan on 2024/6/13. + * + * @author XuSan + * @version 1.0 + */ +@Data +public class QXWarnStatisticsVo { + + @ApiModelProperty(value = "山洪预警叫应") + private String ShWarnStr; + + @ApiModelProperty(value = "暴雨预警叫应") + private String ByWarnStr; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/QXWarningVO.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/QXWarningVO.java new file mode 100644 index 0000000..e871874 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/QXWarningVO.java @@ -0,0 +1,59 @@ +package com.whdc.legacy.model.vo; + +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiParam; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class QXWarningVO { + + @ApiModelProperty(value = "是否播放报警声音") + private Boolean play; + + @ApiModelProperty(value = "生成时间") + private String createTime; + + @ApiModelProperty(value = "发布时间") + private String publishTime; + + @ApiModelProperty(value = "起始时间") + private String startTime; + + @ApiModelProperty(value = "终止时间") + private String endTime; + + @ApiModelProperty(value = "发布单位") + private String publishUnit; + + @ApiParam(value = "预警类型") + @ApiModelProperty(value = "预警类型", dataType = "java.lang.String") + private String warnSignalType; + + @ApiParam(value = "预警级别") + @ApiModelProperty(value = "预警级别", dataType = "java.lang.String") + private String warnSignalLevel; + + @ApiParam(value = "区县名称") + @ApiModelProperty(value = "区县名称", dataType = "java.lang.String") + private String cnnm; + + @ApiParam(value = "市名称") + @ApiModelProperty(value = "市名称", dataType = "java.lang.String") + private String ctnm; + + @ApiModelProperty(value = "预警内容") + private String content; + + @ApiParam(value = "状态") + @ApiModelProperty(value = "状态", dataType = "java.lang.String") + private String status; + + @ApiParam(value = "预警信息id") + @ApiModelProperty(value = "预警信息id", dataType = "java.lang.String") + private Integer warnid; + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/ShAddressBookVo.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/ShAddressBookVo.java new file mode 100644 index 0000000..75e1875 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/ShAddressBookVo.java @@ -0,0 +1,46 @@ +package com.whdc.legacy.model.vo; + + +import cn.afterturn.easypoi.excel.annotation.Excel; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +/** + * 描述: 山洪责任人通讯录Vo + */ +@Schema(description = "山洪责任人通讯录") +@Data +public class ShAddressBookVo implements Serializable { + + /** + * 县 + */ + @Schema(description = "县") + @Excel(name = "县", width = 20, orderNum = "1") + private String county; + + /** + * 乡 + */ + @Schema(description = "乡") + @Excel(name = "乡", width = 20, orderNum = "2") + private String area; + + /** + * 村 + */ + @Schema(description = "行政村") + @Excel(name = "行政村", width = 20, orderNum = "3") + private String village; + + /** + * 责任人类型 县级,乡级,村级, 县干部,乡干部 + */ + @Schema(description = "责任人类型2 县级,乡级,村级, 县干部,乡干部") + @Excel(name = "责任人类型", width = 20, orderNum = "4") + private String type2; + + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/ShCallsExcelVo.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/ShCallsExcelVo.java new file mode 100644 index 0000000..8527e51 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/ShCallsExcelVo.java @@ -0,0 +1,104 @@ +package com.whdc.legacy.model.vo; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * Description: + * Created by XuSan on 2024/7/30. + * + * @author XuSan + * @version 1.0 + */ +@Schema(description = "抽查日志导出") +@Data +@Accessors(chain = true) +public class ShCallsExcelVo { + + + /** + * 主键id + */ + @Excel(name = "序号", width = 20,orderNum = "1") + private Integer id; + + + /** + * 日期 + */ + @Excel(name = "日期", width = 20,orderNum = "2") + private String dateStr; + + /** + * 市 + */ + @Excel(name = "市", width = 20,orderNum = "3") + private String city; + + /** + * 县 + */ + @Excel(name = "县", width = 20,orderNum = "4") + private String county; + + /** + * 责任人类型1 行政责任人,包保责任人 + */ + @Excel(name = "责任人类型", width = 20,orderNum = "5") + private String type2; + /** + * 名字 + */ + @Excel(name = "责任人姓名", width = 20,orderNum = "6") + private String name; + + /** + * 职务 + */ + @Excel(name = "职务", width = 20,orderNum = "7") + private String position; + + /** + * 手机号 + */ + @Excel(name = "手机号", width = 20,orderNum = "8") + private String phone; + + /** + * 负责区域 + */ + @Excel(name = "负责区域", width = 20,orderNum = "9") + private String land; + + + /** + * 抽查时间 + */ + @Excel(name = "抽查时间", width = 20,orderNum = "10") + private String timeStr; + + + /** + * 是否接听 + */ + @Excel(name = "是否接听电话", width = 20,orderNum = "11") + private String callStatus; + + /** + * 是否知晓本人为山洪责任人 + */ + @Excel(name = "是否知晓本人为山洪责任人", width = 20,orderNum = "12") + private String know; + + /** + * 叫应备注 + */ + @Excel(name = "备注", width = 40,orderNum = "13") + private String remark; + + + + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/ShCallsVo.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/ShCallsVo.java new file mode 100644 index 0000000..88cb562 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/ShCallsVo.java @@ -0,0 +1,36 @@ +package com.whdc.legacy.model.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.whdc.legacy.model.entity.ShAddressBook; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * Description: + * Created by XuSan on 2024/7/30. + * + * @author XuSan + * @version 1.0 + */ +@EqualsAndHashCode(callSuper = true) +@Schema(description = "抽查日志分页视图") +@Data +@Accessors(chain = true) +public class ShCallsVo extends ShAddressBook { + + + @Schema(description="是否接听0:否,1是") + private String status; + + @Schema(description="抽查时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date callTime; + + @Schema(description="山洪通讯录编号") + private Integer shAbId; + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/TotalQueryVo.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/TotalQueryVo.java new file mode 100644 index 0000000..8aee651 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/TotalQueryVo.java @@ -0,0 +1,102 @@ +package com.whdc.legacy.model.vo; + +import lombok.Data; + +import java.util.List; + +/** + * Description: + * Created by XuSan on 2024/6/13. + * + * @author XuSan + * @version 1.0 + */ +@Data +public class TotalQueryVo { + + private List page; + private Sgxpt sgxpt; + private Ssdxtj ssdxtj; + private Summary summary; + private Syw syw; + private List yjtj; + + @Data + public static class Syw { + + private Long rs; + private Long sum; + + } + + @Data + public static class Outlist { + + private String adcd; + private String adnm; + private Long sum; + + } + + + @Data + public static class Summary { + + private Long gb; + private Long qt; + private Long rs; + private Long wbcount; + private Long yj; + private Long zdy; + private Long zs; + + } + + @Data + public static class Sgxpt { + + private Long cNT; + private Long rS; + + } + + @Data + public static class Page { + + private _id _id; + private Long gb; + private Long qt; + private Long rs; + private Long wbcount; + private Long yj; + private Long yjrs; + private Long zdy; + + } + + @Data + public static class _id { + + private String adcd; + private String adnm; + + } + @Data + public static class Ssdxtj { + + private Long allcnt; + private List outlist; + + } + + @Data + public static class Yjtj { + + private _id _id; + private Long count; + private Long sdcount; + private Long wbcount; + + } +} + diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/WarnDppleVO.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/WarnDppleVO.java new file mode 100644 index 0000000..64ba5dc --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/WarnDppleVO.java @@ -0,0 +1,32 @@ +package com.whdc.legacy.model.vo; + +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiParam; +import lombok.Data; + +@Data +public class WarnDppleVO { + @ApiParam(value = "区县名称") + @ApiModelProperty(value = "区县名称", dataType = "java.lang.String") + private String cnnm; + + @ApiParam(value = "市名称") + @ApiModelProperty(value = "市名称", dataType = "java.lang.String") + private String ctnm; + + @ApiParam(value = "姓名") + @ApiModelProperty(value = "姓名") + private String name; + + @ApiParam("职务") + @ApiModelProperty(value = "职务") + private String position; + + @ApiParam("手机号") + @ApiModelProperty(value = "手机号") + private String phone; + + @ApiParam("责任级别") + @ApiModelProperty(value = "责任级别") + private Integer level; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/WarnStatsVO.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/WarnStatsVO.java new file mode 100644 index 0000000..b193589 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/WarnStatsVO.java @@ -0,0 +1,36 @@ +package com.whdc.legacy.model.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class WarnStatsVO { +// @ApiModelProperty(value = "统计") +// private Integer sumCount = 0; +// +// @ApiModelProperty(value = "红统计") +// private Integer redCount = 0; +// +// @ApiModelProperty(value = "橙统计") +// private Integer oraCount = 0; +// +// @ApiModelProperty(value = "黄统计") +// private Integer yelCount = 0; +// +// @ApiModelProperty(value = "蓝统计") +// private Integer bluCount = 0; + + @ApiModelProperty(value="日预警个数") + private Integer dayWarnNum = 0;//日预警个数 + + @ApiModelProperty(value="周预警个数") + private Integer weekWarnNum = 0;//周预警个数 + + @ApiModelProperty(value="月预警个数") + private Integer monthWarnNum = 0;//月预警个数 + + @ApiModelProperty(value="年预警个数") + private Integer yearWarnNum = 0;//年预警个数 + +// private List warnList; +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/WarningData.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/WarningData.java new file mode 100644 index 0000000..4e3a4b9 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/WarningData.java @@ -0,0 +1,85 @@ +package com.whdc.legacy.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiParam; +import lombok.Data; + +import java.util.List; + +/** + * @Author xusan + * @Date 2023/7/4 10:28 + * @Notes + **/ +@Data +@ApiModel(value = "预报数据", description = "预报数据") +public class WarningData { + + @ApiParam(value = "服务名") + @ApiModelProperty(value = "服务名", dataType = "java.lang.String") + private String effectArea; + + @ApiParam(value = "预警信息列表") + @ApiModelProperty(value = "预警信息列表", dataType = "array") + private List typeList; + + + @Data + public static class TypeList { + + @ApiParam(value = "预警信息详情") + @ApiModelProperty(value = "预警信息详情", dataType = "array") + private List warnList; + + @ApiParam(value = "预警信号") + @ApiModelProperty(value = "预警信号", dataType = "java.lang.String") + private String type; + + } + + @Data + public static class Warning { + + @ApiParam(value = "ID") + @ApiModelProperty(value = "ID", dataType = "java.lang.Integer") + private int id; + + @ApiParam(value = "创建时间") + @ApiModelProperty(value = "创建时间", dataType = "java.lang.String") + private String createTime; + + @ApiParam(value = "发布时间") + @ApiModelProperty(value = "发布时间", dataType = "java.lang.String") + private String publishTime; + + @ApiParam(value = "预警开始时间") + @ApiModelProperty(value = "预警开始时间", dataType = "java.lang.String") + private String startTime; + + @ApiParam(value = "预警结束时间") + @ApiModelProperty(value = "预警结束时间", dataType = "java.lang.String") + private String endTime; + + @ApiParam(value = "预警类型") + @ApiModelProperty(value = "预警类型", dataType = "java.lang.String") + private String warnSignalType; + + @ApiParam(value = "预警级别") + @ApiModelProperty(value = "预警级别", dataType = "java.lang.String") + private String warnSignalLevel; + + @ApiParam(value = "预警地区") + @ApiModelProperty(value = "预警地区", dataType = "java.lang.String") + private String effectArea; + + @ApiParam(value = "发布单位") + @ApiModelProperty(value = "发布单位", dataType = "java.lang.String") + private String publishUnit; + + @ApiParam(value = "预警内容") + @ApiModelProperty(value = "预警内容", dataType = "java.lang.String") + private String content; + + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/WarningHistoryListVo.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/WarningHistoryListVo.java new file mode 100644 index 0000000..81aa489 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/WarningHistoryListVo.java @@ -0,0 +1,53 @@ +package com.whdc.legacy.model.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * Description: + * Created by XuSan on 2024/5/24. + * + * @author XuSan + * @version 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class WarningHistoryListVo { + + @ApiModelProperty(value = "预警类型") + private String warnSignalType; + + @ApiModelProperty(value = "预警级别") + private String warnSignalLevel; + + @ApiModelProperty(value = "预警地区") + private String effectArea; + + @ApiModelProperty(value = "统计") + private Integer sumCount = 0; + + @ApiModelProperty(value = "红统计") + private Integer redCount = 0; + + @ApiModelProperty(value = "橙统计") + private Integer oraCount = 0; + + @ApiModelProperty(value = "黄统计") + private Integer yelCount = 0; + + @ApiModelProperty(value = "蓝统计") + private Integer bluCount = 0; + + @ApiModelProperty(value = "子统计") + private List child; + + @ApiModelProperty(value = "地区子统计") + private List areaChild; + + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/model/vo/WarningListVo.java b/module-legacy/src/main/java/com/whdc/legacy/model/vo/WarningListVo.java new file mode 100644 index 0000000..fa4875c --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/model/vo/WarningListVo.java @@ -0,0 +1,49 @@ +package com.whdc.legacy.model.vo; + +import com.whdc.legacy.model.entity.AddressBook; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiParam; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * Description: + * Created by XuSan on 2024/5/24. + * + * @author XuSan + * @version 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class WarningListVo { + + @ApiModelProperty(value = "预警标题") + public String title; + + @ApiModelProperty(value = "发布时间") + private String publishTime; + + @ApiParam(value = "预警类型") + @ApiModelProperty(value = "预警类型", dataType = "java.lang.String") + private String warnSignalType; + + @ApiParam(value = "预警级别") + @ApiModelProperty(value = "预警级别", dataType = "java.lang.String") + private String warnSignalLevel; + + @ApiParam(value = "行政区划") + @ApiModelProperty(value = "行政区划", dataType = "java.lang.String") + private String adnm; + + @ApiModelProperty(value = "预警内容") + private String content; + + @ApiModelProperty(value = "防汛责任人") + private List addressBooks; + + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/IAbUdRService.java b/module-legacy/src/main/java/com/whdc/legacy/service/IAbUdRService.java new file mode 100644 index 0000000..79c5b7e --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/IAbUdRService.java @@ -0,0 +1,24 @@ +package com.whdc.legacy.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.entity.AbUdR; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * @author xusan + * @date 2024-05-11 + */ +public interface IAbUdRService extends IService { + + // 获取所有规则分页 + IPage page(AbUdR dto); + + // 获取所有规则 + List find(AbUdR dto); + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/IAddressBookCityService.java b/module-legacy/src/main/java/com/whdc/legacy/service/IAddressBookCityService.java new file mode 100644 index 0000000..9620361 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/IAddressBookCityService.java @@ -0,0 +1,17 @@ +package com.whdc.legacy.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.entity.AddressBookCity; + +/** + *

+ * 服务类 + *

+ * @author xusan + * @date 2024-05-11 + */ +public interface IAddressBookCityService extends IService { + + + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/IAddressBookService.java b/module-legacy/src/main/java/com/whdc/legacy/service/IAddressBookService.java new file mode 100644 index 0000000..b44e827 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/IAddressBookService.java @@ -0,0 +1,29 @@ +package com.whdc.legacy.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.dto.AddressBookDto; +import com.whdc.legacy.model.entity.AddressBook; +import com.whdc.legacy.model.vo.AddressBookVo; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * @author xusan + * @date 2024-05-11 + */ +public interface IAddressBookService extends IService { + + // 获取所有规则分页 + IPage page(AddressBookDto dto); + + // 获取所有规则 + List find(AddressBook dto); + + List getListByAdnm(String adcd); + + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/IAdinfoService.java b/module-legacy/src/main/java/com/whdc/legacy/service/IAdinfoService.java new file mode 100644 index 0000000..7872311 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/IAdinfoService.java @@ -0,0 +1,30 @@ +package com.whdc.legacy.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.entity.Adinfo; +import com.whdc.legacy.model.vo.AdcdTree; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * @author xusan + * @date 2024-05-11 + */ +public interface IAdinfoService extends IService { + + // 获取所有规则分页 + IPage page(Adinfo dto); + + // 获取所有规则 + List find(Adinfo dto); + + List tree(String adcd, String adnm1); + + String getAdcdByAdnm(String adnm); + + String getAdcdByAdnm2(String cnnm2); +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/IFcService.java b/module-legacy/src/main/java/com/whdc/legacy/service/IFcService.java new file mode 100644 index 0000000..c5d67b0 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/IFcService.java @@ -0,0 +1,26 @@ +package com.whdc.legacy.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.dto.FcDto; +import com.whdc.legacy.model.entity.Fc; +import com.whdc.legacy.model.vo.FcVo; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * @author xusan + * @date 2024-05-11 + */ +public interface IFcService extends IService { + + // 获取所有规则分页 + IPage page(FcDto dto); + + // 获取所有规则 + List find(Fc dto); + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/ILoginInfoService.java b/module-legacy/src/main/java/com/whdc/legacy/service/ILoginInfoService.java new file mode 100644 index 0000000..428e4da --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/ILoginInfoService.java @@ -0,0 +1,26 @@ +package com.whdc.legacy.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.dto.FindPageDto; +import com.whdc.legacy.model.dto.LoginInfoDto; +import com.whdc.legacy.model.entity.LoginInfo; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * @author xusan + * @date 2024-05-11 + */ +public interface ILoginInfoService extends IService { + + // 获取所有规则分页 + IPage page(LoginInfoDto dto); + + // 获取所有规则 + List find(LoginInfo dto); + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/IOrganizationService.java b/module-legacy/src/main/java/com/whdc/legacy/service/IOrganizationService.java new file mode 100644 index 0000000..3897ff7 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/IOrganizationService.java @@ -0,0 +1,25 @@ +package com.whdc.legacy.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.entity.Organization; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * @author xusan + * @date 2024-05-11 + */ +public interface IOrganizationService extends IService { + + // 获取所有规则分页 + IPage page(Organization dto); + + // 获取所有规则 + List find(Organization dto); + + List findByUserId(String userId, String adcd); +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/IQXWarningService.java b/module-legacy/src/main/java/com/whdc/legacy/service/IQXWarningService.java new file mode 100644 index 0000000..d9686a9 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/IQXWarningService.java @@ -0,0 +1,18 @@ +package com.whdc.legacy.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.dto.GroupWarningDto; +import com.whdc.legacy.model.entity.QXWarning; +import com.whdc.legacy.model.vo.QXWarningVO; + +import java.util.List; + +public interface IQXWarningService extends IService { + List find(); + IPage page(GroupWarningDto dto); + + List list(GroupWarningDto dto); + + List getWarnAndMsg(String stm, String etm); +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/IUnitDictService.java b/module-legacy/src/main/java/com/whdc/legacy/service/IUnitDictService.java new file mode 100644 index 0000000..590c4b4 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/IUnitDictService.java @@ -0,0 +1,25 @@ +package com.whdc.legacy.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.entity.UnitDict; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * @author xusan + * @date 2024-05-11 + */ +public interface IUnitDictService extends IService { + + // 获取所有规则分页 + IPage page(UnitDict dto); + + // 获取所有规则 + List find(UnitDict dto); + List findByUserId(String userId); + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/IUserService.java b/module-legacy/src/main/java/com/whdc/legacy/service/IUserService.java new file mode 100644 index 0000000..3558a5e --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/IUserService.java @@ -0,0 +1,47 @@ +package com.whdc.legacy.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.dto.LoginDto; +import com.whdc.legacy.model.dto.UserDto; +import com.whdc.legacy.model.dto.VxLoginDto; +import com.whdc.legacy.model.entity.User; +import com.whdc.legacy.model.vo.LoginVo; +import com.whdc.common.utils.ResultJson; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * @author xusan + * @date 2024-05-11 + */ +public interface IUserService extends IService { + + // 获取所有规则分页 + IPage page(User dto); + + // 获取所有规则 + List find(User dto); + + LoginVo login(LoginDto obj); + + LoginVo wxLogin(VxLoginDto obj); + + LoginVo wxLogin(String openid); + + boolean register(User entity); + + User getRole(Integer id); + + boolean register(String phone, Integer abId, String role); + + boolean updateLastDate(Integer id); + ResultJson updatePwd(UserDto dto); + + boolean pushCode(String phone); + LoginVo loginByCode(String phone, String code); + +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/IVersionsService.java b/module-legacy/src/main/java/com/whdc/legacy/service/IVersionsService.java new file mode 100644 index 0000000..1bd09fd --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/IVersionsService.java @@ -0,0 +1,28 @@ +package com.whdc.legacy.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.dto.CommDto; +import com.whdc.legacy.model.entity.AddressBook; +import com.whdc.legacy.model.entity.Versions; +import com.whdc.legacy.model.enums.VersionsType; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * @author xusan + * @date 2024-05-11 + */ +public interface IVersionsService extends IService { + + // 获取所有规则分页 + IPage page(CommDto dto); + + // 获取所有规则 + List find(Versions dto); + + boolean saveInfo(AddressBook model, VersionsType versionsType, String adcd); +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/IWarnMsgFBService.java b/module-legacy/src/main/java/com/whdc/legacy/service/IWarnMsgFBService.java new file mode 100644 index 0000000..7ffb8e1 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/IWarnMsgFBService.java @@ -0,0 +1,11 @@ +package com.whdc.legacy.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.entity.WarnMsgFB; + +import java.util.List; + +public interface IWarnMsgFBService extends IService { + + List find(WarnMsgFB dto); +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/IWarningResponderService.java b/module-legacy/src/main/java/com/whdc/legacy/service/IWarningResponderService.java new file mode 100644 index 0000000..a21bcc7 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/IWarningResponderService.java @@ -0,0 +1,17 @@ +package com.whdc.legacy.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.entity.WarningResponder; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * @author xusan + * @date 2024-05-11 + */ +public interface IWarningResponderService extends IService { + List getListByAdnm2(String cnnm2); +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/ShAddressBookService.java b/module-legacy/src/main/java/com/whdc/legacy/service/ShAddressBookService.java new file mode 100644 index 0000000..988e781 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/ShAddressBookService.java @@ -0,0 +1,37 @@ +package com.whdc.legacy.service; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.dto.ShAddressBookDto; +import com.whdc.legacy.model.entity.ShAddressBook; +import com.whdc.legacy.model.vo.AdcdTree; +import com.whdc.legacy.model.vo.ShAddressBookVo; + +import java.util.List; +import java.util.Map; + +/** + * 描述: 山洪责任人通讯录 + * author: xusan + * date: 2024-07-30 10:27:29 + */ +public interface ShAddressBookService extends IService +{ + + IPage page(ShAddressBookDto dto); + void updateAll(String type1, List appends); + + List tree(); + + /** + * @param shAddressBooks + * @description: 文件导入批量匹配 + * @return: java.util.Map + * @auther: cxw + * @date: 2025-07-14, 周一, 13:11:33 + */ + Map importBatchMatch(List shAddressBooks); +} + + diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/ShCallWordService.java b/module-legacy/src/main/java/com/whdc/legacy/service/ShCallWordService.java new file mode 100644 index 0000000..4befd4c --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/ShCallWordService.java @@ -0,0 +1,22 @@ +package com.whdc.legacy.service; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.dto.ShCallWordDto; +import com.whdc.legacy.model.entity.ShCallWord; + +import java.util.List; + +/** + * 描述: 备注 + * author: xusan + * date: 2024-07-30 10:27:29 + */ +public interface ShCallWordService extends IService +{ + IPage page(ShCallWordDto dto); + List list(ShCallWordDto dto); +} + + diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/ShCallsService.java b/module-legacy/src/main/java/com/whdc/legacy/service/ShCallsService.java new file mode 100644 index 0000000..494f427 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/ShCallsService.java @@ -0,0 +1,31 @@ +package com.whdc.legacy.service; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.dto.ShCallsDto; +import com.whdc.legacy.model.entity.ShAddressBook; +import com.whdc.legacy.model.entity.ShCalls; +import com.whdc.legacy.model.vo.ShCallsVo; + +import java.util.List; +import java.util.Map; + +/** + * 描述: 抽查日志 + * author: xusan + * date: 2024-07-30 10:27:29 + */ +public interface ShCallsService extends IService +{ + + IPage page(ShCallsDto dto); + + List list(ShCallsDto dto); + + List listVo(ShCallsDto dto); + + Map logDateStatistics(ShCallsDto dto); +} + + diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/ShPeriodService.java b/module-legacy/src/main/java/com/whdc/legacy/service/ShPeriodService.java new file mode 100644 index 0000000..9b2f84b --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/ShPeriodService.java @@ -0,0 +1,20 @@ +package com.whdc.legacy.service; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.legacy.model.dto.ShPeriodDto; +import com.whdc.legacy.model.entity.ShPeriod; + +/** + * 描述: 防汛周期 + * author: xusan + * date: 2024-07-30 10:27:29 + */ +public interface ShPeriodService extends IService +{ + + IPage page(ShPeriodDto dto); +} + + diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/AbUdRServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/AbUdRServiceImpl.java new file mode 100644 index 0000000..6f778d1 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/AbUdRServiceImpl.java @@ -0,0 +1,37 @@ +package com.whdc.legacy.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.legacy.mapper.AbUdRMapper; +import com.whdc.legacy.model.entity.AbUdR; +import com.whdc.legacy.service.IAbUdRService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * @author xusan + * @date 2024-05-11 + */ +@Service +public class AbUdRServiceImpl extends ServiceImpl implements IAbUdRService { + + + @Override + public IPage page(AbUdR dto) { + return baseMapper.page(new Page<>(), dto); + } + + + @Override + public List find(AbUdR dto) { + return baseMapper.find(dto); + } + + + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/AddressBookCityServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/AddressBookCityServiceImpl.java new file mode 100644 index 0000000..f744706 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/AddressBookCityServiceImpl.java @@ -0,0 +1,22 @@ +package com.whdc.legacy.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.legacy.mapper.AddressBookCityMapper; +import com.whdc.legacy.model.entity.AddressBookCity; +import com.whdc.legacy.service.IAddressBookCityService; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author xusan + * @date 2024-05-11 + */ +@Service +public class AddressBookCityServiceImpl extends ServiceImpl implements IAddressBookCityService { + + + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/AddressBookServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/AddressBookServiceImpl.java new file mode 100644 index 0000000..657cdbc --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/AddressBookServiceImpl.java @@ -0,0 +1,70 @@ +package com.whdc.legacy.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.legacy.mapper.AddressBookMapper; +import com.whdc.legacy.model.dto.AddressBookDto; +import com.whdc.legacy.model.entity.AddressBook; +import com.whdc.legacy.model.vo.AddressBookVo; +import com.whdc.legacy.service.IAddressBookService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; + +import static com.whdc.legacy.controller.AddressBookController.ADDRESS_BOOK_REDIS_KEY; + +/** + *

+ * 服务实现类 + *

+ * + * @author xusan + * @date 2024-05-11 + */ +@Service +public class AddressBookServiceImpl extends ServiceImpl implements IAddressBookService { + + + @Override + public IPage page(AddressBookDto dto) { + + String adcd = dto.getAdcd(); + + if (null != dto.getAdlevel()) { + switch (dto.getAdlevel()){ + case 1:adcd = adcd.substring(0,4); break; + case 2:adcd = adcd.substring(0,6); break; + default:break; + } + } + if (StringUtils.isNotBlank(adcd)) { + if (adcd.length() < 15) { + dto.setV("LIKE "); + dto.setAdcd(adcd + "%"); + } else { + dto.setV("= "); + dto.setAdcd(adcd.replace("000000","")); + } + } + + + return baseMapper.page(dto.getPage(), dto); + } + + + @Override + public List find(AddressBook dto) { + return baseMapper.find(dto); + } + + @Cacheable(value = ADDRESS_BOOK_REDIS_KEY, key = "#root.method.name+':'+#adcd") + @Override + public List getListByAdnm(String adcd) { + return baseMapper.getListByAdnm(adcd); + } + + + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/AdinfoServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/AdinfoServiceImpl.java new file mode 100644 index 0000000..8ceb8ef --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/AdinfoServiceImpl.java @@ -0,0 +1,201 @@ +package com.whdc.legacy.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.legacy.mapper.AdinfoMapper; +import com.whdc.legacy.model.entity.Adinfo; +import com.whdc.legacy.model.vo.AdcdTree; +import com.whdc.legacy.service.IAdinfoService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +import static com.whdc.legacy.model.MyConstant.REDIS_KEY; + +/** + *

+ * 服务实现类 + *

+ * @author xusan + * @date 2024-05-11 + */ +@Slf4j +@Service +public class AdinfoServiceImpl extends ServiceImpl implements IAdinfoService { + + public static final String ADINFO_REDIS_KEY = REDIS_KEY + "adinfo"; + public static final String TREE_ALL = REDIS_KEY + "tree_all"; + + @Override + public IPage page(Adinfo dto) { + return baseMapper.page(new Page<>(), dto); + } + + + @Override + public List find(Adinfo dto) { + return baseMapper.find(dto); + } + + + + + /** + * 行政区划树型查询 + * 420116,001,002,000 + * 6位区县,9位街道,12位组 + * 省 市 县 + * 42 28 22 100 011 100 + * + * @param adcd + * @return + */ +// @Cacheable(cacheNames = {ADINFO_REDIS_KEY}, key = "getMethodName()", condition = "#adcd + #adnm", unless = "false") + public List tree(String adcd, String adnm) { + + if (TREE_ALL.equals(adcd)){ + adcd = null; + } + if (TREE_ALL.equals(adnm)){ + adnm = null; + } + List list = treeList(adcd, adnm); + + if (CollectionUtils.isNotEmpty(list)){ + list = list.stream().sorted(Comparator.comparing(Adinfo::getAdcd) + .reversed() + ).collect(Collectors.toList()); + } + + // 市 4205 00000000000 + Map> city = new HashMap<>(); + + // 县 421122 000000000 + Map> county = new HashMap<>(); + + List tree = new ArrayList<>(); + + for (Adinfo adinfo : list) { + String ad = adinfo.getAdcd(); + String nm = adinfo.getAdnm(); + AdcdTree adcdTree = new AdcdTree().setAdcd(ad).setAdnm(nm).setChildren(new ArrayList<>()); + + // 判断行政区划编码 + String provinceStr = ad.substring(0, 2); + String cityStr = ad.substring(0, 4); + + if ("00000000000".equals(ad.substring(4))) { // 市 + adcdTree.setAdlevel(1); + List adcdChildren = county.get(cityStr); + AdcdTree adcdTree1 = new AdcdTree(); + BeanUtils.copyProperties(adcdTree,adcdTree1); + if (CollectionUtils.isNotEmpty(adcdChildren)){ +// adcdChildren.add(0,adcdTree1); + } + adcdTree.setChildren(adcdChildren); + addTree(city, provinceStr, adcdTree); + tree.add(adcdTree); + + } else if ("000000000".equals(ad.substring(6))) { // 县 + // 县级市 + if (ad.contains("4290")){ + adcdTree.setAdlevel(1); + addTree(city, provinceStr, adcdTree); + tree.add(adcdTree); + }else{ + adcdTree.setAdlevel(2); + addTree(county, cityStr, adcdTree); + } + } + + } + + // 排序 + + return sorted(tree); + } + + @Override + @Cacheable(value = ADINFO_REDIS_KEY, key = "#root.method.name+':'+#adnm") + public String getAdcdByAdnm(String adnm) { + Adinfo one = this.lambdaQuery().eq(Adinfo::getAdnm, adnm).one(); + if (one != null) { + String adcd = one.getAdcd(); + if (adcd.contains("00000000000")){ + // 查询市辖区的数据 + adcd = adcd.replace("00000000000","01000000000"); + } + return adcd; + } + return null; + } + + public String getAdcdByAdnm2(String adnm){ + Adinfo one = this.baseMapper.selectAdcdByAdnm(adnm); + if (one != null) { + String adcd = one.getAdcd(); + if (adcd.contains("00000000000")){ + // 查询市辖区的数据 + adcd = adcd.replace("00000000000","01000000000"); + } + return adcd; + } + return null; + } + + public List treeList(String adcd, String adnm) { + + if(StringUtils.isNotBlank(adcd) && adcd.endsWith("0000000000000")){ + adcd = adcd.substring(0,2); + } + if (StringUtils.isNotBlank(adcd) && StringUtils.isNotBlank(adnm)) { + log.info("行政区划: " + adcd + "-" + adnm); + // 需要查出层级数据 + return baseMapper.selectByCdOrNm(adcd, adnm); + + } else { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (StringUtils.isNotBlank(adcd)) { + queryWrapper.like(Adinfo::getAdcd, adcd); + } + List adinfos = baseMapper.selectList(queryWrapper); + + return adinfos; // 查所有 + } + + } + + private List sorted( List tree) { + + List sorteds = null; + + if (CollectionUtils.isNotEmpty(tree)){ + sorteds = tree.stream().sorted(Comparator.comparing(AdcdTree::getAdcd) + ).collect(Collectors.toList()); + sorteds.forEach(o->{ + o.setChildren(sorted(o.getChildren())); + }); + } + + return sorteds; + } + + private void addTree(Map> data, String key, AdcdTree tree) { + List trees = data.get(key); + if (CollectionUtils.isEmpty(trees)) { + trees = new ArrayList<>(); + } + trees.add(tree); + + data.put(key, trees); + } + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/FcServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/FcServiceImpl.java new file mode 100644 index 0000000..3227373 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/FcServiceImpl.java @@ -0,0 +1,39 @@ +package com.whdc.legacy.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.whdc.legacy.mapper.FcMapper; +import com.whdc.legacy.model.dto.FcDto; +import com.whdc.legacy.model.entity.Fc; +import com.whdc.legacy.model.vo.FcVo; +import com.whdc.legacy.service.IFcService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * @author xusan + * @date 2024-05-11 + */ +@Service +public class FcServiceImpl extends ServiceImpl implements IFcService { + + + @Override + public IPage page(FcDto dto) { + return baseMapper.page(dto.getPage(), dto); + } + + + @Override + public List find(Fc dto) { + return baseMapper.find(dto); + } + + + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/LoginInfoServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/LoginInfoServiceImpl.java new file mode 100644 index 0000000..3015fa6 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/LoginInfoServiceImpl.java @@ -0,0 +1,38 @@ +package com.whdc.legacy.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.legacy.mapper.LoginInfoMapper; +import com.whdc.legacy.model.dto.FindPageDto; +import com.whdc.legacy.model.dto.LoginInfoDto; +import com.whdc.legacy.model.entity.LoginInfo; +import com.whdc.legacy.service.ILoginInfoService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * @author xusan + * @date 2024-05-11 + */ +@Service +public class LoginInfoServiceImpl extends ServiceImpl implements ILoginInfoService { + + + @Override + public IPage page(LoginInfoDto dto) { + return baseMapper.page(dto.getPage(), dto); + } + + + @Override + public List find(LoginInfo dto) { + return baseMapper.find(dto); + } + + + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/OrganizationServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/OrganizationServiceImpl.java new file mode 100644 index 0000000..e4c6752 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/OrganizationServiceImpl.java @@ -0,0 +1,76 @@ +package com.whdc.legacy.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.legacy.mapper.OrganizationMapper; +import com.whdc.legacy.model.entity.Organization; +import com.whdc.legacy.model.entity.UnitDict; +import com.whdc.legacy.service.IAdinfoService; +import com.whdc.legacy.service.IOrganizationService; +import com.whdc.legacy.service.IUnitDictService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static com.whdc.legacy.service.impl.AdinfoServiceImpl.TREE_ALL; + +/** + *

+ * 服务实现类 + *

+ * @author xusan + * @date 2024-05-11 + */ +@Service +@Slf4j +public class OrganizationServiceImpl extends ServiceImpl implements IOrganizationService { + + @Autowired + private IUnitDictService unitDictService; + + @Autowired + private IAdinfoService adinfoService; + + @Override + public IPage page(Organization dto) { + return baseMapper.page(new Page<>(), dto); + } + + @Override + public List find(Organization dto) { + return null; + } + + + @Override + public List findByUserId(String userId,String adcd) { + if (StringUtils.isBlank(adcd)){ + adcd = TREE_ALL; + } + List organizations = baseMapper.findByUserId(userId); + + List list = unitDictService.findByUserId(userId); + + Map> collect = list.stream().collect(Collectors.groupingBy(UnitDict::getOId)); + String finalAdcd = adcd; + organizations.forEach(organization -> { + List unitDicts = collect.get(organization.getId()); + organization.setUnitDicts(unitDicts); + String name = organization.getName(); + if (name.contains("市") && name.contains("县")){ + organization.setAdinfoList(adinfoService.tree(finalAdcd, finalAdcd)); + } + }); + + return organizations; + } + + + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/QXWarningServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/QXWarningServiceImpl.java new file mode 100644 index 0000000..6a94486 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/QXWarningServiceImpl.java @@ -0,0 +1,78 @@ +package com.whdc.legacy.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.legacy.mapper.QXWarningMapper; +import com.whdc.legacy.model.dto.GroupWarningDto; +import com.whdc.legacy.model.entity.Adinfo; +import com.whdc.legacy.model.entity.QXWarning; +import com.whdc.legacy.model.vo.QXWarningVO; +import com.whdc.legacy.service.IAdinfoService; +import com.whdc.legacy.service.IQXWarningService; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class QXWarningServiceImpl extends ServiceImpl implements IQXWarningService { + + @Autowired + private IAdinfoService adinfoService; + + @Override + public List find() { + return getBaseMapper().findByMsgIsNull(); + } + + @Override + public IPage page(GroupWarningDto dto) { + IPage page = getBaseMapper().page(dto.getPage(), dto); + if (page.getTotal() > 0){ + List list = page.getRecords(); + List adinfos = getXNCnnm(); + for(QXWarningVO vo : list){ + String cnnm = vo.getCnnm(); + String content = vo.getContent(); + if("咸宁".equals(cnnm) && CollectionUtils.isNotEmpty(adinfos)){ + Optional first = adinfos.stream() + .filter(content::contains) + .findFirst(); + if (first.isPresent()){ + vo.setCnnm(first.get()); + } + } + } + } + return page; + } + + private List getXNCnnm() { + List list = adinfoService.lambdaQuery() + .likeRight(Adinfo::getAdcd, "4212") + .likeLeft(Adinfo::getAdcd, "000000000") + .ne(Adinfo::getAdcd,"421200000000000") + .list(); + if (CollectionUtils.isNotEmpty(list)){ + return list.stream().map(o->o.getAdnm().substring(0,2)).collect(Collectors.toList()); + } + return new ArrayList<>(); + } + + @Override + public List list(GroupWarningDto dto) { + return getBaseMapper().list(dto); + } + + @Override + public List getWarnAndMsg(String stm, String etm) { + return getBaseMapper().getWarnAndMsg(stm,etm); + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/ShAddressBookServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/ShAddressBookServiceImpl.java new file mode 100644 index 0000000..7295560 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/ShAddressBookServiceImpl.java @@ -0,0 +1,380 @@ +package com.whdc.legacy.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Maps; +import com.whdc.common.exception.MyException; +import com.whdc.legacy.mapper.ShAddressBookMapper; +import com.whdc.legacy.model.dto.ShAddressBookDto; +import com.whdc.legacy.model.entity.ShAddressBook; +import com.whdc.legacy.model.vo.AdcdTree; +import com.whdc.legacy.model.vo.ShAddressBookVo; +import com.whdc.legacy.service.ShAddressBookService; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static com.whdc.legacy.model.MyConstant.REC; +import static com.whdc.legacy.model.MyConstant.REDIS_KEY; + + +/** + * 描述: 山洪责任人通讯录 + * author: xusan + * date: 2024-07-29 17:27:25 + */ +@Transactional +@Service +public class ShAddressBookServiceImpl extends ServiceImpl implements ShAddressBookService { + + private static final String THIS_REDIS_KEY = REDIS_KEY + ShAddressBook.thisTableName + ":"; + + @Override + public IPage page(ShAddressBookDto dto) { + return getBaseMapper().page(dto.getPage(), dto); + } + + /** + * 全量更新 + * + * @param type1 + * @param appends + */ + @Override + public void updateAll(String type1, List appends) { + if (CollectionUtils.isEmpty(appends)) { + throw new MyException("文件解析数据为空"); + } + + AtomicInteger sort = new AtomicInteger(0); + + appends.forEach(o->{ + String phone = o.getPhone(); + if (StringUtils.isNotBlank(phone)){ + o.setPhone(StringUtils.deleteWhitespace(phone)); + } + String name = o.getName(); + if (StringUtils.isNotBlank(name)){ + o.setName(StringUtils.deleteWhitespace(name)); + } + if (Objects.isNull(o.getSort())) { + o.setSort(sort.getAndIncrement()); + } + }); + + // 去重 + appends = new ArrayList<>(appends.stream() + .collect(Collectors.toMap(o -> o.getCity() + System.lineSeparator() + + o.getCounty() + System.lineSeparator() + + o.getArea() + System.lineSeparator() + + o.getVillage() + System.lineSeparator() + + o.getName() + System.lineSeparator() + + o.getPhone() + System.lineSeparator() + + o.getType2(), Function.identity(), (o1, o2) -> o1)) + .values()); + + // 删除全部数据 + String type1Str = null; + switch (type1) { + case "0": + type1Str = "行政责任人"; + break; + case "1": + type1Str = "包保责任人"; + break; + default: + throw new MyException("参数错误"); + } + + if (this.lambdaQuery() + .eq(ShAddressBook::getDel, REC) + .eq(ShAddressBook::getType1, type1Str).count() > 0) { + + // 清空数据 + boolean remove = this.lambdaUpdate() + .set(ShAddressBook::getDel, 0) + .eq(ShAddressBook::getDel, 1) + .eq(ShAddressBook::getType1, type1Str) + .update(); + if (!remove) { + throw new MyException("清空数据失败"); + } + } + + // 添加第一类型 + String finalType1Str1 = type1Str; + + appends.forEach(o -> { + + // 设置负责区域 + switch (finalType1Str1) { + case "行政责任人":{ +// type1Str = "行政责任人"; + String type2 = o.getType2(); + if (StringUtils.isNotBlank(type2)){ + if (type2.contains("市")){ + o.setLand(o.getCity()); + }else if (type2.contains("县")){ + o.setLand(o.getCounty()); + }else if (type2.contains("乡")){ + o.setLand(o.getArea()); + }else if (type2.contains("村")){ + o.setLand(o.getVillage()); + } + }} + break; + case "包保责任人":{ +// type1Str = "包保责任人"; + String type2 = o.getType2(); + if (StringUtils.isNotBlank(type2)){ + if (type2.contains("市")){ + o.setLand(o.getCounty()); + }else if (type2.contains("县")){ + o.setLand(o.getArea()); + }else if (type2.contains("乡")){ + o.setLand(o.getVillage()); + } + }} + break; + default: + throw new MyException("参数错误"); + } + + o.setType1(finalType1Str1); + + }); + + boolean b = this.saveBatch(appends); + if (!b) { + throw new MyException("保存数据失败"); + } + + + } + + @Override + public List tree() { + List list = this.lambdaQuery() + .eq(ShAddressBook::getDel, REC) + .orderByAsc(ShAddressBook::getSort).list(); + if (CollectionUtils.isEmpty(list)) { + return null; + } + + + Map> cityMap = list.stream().filter(o -> StringUtils.isNotBlank(o.getCity())).collect(Collectors.groupingBy(ShAddressBook::getCity, Collectors.toList())); + Map> countyMap = list.stream().filter(o -> StringUtils.isNotBlank(o.getCounty())).collect(Collectors.groupingBy(ShAddressBook::getCounty, Collectors.toList())); + Map> areaMap = list.stream().filter(o -> StringUtils.isNotBlank(o.getArea())).collect(Collectors.groupingBy(ShAddressBook::getArea, Collectors.toList())); + Map> villageMap = list.stream().filter(o -> StringUtils.isNotBlank(o.getVillage())).collect(Collectors.groupingBy(ShAddressBook::getVillage, Collectors.toList())); + + + Map> city = new HashMap<>(); + + Map> county = new HashMap<>(); + + Map> area = new HashMap<>(); + + Map> village = new HashMap<>(); + + + villageMap.forEach((k, v) -> { + v.forEach(o -> { + String data = o.getCity() + "_" + o.getCounty() + "_" + o.getArea(); + if (StringUtils.isNotBlank(data)) { + List trees = village.get(data); + if (CollectionUtils.isEmpty(trees)) { + trees = Lists.newArrayList(); + } + trees.add(new AdcdTree().setSort(o.getSort()).setAdcd(o.getId().toString()).setAdnm(o.getVillage()).setAdlevel(4).setChildren(null)); + + trees = new ArrayList<>(trees.stream() + .collect( + Collectors.toMap( + AdcdTree::getAdnm, + Function.identity(), + (o1, o2) -> o1.getSort() < o2.getSort() ? o1 : o2 + ) + ) + .values()); + + village.put(data, trees); + } + }); + + }); + + village.keySet().forEach(k ->{ + List trees = village.get(k); + trees = new ArrayList<>(trees.stream() + .collect( + Collectors.toMap( + AdcdTree::getAdnm, + Function.identity(), + (o1, o2) -> o1.getSort() < o2.getSort() ? o1 : o2 + ) + ) + .values()); + + village.put(k, trees); + }); + + areaMap.forEach((k, v) -> { + v.forEach(o -> { + String data = o.getCity() + "_" + o.getCounty(); + if (StringUtils.isNotBlank(data)) { + List trees = area.get(data); + if (CollectionUtils.isEmpty(trees)) { + trees = Lists.newArrayList(); + } + trees.add(new AdcdTree().setSort(o.getSort()).setAdcd(o.getId().toString()).setAdnm(o.getArea()).setAdlevel(3).setChildren(village.get(o.getCity() + "_" + o.getCounty() + "_" + o.getArea()))); + + trees = new ArrayList<>(trees.stream() + .collect( + Collectors.toMap( + AdcdTree::getAdnm, + Function.identity(), + (o1, o2) -> o1.getSort() < o2.getSort() ? o1 : o2 + ) + ) + .values()); + + area.put(data, trees); + } + }); + }); + + area.keySet().forEach(k ->{ + List trees = area.get(k); + trees = new ArrayList<>(trees.stream() + .collect( + Collectors.toMap( + AdcdTree::getAdnm, + Function.identity(), + (o1, o2) -> o1.getSort() < o2.getSort() ? o1 : o2 + ) + ) + .values()); + + area.put(k, trees); + }); + + countyMap.forEach((k, v) -> { + v.forEach(o -> { + String data = o.getCity(); + if (StringUtils.isNotBlank(data)) { + List trees = county.get(data); + if (CollectionUtils.isEmpty(trees)) { + trees = Lists.newArrayList(); + } + trees.add(new AdcdTree().setSort(o.getSort()).setAdcd(o.getId().toString()).setAdnm(o.getCounty()).setAdlevel(2).setChildren(area.get(o.getCity() + "_" + o.getCounty()))); + county.put(data, trees); + } + }); + }); + + + county.keySet().forEach(k ->{ + List trees = county.get(k); + trees = new ArrayList<>(trees.stream() + .collect( + Collectors.toMap( + AdcdTree::getAdnm, + Function.identity(), + (o1, o2) -> o1.getSort() < o2.getSort() ? o1 : o2 + ) + ) + .values()); + + county.put(k, trees); + }); + + List cityList = Lists.newArrayList(); + + cityMap.forEach((k, v) -> { + if (CollectionUtils.isNotEmpty(v)) { + ShAddressBook o = v.get(0); + cityList.add(new AdcdTree().setSort(o.getSort()).setAdcd(o.getId().toString()).setAdnm(o.getCity()).setAdlevel(1).setChildren(county.get(o.getCity()))); + } + }); + + return sorted(cityList); + } + + + private List sorted(List tree) { + + List sorteds = null; + + if (CollectionUtils.isNotEmpty(tree)) { + sorteds = tree.stream().sorted( + Comparator.comparing(AdcdTree::getSort) + ).collect(Collectors.toList()); + sorteds.forEach(o -> { + o.setChildren(sorted(o.getChildren())); + }); + } + + return sorteds; + } + + + @Override + public Map importBatchMatch(List shAddressBooksMatch) { + Map map = Maps.newHashMap(); + map.put("ppAllCount", shAddressBooksMatch.size());// 总数 + map.put("ppOneList", new ArrayList<>());// 精确匹配 + map.put("ppManyRownum", "");// 匹配到多条 + map.put("ppZeroRownum", "");// 未匹配到 + // 根据区划和责任人类型匹配,返回匹配成功数据和未匹配的信息 + List shAddressBooksAll = baseMapper.selectList(new QueryWrapper().eq("DEL", REC)); + // 责任人类型分组 + Map> zrrMaps = shAddressBooksAll.stream().collect(Collectors.groupingBy(ShAddressBook::getType2)); + for (int i = 0; i < shAddressBooksMatch.size(); i++) { + ShAddressBookVo vo = shAddressBooksMatch.get(i); + String county = vo.getCounty(); // 县 + String area = vo.getArea(); // 乡 + String village = vo.getVillage(); // 村 + String type2 = vo.getType2(); // 责任人类型 + if (StringUtils.isNotBlank(type2) && zrrMaps.containsKey(type2)) { + List typeBooks = zrrMaps.get(type2); + List ppResult = typeBooks.stream() + .filter(o -> Objects.equals(county, o.getCounty()) + && Objects.equals(area, o.getArea()) + && Objects.equals(village, o.getVillage()) + && Objects.equals(type2, o.getType2())).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(ppResult)) { + if (ppResult.size() == 1) { + // 匹配单条(正确匹配) + List ppOneList = (List) map.get("ppOneList"); + ppOneList.add(ppResult.get(0)); + map.put("ppOneList", ppOneList); + } else { + // 匹配多条 + map.put("ppManyRownum", map.get("ppManyRownum").toString() + (i + 2) + "、"); + } + } else { + // 未匹配 + map.put("ppZeroRownum", map.get("ppZeroRownum").toString() + (i + 2) + "、"); + } + } else { + // 未匹配 + map.put("ppZeroRownum", map.get("ppZeroRownum").toString() + (i + 2) + "、"); + } + } + if(map.get("ppZeroRownum").toString().length()> 0 && map.get("ppZeroRownum").toString().endsWith("、")){ + map.put("ppZeroRownum", map.get("ppZeroRownum").toString().substring(0, map.get("ppZeroRownum").toString().length() - 1)); + } + if(map.get("ppManyRownum").toString().length()> 0 && map.get("ppManyRownum").toString().endsWith("、")){ + map.put("ppManyRownum", map.get("ppManyRownum").toString().substring(0, map.get("ppManyRownum").toString().length() - 1)); + } + return map; + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/ShCallWordServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/ShCallWordServiceImpl.java new file mode 100644 index 0000000..d2b9eed --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/ShCallWordServiceImpl.java @@ -0,0 +1,35 @@ +package com.whdc.legacy.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.legacy.mapper.ShCallWordMapper; +import com.whdc.legacy.model.dto.ShCallWordDto; +import com.whdc.legacy.model.entity.ShCallWord; +import com.whdc.legacy.service.ShCallWordService; +import org.springframework.stereotype.Service; + +import java.util.List; + +import static com.whdc.legacy.model.MyConstant.REDIS_KEY; + + +/** + * 描述: 备注 + * author: xusan + * date: 2024-07-29 17:27:25 + */ +@Service +public class ShCallWordServiceImpl extends ServiceImpl implements ShCallWordService { + + private static final String THIS_REDIS_KEY = REDIS_KEY + ShCallWord.thisTableName + ":"; + + @Override + public IPage page(ShCallWordDto dto) { + return getBaseMapper().page(dto.getPage(), dto); + } + + @Override + public List list(ShCallWordDto dto) { + return getBaseMapper().page(dto); + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/ShCallsServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/ShCallsServiceImpl.java new file mode 100644 index 0000000..74c30d0 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/ShCallsServiceImpl.java @@ -0,0 +1,66 @@ +package com.whdc.legacy.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.legacy.mapper.ShCallsMapper; +import com.whdc.legacy.model.dto.ShCallsDto; +import com.whdc.legacy.model.entity.ShAddressBook; +import com.whdc.legacy.model.entity.ShCalls; +import com.whdc.legacy.model.vo.ShCallsVo; +import com.whdc.legacy.service.ShCallsService; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static com.whdc.legacy.model.MyConstant.REDIS_KEY; + + +/** + * 描述: 抽查日志 + * author: xusan + * date: 2024-07-29 17:27:25 + */ +@Service +public class ShCallsServiceImpl extends ServiceImpl implements ShCallsService { + + private static final String THIS_REDIS_KEY = REDIS_KEY + ShCalls.thisTableName + ":"; + private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + @Override + public IPage page(ShCallsDto dto) { + return this.getBaseMapper().page(dto.getPage(),dto); + } + + @Override + public List list(ShCallsDto dto) { + return this.getBaseMapper().list(dto); + } + + @Override + public List listVo(ShCallsDto dto) { + return this.getBaseMapper().listVo(dto); + } + + @Override + public Map logDateStatistics(ShCallsDto dto) { + Map retMap = new HashMap<>(); + List shCalls = baseMapper.selectList(new QueryWrapper() + .ge(StringUtils.isNotBlank(dto.getStiStartTime()), "CALL_TIME", dto.getStiStartTime().length() < 11 ? dto.getStiStartTime() + "00:00:00" : dto.getStiStartTime()) + .le(StringUtils.isNotBlank(dto.getStiEndTime()), "CALL_TIME", dto.getStiEndTime().length() < 11 ? dto.getStiEndTime() + "23:59:59" : dto.getStiEndTime()).orderByAsc("CALL_TIME")); + if (CollectionUtils.isNotEmpty(shCalls)) { + retMap = shCalls.stream() + .collect(Collectors.groupingBy( + r -> sdf.format(r.getCallTime()), + Collectors.counting() + )); + } + return retMap; + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/ShPeriodServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/ShPeriodServiceImpl.java new file mode 100644 index 0000000..6f6afbf --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/ShPeriodServiceImpl.java @@ -0,0 +1,28 @@ +package com.whdc.legacy.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.legacy.mapper.ShPeriodMapper; +import com.whdc.legacy.model.dto.ShPeriodDto; +import com.whdc.legacy.model.entity.ShPeriod; +import com.whdc.legacy.service.ShPeriodService; +import org.springframework.stereotype.Service; + +import static com.whdc.legacy.model.MyConstant.REDIS_KEY; + + +/** + * 描述: 防汛周期 + * author: xusan + * date: 2024-07-29 17:27:25 + */ +@Service +public class ShPeriodServiceImpl extends ServiceImpl implements ShPeriodService { + + private static final String THIS_REDIS_KEY = REDIS_KEY + ShPeriod.thisTableName + ":"; + + @Override + public IPage page(ShPeriodDto dto) { + return getBaseMapper().page(dto.getPage(), dto); + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/UnitDictServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/UnitDictServiceImpl.java new file mode 100644 index 0000000..d7458af --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/UnitDictServiceImpl.java @@ -0,0 +1,41 @@ +package com.whdc.legacy.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.legacy.mapper.UnitDictMapper; +import com.whdc.legacy.model.entity.UnitDict; +import com.whdc.legacy.service.IUnitDictService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * @author xusan + * @date 2024-05-11 + */ +@Service +public class UnitDictServiceImpl extends ServiceImpl implements IUnitDictService { + + + @Override + public IPage page(UnitDict dto) { + return baseMapper.page(new Page<>(), dto); + } + + + @Override + public List find(UnitDict dto) { + return baseMapper.find(dto); + } + + @Override + public List findByUserId(String userId) { + return baseMapper.findByUserId(userId); + } + + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/UserServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..bc8c363 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/UserServiceImpl.java @@ -0,0 +1,494 @@ +package com.whdc.legacy.service.impl; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.WxMaUserService; +import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.common.exception.MyException; +import com.whdc.legacy.mapper.AddressBookMapper; +import com.whdc.legacy.mapper.UserMapper; +import com.whdc.legacy.model.dto.LoginDto; +import com.whdc.legacy.model.dto.UserDto; +import com.whdc.legacy.model.dto.VxLoginDto; +import com.whdc.legacy.model.entity.AddressBook; +import com.whdc.legacy.model.entity.User; +import com.whdc.legacy.model.vo.AddressBookVo; +import com.whdc.legacy.model.vo.LoginVo; +import com.whdc.legacy.service.IUserService; +import com.whdc.common.utils.HttpUtil; +import com.whdc.common.utils.ResultJson; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpStatus; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +import static com.whdc.legacy.model.MyConstant.REDIS_KEY; + + +/** + *

+ * 服务实现类 + *

+ * + * @author xusan + * @date 2024-05-11 + */ +@Service +@Slf4j +public class UserServiceImpl extends ServiceImpl implements IUserService { + + public static final String DEFAULT_PASSWORD = "Fxkh@123456"; + + @Autowired + private AddressBookMapper addressBookMapper; + + @Autowired + private RedisTemplate stringRedisTemplate; + + @Autowired + private WxMaService wxMaService; + + @Override + public IPage page(User dto) { + return baseMapper.page(new Page<>(), dto); + } + + + @Override + public List find(User dto) { + return baseMapper.find(dto); + } + + + @Override + public LoginVo login(LoginDto dto) { + + User sysUser = findByLoginName(dto.getLoginName()); + + if (sysUser == null) { + throw new MyException("用户名或密码错误"); + } + + if (getPassword(sysUser.getSalt(), dto.getPassword()).equals(sysUser.getPassword())) { + LoginVo out = new LoginVo(); + BeanUtils.copyProperties(sysUser, out); + + AddressBookVo book = addressBookMapper.getVoById(sysUser.getAbId()); + if (Objects.nonNull(book)) { + String adcd = book.getAdcd(); + if (StringUtils.isNotBlank(adcd)) { +// if ("00000000000".equals(adcd.substring(4))) { // 市 +// out.setAdlevel(1); +// out.setAdcd(adcd.replace("00000000000","")); +// } else if ("000000000".equals(adcd.substring(6))) { // 县 +// out.setAdcd(adcd.replace("000000000","")); +// out.setAdlevel(2); +// }else{ +// out.setAdcd(adcd); +// } + out.setAdlevel(2); + out.setAdcd(adcd.substring(0, 4)); + + } + out.setName(book.getName()); + out.setOname(book.getOname()); + if (StringUtils.isNotBlank(book.getAdnm())) { + out.setOname(book.getAdnm()); + } + } + return out; + + } + + throw new MyException("用户名或密码错误"); + } + + @Override + public LoginVo wxLogin(VxLoginDto dto) { + + WxMaUserService userService = wxMaService.getUserService(); + + WxMaPhoneNumberInfo phoneNoInfo = null; + try { + phoneNoInfo = userService.getPhoneNoInfo(dto.getPhoneCode()); + } catch (WxErrorException e) { + throw new MyException("获取手机号失败," + e.getMessage(), e); + } + + if (phoneNoInfo == null) { + throw new MyException("获取微信数据为空1"); + } + + // 获取手机号 + String phone = phoneNoInfo.getPurePhoneNumber(); + + if (StringUtils.isBlank(phone)) { + throw new MyException("获取手机号失败"); + } + + WxMaJscode2SessionResult sessionInfo = null; + try { + sessionInfo = userService.getSessionInfo(dto.getWxcode()); + } catch (WxErrorException e) { + throw new RuntimeException(e); + } + if (sessionInfo == null) { + throw new MyException("获取微信数据为空2"); + } + + String openid = sessionInfo.getOpenid(); + if (StringUtils.isBlank(openid)) { + throw new MyException("获取微信openid失败"); + } + + User sysUser = findByLoginName(phone); + + if (sysUser == null) { + throw new MyException("当前手机号未注册"); + } + + + + LoginVo out = new LoginVo(); + BeanUtils.copyProperties(sysUser, out); + + AddressBookVo book = addressBookMapper.getVoById(sysUser.getAbId()); + if (Objects.nonNull(book)) { + + if (StringUtils.isNotBlank(book.getOpenid())){ + + System.out.println("openid1:"+sysUser.getAbId()); + System.out.println("openid2:"+openid); + System.out.println("openid3:"+book.getOpenid()); + + if(!openid.equals(book.getOpenid())){ + throw new MyException("当前手机号已绑定其他账号,请先解绑!"); + } + + }else{ + book.setOpenid(openid); + if (!book.updateById()) { + throw new MyException("openid保存失败"); + } + } + + if (!book.getIsPass()){ + throw new MyException("当前账号无法登录,请联系上级管理员!"); + } + + + + String adcd = book.getAdcd(); + if (StringUtils.isNotBlank(adcd)) { + + out.setAdlevel(2); + out.setAdcd(adcd.substring(0, 4)); + + } + out.setOpenid(openid); + out.setName(book.getName()); + out.setOname(book.getOname()); + if (StringUtils.isNotBlank(book.getAdnm())) { + out.setOname(book.getAdnm()); + } + }else{ + throw new MyException("该用户未绑定通讯录"); + } + return out; + + } + + @Override + public LoginVo wxLogin(String openid) { + + LoginVo out = new LoginVo(); + + AddressBookVo book = addressBookMapper.getVoByOpenid(openid); + if (Objects.nonNull(book)) { + + User sysUser = findByLoginName(book.getPhone()); + + if (sysUser == null) { + throw new MyException("当前手机号未注册"); + } + BeanUtils.copyProperties(sysUser, out); + + if (!book.getIsPass()){ + throw new MyException("当前账号无法登录,请联系上级管理员!"); + } + + + + String adcd = book.getAdcd(); + if (StringUtils.isNotBlank(adcd)) { + + out.setAdlevel(2); + out.setAdcd(adcd.substring(0, 4)); + + } + out.setName(book.getName()); + out.setOname(book.getOname()); + if (StringUtils.isNotBlank(book.getAdnm())) { + out.setOname(book.getAdnm()); + } + }else{ + throw new MyException("该用户未绑定通讯录"); + } + return out; + + } + + @Override + public boolean register(User entity) { + // 生成盐值 + String salt = UUID.randomUUID().toString().replaceAll("-", ""); + // 生成密码 + entity.setSalt(salt) + .setPassword(getPassword(salt, DEFAULT_PASSWORD)); + return this.save(entity); + } + + @Override + public User getRole(Integer id) { + + User byId = this.getById(id); + if (byId == null) { + throw new MyException("该用户不存在"); + } + + return byId; + } + + @Override + public boolean register(String phone, Integer abId, String role) { + User user = new User(); + user.setAbId(abId) + .setRole(role) + .setUsername(phone); + return register(user); + } + + @Override + public boolean updateLastDate(Integer id) { + return this.lambdaUpdate() + .set(User::getLastLoginDate, new Date()) + .eq(User::getId, id) + .update(); + } + + @Override + public boolean pushCode(String phone) { + + // 匹配手机号是否存在 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(AddressBook::getPhone, phone); + if (CollectionUtils.isEmpty(addressBookMapper.selectList(queryWrapper))) { + throw new MyException("当前手机号不存在"); + } + // 判断是否以发送 + String key = REDIS_KEY + "code:" + phone; + String code = String.valueOf(stringRedisTemplate.opsForValue().get(key)); + if (StringUtils.isBlank(code) || "null".equals(code)) { + // 生成验证码 + String numCode = getNumCode().toUpperCase(); + push(phone, numCode); + stringRedisTemplate.opsForValue().set(key, numCode, 60, TimeUnit.SECONDS); + } else { + throw new MyException("请勿重复发送验证码"); + } + + + return true; + } + + @Override + public LoginVo loginByCode(String phone, String code) { + // 匹配手机号是否存在 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(AddressBook::getPhone, phone); + List coll = addressBookMapper.selectList(queryWrapper); + if (CollectionUtils.isEmpty(coll)) { + throw new MyException("当前手机号不存在"); + } + AddressBook addressBook = coll.get(0); + // 判断是否以发送 + String key = REDIS_KEY + "code:" + phone; + String pushCode = String.valueOf(stringRedisTemplate.opsForValue().get(key)); + if (StringUtils.isBlank(pushCode)) { + throw new MyException("当前验证码已过期"); + } + + if (!pushCode.equals(code)) { + throw new MyException("验证码错误"); + } + + + User sysUser = this.lambdaQuery().eq(User::getAbId, addressBook.getId()).one(); + + if (sysUser == null) { + throw new MyException("当前账号暂未注册"); + } + + + if (!addressBook.getIsPass()){ + throw new MyException("当前账号无法登录,请联系上级管理员!"); + } + + LoginVo out = new LoginVo(); + BeanUtils.copyProperties(sysUser, out); + String adcd = addressBook.getAdcd(); + if (StringUtils.isNotBlank(adcd)) { +// if ("00000000000".equals(adcd.substring(4))) { // 市 +// out.setAdlevel(1); +// out.setAdcd(adcd.replace("00000000000","")); +// } else if ("000000000".equals(adcd.substring(6))) { // 县 +// out.setAdcd(adcd.replace("000000000","")); +// out.setAdlevel(2); +// }else{ +// out.setAdcd(adcd); +// } + out.setAdlevel(2); + out.setAdcd(adcd.substring(0, 4)); + } + + out.setName(addressBook.getName()); + out.setOname(addressBook.getOname()); + + AddressBookVo book = addressBookMapper.getVoById(sysUser.getAbId()); + if (StringUtils.isNotBlank(book.getAdnm())) { + out.setOname(book.getAdnm()); + } + return out; + } + + + public static String getCode() { + Random yzm = new Random(); //定义一个随机生成数技术,用来生成随机数 + //2,用String常用API-charAit生成验证码 + String yzm1 = "1234567890abcdefghijklmnopqrstuvwxwzABCDEFGHIJKLMNOPQRSTUVWXYZ";//定义一个String变量存放需要的数据,一共58位 + String yzm3 = "";//定义一个空的Atring变量用来接收生成的验证码 + for (int i = 0; i < 5; i++) { + int a = yzm.nextInt(58);//随机生成0-57之间的数,提供索引位置 + yzm3 += yzm1.charAt(a);//用get 和提供的索引找到相应位置的数据给变量 + } + return yzm3; + + } + + public static String getNumCode() { + //1,用随机生成数方法,生成验证码 + Random yzm = new Random(); //定义一个随机生成数技术,用来生成随机数 + + String yzm2 = ""; //定义一个空的Atring变量用来接收生成的验证码 + + for (int i = 0; i < 6; i++) { + //循环5次每次生成一位,5位验证码 + yzm2 = yzm2 + yzm.nextInt(10); +// int a = yzm.nextInt(1); //验证码包括数字、大小写字母组成 +// switch (a) { //a: 0 1 2 +// case 0: // 数字 小写字母 大写字母 +// char s = (char) (yzm.nextInt(26) + 65); +// yzm2 = yzm2 + s; +// break; +// case 1: +// char s1 = (char) (yzm.nextInt(26) + 97); +// yzm2 = yzm2 + s1; +// break; +// case 2: +// int s2 = yzm.nextInt(10); +// yzm2 = yzm2 + s2; +// break; +// } + } + return yzm2; + } + + /** + * 消息推送 + * + * @param phone + * @param code + */ + public void push(String phone, String code) { + + String content = "您正在登录湖北省防汛抗旱通讯录,验证码为:" + code + ",若非本人操作,请勿将验证码泄露他人。"; + + String body = "{\n" + + " \"channel\": [\"phone\"],\n" + + " \"content\": \"" + content + "\",\n" + + " \"devices\": [\"" + phone + "\"],\n" + + " \"foreignId\": \"" + UUID.randomUUID() + "\",\n" + + " \"source\": \"山洪app\",\n" + +// " \"token\": \"\",\n" + + +// 消息类别,3为监测预警,4为预报预警,5自定义短信,示例值(3) + " \"type\": 5\n" + + "}"; + + String s = HttpUtil.sendPost("http://223.75.53.141:82/shpush/v1/push/", body); + log.info("发送结果: " + s); + JSONObject jsonObject = JSON.parseObject(s); + if (jsonObject.getInteger("code") != HttpStatus.SC_OK) { + throw new MyException(jsonObject.getString("message")); + } + } + + + @Override + public ResultJson updatePwd(UserDto dto) { + + + User sysUser = this.getById(dto.getId()); + if (Objects.isNull(sysUser)) { + + return ResultJson.error("当前数据不存在"); + + } + + + if (getPassword(sysUser.getSalt(), dto.getOldPassword()).equals(sysUser.getPassword())) { + // 更新密码 + sysUser.setPassword(getPassword(sysUser.getSalt(), dto.getNewPassword())); + log.info("修改密码" + sysUser.getUsername() + "_" + dto.getNewPassword()); + return ResultJson.ok(sysUser.updateById()); + } + + return ResultJson.error("密码错误"); + } + + private User findByLoginName(String loginName) { + if (loginName == null) { + throw new MyException("登录名不能为空"); + } + + return this.lambdaQuery().eq(User::getUsername, loginName).one(); + + } + + public static String getPassword(String salt, String password) { + return DigestUtils.md5DigestAsHex((salt + password).getBytes()); + } + + public static void main(String[] args) { +// String salt = UUID.randomUUID().toString().replaceAll("-", ""); +// System.out.println(salt); +// System.out.println(DigestUtils.md5DigestAsHex((salt + DEFAULT_PASSWORD).getBytes())); + String numCode = getNumCode(); + System.out.println(); + } +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/VersionsServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/VersionsServiceImpl.java new file mode 100644 index 0000000..f0e4621 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/VersionsServiceImpl.java @@ -0,0 +1,100 @@ +package com.whdc.legacy.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.legacy.mapper.VersionsMapper; +import com.whdc.legacy.model.dto.CommDto; +import com.whdc.legacy.model.entity.AddressBook; +import com.whdc.legacy.model.entity.Versions; +import com.whdc.legacy.model.enums.VersionsType; +import com.whdc.legacy.service.IVersionsService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +import static com.whdc.legacy.model.MyConstant.REDIS_KEY; + +/** + *

+ * 服务实现类 + *

+ * @author xusan + * @date 2024-05-11 + */ +@Slf4j +@Service +public class VersionsServiceImpl extends ServiceImpl implements IVersionsService { + + @Autowired + private RedisTemplate stringRedisTemplate; + + @Override + public IPage page(CommDto dto) { + return baseMapper.page(dto.getPage(), dto); + } + + + @Override + public List find(Versions dto) { + return baseMapper.find(dto); + } + + @Override + public boolean saveInfo(AddressBook model, VersionsType versionsType, String adcd) { + + Integer version = 0; + + if (Objects.requireNonNull(versionsType) != VersionsType.ADD) { + List list = this.lambdaQuery() + .eq(Versions::getAbId, model.getId()) + .list(); + if (CollectionUtils.isNotEmpty(list)) { + version = list + .stream().map(Versions::getVersion) + .max(Comparator.comparing(Integer::intValue)) + .get(); + } + } + + // redis 获取当前数据库版本 + // 判断是否以发送 + String key = REDIS_KEY + "version:" + model.getId(); + String versionRed = String.valueOf(stringRedisTemplate.opsForValue().get(key)); + if (StringUtils.isNotBlank(versionRed) && !"null".equals(versionRed)){ + int i = Integer.parseInt(versionRed); + if (i != version){ + version = i; + } + } + + // 添加日志 + ++version; + + // 查询当前版本是否存在 + Versions entity = new Versions(null, + JSON.toJSONString(model), model.getId(), version , adcd,String.valueOf(StpUtil.getLoginId()), new Date(),versionsType.getName(), + null, null + ); + + boolean save = this.save(entity); + + if (save){ + stringRedisTemplate.opsForValue().set(key,String.valueOf(version)); + } + + return save; + + } + + +} diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/WarnMsgFBServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/WarnMsgFBServiceImpl.java new file mode 100644 index 0000000..c467082 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/WarnMsgFBServiceImpl.java @@ -0,0 +1,20 @@ +package com.whdc.legacy.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.legacy.mapper.WarnMsgFBMapper; +import com.whdc.legacy.model.entity.WarnMsgFB; +import com.whdc.legacy.service.IWarnMsgFBService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Slf4j +@Service +public class WarnMsgFBServiceImpl extends ServiceImpl implements IWarnMsgFBService { + + @Override + public List find(WarnMsgFB dto) {//默认根据warnid和calledphone查找 + return baseMapper.selectByWarnidAndCalledPhone(dto.getWarnid(),dto.getCalledPhone()); + } +} \ No newline at end of file diff --git a/module-legacy/src/main/java/com/whdc/legacy/service/impl/WarningResponderServiceImpl.java b/module-legacy/src/main/java/com/whdc/legacy/service/impl/WarningResponderServiceImpl.java new file mode 100644 index 0000000..8fe1402 --- /dev/null +++ b/module-legacy/src/main/java/com/whdc/legacy/service/impl/WarningResponderServiceImpl.java @@ -0,0 +1,26 @@ +package com.whdc.legacy.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.legacy.mapper.WarningResponderMapper; +import com.whdc.legacy.model.entity.WarningResponder; +import com.whdc.legacy.service.IWarningResponderService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author xusan + * @date 2024-05-11 + */ +@Service +public class WarningResponderServiceImpl extends ServiceImpl implements IWarningResponderService { + + @Override + public List getListByAdnm2(String adnm) { + return baseMapper.getListByAdnm2(adnm); + } +} diff --git a/module-legacy/src/main/resources/application.yml b/module-legacy/src/main/resources/application.yml new file mode 100644 index 0000000..85a28f1 --- /dev/null +++ b/module-legacy/src/main/resources/application.yml @@ -0,0 +1,113 @@ + +server: + port: 20020 + servlet: + context-path: /fxkhtxl + session: + # 配置会话超时 + timeout: 120s + encoding: + charset: UTF-8 + enabled: true + force: true +spring: + #数据库配置 + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: dm.jdbc.driver.DmDriver +# url: jdbc:dm://local.gunshiiot.com:5236?schema=FXKH_TXL +# username: SYSDBA +# password: SYSDBA001 + url: jdbc:dm://10.42.6.247:5236?schema=FXKH_TXL + username: SHZH + password: Shzh_890 + druid: + initialSize: 5 + minIdle: 5 + maxActive: 20 + maxWait: 60000 + timeBetweenEvictionRunsMillis: 60000 + minEvictableIdleTimeMillis: 300000 + validationQuery: SELECT1FROMDUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + filters: stat,wall,log4j #wall表示排除防火请 + logSlowSql: true + + + #jpa配置 + jpa: + properties: + hibernate: + dialect: org.hibernate.dialect.DmDialect + + # Redis + redis: + database: 5 + host: 10.42.6.75 + password: Whdc_890 +# host: 10.0.41.112 +# password: 1234567a +# host: 127.0.0.1 +# password: + port: 6379 + servlet: + multipart: + max-file-size: 1100MB + max-request-size: 1100MB + +knife4j: + enable: true + setting: + enableFooter: false + enableFooterCustom: true + footerCustomContent: Copyright 2018-[湖北纬皓端成科技有限公司](http://www.wavehorizon.cn) + + documents: # 文档配置,可配置多个分组 + - group: doc-knife4j-1.0.0 + name: MarkDown文档 + locations: classpath:markdown/* + - group: v1.0 + name: v1.0 + + +logging: + level.org.springframework.boot.autoconfigure: error #spring的自动装配日志只打error,否则debug输出的会打印很多自动装配的log信息到控制台 + config: classpath:logback-spring.xml + +mybatis-plus: + global-config: + db-config: + update-strategy: not_empty + insert-strategy: not_empty + +wx: + miniapp: + configs: + appid: wxb9b07668d1ba20fe + secret: 99a1b89ac30e28bcc9bba8be973027f4 + +#getGroupWarning: http://223.75.53.141:8000/shzh/met/zyqxfw/api/warning/getGroupWarning +getGroupWarning: http://127.0.0.1:20000/shzh/met/zyqxfw/api/warning/getGroupWarning + +autocall: + sysUserId: HBSL01 # 平台网页https://aicc.cuopen.net:9801/login 密码Gswl@2025 +# processId: 1935233125932101634 + processId: 1952550108058906626 +# callerGroup: 02160980358 + callerGroup: 02759325005 + secret: yxt@2024-1234567 + +enableModules: + sms: true + +enableSchedules: + qxwarning: true + sms: false + +sms: + url: http://120.55.193.51:8098/smtp/http/submit + userName: hbfx15 + serviceCode: hbfx15 + userPassword: hbfx15 \ No newline at end of file diff --git a/module-legacy/src/main/resources/fonts/ChineseFonts.ttf b/module-legacy/src/main/resources/fonts/ChineseFonts.ttf new file mode 100644 index 0000000..4c2831f Binary files /dev/null and b/module-legacy/src/main/resources/fonts/ChineseFonts.ttf differ diff --git a/module-legacy/src/main/resources/log4j.properties b/module-legacy/src/main/resources/log4j.properties new file mode 100644 index 0000000..a6233d5 --- /dev/null +++ b/module-legacy/src/main/resources/log4j.properties @@ -0,0 +1,2 @@ +log4j.rootLogger=ERROR +log4j.logger.org.apache.http=ERROR \ No newline at end of file diff --git a/module-legacy/src/main/resources/logback-spring.xml b/module-legacy/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..e622d79 --- /dev/null +++ b/module-legacy/src/main/resources/logback-spring.xml @@ -0,0 +1,218 @@ + + + + + + + + logback + + + + + + + + + + + + + + + + + + + + + + + + + + info + + + ${CONSOLE_LOG_PATTERN} + + UTF-8 + + + + + + + + ${log.path}/web_debug.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + + ${log.path}/web-debug-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + debug + ACCEPT + DENY + + + + + + + ${log.path}/web_info.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + + ${log.path}/web-info-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + info + ACCEPT + DENY + + + + + + + ${log.path}/web_warn.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${log.path}/web-warn-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + warn + ACCEPT + DENY + + + + + + + ${log.path}/web_error.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${log.path}/web-error-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + ERROR + ACCEPT + DENY + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module-legacy/src/main/resources/mapper/AbUdRMapper.xml b/module-legacy/src/main/resources/mapper/AbUdRMapper.xml new file mode 100644 index 0000000..2aa26ed --- /dev/null +++ b/module-legacy/src/main/resources/mapper/AbUdRMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/module-legacy/src/main/resources/mapper/AddressBookCityMapper.xml b/module-legacy/src/main/resources/mapper/AddressBookCityMapper.xml new file mode 100644 index 0000000..b79f079 --- /dev/null +++ b/module-legacy/src/main/resources/mapper/AddressBookCityMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/module-legacy/src/main/resources/mapper/AddressBookMapper.xml b/module-legacy/src/main/resources/mapper/AddressBookMapper.xml new file mode 100644 index 0000000..7e522c8 --- /dev/null +++ b/module-legacy/src/main/resources/mapper/AddressBookMapper.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module-legacy/src/main/resources/mapper/AdinfoMapper.xml b/module-legacy/src/main/resources/mapper/AdinfoMapper.xml new file mode 100644 index 0000000..05822a8 --- /dev/null +++ b/module-legacy/src/main/resources/mapper/AdinfoMapper.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module-legacy/src/main/resources/mapper/FcMapper.xml b/module-legacy/src/main/resources/mapper/FcMapper.xml new file mode 100644 index 0000000..d1583e8 --- /dev/null +++ b/module-legacy/src/main/resources/mapper/FcMapper.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/module-legacy/src/main/resources/mapper/LoginInfoMapper.xml b/module-legacy/src/main/resources/mapper/LoginInfoMapper.xml new file mode 100644 index 0000000..ca14aa1 --- /dev/null +++ b/module-legacy/src/main/resources/mapper/LoginInfoMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/module-legacy/src/main/resources/mapper/OrganizationMapper.xml b/module-legacy/src/main/resources/mapper/OrganizationMapper.xml new file mode 100644 index 0000000..590aad8 --- /dev/null +++ b/module-legacy/src/main/resources/mapper/OrganizationMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/module-legacy/src/main/resources/mapper/QXWarningMapper.xml b/module-legacy/src/main/resources/mapper/QXWarningMapper.xml new file mode 100644 index 0000000..f0359ab --- /dev/null +++ b/module-legacy/src/main/resources/mapper/QXWarningMapper.xml @@ -0,0 +1,71 @@ + + + + + + + + + + \ No newline at end of file diff --git a/module-legacy/src/main/resources/mapper/ShAddressBookMapper.xml b/module-legacy/src/main/resources/mapper/ShAddressBookMapper.xml new file mode 100644 index 0000000..08b7f3a --- /dev/null +++ b/module-legacy/src/main/resources/mapper/ShAddressBookMapper.xml @@ -0,0 +1,107 @@ + + + + + + + diff --git a/module-legacy/src/main/resources/mapper/ShCallWordMapper.xml b/module-legacy/src/main/resources/mapper/ShCallWordMapper.xml new file mode 100644 index 0000000..4245b9d --- /dev/null +++ b/module-legacy/src/main/resources/mapper/ShCallWordMapper.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/module-legacy/src/main/resources/mapper/ShCallsMapper.xml b/module-legacy/src/main/resources/mapper/ShCallsMapper.xml new file mode 100644 index 0000000..4511042 --- /dev/null +++ b/module-legacy/src/main/resources/mapper/ShCallsMapper.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module-legacy/src/main/resources/mapper/ShPeriodMapper.xml b/module-legacy/src/main/resources/mapper/ShPeriodMapper.xml new file mode 100644 index 0000000..560b922 --- /dev/null +++ b/module-legacy/src/main/resources/mapper/ShPeriodMapper.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/module-legacy/src/main/resources/mapper/UnitDictMapper.xml b/module-legacy/src/main/resources/mapper/UnitDictMapper.xml new file mode 100644 index 0000000..850fc88 --- /dev/null +++ b/module-legacy/src/main/resources/mapper/UnitDictMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/module-legacy/src/main/resources/mapper/UserMapper.xml b/module-legacy/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..4d61ef9 --- /dev/null +++ b/module-legacy/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/module-legacy/src/main/resources/mapper/VersionsMapper.xml b/module-legacy/src/main/resources/mapper/VersionsMapper.xml new file mode 100644 index 0000000..572f4e1 --- /dev/null +++ b/module-legacy/src/main/resources/mapper/VersionsMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/module-legacy/src/main/resources/mapper/WarnMsgFBMapper.xml b/module-legacy/src/main/resources/mapper/WarnMsgFBMapper.xml new file mode 100644 index 0000000..edc2f35 --- /dev/null +++ b/module-legacy/src/main/resources/mapper/WarnMsgFBMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file diff --git a/module-legacy/src/main/resources/mapper/WarningResponderMapper.xml b/module-legacy/src/main/resources/mapper/WarningResponderMapper.xml new file mode 100644 index 0000000..e5320eb --- /dev/null +++ b/module-legacy/src/main/resources/mapper/WarningResponderMapper.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module-sms/README.md b/module-sms/README.md new file mode 100644 index 0000000..9c36052 --- /dev/null +++ b/module-sms/README.md @@ -0,0 +1,156 @@ +# SMS短信模块 + +## 模块概述 + +SMS模块提供生日短信和主题日短信的自动发送功能,包括: + +- **生日短信**:自动检测当日生日的专家并发送祝福短信 +- **主题日短信**:根据配置的主题日信息批量发送通知短信 +- **短信日志**:记录所有短信发送状态和结果 +- **定时任务**:自动化的发送和重置机制 + +## 重要:模块启用条件 + +SMS模块采用**双重条件控制**,必须同时满足以下条件才会启用: + +### 1. 环境条件 +```yaml +spring: + profiles: + active: prod +``` +- **必须**在生产环境中(`prod` profile) +- 其他环境(dev、test等)不会加载SMS模块 + +### 2. 配置条件 +```yaml +enableModules: + sms: + enable: true # 必须显式设置为true +``` +- **必须**显式设置 `enableModules.sms.enable=true` +- 默认值为 `false`,未配置时不会启用 + +### 完整启用配置示例 +```java +@SpringBootApplication +@Import({SmsModuleConfig.class}) +public class Main { + public static void main(String[] args) { + SpringApplication.run(Main.class, args); + } +} +``` +```yaml +enableModules: + sms: + enable: true + +sms: + url: http://your-sms-service-url:port/smtp/http/submit + userName: your-username + serviceCode: your-service-code + userPassword: your-password +``` + +## 功能配置 + +### 生日短信配置 +- **配置位置**:数据库表 `sms_birthday` +- **关键配置**: + - `status`: 启用状态(1=启用,0=禁用) + - `template`: 短信模板,支持 `{姓名}` 占位符 + - `executionTmStr`: 执行时间(格式:HH:mm:ss) + +### 主题日短信配置 +- **配置位置**:数据库表 `sms_holiday` +- **关键配置**: + - `status`: 启用状态 + - `subjectName`: 主题名称 + - `template`: 短信模板,支持 `{姓名}` 和 `{主题}` 占位符 + - `startDate` / `endDate`: 活动日期范围 + - `executionTmStr`: 执行时间 + +## 开发注意事项 + +### 默认行为 +- SMS模块在非生产环境**不会**被加载 +- 定时任务默认**禁用**,需要显式配置启用 +- 这是出于安全考虑,避免意外发送短信 + +### 验证模块是否启用 +1. **查看启动日志**: + ``` + SMS定时任务状态: 已启用 # 或 "已禁用" + ``` + +2. **检查Spring容器**: + - 启用:`SmsHelper`、`ScheduledTask` 等bean被加载 + - 禁用:这些bean不会被实例化 + +3. **检查Controller**: + - 如果模块未启用,SMS相关的API接口将返回404 + +### 日志配置 +建议在日志配置中添加SMS相关日志级别: +```xml + + +``` + +## 故障排查 + +### 常见问题 + +#### 1. SMS模块未启用 +**症状**:启动时看不到SMS相关日志,API返回404 +**排查**: +- 检查 `spring.profiles.active` 是否为 `prod` +- 检查 `enableModules.sms.enable` 是否为 `true` + +#### 2. 定时任务未执行 +**症状**:到达配置时间但未发送短信 +**排查**: +- 确认 `ScheduledTask` bean被加载(查看启动日志) +- 检查任务执行时间配置格式 +- 查看是否有异常日志 + +#### 3. 短信发送失败 +**症状**:任务执行但短信未发送成功 +**排查**: +- 检查短信服务配置(URL、认证信息) +- 查看短信日志表 `sms_log` 中的错误信息 +- 检查手机号码格式和状态 + +### 调试方法 + +#### 1. 启用详细日志 +```yaml +logging: + level: + com.whdc.sms: DEBUG + org.springframework.scheduling: DEBUG +``` + +#### 2. 手动触发测试 +通过API接口手动测试短信发送功能: +- `POST /sms/birthday/get` - 获取生日短信配置 +- `POST /sms/holiday/page` - 查看主题日配置 + +## 数据库表说明 + +- `sms_birthday` - 生日短信配置 +- `sms_holiday` - 主题日短信配置 +- `sms_specialist` - 专家信息(包含生日和手机号) +- `sms_log` - 短信发送日志 + +## 安全提醒 + +1. **生产环境专用**:SMS功能仅在生产环境启用 +2. **显式配置**:必须显式配置才能启用,避免误操作 +3. **短信监控**:定期检查短信发送日志,确保功能正常 +4. **配置保护**:短信服务认证信息应妥善保管 + +## 联系方式 + +如有问题请联系开发团队。 \ No newline at end of file diff --git a/module-sms/pom.xml b/module-sms/pom.xml new file mode 100644 index 0000000..3416031 --- /dev/null +++ b/module-sms/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + + com.whdc + fxkh-txl-parent + 1.0 + ../poms/dependency.xml + + + fxkh-txl-sms + jar + 防汛抗旱通讯录API - 短信服务模块 + + + + + com.whdc + fxkh-txl-common + + + + + org.springframework.boot + spring-boot-starter + + + + + com.baomidou + mybatis-plus-boot-starter + + + + + com.dameng + DmJdbcDriver18 + + + com.alibaba + druid + + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/config/SmsModuleConfig.java b/module-sms/src/main/java/com/whdc/sms/config/SmsModuleConfig.java new file mode 100644 index 0000000..9ee5444 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/config/SmsModuleConfig.java @@ -0,0 +1,25 @@ +package com.whdc.sms.config; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * SMS模块配置 + * 根据配置决定是否启用SMS模块 + * + * @author lyf + * @since 2025-10-29 + */ +@Configuration +@ComponentScan(basePackages = "com.whdc.sms") +@ConditionalOnProperty( + name = "enableModules.sms", + havingValue = "true" +) +public class SmsModuleConfig { + + // 这个配置类只会在spring.profiles.active=prod时生效 + // 从而扫描com.whdc.sms包下的所有组件 + +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/controller/SmsBirthdayController.java b/module-sms/src/main/java/com/whdc/sms/controller/SmsBirthdayController.java new file mode 100644 index 0000000..216aa84 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/controller/SmsBirthdayController.java @@ -0,0 +1,40 @@ +package com.whdc.sms.controller; + +import com.whdc.sms.model.entity.SmsBirthday; +import com.whdc.common.model.group.Update; +import com.whdc.sms.service.ISmsBirthdayService; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 生日短信控制器 + * + * @author lyf + * @since 2025-09-23 + */ +@Api(tags = "生日短信 - Controller") +@RestController +@RequestMapping("/sms/birthday") +public class SmsBirthdayController { + + @Autowired + private ISmsBirthdayService smsBirthdayService; + + private static final Long THE_ONLY_ONE = 1L; + + @ApiOperation(value = "修改") + @PostMapping(value = "edit") + public ResultJson edit(@RequestBody @Validated(Update.class) SmsBirthday model) { + return ResultJson.ok(smsBirthdayService.updateById(model)); + } + + @ApiOperation(value = "查询") + @GetMapping(value = "get") + public ResultJson getById() { + return ResultJson.ok(smsBirthdayService.getById(THE_ONLY_ONE)); + } +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/controller/SmsHolidayController.java b/module-sms/src/main/java/com/whdc/sms/controller/SmsHolidayController.java new file mode 100644 index 0000000..4d58b0f --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/controller/SmsHolidayController.java @@ -0,0 +1,59 @@ +package com.whdc.sms.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.sms.model.dto.SmsHolidayPageDto; +import com.whdc.sms.model.entity.SmsHoliday; +import com.whdc.common.model.group.Insert; +import com.whdc.common.model.group.Update; +import com.whdc.sms.service.ISmsHolidayService; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 短信任务控制器 + * + * @author lyf + * @since 2025-09-23 + */ +@Api(tags = "短信任务 - Controller") +@RestController +@RequestMapping("/sms/holiday") +public class SmsHolidayController { + + @Autowired + private ISmsHolidayService smsTaskService; + + @ApiOperation(value = "分页查询") + @PostMapping(value = "page") + public ResultJson> page(@RequestBody SmsHolidayPageDto dto) { + return ResultJson.ok(smsTaskService.page(dto)); + } + + @ApiOperation(value = "新增") + @PostMapping(value = "add") + public ResultJson add(@RequestBody @Validated(Insert.class) SmsHoliday model) { + return ResultJson.ok(smsTaskService.save(model)); + } + + @ApiOperation(value = "修改") + @PostMapping(value = "edit") + public ResultJson edit(@RequestBody @Validated(Update.class) SmsHoliday model) { + return ResultJson.ok(smsTaskService.updateById(model)); + } + + @ApiOperation(value = "删除") + @GetMapping(value = "del/{id}") + public ResultJson delete(@PathVariable("id") Long id) { + return ResultJson.ok(smsTaskService.removeById(id)); + } + + @ApiOperation(value = "根据ID查询") + @GetMapping(value = "get/{id}") + public ResultJson getById(@PathVariable("id") Long id) { + return ResultJson.ok(smsTaskService.getById(id)); + } +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/controller/SmsLogController.java b/module-sms/src/main/java/com/whdc/sms/controller/SmsLogController.java new file mode 100644 index 0000000..6b57f08 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/controller/SmsLogController.java @@ -0,0 +1,59 @@ +package com.whdc.sms.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.sms.model.dto.SmsLogPageDto; +import com.whdc.sms.model.entity.SmsLog; +import com.whdc.common.model.group.Insert; +import com.whdc.common.model.group.Update; +import com.whdc.sms.service.ISmsLogService; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 短信日志控制器 + * + * @author lyf + * @since 2025-09-23 + */ +@Api(tags = "短信日志 - Controller") +@RestController +@RequestMapping("/sms/log") +public class SmsLogController { + + @Autowired + private ISmsLogService smsLogService; + + @ApiOperation(value = "分页查询") + @PostMapping(value = "page") + public ResultJson> page(@RequestBody SmsLogPageDto dto) { + return ResultJson.ok(smsLogService.page(dto)); + } + + @ApiOperation(value = "新增") + @PostMapping(value = "add") + public ResultJson add(@RequestBody @Validated(Insert.class) SmsLog model) { + return ResultJson.ok(smsLogService.save(model)); + } + + @ApiOperation(value = "修改") + @PostMapping(value = "edit") + public ResultJson edit(@RequestBody @Validated(Update.class) SmsLog model) { + return ResultJson.ok(smsLogService.updateById(model)); + } + + @ApiOperation(value = "删除") + @GetMapping(value = "del/{id}") + public ResultJson delete(@PathVariable("id") Long id) { + return ResultJson.ok(smsLogService.removeById(id)); + } + + @ApiOperation(value = "根据ID查询") + @GetMapping(value = "get/{id}") + public ResultJson getById(@PathVariable("id") Long id) { + return ResultJson.ok(smsLogService.getById(id)); + } +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/controller/SmsSpecialistController.java b/module-sms/src/main/java/com/whdc/sms/controller/SmsSpecialistController.java new file mode 100644 index 0000000..fc37083 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/controller/SmsSpecialistController.java @@ -0,0 +1,60 @@ +package com.whdc.sms.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.sms.model.dto.SmsSpecialistPageDto; +import com.whdc.sms.model.entity.SmsSpecialist; +import com.whdc.common.model.group.Insert; +import com.whdc.common.model.group.Update; +import com.whdc.sms.service.ISmsSpecialistService; +import com.whdc.common.utils.ResultJson; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 专家通讯录控制器 + * + * @author lyf + * @since 2025-09-23 + */ +@Api(tags = "专家通讯录 - Controller") +@RestController +@RequestMapping("/sms/specialist") +public class SmsSpecialistController { + + @Autowired + private ISmsSpecialistService specialistService; + + + @ApiOperation(value = "分页查询") + @PostMapping(value = "page") + public ResultJson> page(@RequestBody SmsSpecialistPageDto dto) { + return ResultJson.ok(specialistService.page(dto)); + } + + @ApiOperation(value = "新增") + @PostMapping(value = "add") + public ResultJson add(@RequestBody @Validated(Insert.class) SmsSpecialist model) { + return ResultJson.ok(specialistService.save(model)); + } + + @ApiOperation(value = "修改") + @PostMapping(value = "edit") + public ResultJson edit(@RequestBody @Validated(Update.class) SmsSpecialist model) { + return ResultJson.ok(specialistService.updateById(model)); + } + + @ApiOperation(value = "删除") + @GetMapping(value = "del/{id}") + public ResultJson delete(@PathVariable("id") Long id) { + return ResultJson.ok(specialistService.removeById(id)); + } + + @ApiOperation(value = "根据ID查询") + @GetMapping(value = "get/{id}") + public ResultJson getById(@PathVariable("id") Long id) { + return ResultJson.ok(specialistService.getById(id)); + } +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/mapper/SmsBirthdayMapper.java b/module-sms/src/main/java/com/whdc/sms/mapper/SmsBirthdayMapper.java new file mode 100644 index 0000000..7e11019 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/mapper/SmsBirthdayMapper.java @@ -0,0 +1,11 @@ +package com.whdc.sms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.whdc.sms.model.entity.SmsBirthday; + +/** + * @author lyf + * @since 2025-09-23 + */ +public interface SmsBirthdayMapper extends BaseMapper { +} diff --git a/module-sms/src/main/java/com/whdc/sms/mapper/SmsHolidayMapper.java b/module-sms/src/main/java/com/whdc/sms/mapper/SmsHolidayMapper.java new file mode 100644 index 0000000..53b52e8 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/mapper/SmsHolidayMapper.java @@ -0,0 +1,13 @@ +package com.whdc.sms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.whdc.sms.model.entity.SmsHoliday; + +/** + * 短信任务Mapper接口 + * + * @author lyf + * @since 2025-09-23 + */ +public interface SmsHolidayMapper extends BaseMapper { +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/mapper/SmsLogMapper.java b/module-sms/src/main/java/com/whdc/sms/mapper/SmsLogMapper.java new file mode 100644 index 0000000..6f2c000 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/mapper/SmsLogMapper.java @@ -0,0 +1,13 @@ +package com.whdc.sms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.whdc.sms.model.entity.SmsLog; + +/** + * 短信日志Mapper接口 + * + * @author lyf + * @since 2025-09-23 + */ +public interface SmsLogMapper extends BaseMapper { +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/mapper/SmsSpecialistMapper.java b/module-sms/src/main/java/com/whdc/sms/mapper/SmsSpecialistMapper.java new file mode 100644 index 0000000..64c4241 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/mapper/SmsSpecialistMapper.java @@ -0,0 +1,19 @@ +package com.whdc.sms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.whdc.sms.model.entity.SmsSpecialist; +import org.apache.ibatis.annotations.Update; + +/** + * 专家通讯录Mapper接口 + * + * @author lyf + * @since 2025-09-23 + */ +public interface SmsSpecialistMapper extends BaseMapper { + @Update("update specialist set flag_birthday_sent_today = 0 where flag_birthday_sent_today = 1") + void resetFlagBirthdaySentToday(); + + @Update("update specialist set flag_holiday_sent_today = 0 where flag_holiday_sent_today = 1") + void resetFlagHolidaySentToday(); +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/model/dto/SmsHolidayPageDto.java b/module-sms/src/main/java/com/whdc/sms/model/dto/SmsHolidayPageDto.java new file mode 100644 index 0000000..bc0f457 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/model/dto/SmsHolidayPageDto.java @@ -0,0 +1,28 @@ +package com.whdc.sms.model.dto; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 节日短信分页查询DTO + * + * @author lyf + * @since 2025-09-26 + */ +@Data +public class SmsHolidayPageDto { + + @ApiModelProperty(value = "当前页", example = "1") + private Integer pageNumber = 1; + + @ApiModelProperty(value = "每页条数", example = "10") + private Integer pageSize = 10; + + @ApiModelProperty(value = "主题名称") + private String subjectName; + + public Page getPage() { + return new Page(pageNumber, pageSize); + } +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/model/dto/SmsLogPageDto.java b/module-sms/src/main/java/com/whdc/sms/model/dto/SmsLogPageDto.java new file mode 100644 index 0000000..17df7fb --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/model/dto/SmsLogPageDto.java @@ -0,0 +1,42 @@ +package com.whdc.sms.model.dto; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 短信日志分页查询DTO + * + * @author lyf + * @since 2025-09-26 + */ +@Data +public class SmsLogPageDto { + + @ApiModelProperty(value = "当前页", example = "1") + private Integer pageNumber = 1; + + @ApiModelProperty(value = "每页条数", example = "10") + private Integer pageSize = 10; + + @ApiModelProperty(value = "开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date stm; + + @ApiModelProperty(value = "结束时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date etm; + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "电话号码") + private String phone; + + public Page getPage() { + return new Page(pageNumber, pageSize); + } +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/model/dto/SmsSpecialistPageDto.java b/module-sms/src/main/java/com/whdc/sms/model/dto/SmsSpecialistPageDto.java new file mode 100644 index 0000000..5fde399 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/model/dto/SmsSpecialistPageDto.java @@ -0,0 +1,34 @@ +package com.whdc.sms.model.dto; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 专家通讯录分页查询DTO + * + * @author lyf + * @since 2025-09-26 + */ +@Data +public class SmsSpecialistPageDto { + + @ApiModelProperty(value = "当前页", example = "1") + private Integer pageNumber = 1; + + @ApiModelProperty(value = "每页条数", example = "10") + private Integer pageSize = 10; + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "电话号码") + private String phone; + + @ApiModelProperty(value = "状态 1:有效 0:无效") + private Integer status; + + public Page getPage() { + return new Page(pageNumber, pageSize); + } +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/model/entity/SmsBirthday.java b/module-sms/src/main/java/com/whdc/sms/model/entity/SmsBirthday.java new file mode 100644 index 0000000..291226d --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/model/entity/SmsBirthday.java @@ -0,0 +1,57 @@ +package com.whdc.sms.model.entity; + +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 io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 任务实体类 + * + * @author + * @date + */ +@Data +@EqualsAndHashCode +@Accessors(chain = true) +@ApiModel(description = "生日短信") +@TableName("SMS_BIRTHDAY") +public class SmsBirthday implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "ID", type = IdType.AUTO) + @ApiModelProperty(value = "主键ID") + private Long id; + + /** + * 任务执行时间 + * 例:08:00:00 + */ + @TableField("EXECUTION_TM_STR") + @ApiModelProperty(value = "任务执行时间") + private String executionTmStr; + + /** + * 状态 1:有效 0:无效 + */ + @TableField("STATUS") + @ApiModelProperty(value = "状态 1:有效 0:无效") + private Integer status; + + /** + * 模板 + */ + @TableField("TEMPLATE") + @ApiModelProperty(value = "模板") + private String template; +} diff --git a/module-sms/src/main/java/com/whdc/sms/model/entity/SmsHoliday.java b/module-sms/src/main/java/com/whdc/sms/model/entity/SmsHoliday.java new file mode 100644 index 0000000..a3a6041 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/model/entity/SmsHoliday.java @@ -0,0 +1,89 @@ +package com.whdc.sms.model.entity; + +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.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 任务实体类 + * + * @author + * @date + */ +@Data +@EqualsAndHashCode +@Accessors(chain = true) +@ApiModel(description = "节日短信") +@TableName("SMS_HOLIDAY") +public class SmsHoliday implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "ID", type = IdType.AUTO) + @ApiModelProperty(value = "主键ID") + private Long id; + + /** + * 主题名称 + */ + @TableField("SUBJECT_NAME") + @ApiModelProperty(value = "主题名称") + private String subjectName; + + /** + * 任务开始日期 + */ + @TableField("START_DATE") + @ApiModelProperty(value = "任务开始日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date startDate; + + /** + * 任务结束日期 + */ + @TableField("END_DATE") + @ApiModelProperty(value = "任务结束日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date endDate; + + /** + * 任务执行时间 + */ + @TableField("EXECUTION_TM_STR") + @ApiModelProperty(value = "任务执行时间") + private String executionTmStr; + + /** + * 状态 1:有效 0:无效 + */ + @TableField("STATUS") + @ApiModelProperty(value = "状态 1:有效 0:无效") + private Integer status; + + /** + * 模板 + */ + @TableField("TEMPLATE") + @ApiModelProperty(value = "模板") + private String template; + + /** + * 创建日期 + */ + @TableField("CREATE_TM") + @ApiModelProperty(value = "创建日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date createTm; +} diff --git a/module-sms/src/main/java/com/whdc/sms/model/entity/SmsLog.java b/module-sms/src/main/java/com/whdc/sms/model/entity/SmsLog.java new file mode 100644 index 0000000..e1df97b --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/model/entity/SmsLog.java @@ -0,0 +1,74 @@ +package com.whdc.sms.model.entity; + +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.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 短信日志实体类 + * + * @author + * @since 2025-09-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(description = "短信日志") +@TableName("SMS_LOG") +public class SmsLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "ID", type = IdType.AUTO) + @ApiModelProperty(value = "主键ID") + private Long id; + + /** + * 发送时间 + */ + @TableField("SEND_TM") + @ApiModelProperty(value = "发送时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date sendTm; + + /** + * 姓名 + */ + @TableField("NAME") + @ApiModelProperty(value = "姓名") + private String name; + + /** + * 电话号码 + */ + @TableField("PHONE") + @ApiModelProperty(value = "电话号码") + private String phone; + + /** + * 备注 + */ + @TableField("REMARK") + @ApiModelProperty(value = "备注") + private String remark; + + /** + * 短信内容 + */ + @TableField("CONTENT") + @ApiModelProperty(value = "短信内容") + private String content; +} diff --git a/module-sms/src/main/java/com/whdc/sms/model/entity/SmsSpecialist.java b/module-sms/src/main/java/com/whdc/sms/model/entity/SmsSpecialist.java new file mode 100644 index 0000000..0641162 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/model/entity/SmsSpecialist.java @@ -0,0 +1,94 @@ +package com.whdc.sms.model.entity; + +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.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author + * @date + */ +@Data +@EqualsAndHashCode +@Accessors(chain = true) +@ApiModel(description = "专家") +@TableName("SMS_SPECIALIST") +public class SmsSpecialist implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "ID", type = IdType.AUTO) + @ApiModelProperty(value = "主键ID") + private Long id; + + /** + * 姓名 + */ + @TableField("NAME") + @ApiModelProperty(value = "姓名") + private String name; + + /** + * 职务 + */ + @TableField("POSITION") + @ApiModelProperty(value = "职务") + private String position; + + /** + * 生日 + */ + @TableField("BIRTHDAY") + @ApiModelProperty(value = "生日") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date birthday; + + /** + * 职位称呼 + */ + @TableField("ADDRESS") + @ApiModelProperty(value = "区域") + private String address; + + /** + * 电话号码 + */ + @TableField("PHONE") + @ApiModelProperty(value = "电话号码") + private String phone; + + /** + * 生效状态 1:有效 0:无效 + */ + @TableField("STATUS") + @ApiModelProperty(value = "生效状态 1:有效 0:无效") + private Integer status; + + /** + * 创建日期 + */ + @TableField("CREATE_TM") + @ApiModelProperty(value = "创建日期") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTm; + + //标记今天已经发送过生日短信的flag + @TableField("FLAG_BIRTHDAY_SENT_TODAY") + private Integer flagBirthdaySentToday; + + //标记今天已经发送过节日短信的flag + @TableField("FLAG_HOLIDAY_SENT_TODAY") + private Integer flagHolidaySentToday; +} diff --git a/module-sms/src/main/java/com/whdc/sms/scheduled/ScheduledTask.java b/module-sms/src/main/java/com/whdc/sms/scheduled/ScheduledTask.java new file mode 100644 index 0000000..9e14e4c --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/scheduled/ScheduledTask.java @@ -0,0 +1,54 @@ +package com.whdc.sms.scheduled; + +import com.whdc.sms.service.ISmsBirthdayService; +import com.whdc.sms.service.ISmsHolidayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Profile; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @author lyf + * @since 2025-10-28 + */ +@Component +@ConditionalOnProperty( + name = "enableSchedules.sms", + havingValue = "true" +) +public class ScheduledTask { + + @Autowired + private ISmsBirthdayService birthdayService; + + @Autowired + private ISmsHolidayService holidayService; + + @Scheduled(cron = "0 * * * * ?") + public void checkAndSendBirthdaySms() { + birthdayService.checkAndSendBirthdaySms(); + } + + @Scheduled(cron = "1 0 0 * * ?") + public void resetFlagBirthdaySentToday() { + birthdayService.resetFlagBirthdaySentToday(); + } + + /** + * 每天0点1分重置所有专家的flagHolidaySentToday为0 + */ + @Scheduled(cron = "1 0 0 * * ?") + public void resetFlagHolidaySentToday() { + holidayService.resetFlagHolidaySentToday(); + } + + /** + * 定时检查并发送主题日短信 + * 每分钟执行一次 + */ + @Scheduled(cron = "0 * * * * ?") + public void checkAndSendThemeSms() { + holidayService.checkAndSendThemeSms(); + } +} diff --git a/module-sms/src/main/java/com/whdc/sms/service/ISmsBirthdayService.java b/module-sms/src/main/java/com/whdc/sms/service/ISmsBirthdayService.java new file mode 100644 index 0000000..ebc0bf1 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/service/ISmsBirthdayService.java @@ -0,0 +1,37 @@ +package com.whdc.sms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.sms.model.entity.SmsBirthday; +import com.whdc.sms.model.entity.SmsSpecialist; +import org.springframework.scheduling.annotation.Scheduled; + +import java.util.List; + +/** + * 生日短信服务接口 + * + * @author lyf + * @since 2025-09-23 + */ +public interface ISmsBirthdayService extends IService { + /** + * 查询今天过生日专家 + */ + List listBirthdayToday(); + + /** + * 发送生日短信 + */ + void sendBirthdaySms(List specialists); + + /** + * 定时检查并发送生日短信 + * 每分钟执行一次 + */ + void checkAndSendBirthdaySms(); + + /** + * 每天0点1分重置所有专家的flagBirthdaySentToday为0 + */ + void resetFlagBirthdaySentToday(); +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/service/ISmsHolidayService.java b/module-sms/src/main/java/com/whdc/sms/service/ISmsHolidayService.java new file mode 100644 index 0000000..467ac4f --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/service/ISmsHolidayService.java @@ -0,0 +1,50 @@ +package com.whdc.sms.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.sms.model.dto.SmsHolidayPageDto; +import com.whdc.sms.model.entity.SmsHoliday; +import org.springframework.scheduling.annotation.Scheduled; + +import java.util.List; + +/** + * 主题日短信服务接口 + * + * @author lyf + * @since 2025-09-23 + */ +public interface ISmsHolidayService extends IService { + + Page page(SmsHolidayPageDto dto); + /** + * 查询当前活动中的主题日短信任务 + */ + List listActiveTasks(); + + /** + * 查询需要执行的今日主题日任务 + */ + List listTodayTasks(); + + /** + * 发送主题日短信 + */ + void sendThemeSms(SmsHoliday smsTask); + + /** + * 批量发送主题日短信 + */ + void sendBatchThemeSms(List smsTasks); + + /** + * 每天0点1分重置所有专家的flagHolidaySentToday为0 + */ + void resetFlagHolidaySentToday(); + + /** + * 定时检查并发送主题日短信 + * 每分钟执行一次 + */ + void checkAndSendThemeSms(); +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/service/ISmsLogService.java b/module-sms/src/main/java/com/whdc/sms/service/ISmsLogService.java new file mode 100644 index 0000000..b1bf0db --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/service/ISmsLogService.java @@ -0,0 +1,17 @@ +package com.whdc.sms.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.sms.model.dto.SmsLogPageDto; +import com.whdc.sms.model.entity.SmsLog; + +/** + * 短信日志服务接口 + * + * @author lyf + * @since 2025-09-23 + */ +public interface ISmsLogService extends IService { + + Page page(SmsLogPageDto dto); +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/service/ISmsService.java b/module-sms/src/main/java/com/whdc/sms/service/ISmsService.java new file mode 100644 index 0000000..4d38cf0 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/service/ISmsService.java @@ -0,0 +1,11 @@ +package com.whdc.sms.service; + +import java.util.List; + +/** + * @author lyf + * @since 2025-10-29 + */ +public interface ISmsService { + String send(List phoneList, String content); +} diff --git a/module-sms/src/main/java/com/whdc/sms/service/ISmsSpecialistService.java b/module-sms/src/main/java/com/whdc/sms/service/ISmsSpecialistService.java new file mode 100644 index 0000000..65f1a2b --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/service/ISmsSpecialistService.java @@ -0,0 +1,17 @@ +package com.whdc.sms.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.sms.model.dto.SmsSpecialistPageDto; +import com.whdc.sms.model.entity.SmsSpecialist; + +/** + * 专家通讯录服务接口 + * + * @author lyf + * @since 2025-09-23 + */ +public interface ISmsSpecialistService extends IService { + + Page page(SmsSpecialistPageDto dto); +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/service/impl/SmsBirthdayServiceImpl.java b/module-sms/src/main/java/com/whdc/sms/service/impl/SmsBirthdayServiceImpl.java new file mode 100644 index 0000000..8ec19f3 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/service/impl/SmsBirthdayServiceImpl.java @@ -0,0 +1,266 @@ +package com.whdc.sms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.sms.mapper.SmsBirthdayMapper; +import com.whdc.sms.mapper.SmsLogMapper; +import com.whdc.sms.mapper.SmsSpecialistMapper; +import com.whdc.sms.model.entity.SmsBirthday; +import com.whdc.sms.model.entity.SmsLog; +import com.whdc.sms.model.entity.SmsSpecialist; +import com.whdc.sms.service.ISmsBirthdayService; +import com.whdc.sms.utils.SmsHelper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 生日短信服务实现类 + * + * @author lyf + * @since 2025-09-23 + */ +@Service +@Slf4j +public class SmsBirthdayServiceImpl extends ServiceImpl implements ISmsBirthdayService { + + @Autowired + private SmsSpecialistMapper specialistMapper; + + @Autowired + private SmsLogMapper smsLogMapper; + + @Autowired + private SmsHelper smsHelper; + + // 记录今日是否已发送生日短信 - 使用原子变量保证线程安全 + private final AtomicBoolean sending = new AtomicBoolean(false); + + @Override + public List listBirthdayToday() { + try { + // 获取当前日期的月和日 + LocalDate today = LocalDate.now(); + String monthDay = today.format(DateTimeFormatter.ofPattern("MM-dd")); + + // 查询今天过生日的专家(状态为有效的) + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper + .apply("DATE_FORMAT(BIRTHDAY, '%m-%d') = {0}", monthDay) + .eq(SmsSpecialist::getFlagBirthdaySentToday, 0) + .eq(SmsSpecialist::getStatus, 1); // 1:有效 + + List specialists = specialistMapper.selectList(queryWrapper); + return specialists != null ? specialists : Collections.emptyList(); + } catch (Exception e) { + // 记录异常并返回空列表 + return Collections.emptyList(); + } + } + + @Override + public void sendBirthdaySms(List specialists) { + if (specialists == null || specialists.isEmpty()) { + log.info("没有需要发送生日短信的专家"); + return; + } + + // 获取生日短信模板 + SmsBirthday smsBirthday = this.getById(1L); // 使用ID=1的记录 + if (smsBirthday == null || smsBirthday.getStatus() != 1) { + log.warn("生日短信模板不存在或未启用"); + return; // 模板不存在或未启用 + } + + String template = smsBirthday.getTemplate(); + if (template == null || template.trim().isEmpty()) { + log.warn("生日短信模板内容为空"); + return; // 模板内容为空 + } + + // 逐个发送个性化短信 + int totalSpecialists = specialists.size(); + log.info("开始向{}位专家发送生日短信", totalSpecialists); + + //去重 + Set distinct = new HashSet<>(); + for (int i = 0; i < specialists.size(); i++) { + SmsSpecialist specialist = specialists.get(i); + if (distinct.contains(specialist.getPhone())) { + continue; + } + + String content = template.replace("{姓名}", specialist.getName()); + try { + log.info("正在发送第{}/{}位专家{}的生日短信", i + 1, totalSpecialists, specialist.getName()); + + // 创建短信日志记录 + SmsLog smsLog = new SmsLog(); + smsLog.setName(specialist.getName()) + .setPhone(specialist.getPhone()) + .setContent(content) + .setRemark("生日短信") + .setSendTm(new java.util.Date()); + + // 使用SmsHelper发送个性化短信 + List phoneList = Collections.singletonList(specialist.getPhone()); + String sendResult = smsHelper.send(phoneList, content); + // 更新专家的flagBirthdaySentToday + specialist.setFlagBirthdaySentToday(1); + specialistMapper.updateById(specialist); + distinct.add(specialist.getPhone()); + log.info("向专家{}发送生日短信结果: {}", specialist.getName(), sendResult); + + // 根据发送结果设置备注 + if ("发送成功".equals(sendResult)) { + smsLog.setRemark("生日短信-发送成功"); + } else { + smsLog.setRemark("生日短信-发送失败: " + sendResult); + } + //应唐科要求,每次发送短讯要抄送给唐威,陈锋 + carbonCopy(content); + // 保存短信日志记录 + smsLogMapper.insert(smsLog); + + // 如果不是最后一位专家,等待3秒再发送下一条 + if (i < specialists.size() - 1) { + try { + log.info("等待3秒后发送下一条短信..."); + Thread.sleep(3000); // 3秒间隔 + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + log.warn("生日短信发送间隔被中断"); + break; + } + } + + } catch (Exception e) { + log.error("向专家{}发送生日短信时发生异常: {}", specialist.getName(), e.getMessage(), e); + + // 即使发送失败,也保存短信记录 + try { + SmsLog failedSmsLog = new SmsLog(); + failedSmsLog.setName(specialist.getName()) + .setPhone(specialist.getPhone()) + .setContent(content) + .setRemark("生日短信-发送异常: " + e.getMessage()) + .setSendTm(new java.util.Date()); + smsLogMapper.insert(failedSmsLog); + } catch (Exception logException) { + log.error("保存发送失败的短信日志时发生异常: {}", logException.getMessage(), logException); + } + } + } + + log.info("生日短信批量发送任务完成"); + } + + /** + * 抄送 + */ + private void carbonCopy(String content) { + // 检查当前日期是否超过10月5号 + LocalDate today = LocalDate.now(); + LocalDate limitDate = LocalDate.of(2025, 10, 5); + + if (today.isAfter(limitDate)) { + log.info("当前日期{}已超过10月5日,跳过抄送", today); + return; + } + + List phoneList = new ArrayList<>(); + phoneList.add("18154318312"); //唐威 + phoneList.add("13247155309"); //陈锋 + phoneList.add("15671545233"); //李 + smsHelper.send(phoneList, content); + } + + @Override + public void resetFlagBirthdaySentToday() { + //直接update语句没有生效 +// specialistMapper.resetFlagBirthdaySentToday(); + //改为用wrapper + SmsSpecialist smsSpecialist = new SmsSpecialist(); + smsSpecialist.setFlagBirthdaySentToday(0); + specialistMapper.update(smsSpecialist, new QueryWrapper().eq("flag_birthday_sent_today", 1)); + } + + @Override + public void checkAndSendBirthdaySms() { + try { + // 获取生日短信配置 + SmsBirthday smsBirthday = this.getById(1L); + if (smsBirthday == null || smsBirthday.getStatus() != 1) { + log.info("生日短信功能未启用"); + return; + } + + // 检查执行时间 + String executionTime = smsBirthday.getExecutionTmStr(); + if (executionTime == null || executionTime.trim().isEmpty()) { + log.warn("生日短信执行时间未配置"); + return; + } + + // 如果已经发送过,不再重复发送 + if (sending.get()) { + log.info("其他线程正在执行生日短信发送任务"); + return; + } + + // 获取当前时间 + LocalDateTime now = LocalDateTime.now(); + + try { + // 将执行时间字符串与当前日期拼接 + String todayWithExecutionTime = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + executionTime; + + // 解析为完整的LocalDateTime + LocalDateTime scheduledTime = LocalDateTime.parse( + todayWithExecutionTime, + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") + ); + + // 检查当前时间是否大于等于执行时间 + if (now.isEqual(scheduledTime) || now.isAfter(scheduledTime)) { + // 原子性检查和设置发送状态 + if (sending.compareAndSet(false, true)) { + try { + log.info("到达生日短信发送时间: {}, 开始执行发送任务", executionTime); + // 查询今天过生日的专家 + List birthdaySpecialists = listBirthdayToday(); + if (birthdaySpecialists.isEmpty()) { + log.info("今天没有专家过生日,无需发送生日短信"); + } else { + log.info("今天有{}位专家过生日,开始发送生日短信", birthdaySpecialists.size()); + // 发送生日短信 + sendBirthdaySms(birthdaySpecialists); + log.info("生日短信发送任务完成"); + } + } finally { + sending.set(false); + } + } else { + log.info("其他线程正在执行生日短信发送任务"); + } + } else { + log.info("当前时间{}未到执行时间{}", now.format(DateTimeFormatter.ofPattern("HH:mm:ss")), executionTime); + } + + } catch (Exception e) { + log.error("执行时间格式解析失败: {}", executionTime, e); + } + + } catch (Exception e) { + log.error("定时检查生日短信任务执行异常: {}", e.getMessage(), e); + } + } +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/service/impl/SmsHolidayServiceImpl.java b/module-sms/src/main/java/com/whdc/sms/service/impl/SmsHolidayServiceImpl.java new file mode 100644 index 0000000..e79a186 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/service/impl/SmsHolidayServiceImpl.java @@ -0,0 +1,329 @@ +package com.whdc.sms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.sms.mapper.SmsHolidayMapper; +import com.whdc.sms.mapper.SmsLogMapper; +import com.whdc.sms.mapper.SmsSpecialistMapper; +import com.whdc.sms.model.dto.SmsHolidayPageDto; +import com.whdc.sms.model.entity.SmsHoliday; +import com.whdc.sms.model.entity.SmsLog; +import com.whdc.sms.model.entity.SmsSpecialist; +import com.whdc.sms.service.ISmsHolidayService; +import com.whdc.sms.utils.SmsHelper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 主题日短信服务实现类 + * + * @author lyf + * @since 2025-09-23 + */ +@Service +@Slf4j +public class SmsHolidayServiceImpl extends ServiceImpl implements ISmsHolidayService { + + public Page page(SmsHolidayPageDto dto) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 添加查询条件 + if (StringUtils.hasText(dto.getSubjectName())) { + queryWrapper.like(SmsHoliday::getSubjectName, dto.getSubjectName()); + } + + // 默认按创建时间降序排列 + queryWrapper.orderByDesc(SmsHoliday::getCreateTm); + + return page(dto.getPage(), queryWrapper); + } + + @Autowired + private SmsSpecialistMapper specialistMapper; + + @Autowired + private SmsLogMapper smsLogMapper; + + @Autowired + private SmsHelper smsHelper; + + // 记录任务发送状态 - 使用原子变量保证线程安全 + private final AtomicBoolean sending = new AtomicBoolean(false); + + @Override + public List listActiveTasks() { + try { + LocalDate today = LocalDate.now(); + + // 查询当前活动中的主题日短信任务 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper + .eq(SmsHoliday::getStatus, 1) // 1:有效 + .le(SmsHoliday::getStartDate, today) // 开始日期小于等于今天 + .ge(SmsHoliday::getEndDate, today); // 结束日期大于等于今天 + + List tasks = this.list(queryWrapper); + return tasks != null ? tasks : Collections.emptyList(); + } catch (Exception e) { + log.error("查询活动中的主题日短信任务失败: {}", e.getMessage(), e); + return Collections.emptyList(); + } + } + + @Override + public List listTodayTasks() { + try { + // 获取当前活动中的任务 + List activeTasks = listActiveTasks(); + if (activeTasks.isEmpty()) { + return Collections.emptyList(); + } + + LocalDate today = LocalDate.now(); + List todayTasks = new ArrayList<>(); + + // 筛选今天需要执行的任务 + for (SmsHoliday task : activeTasks) { + // 检查执行时间 + String executionTime = task.getExecutionTmStr(); + if (executionTime == null || executionTime.trim().isEmpty()) { + log.warn("主题日任务{}执行时间未配置", task.getSubjectName()); + continue; + } + + // 检查当前时间是否达到执行时间 + LocalDateTime now = LocalDateTime.now(); + try { + String todayWithExecutionTime = today.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + executionTime; + LocalDateTime scheduledTime = LocalDateTime.parse( + todayWithExecutionTime, + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") + ); + + if (now.isEqual(scheduledTime) || now.isAfter(scheduledTime)) { + todayTasks.add(task); + } + } catch (Exception e) { + log.error("主题日任务{}执行时间格式解析失败: {}", task.getSubjectName(), executionTime, e); + } + } + + return todayTasks; + } catch (Exception e) { + log.error("查询今日主题日任务失败: {}", e.getMessage(), e); + return Collections.emptyList(); + } + } + + @Override + public void sendThemeSms(SmsHoliday smsTask) { + if (smsTask == null) { + log.warn("主题日短信任务为空"); + return; + } + + // 获取所有有效专家(节日短信专用) + List specialists = getValidSpecialistsForHoliday(); + if (specialists.isEmpty()) { + log.info("没有有效专家,跳过主题日短信发送"); + return; + } + + String template = smsTask.getTemplate(); + if (template == null || template.trim().isEmpty()) { + log.warn("主题日任务{}模板内容为空", smsTask.getSubjectName()); + return; + } + + // 逐个发送个性化短信 + int totalSpecialists = specialists.size(); + log.info("开始向{}位专家发送主题日短信[{}]", totalSpecialists, smsTask.getSubjectName()); + + // 去重 + Set distinct = new HashSet<>(); + for (int i = 0; i < specialists.size(); i++) { + SmsSpecialist specialist = specialists.get(i); + if (distinct.contains(specialist.getPhone())) { + continue; + } + + // 替换模板中的占位符 + String content = template.replace("{姓名}", specialist.getName()) + .replace("{主题}", smsTask.getSubjectName()); + try { + log.info("正在发送第{}/{}位专家{}的主题日短信", i + 1, totalSpecialists, specialist.getName()); + + // 创建短信日志记录 + SmsLog smsLog = new SmsLog(); + smsLog.setName(specialist.getName()) + .setPhone(specialist.getPhone()) + .setContent(content) + .setRemark("主题日短信-" + smsTask.getSubjectName()) + .setSendTm(new java.util.Date()); + + // 使用SmsHelper发送个性化短信 + List phoneList = Collections.singletonList(specialist.getPhone()); + String sendResult = smsHelper.send(phoneList, content); + + // 更新专家的flagHolidaySentToday + specialist.setFlagHolidaySentToday(1); + specialistMapper.updateById(specialist); + distinct.add(specialist.getPhone()); + + log.info("向专家{}发送主题日短信[{}]结果: {}", specialist.getName(), smsTask.getSubjectName(), sendResult); + + // 根据发送结果设置备注 + if ("发送成功".equals(sendResult)) { + smsLog.setRemark("主题日短信-" + smsTask.getSubjectName() + "-发送成功"); + } else { + smsLog.setRemark("主题日短信-" + smsTask.getSubjectName() + "-发送失败: " + sendResult); + } + + // 应唐科要求,每次发送短讯要抄送给唐威,陈锋 + carbonCopy(content); + + // 保存短信日志记录 + smsLogMapper.insert(smsLog); + + // 如果不是最后一位专家,等待3秒再发送下一条 + if (i < specialists.size() - 1) { + try { + log.info("等待3秒后发送下一条短信..."); + Thread.sleep(3000); // 3秒间隔 + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + log.warn("短信发送间隔被中断"); + break; + } + } + + } catch (Exception e) { + log.error("向专家{}发送主题日短信[{}]时发生异常: {}", specialist.getName(), smsTask.getSubjectName(), e.getMessage(), e); + + // 即使发送失败,也保存短信记录 + try { + SmsLog failedSmsLog = new SmsLog(); + failedSmsLog.setName(specialist.getName()) + .setPhone(specialist.getPhone()) + .setContent(content) + .setRemark("主题日短信-" + smsTask.getSubjectName() + "-发送异常: " + e.getMessage()) + .setSendTm(new java.util.Date()); + smsLogMapper.insert(failedSmsLog); + } catch (Exception logException) { + log.error("保存发送失败的短信日志时发生异常: {}", logException.getMessage(), logException); + } + } + } + + log.info("主题日短信任务[{}]发送完成", smsTask.getSubjectName()); + } + + @Override + public void sendBatchThemeSms(List smsTasks) { + if (smsTasks == null || smsTasks.isEmpty()) { + log.info("没有需要发送的主题日短信任务"); + return; + } + + log.info("开始批量发送{}个主题日短信任务", smsTasks.size()); + for (SmsHoliday task : smsTasks) { + try { + sendThemeSms(task); + } catch (Exception e) { + log.error("发送主题日短信任务[{}]失败: {}", task.getSubjectName(), e.getMessage(), e); + } + } + log.info("批量主题日短信任务发送完成"); + } + + /** + * 抄送 + */ + private void carbonCopy(String content) { + // 检查当前日期是否超过10月5号 + LocalDate today = LocalDate.now(); + LocalDate limitDate = LocalDate.of(2025, 10, 5); + + if (today.isAfter(limitDate)) { + log.info("当前日期{}已超过10月5日,跳过抄送", today); + return; + } + + List phoneList = new ArrayList<>(); + phoneList.add("18154318312"); //唐威 + phoneList.add("13247155309"); //陈锋 + phoneList.add("15671545233"); //李 + smsHelper.send(phoneList, content); + } + + @Override + public void resetFlagHolidaySentToday() { + //直接update语句没有生效 +// specialistMapper.resetFlagHolidaySentToday(); + //改为用wrapper + SmsSpecialist smsSpecialist = new SmsSpecialist(); + smsSpecialist.setFlagHolidaySentToday(0); + specialistMapper.update(smsSpecialist, new QueryWrapper().eq("flag_holiday_sent_today", 1)); + } + + /** + * 获取所有有效专家(节日短信专用) + */ + private List getValidSpecialistsForHoliday() { + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SmsSpecialist::getStatus, 1); // 1:有效 + queryWrapper.eq(SmsSpecialist::getFlagHolidaySentToday, 0); // 未发送节日短信 + queryWrapper.isNotNull(SmsSpecialist::getPhone); // 手机号不为空 + + List specialists = specialistMapper.selectList(queryWrapper); + return specialists != null ? specialists : Collections.emptyList(); + } catch (Exception e) { + log.error("查询有效专家失败: {}", e.getMessage(), e); + return Collections.emptyList(); + } + } + + @Override + public void checkAndSendThemeSms() { + try { + // 如果其他线程正在执行,跳过 + if (sending.get()) { + log.debug("其他线程正在执行主题日短信发送任务"); + return; + } + + // 查询今日需要执行的主题日任务 + List todayTasks = listTodayTasks(); + + if (todayTasks.isEmpty()) { + log.info("今日没有需要执行的主题日短信任务"); + return; + } + + log.info("检测到{}个主题日短信任务需要执行", todayTasks.size()); + + // 批量发送主题日短信 + try { + sendBatchThemeSms(todayTasks); + } finally { + sending.set(false); + } + + } catch (Exception e) { + log.error("定时检查主题日短信任务执行异常: {}", e.getMessage(), e); + sending.set(false); + } + } +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/service/impl/SmsLogServiceImpl.java b/module-sms/src/main/java/com/whdc/sms/service/impl/SmsLogServiceImpl.java new file mode 100644 index 0000000..b59eadc --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/service/impl/SmsLogServiceImpl.java @@ -0,0 +1,44 @@ +package com.whdc.sms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.sms.mapper.SmsLogMapper; +import com.whdc.sms.model.dto.SmsLogPageDto; +import com.whdc.sms.model.entity.SmsLog; +import com.whdc.sms.service.ISmsLogService; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +/** + * 短信日志服务实现类 + * + * @author lyf + * @since 2025-09-23 + */ +@Service +public class SmsLogServiceImpl extends ServiceImpl implements ISmsLogService { + + public Page page(SmsLogPageDto dto) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 添加查询条件 + if (StringUtils.hasText(dto.getName())) { + queryWrapper.like(SmsLog::getName, dto.getName()); + } + if (StringUtils.hasText(dto.getPhone())) { + queryWrapper.like(SmsLog::getPhone, dto.getPhone()); + } + if (dto.getStm() != null) { + queryWrapper.ge(SmsLog::getSendTm, dto.getStm()); + } + if (dto.getEtm() != null) { + queryWrapper.le(SmsLog::getSendTm, dto.getEtm()); + } + + // 默认按发送时间降序排列 + queryWrapper.orderByDesc(SmsLog::getSendTm); + + return page(dto.getPage(), queryWrapper); + } +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/service/impl/SmsServiceImpl.java b/module-sms/src/main/java/com/whdc/sms/service/impl/SmsServiceImpl.java new file mode 100644 index 0000000..12ca827 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/service/impl/SmsServiceImpl.java @@ -0,0 +1,22 @@ +package com.whdc.sms.service.impl; + +import com.whdc.sms.service.ISmsService; +import com.whdc.sms.utils.SmsHelper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author lyf + * @since 2025-10-29 + */ +@Service +public class SmsServiceImpl implements ISmsService { + @Autowired + private SmsHelper smsHelper; + + public String send(List phoneList, String content) { + return smsHelper.send(phoneList, content); + } +} diff --git a/module-sms/src/main/java/com/whdc/sms/service/impl/SmsSpecialistServiceImpl.java b/module-sms/src/main/java/com/whdc/sms/service/impl/SmsSpecialistServiceImpl.java new file mode 100644 index 0000000..49a8658 --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/service/impl/SmsSpecialistServiceImpl.java @@ -0,0 +1,41 @@ +package com.whdc.sms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.sms.mapper.SmsSpecialistMapper; +import com.whdc.sms.model.dto.SmsSpecialistPageDto; +import com.whdc.sms.model.entity.SmsSpecialist; +import com.whdc.sms.service.ISmsSpecialistService; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +/** + * 专家通讯录服务实现类 + * + * @author lyf + * @since 2025-09-23 + */ +@Service +public class SmsSpecialistServiceImpl extends ServiceImpl implements ISmsSpecialistService { + + public Page page(SmsSpecialistPageDto dto) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 添加查询条件 + if (StringUtils.hasText(dto.getName())) { + queryWrapper.like(SmsSpecialist::getName, dto.getName()); + } + if (StringUtils.hasText(dto.getPhone())) { + queryWrapper.like(SmsSpecialist::getPhone, dto.getPhone()); + } + if (dto.getStatus() != null) { + queryWrapper.eq(SmsSpecialist::getStatus, dto.getStatus()); + } + + // 默认按创建时间降序排列 + queryWrapper.orderByDesc(SmsSpecialist::getCreateTm); + + return page(dto.getPage(), queryWrapper); + } +} \ No newline at end of file diff --git a/module-sms/src/main/java/com/whdc/sms/utils/SmsHelper.java b/module-sms/src/main/java/com/whdc/sms/utils/SmsHelper.java new file mode 100644 index 0000000..0f4e3ff --- /dev/null +++ b/module-sms/src/main/java/com/whdc/sms/utils/SmsHelper.java @@ -0,0 +1,175 @@ +package com.whdc.sms.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.whdc.common.utils.HttpHelper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.nio.charset.Charset; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @author lyf + * @since 2025-06-25 + */ +@Component +@Slf4j +public class SmsHelper { + @Value("${sms.url}") + private String url; + @Value("${sms.userName}") + private String userName; + @Value("${sms.serviceCode}") + private String serviceCode; + @Value("${sms.userPassword}") + private String userPassword; + @Autowired + private HttpHelper httpHelper; + + public String send(List phones, String content) { + return send(phones, content, "201"); + } + + private String send(List phones, String content, String msgType) { + if (phones == null || phones.size() == 0) { + return "未选择手机号"; + } + if (content == null || content.length() == 0) { + return "短信内容为空"; + } + + String[] msgIds = new String[phones.size()]; + for (int i = 0; i < phones.size(); i++) { + msgIds[i] = UUID.randomUUID().toString().replace("-", ""); + } + String strPhones = String.join(",", phones); + String strMsgIds = String.join(",", msgIds); + String timestamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); + String sign = md5(userPassword + timestamp).toUpperCase(); + + Map params = new HashMap<>(); + params.put("serviceCode", serviceCode); + params.put("userName", userName); + params.put("userPassword", userPassword); + params.put("phones", strPhones); + params.put("msgContent", encodeGBK(content)); + params.put("timestamp", timestamp); + params.put("sign", sign); + params.put("mhtMsgIds", strMsgIds); + params.put("sendTime", ""); + params.put("priority", "5"); + params.put("orgCode", "42"); + params.put("msgType", msgType); + params.put("reportFlag", "0"); + + String strResult = httpHelper.postFormUrlEncoded(url, params, null, Charset.forName("GBK")); + if (strResult == null) { + return "发送失败"; + } + +// Map result = new ObjectMapper().readValue(strResult, Map.class); + JSONObject result = JSON.parseObject(strResult); + if (result == null) { + return "发送结果解析失败"; + } + int errorCode = (Integer) result.get("result"); + if (errorCode != 0) { + return SmtpErrorCode.getErrorString(errorCode); + } + + return "发送成功"; + } + + private String md5(String str) { + MessageDigest m; + try { + m = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + m.update(str.getBytes()); + byte[] s = m.digest(); + return parseByte2HexStr(s); + } + + private static String encodeGBK(String content) { + try { + return URLDecoder.decode(content, "GBK"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + + //将二进制数组转换成16进制字符串 + private String parseByte2HexStr(byte[] buf) { + StringBuilder sb = new StringBuilder(); + for (byte b : buf) { + String hex = Integer.toHexString(b & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + sb.append(hex); + } + return sb.toString(); + } + + public static class SmtpErrorCode { + private static Map map; + + static { + map = new HashMap<>(); + + map.put(100, "非法登录,如登录名、口令出错、登录名与口令不符,md5 值不匹配等。"); + map.put(101, "连接过多,指单个商户要求同时建立的连接数过多。"); + map.put(102, "登陆类型错。"); + map.put(103, "协议版本号错"); + map.put(104, "ip 不合法,请联系管理员绑定 ip 后才可正常使用"); + map.put(105, "Smtp 的 tcp 协议只支持后付费类型"); + + map.put(201, "非法手机号码。"); + map.put(202, "reportFlag 值不合法,值必须为 0 或 1"); + map.put(203, "信息长度错"); + map.put(204, "短信内容中有非法字符"); + map.put(205, "短信内容太长"); + map.put(206, "不存在的优先级"); + map.put(207, "SUBMIT 命令中的 serviceCode 不合法或者过期"); + map.put(208, "手机号和商户消息 id 个数不匹配"); + map.put(209, "orgCode 字段超过规定长度"); + map.put(210, "msgType 字段超过规定长度"); + map.put(211, "http 提交短信时的 url 不正确"); + map.put(212, "被代理的商户与代理商户之间的关系不合法"); + map.put(213, "暂未开通此商户通道,或者商户通道名称配置错误"); + map.put(214, "请求参数有误,比如传递了不在接口文档中定义的参数"); + map.put(215, "被代理的商户 id 不存在"); + map.put(216, "商户平台的消息 id 的长度超过最大长度"); + map.put(217, "sendTime 参数时间戳格式不正确"); + map.put(218, "商户服务代码与用户名密码不匹配"); + map.put(219, "接口只支持 HTTP POST 方式提交,而您的请求为 HTTP GET 方式"); + map.put(220, "批量提交一次最多只支持 50 个"); + map.put(221, "手机号不能为空"); + map.put(222, "短信内容含有乱码"); + + map.put(500, "系统内部失败"); + + map.put(900, "余额不足"); + map.put(901, "发送速度太快"); + } + + public static String getErrorString(int errorcode) { + if (!map.containsKey(errorcode)) { + return "errorcode:" + errorcode + "未定义"; + } + + return map.get(errorcode); + } + } + +} diff --git a/poms/dependency.xml b/poms/dependency.xml new file mode 100644 index 0000000..a80a3f9 --- /dev/null +++ b/poms/dependency.xml @@ -0,0 +1,321 @@ + + + 4.0.0 + + com.whdc + fxkh-txl-parent + 1.0 + pom + 防汛抗旱通讯录API - 父模块 + + + + ../module-common + + + + 8 + 8 + 1.8 + target/release + UTF-8 + 2.7.1 + 3.5.2 + 1.2.8 + 3.0.3 + 1.30.0 + 7.2.4 + 4.4.0 + 1.2.83 + 4.12.0 + 4.5.13 + 4.4.15 + 2.11.1 + 4.6.0 + 1.18.24 + 8.1.2.192 + 8.1.2.79 + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring.boot.version} + pom + import + + + + + org.springframework.boot + spring-boot-starter-web + ${spring.boot.version} + + + org.springframework.boot + spring-boot-starter-aop + ${spring.boot.version} + + + org.springframework.boot + spring-boot-configuration-processor + ${spring.boot.version} + true + + + org.springframework.boot + spring-boot-starter-validation + ${spring.boot.version} + + + org.springframework.boot + spring-boot-starter-data-redis + ${spring.boot.version} + + + org.springframework.boot + spring-boot-starter-cache + ${spring.boot.version} + + + + org.springframework.boot + spring-boot-starter-test + ${spring.boot.version} + test + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis.plus.version} + + + com.github.jeffreyning + mybatisplus-plus + 1.7.2-RELEASE + + + + + com.dameng + DmJdbcDriver18 + ${dameng.version} + + + com.dameng + DmDialect-for-hibernate4.0 + ${dameng.hibernate.version} + + + com.alibaba + druid + ${druid.version} + + + + + com.github.xiaoymin + knife4j-spring-boot-starter + ${knife4j.version} + + + + + com.itextpdf + kernel + ${itext.version} + + + com.itextpdf + io + ${itext.version} + + + com.itextpdf + forms + ${itext.version} + + + com.itextpdf + layout + ${itext.version} + + + com.itextpdf + svg + ${itext.version} + + + + + cn.afterturn + easypoi-spring-boot-starter + ${easypoi.version} + + + + + cn.dev33 + sa-token-spring-boot-starter + ${sa.token.version} + + + cn.dev33 + sa-token-dao-redis-jackson + ${sa.token.version} + + + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + org.apache.httpcomponents + httpcore + ${httpcore.version} + + + com.squareup.okhttp3 + okhttp + ${okhttp.version} + + + + + com.github.binarywang + weixin-java-miniapp + ${weixin.java.version} + + + + + com.alibaba + fastjson + ${fastjson.version} + + + org.projectlombok + lombok + ${lombok.version} + + + commons-beanutils + commons-beanutils + 1.9.4 + + + joda-time + joda-time + 2.10.14 + + + org.apache.commons + commons-pool2 + ${commons-pool2.version} + + + + com.github.xiaoymin + knife4j-spring-boot-starter + 3.0.3 + + + + com.whdc + fxkh-txl-common + ${project.version} + + + + + + + osgeo + OSGeo Release Repository + https://repo.osgeo.org/repository/release/ + + false + + + true + + + + osgeo-snapshot + OSGeo Snapshot Repository + https://repo.osgeo.org/repository/snapshot/ + + true + + + false + + + + wh_gsiot-mvn + https://maven.cnb.cool/wh_gsiot/mvn/-/packages/ + + true + + + true + + + + tencent-maven + TencentCloud Maven + https://mirrors.cloud.tencent.com/nexus/repository/maven-public/ + + true + + + false + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + + + org.projectlombok + lombok + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + UTF-8 + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.5.0 + + + + + + \ No newline at end of file diff --git a/sql/dm_start.sql b/sql/dm_start.sql index ab085f1..3b89916 100644 --- a/sql/dm_start.sql +++ b/sql/dm_start.sql @@ -1,97 +1,251 @@ +CREATE TABLE "FXKH_TXL"."AB_INFO" +( +"ID" INTEGER IDENTITY(1, 1) NOT NULL, +"JSON" VARCHAR(2000), +"AB_ID" INTEGER, +"VERSION" INTEGER DEFAULT 0 NOT NULL, +"CREATE_ID" VARCHAR(50), +"CREATE_TIME" DATETIME(0), +"TYPE" CHAR(1) DEFAULT 0, +"ADCD" VARCHAR(50), +NOT CLUSTER PRIMARY KEY("ID") USING INDEX TABLESPACE "SHZH" ) STORAGE(ON "MAIN", CLUSTERBTR) ; + +COMMENT ON TABLE "FXKH_TXL"."AB_INFO" IS '通讯录操作日志'; +COMMENT ON COLUMN "FXKH_TXL"."AB_INFO"."AB_ID" IS '通讯录编号'; +COMMENT ON COLUMN "FXKH_TXL"."AB_INFO"."CREATE_ID" IS '新增人id'; +COMMENT ON COLUMN "FXKH_TXL"."AB_INFO"."CREATE_TIME" IS '新增时间'; +COMMENT ON COLUMN "FXKH_TXL"."AB_INFO"."JSON" IS '数据'; +COMMENT ON COLUMN "FXKH_TXL"."AB_INFO"."TYPE" IS '0:添加用户,1:修改用户,2:修改权限,3:删除用户'; +COMMENT ON COLUMN "FXKH_TXL"."AB_INFO"."VERSION" IS '版本号'; + + +CREATE TABLE "FXKH_TXL"."AB_UD_R" +( +"AD_ID" INTEGER, +"DICT_ID" VARCHAR(50), +"TYPE" CHAR(1), +"SORT" INTEGER) STORAGE(ON "MAIN", CLUSTERBTR) ; + +COMMENT ON TABLE "FXKH_TXL"."AB_UD_R" IS '用户单位字典关联表'; +COMMENT ON COLUMN "FXKH_TXL"."AB_UD_R"."AD_ID" IS '联系人id'; +COMMENT ON COLUMN "FXKH_TXL"."AB_UD_R"."DICT_ID" IS '字典id'; +COMMENT ON COLUMN "FXKH_TXL"."AB_UD_R"."SORT" IS '序号'; +COMMENT ON COLUMN "FXKH_TXL"."AB_UD_R"."TYPE" IS '0:组织,1:单位'; + + CREATE TABLE "FXKH_TXL"."ADDRESS_BOOK" ( - "ID" INTEGER IDENTITY(1, 1) NOT NULL, - "NAME" VARCHAR(10) NOT NULL, - "PHONE" VARCHAR(20), - "TEL" VARCHAR(50), - "FAXES" VARCHAR(50), - "ORGANIZATION" VARCHAR(50), - "RESPONSIBILITY" VARCHAR(50), - "POSITION" VARCHAR(200), - "COMMENTS" VARCHAR(200), - "URL" VARCHAR(200), - "ADCD" VARCHAR(50), - "RESPONSIBILITY" VARCHAR(50), - "SORT" INTEGER DEFAULT 0, - "V" INTEGER DEFAULT 0, - NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ; +"ID" INTEGER IDENTITY(1, 1) NOT NULL, +"NAME" VARCHAR(80) NOT NULL, +"PHONE" VARCHAR(15), +"TEL" VARCHAR(50), +"FAXES" VARCHAR(50), +"ORGANIZATION" VARCHAR(50), +"POSITION" VARCHAR(200), +"COMMENTS" VARCHAR(200), +"URL" VARCHAR(200), +"ADCD" VARCHAR(50), +"SORT" INTEGER DEFAULT 0, +"V" INTEGER DEFAULT 0, +"RESPONSIBILITY" VARCHAR(50), +"IS_PASS" TINYINT DEFAULT FALSE, +"OPENID" VARCHAR(50), +"LEVEL" INTEGER, +NOT CLUSTER PRIMARY KEY("ID") USING INDEX TABLESPACE "SHZH" ) STORAGE(ON "MAIN", CLUSTERBTR) ; COMMENT ON TABLE "FXKH_TXL"."ADDRESS_BOOK" IS '通讯录'; -comment on column "FXKH_TXL"."ADDRESS_BOOK"."RESPONSIBILITY" is '职责'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."ADCD" IS '行政区划'; COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."COMMENTS" IS '备注'; COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."FAXES" IS '传真'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."IS_PASS" IS '是否放行, 放行:true,拦截:false'; COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."NAME" IS '姓名'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."OPENID" IS 'openid'; COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."ORGANIZATION" IS '组织'; COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."PHONE" IS '手机号'; -COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."ADCD" IS '行政区划'; COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."POSITION" IS '职务'; -COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."RESPONSIBILITY" IS '职责'; COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."SORT" IS '序号'; COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."TEL" IS '电话'; COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."URL" IS '图片路径'; COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."V" IS '版本'; +CREATE TABLE "FXKH_TXL"."ADDRESS_BOOK_CITY" +( +"ID" INT IDENTITY(1, 1) NOT NULL, +"UNIT" VARCHAR(50), +"NAME" VARCHAR(50) NOT NULL, +"POSITION" VARCHAR(50), +"PHONE" VARCHAR(50) NOT NULL, +"COMMENTS" VARCHAR(50), +"DEL" VARCHAR(2) DEFAULT 1, +NOT CLUSTER PRIMARY KEY("ID") USING INDEX TABLESPACE "SHZH" ) STORAGE(ON "MAIN", CLUSTERBTR) ; + +COMMENT ON TABLE "FXKH_TXL"."ADDRESS_BOOK_CITY" IS '市级责任人通讯录'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_CITY"."COMMENTS" IS '备注'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_CITY"."DEL" IS '删除标识:1:未删除,0:已删除'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_CITY"."NAME" IS '名字'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_CITY"."PHONE" IS '电话'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_CITY"."POSITION" IS '职务'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_CITY"."UNIT" IS '单位'; + + +CREATE TABLE "FXKH_TXL"."ADDRESS_BOOK_OLD" +( +"ID" INTEGER IDENTITY(1, 1) NOT NULL, +"CTNM" VARCHAR(50), +"CNNM" VARCHAR(50), +"NAME" VARCHAR(50), +"POSITION" VARCHAR(50), +"PHONE" VARCHAR(50), +"CREATE_TIME" DATETIME(0), +"SALT" VARCHAR(50), +"LEVEL" INTEGER, +NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "SHZH", CLUSTERBTR) ; + +COMMENT ON TABLE "FXKH_TXL"."ADDRESS_BOOK_OLD" IS '旧的通讯录表'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_OLD"."CNNM" IS '县名称'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_OLD"."CREATE_TIME" IS '导入时间'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_OLD"."CTNM" IS '市名称'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_OLD"."LEVEL" IS '责任人级别'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_OLD"."NAME" IS '姓名'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_OLD"."PHONE" IS '手机号'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_OLD"."POSITION" IS '职务'; +COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_OLD"."SALT" IS '盐'; + + CREATE TABLE "FXKH_TXL"."ADINFO" ( - "ADCD" CHAR(15) NOT NULL, - "ADNM" VARCHAR(32) NOT NULL, - NOT CLUSTER PRIMARY KEY("ADCD")) STORAGE(ON "MAIN", CLUSTERBTR) ; +"ADCD" CHAR(15) NOT NULL, +"ADNM" VARCHAR(32) NOT NULL, +NOT CLUSTER PRIMARY KEY("ADCD") USING INDEX TABLESPACE "SHZH" ) STORAGE(ON "MAIN", CLUSTERBTR) ; COMMENT ON TABLE "FXKH_TXL"."ADINFO" IS '行政区划基础信息'; COMMENT ON COLUMN "FXKH_TXL"."ADINFO"."ADCD" IS '政区编码'; COMMENT ON COLUMN "FXKH_TXL"."ADINFO"."ADNM" IS '政区名称'; -CREATE TABLE "FXKH_TXL"."UNIT_DICT" +CREATE TABLE "FXKH_TXL"."AUTOCALL" ( - "ID" INTEGER IDENTITY(1, 1) NOT NULL, - "NAME" VARCHAR(80) NOT NULL, - "SORT" INTEGER DEFAULT 0 NOT NULL, - "O_ID" INTEGER NOT NULL, - NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ; +"ID" INT IDENTITY(1, 1) NOT NULL, +"LEVEL" INT, +"STATUS" VARCHAR(50), +"_CREATE_TM" TIMESTAMP(6), +"__TALK_TIMES" INT, +"__SIP_TERM_CAUSE" VARCHAR(255), +"__CALLER" VARCHAR(255), +"__NUMBER" VARCHAR(50), +"__STARTRING_AT" TIMESTAMP(6), +"__STARTED_AT" TIMESTAMP(6), +"__CONNECTED_AT" TIMESTAMP(6), +"__DISCONNECTED_AT" TIMESTAMP(6), +"__ENDRING_AT" TIMESTAMP(6), +"__STOPPED_AT" TIMESTAMP(6), +"__LAST_MODIFY" TIMESTAMP(6), +"WCM_ID" INTEGER, +"RESPONDER_ID" INTEGER, +"RESPONDER_NAME" VARCHAR(100), +NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "SHZH", CLUSTERBTR) ; -COMMENT ON TABLE "FXKH_TXL"."UNIT_DICT" IS '单位字典表'; -COMMENT ON COLUMN "FXKH_TXL"."UNIT_DICT"."NAME" IS '名称'; -COMMENT ON COLUMN "FXKH_TXL"."UNIT_DICT"."SORT" IS '序号'; -COMMENT ON COLUMN "FXKH_TXL"."UNIT_DICT"."O_ID" IS '组织类型Id'; - - -CREATE TABLE "FXKH_TXL"."ORGANIZATION" +CREATE TABLE "FXKH_TXL"."AUTOCALL_CONFIG" ( - "ID" INTEGER IDENTITY(1, 1) NOT NULL, - "NAME" VARCHAR(50) NOT NULL, - "SORT" INTEGER DEFAULT 0, - NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ; +"KEY" VARCHAR(50) NOT NULL, +"VALUE" VARCHAR(50), +CONSTRAINT "AUTOCALL_CONFIG_PK" NOT CLUSTER PRIMARY KEY("KEY")) STORAGE(ON "SHZH", CLUSTERBTR) ; -COMMENT ON TABLE "FXKH_TXL"."ORGANIZATION" IS '组织表'; -COMMENT ON COLUMN "FXKH_TXL"."ORGANIZATION"."NAME" IS '名称'; -COMMENT ON COLUMN "FXKH_TXL"."ORGANIZATION"."SORT" IS '序号'; - - - -CREATE TABLE "FXKH_TXL"."AB_UD_R" +CREATE TABLE "FXKH_TXL"."AUTOCALL_TEST" ( - "AD_ID" INTEGER, - "DICT_ID" INTEGER, - "TYPE" CHAR(1), - "SORT" INTEGER) STORAGE(ON "MAIN", CLUSTERBTR) ; +"ID" INT NOT NULL, +"WARN_ID" INT, +"ADDRESS_BOOK_OLD_ID" INT, +"LEVEL" INT, +"STATUS" VARCHAR(50), +"_CREATE_TM" TIMESTAMP(6), +"__TALK_TIMES" INT, +"__TASK_NAME" VARCHAR(255), +"__DIAL_TASK_MAIN_SN" VARCHAR(255), +"__CUST_ID" VARCHAR(255), +"__SIP_TERM_CAUSE" VARCHAR(255), +"__CALLER" VARCHAR(255), +"__NUMBER" VARCHAR(50), +"__STARTRING_AT" TIMESTAMP(6), +"__STARTED_AT" TIMESTAMP(6), +"__CONNECTED_AT" TIMESTAMP(6), +"__DISCONNECTED_AT" TIMESTAMP(6), +"__ENDRING_AT" TIMESTAMP(6), +"__STOPPED_AT" TIMESTAMP(6), +"__LAST_MODIFY" TIMESTAMP(6), +"CUST_NAME" VARCHAR(50), +"ADDRESS_BOOK_OLD_NAME" VARCHAR(50), +"CNNM" VARCHAR(50), +"WARN_LEVEL" VARCHAR(50), +"UPLOAD_RESP_MSG" VARCHAR(50), +CONSTRAINT "CONS134A63138" NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "SHZH", CLUSTERBTR) ; -COMMENT ON TABLE "FXKH_TXL"."AB_UD_R" IS '用户单位字典关联表'; -COMMENT ON COLUMN "FXKH_TXL"."AB_UD_R"."AD_ID" IS '联系人id'; -COMMENT ON COLUMN "FXKH_TXL"."AB_UD_R"."DICT_ID" IS '字典id'; -COMMENT ON COLUMN "FXKH_TXL"."AB_UD_R"."TYPE" IS '0:组织,1:单位'; -COMMENT ON COLUMN "FXKH_TXL"."AB_UD_R"."SORT" IS '序号'; +CREATE UNIQUE INDEX "INDEX33664D23" ON "FXKH_TXL"."AUTOCALL_TEST"("ID" ASC) STORAGE(ON "SHZH", CLUSTERBTR) ; +CREATE TABLE "FXKH_TXL"."AUTO_CALL_PERSON" +( +"ID" INT IDENTITY(1, 1) NOT NULL, +"TASK_ID" INT NOT NULL, +"STATUS" INT DEFAULT 0, +"LEVEL" INT NOT NULL, +"_CREATE_TM" TIMESTAMP(6) NOT NULL, +"ERROR_CODE" INT DEFAULT 0, +"__REQUEST_ID" VARCHAR(255) NOT NULL, +"__CUST_ID" VARCHAR(255) NOT NULL, +"__CUST_NAME" VARCHAR(255) NOT NULL, +"__CONTENT" VARCHAR(1000) NOT NULL, +"__NUMBER" VARCHAR(50) NOT NULL, +"__UPLOAD_RESP_MSG" VARCHAR(1000), +"__REMARK" VARCHAR(255), +"__TALK_TIMES" INT, +"__SIP_TERM_CAUSE" VARCHAR(255), +"__STARTRING_AT" TIMESTAMP(6), +"__CONNECTED_AT" TIMESTAMP(6), +"__STARTED_AT" TIMESTAMP(6), +"__ENDRING_AT" TIMESTAMP(6), +"__DISCONNECTED_AT" TIMESTAMP(6), +"__STOPPED_AT" TIMESTAMP(6), +"__LAST_MODIFY" TIMESTAMP(6), +"__TAG" VARCHAR(100), +"UPLOADED_TIMES" INTEGER DEFAULT 0, +"SMS_CONTENT" VARCHAR(1000), +"MANUAL_CLOSE" INTEGER DEFAULT 0, +"POSITION" VARCHAR(100), +"MANUAL_CLOSE_TM" TIMESTAMP(6), +"__IS_COMPLETE" INTEGER DEFAULT 0, +NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "SHZH", CLUSTERBTR) ; + +CREATE UNIQUE INDEX "INDEX_AUTO_CALL_PERSON" ON "FXKH_TXL"."AUTO_CALL_PERSON"("ID" ASC) STORAGE(ON "SHZH", CLUSTERBTR) ; + +CREATE TABLE "FXKH_TXL"."AUTO_CALL_TASK" +( +"ID" INT IDENTITY(1, 1) NOT NULL, +"WARN_ID" INT NOT NULL, +"STATUS" INT DEFAULT 0, +"ERROR_CODE" INT DEFAULT 0, +"WARN_NAME" VARCHAR(255) NOT NULL, +"WARN_TM" TIMESTAMP(6) NOT NULL, +"WARN_LEVEL" VARCHAR(255) NOT NULL, +"WARN_CTNM" VARCHAR(255) NOT NULL, +"WARN_CNNM" VARCHAR(255) NOT NULL, +"WARN_CONTENT" VARCHAR(1000) NOT NULL, +"_CREATE_TM" TIMESTAMP(6) NOT NULL, +"_REMARK" VARCHAR(1000), +"__TAG" VARCHAR(100), +"SUBMIT" INTEGER DEFAULT 0, +NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "SHZH", CLUSTERBTR) ; + +CREATE UNIQUE INDEX "INDEX_AUTO_CALL_TASK" ON "FXKH_TXL"."AUTO_CALL_TASK"("ID" ASC) STORAGE(ON "SHZH", CLUSTERBTR) ; CREATE TABLE "FXKH_TXL"."FC" ( - "ID" INTEGER IDENTITY(1, 1) NOT NULL, - "USER_ID" INTEGER NOT NULL, - "AB_ID" INTEGER NOT NULL, - "SORT" INTEGER DEFAULT 0, - "TYPE" CHAR(1), - NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ; +"ID" INTEGER IDENTITY(1, 1) NOT NULL, +"USER_ID" INTEGER NOT NULL, +"AB_ID" INTEGER NOT NULL, +"SORT" INTEGER DEFAULT 0, +"TYPE" CHAR(1), +NOT CLUSTER PRIMARY KEY("ID") USING INDEX TABLESPACE "SHZH" ) STORAGE(ON "MAIN", CLUSTERBTR) ; COMMENT ON TABLE "FXKH_TXL"."FC" IS '常用联系人'; COMMENT ON COLUMN "FXKH_TXL"."FC"."AB_ID" IS '通讯录编号'; @@ -102,12 +256,12 @@ COMMENT ON COLUMN "FXKH_TXL"."FC"."USER_ID" IS '用户编号'; CREATE TABLE "FXKH_TXL"."LOGIN_INFO" ( - "ID" INTEGER IDENTITY(1, 1) NOT NULL, - "IP" VARCHAR(50), - "CREATE_ID" VARCHAR(50), - "CREATE_TIME" DATETIME(0), - "TYPE" CHAR(1) NOT NULL, - NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ; +"ID" INTEGER IDENTITY(1, 1) NOT NULL, +"IP" VARCHAR(50), +"CREATE_ID" VARCHAR(50), +"CREATE_TIME" DATETIME(0), +"TYPE" CHAR(1) NOT NULL, +NOT CLUSTER PRIMARY KEY("ID") USING INDEX TABLESPACE "SHZH" ) STORAGE(ON "MAIN", CLUSTERBTR) ; COMMENT ON TABLE "FXKH_TXL"."LOGIN_INFO" IS '登录日志'; COMMENT ON COLUMN "FXKH_TXL"."LOGIN_INFO"."CREATE_ID" IS '新增人id'; @@ -115,44 +269,172 @@ COMMENT ON COLUMN "FXKH_TXL"."LOGIN_INFO"."CREATE_TIME" IS '新增时间'; COMMENT ON COLUMN "FXKH_TXL"."LOGIN_INFO"."TYPE" IS '0:密码登录 1:验证码登录'; +CREATE TABLE "FXKH_TXL"."ORGANIZATION" +( +"ID" INTEGER IDENTITY(1, 1) NOT NULL, +"NAME" VARCHAR(50) NOT NULL, +"SORT" INTEGER DEFAULT 0, +NOT CLUSTER PRIMARY KEY("ID") USING INDEX TABLESPACE "SHZH" ) STORAGE(ON "MAIN", CLUSTERBTR) ; + +COMMENT ON TABLE "FXKH_TXL"."ORGANIZATION" IS '组织表'; +COMMENT ON COLUMN "FXKH_TXL"."ORGANIZATION"."NAME" IS '名称'; +COMMENT ON COLUMN "FXKH_TXL"."ORGANIZATION"."SORT" IS '序号'; + + +CREATE TABLE "FXKH_TXL"."QXWARNING" +( +"ID" INTEGER IDENTITY(1, 1) NOT NULL, +"CREATE_TIME" DATETIME(6), +"PUBLISH_TIME" DATETIME(0), +"START_TIME" DATETIME(0), +"END_TIME" DATETIME(0), +"WARN_SIGNAL_TYPE" VARCHAR(50), +"WARN_SIGNAL_LEVEL" VARCHAR(50), +"PUBLISH_UNIT" VARCHAR(50), +"CONTENT" VARCHAR(500), +"WARNID" INTEGER, +"CTNM" VARCHAR(50), +"CNNM" VARCHAR(1000), +"INSEART_TIME" TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(), +NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "SHZH", CLUSTERBTR) ; + +COMMENT ON TABLE "FXKH_TXL"."QXWARNING" IS '气象预警表'; +COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."CNNM" IS '预警县名称'; +COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."CONTENT" IS '预警内容'; +COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."CTNM" IS '预警市名称'; +COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."END_TIME" IS '预警结束时间'; +COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."PUBLISH_TIME" IS '发布时间'; +COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."PUBLISH_UNIT" IS '发布单位'; +COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."START_TIME" IS '预警开始时间'; +COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."WARNID" IS '预警ID'; +COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."WARN_SIGNAL_LEVEL" IS '预警级别'; +COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."WARN_SIGNAL_TYPE" IS '预警类型'; + + +CREATE TABLE "FXKH_TXL"."SH_ADDRESS_BOOK" +( +"ID" INTEGER IDENTITY(1, 1) NOT NULL, +"CITY" VARCHAR(50), +"COUNTY" VARCHAR(50), +"AREA" VARCHAR(50), +"VILLAGE" VARCHAR(100), +"TYPE1" VARCHAR(50), +"TYPE2" VARCHAR(50), +"NAME" VARCHAR(50), +"POSITION" VARCHAR(200), +"PHONE" VARCHAR(50), +"SORT" INTEGER, +"LAND" VARCHAR(100), +"IS_SPOT_CHECK" VARCHAR(2) DEFAULT 0, +"CALL_STATUS" VARCHAR(2), +"DEL" VARCHAR(2) DEFAULT 1, +"LEVEL" INTEGER, +UNIQUE("ID") USING INDEX TABLESPACE "SHZH" , +NOT CLUSTER PRIMARY KEY("ID") USING INDEX TABLESPACE "SHZH" ) STORAGE(ON "MAIN", CLUSTERBTR) ; + +COMMENT ON TABLE "FXKH_TXL"."SH_ADDRESS_BOOK" IS '山洪责任人通讯录'; +COMMENT ON COLUMN "FXKH_TXL"."SH_ADDRESS_BOOK"."AREA" IS '乡'; +COMMENT ON COLUMN "FXKH_TXL"."SH_ADDRESS_BOOK"."CALL_STATUS" IS '是否接听0:否,1是'; +COMMENT ON COLUMN "FXKH_TXL"."SH_ADDRESS_BOOK"."CITY" IS '市'; +COMMENT ON COLUMN "FXKH_TXL"."SH_ADDRESS_BOOK"."COUNTY" IS '县'; +COMMENT ON COLUMN "FXKH_TXL"."SH_ADDRESS_BOOK"."DEL" IS '是否删除0:是,1:否'; +COMMENT ON COLUMN "FXKH_TXL"."SH_ADDRESS_BOOK"."ID" IS '主键id'; +COMMENT ON COLUMN "FXKH_TXL"."SH_ADDRESS_BOOK"."IS_SPOT_CHECK" IS '是否抽查:0:不抽查,1:抽查'; +COMMENT ON COLUMN "FXKH_TXL"."SH_ADDRESS_BOOK"."LAND" IS '负责区域'; +COMMENT ON COLUMN "FXKH_TXL"."SH_ADDRESS_BOOK"."NAME" IS '名字'; +COMMENT ON COLUMN "FXKH_TXL"."SH_ADDRESS_BOOK"."PHONE" IS '手机号'; +COMMENT ON COLUMN "FXKH_TXL"."SH_ADDRESS_BOOK"."POSITION" IS '职务'; +COMMENT ON COLUMN "FXKH_TXL"."SH_ADDRESS_BOOK"."SORT" IS '排序字段'; +COMMENT ON COLUMN "FXKH_TXL"."SH_ADDRESS_BOOK"."TYPE1" IS '责任人类型1 行政责任人,包保责任人'; +COMMENT ON COLUMN "FXKH_TXL"."SH_ADDRESS_BOOK"."TYPE2" IS '责任人类型 县级,乡级,村级, 县干部,乡干部'; +COMMENT ON COLUMN "FXKH_TXL"."SH_ADDRESS_BOOK"."VILLAGE" IS '村'; + + +CREATE TABLE "FXKH_TXL"."SH_CALLS" +( +"ID" INTEGER IDENTITY(1, 1) NOT NULL, +"SH_AB_ID" INTEGER, +"CALL_TIME" TIMESTAMP(0), +"STATUS" VARCHAR(2), +"TYPE" VARCHAR(2) DEFAULT 0, +"CALL_TYPE" VARCHAR(2), +"KNOW" VARCHAR(2) DEFAULT 0, +"REMARK" VARCHAR2(500), +NOT CLUSTER PRIMARY KEY("ID") USING INDEX TABLESPACE "SHZH" ) STORAGE(ON "MAIN", CLUSTERBTR) ; + +COMMENT ON TABLE "FXKH_TXL"."SH_CALLS" IS '抽查日志'; +COMMENT ON COLUMN "FXKH_TXL"."SH_CALLS"."CALL_TIME" IS '抽查时间'; +COMMENT ON COLUMN "FXKH_TXL"."SH_CALLS"."CALL_TYPE" IS '叫应状态: 0:接通,1:拒接,2:忙线'; +COMMENT ON COLUMN "FXKH_TXL"."SH_CALLS"."KNOW" IS '知晓本人为山洪责任人, 0:否,1:是'; +COMMENT ON COLUMN "FXKH_TXL"."SH_CALLS"."REMARK" IS '叫应备注'; +COMMENT ON COLUMN "FXKH_TXL"."SH_CALLS"."SH_AB_ID" IS '山洪通讯录编号'; +COMMENT ON COLUMN "FXKH_TXL"."SH_CALLS"."STATUS" IS '是否接听0:否,1是'; +COMMENT ON COLUMN "FXKH_TXL"."SH_CALLS"."TYPE" IS '通话类型: 0:拨打,1:回拨'; + + +CREATE TABLE "FXKH_TXL"."SH_CALL_WORD" +( +"ID" INTEGER IDENTITY(1, 1) NOT NULL, +"SH_AB_TYPE1" VARCHAR(50), +"SH_PERIOD_ID" INTEGER, +"WORD" VARCHAR2(2000), +"CREATE_TIME" TIMESTAMP(0), +NOT CLUSTER PRIMARY KEY("ID") USING INDEX TABLESPACE "SHZH" ) STORAGE(ON "MAIN", CLUSTERBTR) ; + +COMMENT ON TABLE "FXKH_TXL"."SH_CALL_WORD" IS '备注'; +COMMENT ON COLUMN "FXKH_TXL"."SH_CALL_WORD"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "FXKH_TXL"."SH_CALL_WORD"."ID" IS '主键id'; +COMMENT ON COLUMN "FXKH_TXL"."SH_CALL_WORD"."SH_AB_TYPE1" IS '责任人类型1 行政责任人,包保责任人'; +COMMENT ON COLUMN "FXKH_TXL"."SH_CALL_WORD"."SH_PERIOD_ID" IS '防汛周期ID'; +COMMENT ON COLUMN "FXKH_TXL"."SH_CALL_WORD"."WORD" IS '备注内容'; + + +CREATE TABLE "FXKH_TXL"."SH_PERIOD" +( +"ID" INTEGER IDENTITY(1, 1) NOT NULL, +"NAME" VARCHAR(50), +"CREATE_TIME" TIMESTAMP(0), +NOT CLUSTER PRIMARY KEY("ID") USING INDEX TABLESPACE "SHZH" ) STORAGE(ON "MAIN", CLUSTERBTR) ; + +COMMENT ON TABLE "FXKH_TXL"."SH_PERIOD" IS '防汛周期'; +COMMENT ON COLUMN "FXKH_TXL"."SH_PERIOD"."CREATE_TIME" IS '新增时间'; +COMMENT ON COLUMN "FXKH_TXL"."SH_PERIOD"."ID" IS '主键id'; +COMMENT ON COLUMN "FXKH_TXL"."SH_PERIOD"."NAME" IS '防汛周期'; + + +CREATE TABLE "FXKH_TXL"."UNIT_DICT" +( +"ID" INTEGER IDENTITY(1, 1) NOT NULL, +"NAME" VARCHAR(80) NOT NULL, +"SORT" INTEGER DEFAULT 0 NOT NULL, +"O_ID" INTEGER NOT NULL, +NOT CLUSTER PRIMARY KEY("ID") USING INDEX TABLESPACE "SHZH" ) STORAGE(ON "MAIN", CLUSTERBTR) ; + +COMMENT ON TABLE "FXKH_TXL"."UNIT_DICT" IS '单位字典表'; +COMMENT ON COLUMN "FXKH_TXL"."UNIT_DICT"."NAME" IS '名称'; +COMMENT ON COLUMN "FXKH_TXL"."UNIT_DICT"."O_ID" IS '组织类型Id'; +COMMENT ON COLUMN "FXKH_TXL"."UNIT_DICT"."SORT" IS '序号'; + + CREATE TABLE "FXKH_TXL"."USERS" ( - "ID" INTEGER IDENTITY(1, 1) NOT NULL, - "USERNAME" VARCHAR(50) NOT NULL, - "PASSWORD" VARCHAR(50) NOT NULL, - "SALT" VARCHAR(50) NOT NULL, - "ROLE" VARCHAR(2) DEFAULT 0, - "AB_ID" INTEGER, - "LAST_DATE" DATETIME(0), - NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ; +"ID" INTEGER IDENTITY(1, 1) NOT NULL, +"USERNAME" VARCHAR(50) NOT NULL, +"PASSWORD" VARCHAR(50) NOT NULL, +"SALT" VARCHAR(50) NOT NULL, +"ROLE" VARCHAR(2) DEFAULT 0, +"AB_ID" INTEGER, +"LAST_DATE" DATETIME(0), +NOT CLUSTER PRIMARY KEY("ID") USING INDEX TABLESPACE "SHZH" ) STORAGE(ON "MAIN", CLUSTERBTR) ; COMMENT ON TABLE "FXKH_TXL"."USERS" IS '用户表'; COMMENT ON COLUMN "FXKH_TXL"."USERS"."AB_ID" IS '通讯录id'; -COMMENT ON COLUMN "FXKH_TXL"."USERS"."USERNAME" IS '用户名'; -COMMENT ON COLUMN "FXKH_TXL"."USERS"."ROLE" IS '0:普通管理员,1:政区管理员,99:系统管理员'; -COMMENT ON COLUMN "FXKH_TXL"."USERS"."PASSWORD" IS '密码'; COMMENT ON COLUMN "FXKH_TXL"."USERS"."LAST_DATE" IS '最后登录时间'; +COMMENT ON COLUMN "FXKH_TXL"."USERS"."PASSWORD" IS '密码'; +COMMENT ON COLUMN "FXKH_TXL"."USERS"."ROLE" IS '0:普通管理员,1:政区管理员,99:系统管理员'; COMMENT ON COLUMN "FXKH_TXL"."USERS"."SALT" IS '盐值'; - - -CREATE TABLE "FXKH_TXL"."AB_INFO" -( - "ID" INTEGER IDENTITY(1, 1) NOT NULL, - "JSON" VARCHAR(2000), - "AB_ID" INTEGER, - "VERSION" INTEGER DEFAULT 0, - "CREATE_ID" VARCHAR(50), - "CREATE_TIME" DATETIME(0), - "TYPE" CHAR(1) DEFAULT 0, - NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ; - -COMMENT ON TABLE "FXKH_TXL"."AB_INFO" IS '通讯录操作日志'; -COMMENT ON COLUMN "FXKH_TXL"."AB_INFO"."AB_ID" IS '通讯录编号'; -COMMENT ON COLUMN "FXKH_TXL"."AB_INFO"."CREATE_ID" IS '新增人id'; -COMMENT ON COLUMN "FXKH_TXL"."AB_INFO"."CREATE_TIME" IS '新增时间'; -COMMENT ON COLUMN "FXKH_TXL"."AB_INFO"."JSON" IS '数据'; -COMMENT ON COLUMN "FXKH_TXL"."AB_INFO"."TYPE" IS '0:添加用户,1:修改用户,2:修改权限,3:删除用户'; -COMMENT ON COLUMN "FXKH_TXL"."AB_INFO"."VERSION" IS '版本号'; +COMMENT ON COLUMN "FXKH_TXL"."USERS"."USERNAME" IS '用户名'; CREATE TABLE "FXKH_TXL"."WARNMSG_FEEDBACK" @@ -166,7 +448,7 @@ CREATE TABLE "FXKH_TXL"."WARNMSG_FEEDBACK" "CALL_PERSON" VARCHAR(50), "WARNID" INTEGER, "PUBLISH_TIME" DATETIME(6), -NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ; +NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "SHZH", CLUSTERBTR) ; COMMENT ON TABLE "FXKH_TXL"."WARNMSG_FEEDBACK" IS '预警叫应信息表'; COMMENT ON COLUMN "FXKH_TXL"."WARNMSG_FEEDBACK"."CALLED_PERSON" IS '被呼叫人姓名'; @@ -179,48 +461,110 @@ COMMENT ON COLUMN "FXKH_TXL"."WARNMSG_FEEDBACK"."ID" IS '自增ID'; COMMENT ON COLUMN "FXKH_TXL"."WARNMSG_FEEDBACK"."PUBLISH_TIME" IS '预警发布时间'; COMMENT ON COLUMN "FXKH_TXL"."WARNMSG_FEEDBACK"."WARNID" IS '预警信息ID'; -CREATE TABLE "FXKH_TXL"."ADDRESS_BOOK_OLD" + +CREATE TABLE "FXKH_TXL"."WARN_CALL_MAP" ( "ID" INTEGER IDENTITY(1, 1) NOT NULL, -"CTNM" VARCHAR(50), -"CNNM" VARCHAR(50), -"NAME" VARCHAR(50), -"POSITION" VARCHAR(50), -"PHONE" VARCHAR(50), -NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ; +"WARN_ID" INTEGER NOT NULL, +"SHOULD_GENERATE" INTEGER NOT NULL, +"GENERATED" INTEGER DEFAULT 0, +"UPLOADED" INTEGER DEFAULT 0, +"CNNM" VARCHAR(50) NOT NULL, +"UPLOAD_RESP_MSG" VARCHAR(100), +"REQUEST_ID" VARCHAR(100), +"CUST_ID" VARCHAR(100), +"WARN_NAME" VARCHAR(100), +"WARN_LEVEL" VARCHAR(100), +"WARN_TM" TIMESTAMP(6), +"CALLED" INTEGER DEFAULT 0, +"CALL_IS_PUT" INTEGER DEFAULT 0, +"ERR_STEP" INTEGER DEFAULT 0, +"CALL_CONTENT" VARCHAR(500), +"_REMARK" VARCHAR(100), +"CUST_NAME" VARCHAR(100), +"_CREATE_TM" TIMESTAMP(6), +NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "SHZH", CLUSTERBTR) ; -COMMENT ON TABLE "FXKH_TXL"."ADDRESS_BOOK_OLD" IS '旧的通讯录表'; -COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_OLD"."CNNM" IS '县名称'; -COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_OLD"."CTNM" IS '市名称'; -COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_OLD"."NAME" IS '姓名'; -COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_OLD"."PHONE" IS '手机号'; -COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK_OLD"."POSITION" IS '职务'; +CREATE INDEX "WARN_CALL_MAP_WARN_ID_IDX" ON "FXKH_TXL"."WARN_CALL_MAP"("WARN_ID" DESC,"WARN_TM" DESC) STORAGE(ON "SHZH", CLUSTERBTR) ; -CREATE TABLE "FXKH_TXL"."QXWARNING" -( -"ID" INTEGER IDENTITY(1, 1) NOT NULL, -"CREATE_TIME" DATETIME(6), -"PUBLISH_TIME" DATETIME(6), -"START_TIME" DATETIME(6), -"END_TIME" DATETIME(6), -"WARN_SIGNAL_TYPE" VARCHAR(50), -"WARN_SIGNAL_LEVEL" VARCHAR(50), -"PUBLISH_UNIT" VARCHAR(50), -"CONTENT" VARCHAR(500), -"WARNID" INTEGER, -"CTNM" VARCHAR(200), -"CNNM" VARCHAR(1000), -NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ; +CREATE TABLE FXKH_TXL.SMS_SPECIALIST ( + ID BIGINT NOT NULL, + NAME VARCHAR(50) NOT NULL, + "POSITION" VARCHAR(100), + BIRTHDAY DATE, + ADDRESS VARCHAR(20), + PHONE VARCHAR(20), + STATUS INT DEFAULT 1, + CREATE_TM DATETIME DEFAULT SYSDATE, + FLAG_BIRTHDAY_SENT_TODAY INT DEFAULT 0, + FLAG_HOLIDAY_SENT_TODAY INT DEFAULT 0, + CONSTRAINT CONS134219973 PRIMARY KEY (ID) +); +CREATE UNIQUE INDEX INDEX33558075 ON FXKH_TXL.SMS_SPECIALIST (ID); +CREATE UNIQUE INDEX INDEX33558076 ON FXKH_TXL.SMS_SPECIALIST (PHONE); +CREATE INDEX SMS_SPECIALIST_NAME_IDX ON FXKH_TXL.SMS_SPECIALIST (NAME,PHONE,ADDRESS); -COMMENT ON TABLE "FXKH_TXL"."QXWARNING" IS '气象预警表'; -COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."CNNM" IS '预警县名称'; -COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."CONTENT" IS '预警内容'; -COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."CREATE_TIME" IS '创建时间'; -COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."CTNM" IS '预警市名称'; -COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."END_TIME" IS '预警结束时间'; -COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."PUBLISH_TIME" IS '发布时间'; -COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."PUBLISH_UNIT" IS '发布单位'; -COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."START_TIME" IS '预警开始时间'; -COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."WARNID" IS '预警ID'; -COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."WARN_SIGNAL_LEVEL" IS '预警级别'; -COMMENT ON COLUMN "FXKH_TXL"."QXWARNING"."WARN_SIGNAL_TYPE" IS '预警类型'; \ No newline at end of file +COMMENT ON TABLE "FXKH_TXL"."SMS_SPECIALIST" IS '防汛专家表'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_SPECIALIST"."NAME" IS '姓名'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_SPECIALIST"."POSITION" IS '职务'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_SPECIALIST"."BIRTHDAY" IS '生日'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_SPECIALIST"."ADDRESS" IS '区域'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_SPECIALIST"."PHONE" IS '手机号码'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_SPECIALIST"."STATUS" IS '生效状态 1:有效 0:无效'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_SPECIALIST"."CREATE_TM" IS '创建日期'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_SPECIALIST"."FLAG_BIRTHDAY_SENT_TODAY" IS '今日是否发送过生日短信 0:没有发过 1:发过'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_SPECIALIST"."FLAG_HOLIDAY_SENT_TODAY" IS '今日是否发送过节日短信 0:没有发过 1:发过'; + +CREATE TABLE FXKH_TXL.SMS_BIRTHDAY ( + ID BIGINT NOT NULL, + EXECUTION_TM_STR VARCHAR(8), + STATUS INT DEFAULT 1, + TEMPLATE VARCHAR(500), + CONSTRAINT CONS134219970 PRIMARY KEY (ID) +); +CREATE UNIQUE INDEX INDEX33558070 ON FXKH_TXL.SMS_BIRTHDAY (ID); + +COMMENT ON TABLE "FXKH_TXL"."SMS_BIRTHDAY" IS '生日短信模板表'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_BIRTHDAY"."EXECUTION_TM_STR" IS '任务执行时间'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_BIRTHDAY"."STATUS" IS '状态 1:有效 0:无效'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_BIRTHDAY"."TEMPLATE" IS '短信模板'; + +CREATE TABLE FXKH_TXL.SMS_HOLIDAY ( + ID BIGINT NOT NULL, + SUBJECT_NAME VARCHAR(200) NOT NULL, + START_DATE DATE, + END_DATE DATE, + EXECUTION_TM_STR VARCHAR(8), + STATUS INT DEFAULT 1, + TEMPLATE VARCHAR(500), + CREATE_TM DATETIME DEFAULT SYSDATE, + CONSTRAINT CONS134219972 PRIMARY KEY (ID) +); +CREATE UNIQUE INDEX INDEX33558073 ON FXKH_TXL.SMS_HOLIDAY (ID); + +COMMENT ON TABLE "FXKH_TXL"."SMS_HOLIDAY" IS '节日短信模板表'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_HOLIDAY"."SUBJECT_NAME" IS '节日名称'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_HOLIDAY"."START_DATE" IS '任务开始时间'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_HOLIDAY"."END_DATE" IS '任务结束时间'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_HOLIDAY"."EXECUTION_TM_STR" IS '任务执行时间'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_HOLIDAY"."STATUS" IS '状态 1:有效 0:无效'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_HOLIDAY"."TEMPLATE" IS '短信模板'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_HOLIDAY"."CREATE_TM" IS '创建日期'; + +CREATE TABLE FXKH_TXL.SMS_LOG ( + ID BIGINT NOT NULL, + SEND_TM DATETIME NOT NULL, + NAME VARCHAR(50) NOT NULL, + PHONE VARCHAR(20), + REMARK VARCHAR(500), + CONTENT VARCHAR(500), + CONSTRAINT CONS134219969 PRIMARY KEY (ID) +); +CREATE UNIQUE INDEX INDEX33558068 ON FXKH_TXL.SMS_LOG (ID); + +COMMENT ON TABLE "FXKH_TXL"."SMS_LOG" IS '短信发送日志'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_LOG"."SEND_TM" IS '发动时间'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_LOG"."NAME" IS '姓名'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_LOG"."PHONE" IS '手机号码'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_LOG"."REMARK" IS '备注'; +COMMENT ON COLUMN "FXKH_TXL"."SMS_LOG"."CONTENT" IS '短信内容'; \ No newline at end of file diff --git a/sql/tables.sms.sql b/sql/tables.sms.sql deleted file mode 100644 index 32fb9fa..0000000 --- a/sql/tables.sms.sql +++ /dev/null @@ -1,49 +0,0 @@ --- 姓名,职务,生日,称呼,电话号码,生效状态,创建日期 - --- 达梦数据库SPECIALIST表建表语句 -CREATE TABLE SMS_SPECIALIST ( - ID BIGINT IDENTITY(1,1) PRIMARY KEY, - NAME VARCHAR(50) NOT NULL COMMENT '姓名', - POSITION VARCHAR(100) COMMENT '职务', - BIRTHDAY DATE COMMENT '生日', - ADDRESS VARCHAR(20) COMMENT '区域', - PHONE VARCHAR(20) UNIQUE COMMENT '电话号码', - STATUS INT DEFAULT 1 COMMENT '生效状态 1:有效 0:无效', - CREATE_TM DATETIME DEFAULT SYSDATE COMMENT '创建日期', - FLAG_BIRTHDAY_SENT_TODAY INT DEFAULT 0, - FLAG_HOLIDAY_SENT_TODAY INT DEFAULT 0 -); - - ---主题名称,任务开始日期,任务结束日期,任务执行时间,状态,创建日期,操作 ---2025年国庆,2025-10-01,2025-10-03,08:00:00,有效,2025-09-15 ---2026年春节,2026-02-17,2026-02-17,08:00:00,有效,2025-09-15 --- 达梦数据库TASK表建表语句 -CREATE TABLE SMS_HOLIDAY ( - ID BIGINT IDENTITY(1,1) PRIMARY KEY, - SUBJECT_NAME VARCHAR(200) NOT NULL COMMENT '主题名称', - START_DATE DATE COMMENT '任务开始日期', - END_DATE DATE COMMENT '任务结束日期', - EXECUTION_TM_STR VARCHAR(8) COMMENT '任务执行时间', - STATUS INT DEFAULT 1 COMMENT '状态 1:有效 0:无效', - TEMPLATE VARCHAR(500), - CREATE_TM DATETIME DEFAULT SYSDATE COMMENT '创建日期' -); - - -CREATE TABLE SMS_BIRTHDAY ( - ID BIGINT IDENTITY(1,1) PRIMARY KEY, - EXECUTION_TM_STR VARCHAR(8) COMMENT '任务执行时间', - STATUS INT DEFAULT 1 COMMENT '状态 1:有效 0:无效', - TEMPLATE VARCHAR(500) -); - - -CREATE TABLE SMS_LOG ( - ID BIGINT IDENTITY(1,1) PRIMARY KEY, - SEND_TM DATETIME NOT NULL COMMENT '发送时间', - NAME VARCHAR(50) NOT NULL COMMENT '姓名', - PHONE VARCHAR(20) COMMENT '电话号码', - REMARK VARCHAR(500) COMMENT '备注', - CONTENT VARCHAR(500) COMMENT '短信内容' -) \ No newline at end of file