Browse Source

执法端-计划

dev-V1.0.1
庄锐波 4 months ago
parent
commit
fa533ab92b
  1. 3
      script/sql/zfjd-refactoring-v1/013-计划任务表设计.sql
  2. 43
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/common/util/CommonUtil.java
  3. 8
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpSettingController.java
  4. 11
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfLoginController.java
  5. 17
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpSettingService.java
  6. 8
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpSettingServiceImpl.java
  7. 3
      zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/plan.js
  8. 14
      zdxt-web-client/zdxt-efcode-enforcement-app/src/store/Common.js
  9. 2
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/login.vue
  10. 35
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/plan/cp_plan_edit.vue

3
script/sql/zfjd-refactoring-v1/013-计划任务表设计.sql

@ -184,4 +184,5 @@ VALUES ('CP_SETTING_SUBMIT_DEADLINE', '下阶段计划提交最晚时间', '26',
('CP_SETTING_AUTO_MATCH_START', '系统自动推荐匹配开始时间', '26', '系统自动推荐匹配的开始时间(号)>=', '0', ('CP_SETTING_AUTO_MATCH_START', '系统自动推荐匹配开始时间', '26', '系统自动推荐匹配的开始时间(号)>=', '0',
NULL), NULL),
('CP_SETTING_MANUAL_MATCH_DAYS', '手工匹配距计划开始天数', '3', '手工匹配距离计划开始的天数>=', '0', NULL), ('CP_SETTING_MANUAL_MATCH_DAYS', '手工匹配距计划开始天数', '3', '手工匹配距离计划开始的天数>=', '0', NULL),
('CP_MAX_UNION_UNIT', '单次联合单位最大数量', '3', '单次联合单位最大数量>=2', '0', NULL); ('CP_MAX_UNION_UNIT', '单次联合单位最大数量', '3', '单次联合单位最大数量>=2', '0', NULL),
('CP_MAX_INNER_UNIT_AC_PERSON_NUM', '单位内部单次计划最多参与人数', '3', '单位内部单次计划最多参与人数<=3', '0', NULL);

43
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/common/util/CommonUtil.java

@ -22,6 +22,49 @@ public class CommonUtil {
return num; return num;
} }
/**
* 判断手机号是否为加密状态
* <ul>
* <li>空值 返回 false(无法判定视为未加密)</li>
* <li>纯数字( 13800001234) 返回 false(明文)</li>
* <li>其他( Base64 密文 0d17ehr8XLbrj2kbgeEiDg==) 返回 true(已加密)</li>
* </ul>
*
* @param num 待判断的手机号字符串
* @return true=已加密false=明文或空值
*/
public static boolean isPhoneEncrypted(String num){
if(StringUtils.isEmpty(num))return false;
// 纯数字视为明文,非纯数字视为密文
return !num.matches("^\\d+$");
}
/**
* 手机号解密返回明文(不脱敏)
* <ul>
* <li>空值 原样返回</li>
* <li>纯数字 视为未加密原样返回</li>
* <li>其他 调用 {@link IdCardCryptoUtil#symmetricDecryptIdCard(String, String)} 解密</li>
* <li>解密异常 返回原值不抛出</li>
* </ul>
*
* @param num 可能是明文或密文的手机号
* @return 明文手机号
*/
public static String decryptPhone(String num){
if(StringUtils.isEmpty(num))return num;
// 纯数字视为未加密明文,直接返回
if(num.matches("^\\d+$")){
return num;
}
try {
return IdCardCryptoUtil.symmetricDecryptIdCard(KEY, num);
} catch (Exception e) {
// 解密失败,返回原值,避免调用方报错
return num;
}
}
/** /**
* 两个字名字空格 * 两个字名字空格
* @param name * @param name

8
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpSettingController.java

@ -57,4 +57,12 @@ public class AppEnfCpSettingController extends EfcodeCpSettingController {
public R<Integer> getMaxUnionUnit() { public R<Integer> getMaxUnionUnit() {
return R.ok(efcodeCpSettingService.getMaxUnionUnit()); return R.ok(efcodeCpSettingService.getMaxUnionUnit());
} }
/**
* 获取单位内部单次计划最多参与人数
*/
@GetMapping("/maxInnerUnitAcPersonNum")
public R<Integer> getMaxInnerUnitAcPersonNum() {
return R.ok(efcodeCpSettingService.getMaxInnerUnitAcPersonNum());
}
} }

11
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfLoginController.java

