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',
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;
}
/**
* 判断手机号是否为加密状态
* <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

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() {
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;
import cn.dev33.satoken.annotation.SaIgnore;
import com.zdxt.enforcementcode.common.util.CommonUtil;
import com.zdxt.enforcementcode.service.enforcement.IAppEnfLoginService;
import com.zdxt.enforcementcode.controller.app.LoginController;
import com.zdxt.enforcementcode.domain.vo.SrzDeptVo;
@ -99,14 +100,20 @@ public class AppEnfLoginController extends LoginController {
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<>();
data.put("token", token);
data.put("userId", user.getUserId());
data.put("userName", user.getUserName());
data.put("loginName", user.getLoginName());
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("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";
/**
* 设置项主键单位内部单次计划最多参与人数<=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_INNER_UNIT_AC_PERSON_NUM = 3;
/**
* 查询行政执法检查计划-设置
*
@ -92,6 +102,13 @@ public interface IEfcodeCpSettingService {
*/
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);
}
/**
* 获取单位内部单次计划最多参与人数
*/
@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);
// 单位内部单次计划最多参与人数(>=3)
export const getMaxInnerUnitAcPersonNum = (success, error) => _get(settingBaseUrl + "/maxInnerUnitAcPersonNum", {}, success, error);
// endregion
// region 企业检索接口

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

@ -12,6 +12,10 @@ export default defineStore('useCommon', {
enterpriseId:"",
//当前登录用户ID
userId:"",
//当前登录用户名(账号)
userName:"",
//当前登录用户昵称(姓名)
nickName:"",
//部门ID
deptId:"",
//部门名称
@ -63,6 +67,14 @@ export default defineStore('useCommon', {
SET_USER_ID(data){
this.userId = data;
},
//设置用户名(账号)
SET_USER_NAME(data){
this.userName = data;
},
//设置用户昵称(姓名)
SET_NICK_NAME(data){
this.nickName = data;
},
//设置部门ID
SET_DEPT_ID(data){
this.deptId = data;
@ -145,6 +157,6 @@ export default defineStore('useCommon', {
},
persist: {
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_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_DEPT_ID(response.data.deptId);
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">
import { useRouter, useRoute } from 'vue-router';
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 route = useRoute();
@ -261,6 +261,9 @@ const form = ref({
//
const personList = ref([]);
//
const maxPersonNum = ref(3);
//
const enterpriseOptions = ref([]);
const showEnterpriseSuggest = ref(false);
@ -287,13 +290,39 @@ onMounted(() => {
//
form.value.bureauDeptId = useCommon.bureauUnitId || '';
form.value.bureauDeptName = useCommon.bureauUnitName || '';
//
bindCurrentUserAsDefaultPerson();
//
loadSubmitDeadline();
//
loadMaxPersonNum();
if (isEdit.value) {
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 = () => {
getSubmitDeadline((res) => {
@ -405,6 +434,10 @@ const onSelectEnterprise = (item) => {
//
const onAddPerson = () => {
if (personList.value.length >= maxPersonNum.value) {
showToast(`最多只能添加 ${maxPersonNum.value} 名执法人员`);
return;
}
// TODO:
showToast('人员选择功能开发中');
};

Loading…
Cancel
Save