@ -1,6 +1,7 @@
package com.zdxt.enforcementcode.controller.app.enforcement; package com.zdxt.enforcementcode.controller.app.enforcement;
import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.annotation.SaIgnore;
import com.zdxt.enforcementcode.common.util.CommonUtil;
import com.zdxt.enforcementcode.service.enforcement.IAppEnfLoginService; import com.zdxt.enforcementcode.service.enforcement.IAppEnfLoginService;
import com.zdxt.enforcementcode.controller.app.LoginController; import com.zdxt.enforcementcode.controller.app.LoginController;
import com.zdxt.enforcementcode.domain.vo.SrzDeptVo; import com.zdxt.enforcementcode.domain.vo.SrzDeptVo;
@ -99,14 +100,20 @@ public class AppEnfLoginController extends LoginController {
return R.fail("部门ID查找错误!"); return R.fail("部门ID查找错误!");
} }
// 8. 构造返回数据 // 8. 手机号解密处理(如是加密存储则返回明文以供前端展示与业务使用)
String phonenumber = user.getPhonenumber();
if (CommonUtil.isPhoneEncrypted(phonenumber)) {
phonenumber = CommonUtil.decryptPhone(phonenumber);
}
// 9. 构造返回数据
Map<String, Object> data = new HashMap<>(); Map<String, Object> data = new HashMap<>();
data.put("token", token); data.put("token", token);
data.put("userId", user.getUserId()); data.put("userId", user.getUserId());
data.put("userName", user.getUserName()); data.put("userName", user.getUserName());
data.put("loginName", user.getLoginName()); data.put("loginName", user.getLoginName());
data.put("nickName", user.getNickName()); data.put("nickName", user.getNickName());
data.put("phonenumber", user.getPhonenumber() != null ? user.getPhonenumber() : ""); data.put("phonenumber", phonenumber != null ? phonenumber : "");
data.put("deptId", user.getDeptId()); data.put("deptId", user.getDeptId());
data.put("deptName", sysDept.getDeptName()); data.put("deptName", sysDept.getDeptName());

17
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpSettingService.java

@ -36,6 +36,11 @@ public interface IEfcodeCpSettingService {
*/ */
String SETTING_ID_MAX_UNION_UNIT = "CP_MAX_UNION_UNIT"; String SETTING_ID_MAX_UNION_UNIT = "CP_MAX_UNION_UNIT";
/**
* 设置项主键单位内部单次计划最多参与人数<=3
*/
String SETTING_ID_MAX_INNER_UNIT_AC_PERSON_NUM = "CP_MAX_INNER_UNIT_AC_PERSON_NUM";
/** /**
* 默认值下阶段计划提交最晚时间 * 默认值下阶段计划提交最晚时间
*/ */
@ -56,6 +61,11 @@ public interface IEfcodeCpSettingService {
*/ */
int DEFAULT_MAX_UNION_UNIT = 3; int DEFAULT_MAX_UNION_UNIT = 3;
/**
* 默认值单位内部单次计划最多参与人数
*/
int DEFAULT_MAX_INNER_UNIT_AC_PERSON_NUM = 3;
/** /**
* 查询行政执法检查计划-设置 * 查询行政执法检查计划-设置
* *
@ -92,6 +102,13 @@ public interface IEfcodeCpSettingService {
*/ */
Integer getMaxUnionUnit(); Integer getMaxUnionUnit();
/**
* 获取单位内部单次计划最多参与人数
*
* @return 数值未配置或无法解析时返回默认值 {@link #DEFAULT_MAX_INNER_UNIT_AC_PERSON_NUM}
*/
Integer getMaxInnerUnitAcPersonNum();
/** /**
* 分页查询行政执法检查计划-设置列表 * 分页查询行政执法检查计划-设置列表
* *

8
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpSettingServiceImpl.java

@ -76,6 +76,14 @@ public class EfcodeCpSettingServiceImpl implements IEfcodeCpSettingService {
return getIntSetting(SETTING_ID_MAX_UNION_UNIT, DEFAULT_MAX_UNION_UNIT); return getIntSetting(SETTING_ID_MAX_UNION_UNIT, DEFAULT_MAX_UNION_UNIT);
} }
/**
* 获取单位内部单次计划最多参与人数
*/
@Override
public Integer getMaxInnerUnitAcPersonNum() {
return getIntSetting(SETTING_ID_MAX_INNER_UNIT_AC_PERSON_NUM, DEFAULT_MAX_INNER_UNIT_AC_PERSON_NUM);
}
/** /**
* 根据设置主键获取整型配置值不存在或解析失败时返回默认值 * 根据设置主键获取整型配置值不存在或解析失败时返回默认值
* *

3
zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/plan.js

@ -28,6 +28,9 @@ const settingBaseUrl = "/app-enf/cpSetting";
// 下阶段计划提交最晚时间(每月几号前需提交下阶段计划<=) // 下阶段计划提交最晚时间(每月几号前需提交下阶段计划<=)
export const getSubmitDeadline = (success, error) => _get(settingBaseUrl + "/submitDeadline", {}, success, error); export const getSubmitDeadline = (success, error) => _get(settingBaseUrl + "/submitDeadline", {}, success, error);
// 单位内部单次计划最多参与人数(>=3)
export const getMaxInnerUnitAcPersonNum = (success, error) => _get(settingBaseUrl + "/maxInnerUnitAcPersonNum", {}, success, error);
// endregion // endregion
// region 企业检索接口 // region 企业检索接口

14
zdxt-web-client/zdxt-efcode-enforcement-app/src/store/Common.js

@ -12,6 +12,10 @@ export default defineStore('useCommon', {
enterpriseId:"", enterpriseId:"",
//当前登录用户ID //当前登录用户ID
userId:"", userId:"",
//当前登录用户名(账号)
userName:"",
//当前登录用户昵称(姓名)
nickName:"",
//部门ID //部门ID
deptId:"", deptId:"",
//部门名称 //部门名称
@ -63,6 +67,14 @@ export default defineStore('useCommon', {
SET_USER_ID(data){ SET_USER_ID(data){
this.userId = data; this.userId = data;
}, },
//设置用户名(账号)
SET_USER_NAME(data){
this.userName = data;
},
//设置用户昵称(姓名)
SET_NICK_NAME(data){
this.nickName = data;
},
//设置部门ID //设置部门ID
SET_DEPT_ID(data){ SET_DEPT_ID(data){
this.deptId = data; this.deptId = data;
@ -145,6 +157,6 @@ export default defineStore('useCommon', {
}, },
persist: { persist: {
storage: sessionStorage, storage: sessionStorage,
pick: ['token', 'userId', 'enterpriseNumber', 'enterpriseName', 'enterpriseId', 'phonenumber', 'deptId', 'deptName', 'organId', 'organName', 'bureauUnitId', 'bureauUnitName', 'hasLaw'], pick: ['token', 'userId', 'userName', 'nickName', 'enterpriseNumber', 'enterpriseName', 'enterpriseId', 'phonenumber', 'deptId', 'deptName', 'organId', 'organName', 'bureauUnitId', 'bureauUnitName', 'hasLaw'],
}, },
}); });

2
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/login.vue

@ -89,6 +89,8 @@
// //
useCommon.SET_USER_PHONENUMBER(response.data.phonenumber || ""); useCommon.SET_USER_PHONENUMBER(response.data.phonenumber || "");
useCommon.SET_USER_ID(response.data.userId); useCommon.SET_USER_ID(response.data.userId);
useCommon.SET_USER_NAME(response.data.userName || "");
useCommon.SET_NICK_NAME(response.data.nickName || "");
useCommon.SET_TOKEN(response.data.token); useCommon.SET_TOKEN(response.data.token);
useCommon.SET_DEPT_ID(response.data.deptId); useCommon.SET_DEPT_ID(response.data.deptId);
useCommon.SET_DEPT_NAME(response.data.deptName || ""); useCommon.SET_DEPT_NAME(response.data.deptName || "");

35
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/plan/cp_plan_edit.vue

@ -184,7 +184,7 @@
<script setup name="cpPlanEdit"> <script setup name="cpPlanEdit">
import { useRouter, useRoute } from 'vue-router'; import { useRouter, useRoute } from 'vue-router';
import { showToast } from 'vant'; import { showToast } from 'vant';
import { addPlan, editPlan, getPlanDetail, getSubmitDeadline, searchUnionByEnterpriseName } from '@/api/enforcement/plan'; import { addPlan, editPlan, getPlanDetail, getSubmitDeadline, getMaxInnerUnitAcPersonNum, searchUnionByEnterpriseName } from '@/api/enforcement/plan';
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
@ -261,6 +261,9 @@ const form = ref({
// //
const personList = ref([]); const personList = ref([]);
//
const maxPersonNum = ref(3);
// //
const enterpriseOptions = ref([]); const enterpriseOptions = ref([]);
const showEnterpriseSuggest = ref(false); const showEnterpriseSuggest = ref(false);
@ -287,13 +290,39 @@ onMounted(() => {
// //
form.value.bureauDeptId = useCommon.bureauUnitId || ''; form.value.bureauDeptId = useCommon.bureauUnitId || '';
form.value.bureauDeptName = useCommon.bureauUnitName || ''; form.value.bureauDeptName = useCommon.bureauUnitName || '';
//
bindCurrentUserAsDefaultPerson();
// //
loadSubmitDeadline(); loadSubmitDeadline();
//
loadMaxPersonNum();
if (isEdit.value) { if (isEdit.value) {
loadDetail(route.query.id); loadDetail(route.query.id);
} }
}); });
//
const bindCurrentUserAsDefaultPerson = () => {
const name = useCommon.nickName || useCommon.userName || '';
const phone = useCommon.phonenumber || '';
const id = useCommon.userId || '';
if (!name && !id) return;
personList.value = [{ id, name, phone, code: '' }];
syncPersonData();
};
//
const loadMaxPersonNum = () => {
getMaxInnerUnitAcPersonNum((res) => {
if (res && res.code === 200 && res.data != null) {
const val = Number(res.data);
if (!isNaN(val) && val > 0) {
maxPersonNum.value = val;
}
}
});
};
// //
const loadSubmitDeadline = () => { const loadSubmitDeadline = () => {
getSubmitDeadline((res) => { getSubmitDeadline((res) => {
@ -405,6 +434,10 @@ const onSelectEnterprise = (item) => {
// //
const onAddPerson = () => { const onAddPerson = () => {
if (personList.value.length >= maxPersonNum.value) {
showToast(`最多只能添加 ${maxPersonNum.value} 名执法人员`);
return;
}
// TODO: // TODO:
showToast('人员选择功能开发中'); showToast('人员选择功能开发中');
}; };

Loading…
Cancel
Save