Browse Source

bug修复

dev-V1.0.1
蟑螂恶霸 5 months ago
parent
commit
e3ce21fdc1
  1. 4
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfLoginController.java
  2. 16
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnforcementRegistrationController.java
  3. 6
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/common/FileController.java
  4. 16
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/common/impl/FileUploadApiImpl.java
  5. 47
      zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/EnforcementInfoSection.vue
  6. 42
      zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/NonEnforcementInfoSection.vue
  7. 5
      zdxt-web-client/zdxt-efcode-enforcement-app/src/http/http.js
  8. 85
      zdxt-web-client/zdxt-efcode-enforcement-app/src/util/fileUpload.js
  9. 47
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/components/EnforcementRecordList.vue
  10. 26
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementRegister.vue
  11. 1
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enterpriseScanPreview.vue
  12. 4
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/planNoticeList.vue
  13. 53
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/program/components/ProgramCreate.vue

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

@ -1,6 +1,8 @@
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.alibaba.fastjson.JSONObject;
import com.zdxt.enforcementcode.controller.app.utils.HttpUtil;
import com.zdxt.enforcementcode.common.util.CommonUtil; 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;
@ -12,9 +14,11 @@ import org.dromara.system.domain.vo.SysDeptVo;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISysDeptService; import org.dromara.system.service.ISysDeptService;
import org.dromara.system.service.ISysUserService; import org.dromara.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**

16
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnforcementRegistrationController.java

@ -180,14 +180,14 @@ public class AppEnforcementRegistrationController extends BaseController {
@GetMapping("/queryByEpId") @GetMapping("/queryByEpId")
public R<List<EnforcementRegistrationVo>> queryByEpId(EnforcementRegistrationBo bo) public R<List<EnforcementRegistrationVo>> queryByEpId(EnforcementRegistrationBo bo)
{ {
if (Objects.nonNull( LoginHelper.getUserId()) && bo.getWarnType()==0) { // if (Objects.nonNull( LoginHelper.getUserId()) && bo.getWarnType()==0) {
bo.setDeptId(LoginHelper.getDeptId() == null ? null : LoginHelper.getDeptId()); // bo.setDeptId(LoginHelper.getDeptId() == null ? null : LoginHelper.getDeptId());
//
SysDeptVo bureauDept = sysDeptService.iterationDeptParentToBureau(LoginHelper.getDeptId()); // SysDeptVo bureauDept = sysDeptService.iterationDeptParentToBureau(LoginHelper.getDeptId());
if (bureauDept != null) { // if (bureauDept != null) {
bo.setBureauDeptId(bureauDept.getDeptId()); // bo.setBureauDeptId(bureauDept.getDeptId());
} // }
} // }
List<EnforcementRegistrationVo> list = enforcementRegistrationService.selectEnforcementRegistrationList(bo); List<EnforcementRegistrationVo> list = enforcementRegistrationService.selectEnforcementRegistrationList(bo);
return R.ok(list); return R.ok(list);

6
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/common/FileController.java

@ -10,7 +10,7 @@ import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -34,7 +34,7 @@ public class FileController extends BaseController {
*/ */
@Log(title = "文件上传", businessType = BusinessType.INSERT) @Log(title = "文件上传", businessType = BusinessType.INSERT)
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<String> upload(@RequestPart("file") MultipartFile file) { public R<String> upload(@RequestParam("file") MultipartFile file) {
String filePath = fileUploadApi.upload(file); String filePath = fileUploadApi.upload(file);
return R.ok("上传成功", filePath); return R.ok("上传成功", filePath);
} }
@ -49,7 +49,7 @@ public class FileController extends BaseController {
*/ */
@Log(title = "文件上传", businessType = BusinessType.INSERT) @Log(title = "文件上传", businessType = BusinessType.INSERT)
@PostMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @PostMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<String> uploadFile(@RequestPart("file") MultipartFile file, String dir) { public R<String> uploadFile(@RequestParam("file") MultipartFile file, String dir) {
String filePath = fileUploadApi.uploadWithType(file, dir); String filePath = fileUploadApi.uploadWithType(file, dir);
return R.ok("上传成功", filePath); return R.ok("上传成功", filePath);
} }

16
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/common/impl/FileUploadApiImpl.java

@ -6,31 +6,32 @@ import com.zdxt.enforcementcode.common.util.file.FileUploadUtils;
import com.zdxt.enforcementcode.common.util.file.MimeTypeUtils; import com.zdxt.enforcementcode.common.util.file.MimeTypeUtils;
import com.zdxt.enforcementcode.service.common.FileUploadApi; import com.zdxt.enforcementcode.service.common.FileUploadApi;
import org.dromara.common.core.exception.base.BaseException; import org.dromara.common.core.exception.base.BaseException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
/** /**
* 文件上传API-实现类 * 文件上传API-实现类
* *
* @author QingWang.Li * @author QingWang.Li
* @date 2020/3/20 16:50 * @date 2020/3/20 16:50
*/ */
@Slf4j
@Service @Service
public class FileUploadApiImpl implements FileUploadApi { public class FileUploadApiImpl implements FileUploadApi {
@Autowired @Autowired
RuoYiConfig ruoYiConfig; RuoYiConfig ruoYiConfig;
@Override @Override
public String upload(MultipartFile file) { public String upload(MultipartFile file) {
String filePath = RuoYiConfig.getUploadPath(); String filePath = RuoYiConfig.getUploadPath();
try { try {
return FileUploadUtils.upload(filePath, file); return FileUploadUtils.upload(filePath, file);
} catch (IOException e) { } catch (Exception e) {
throw new BaseException("上传失败"); log.error("文件上传失败, path={}", filePath, e);
throw new BaseException("上传失败: " + e.getMessage());
} }
} }
@ -40,7 +41,7 @@ public class FileUploadApiImpl implements FileUploadApi {
// 构建完整的上传路径:基础路径 + 指定目录 // 构建完整的上传路径:基础路径 + 指定目录
String basePath = RuoYiConfig.getUploadPath(); String basePath = RuoYiConfig.getUploadPath();
String uploadPath; String uploadPath;
if (dir != null && !dir.isEmpty()) { if (dir != null && !dir.isEmpty()) {
// 去除目录前后的斜杠,避免路径问题 // 去除目录前后的斜杠,避免路径问题
String cleanDir = dir.trim().replaceAll("^/+|/+$", ""); String cleanDir = dir.trim().replaceAll("^/+|/+$", "");
@ -49,9 +50,10 @@ public class FileUploadApiImpl implements FileUploadApi {
// 如果未指定目录,使用默认上传路径 // 如果未指定目录,使用默认上传路径
uploadPath = basePath; uploadPath = basePath;
} }
return FileUploadUtils.upload(uploadPath, file); return FileUploadUtils.upload(uploadPath, file);
} catch (Exception e) { } catch (Exception e) {
log.error("文件上传失败, dir={}", dir, e);
throw new BaseException("上传失败: " + e.getMessage()); throw new BaseException("上传失败: " + e.getMessage());
} }
} }

47
zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/EnforcementInfoSection.vue

@ -66,11 +66,13 @@
<!-- 原因 --> <!-- 原因 -->
<van-field v-model="formData.reason" name="reason" label="原因" placeholder="请输入原因" readonly /> <van-field v-model="formData.reason" name="reason" label="原因" placeholder="请输入原因" readonly />
<!-- 执法时间 --> <!-- 执法时间(可选,近10天内) -->
<van-field v-model="formData.enforcementTime" name="enforcementTime" label="执法时间" placeholder="请选择执法时间" <van-field v-model="formData.enforcementTime" name="enforcementTime" label="执法时间" placeholder="请选择执法时间"
readonly /> readonly is-link clearable @click="openTimePicker" />
<!-- <van-field v-model="formData.enforcementTime" name="enforcementTime" label="执法时间" placeholder="请选择执法时间" is-link <van-popup v-model:show="showTimePicker" position="bottom" round>
readonly :rules="[{ required: true, message: '请选择执法时间' }]" required /> --> <van-date-picker v-model="datePickerValue" title="选择执法时间" :min-date="minDate" :max-date="maxDate"
@confirm="onTimeConfirm" @cancel="showTimePicker = false" />
</van-popup>
<!-- 联合执法 --> <!-- 联合执法 -->
</div> </div>
@ -126,8 +128,13 @@
</template> </template>
<script setup name="EnforcementInfoSection"> <script setup name="EnforcementInfoSection">
import { computed } from 'vue'; import { computed, ref, onMounted } from 'vue';
import { uploadFile } from '@/util/fileUpload'; import { uploadFile } from '@/util/fileUpload';
import {
getEnforcementTimeDateRange,
parseEnforcementTimeToPicker,
buildEnforcementTimeFromPicker,
} from '@/util/enforcementTimePicker';
const props = defineProps({ const props = defineProps({
formData: { formData: {
@ -157,6 +164,34 @@ defineEmits([
'showEntrustedAgencyPicker' 'showEntrustedAgencyPicker'
]); ]);
const showTimePicker = ref(false);
const datePickerValue = ref([]);
const minDate = ref(new Date());
const maxDate = ref(new Date());
let defaultPickerValue = [];
onMounted(() => {
const range = getEnforcementTimeDateRange(10);
minDate.value = range.minDate;
maxDate.value = range.maxDate;
defaultPickerValue = range.currentDate;
datePickerValue.value = [...range.currentDate];
});
const openTimePicker = () => {
const parsed = parseEnforcementTimeToPicker(props.formData.enforcementTime);
datePickerValue.value = parsed ? [...parsed] : [...defaultPickerValue];
showTimePicker.value = true;
};
const onTimeConfirm = ({ selectedValues }) => {
const value = buildEnforcementTimeFromPicker(selectedValues);
if (value) {
props.formData.enforcementTime = value;
}
showTimePicker.value = false;
};
// 计算属性:是否有执法人员(转换为字符串用于表单验证) // 计算属性:是否有执法人员(转换为字符串用于表单验证)
const hasPerson = computed(() => { const hasPerson = computed(() => {
return props.defaultPerson?.name || props.additionalPersons.some(p => p.name) ? '1' : ''; return props.defaultPerson?.name || props.additionalPersons.some(p => p.name) ? '1' : '';
@ -436,4 +471,4 @@ const onAfterReadImage = (file) => {
border-radius: 0.1rem; border-radius: 0.1rem;
} }
} }
</style> </style>

42
zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/NonEnforcementInfoSection.vue

@ -61,9 +61,13 @@
<!-- 原因 --> <!-- 原因 -->
<van-field v-model="formData.reason" name="reason" label="原因" placeholder="请输入原因" readonly /> <van-field v-model="formData.reason" name="reason" label="原因" placeholder="请输入原因" readonly />
<!-- 入企时间 --> <!-- 入企时间(可选,近10天内) -->
<van-field v-model="formData.enforcementTime" name="enforcementTime" label="入企时间" placeholder="请选择入企时间" <van-field v-model="formData.enforcementTime" name="enforcementTime" label="入企时间" placeholder="请选择入企时间"
readonly /> readonly is-link clearable @click="openTimePicker" />
<van-popup v-model:show="showTimePicker" position="bottom" round>
<van-date-picker v-model="datePickerValue" title="选择入企时间" :min-date="minDate" :max-date="maxDate"
@confirm="onTimeConfirm" @cancel="showTimePicker = false" />
</van-popup>
<!-- 附件 --> <!-- 附件 -->
<div class="file-upload-row"> <div class="file-upload-row">
@ -79,12 +83,22 @@
import { ref, computed, onMounted } from 'vue'; import { ref, computed, onMounted } from 'vue';
import { uploadFile } from '@/util/fileUpload'; import { uploadFile } from '@/util/fileUpload';
import { loadDict } from '@/util/dictUtil'; import { loadDict } from '@/util/dictUtil';
import {
getEnforcementTimeDateRange,
parseEnforcementTimeToPicker,
buildEnforcementTimeFromPicker,
} from '@/util/enforcementTimePicker';
// 入企事由选项(从字典接口获取) // 入企事由选项(从字典接口获取)
const matterOptions = ref([]); const matterOptions = ref([]);
// 弹窗显示状态 // 弹窗显示状态
const showMatterPicker = ref(false); const showMatterPicker = ref(false);
const showTimePicker = ref(false);
const datePickerValue = ref([]);
const minDate = ref(new Date());
const maxDate = ref(new Date());
let defaultPickerValue = [];
// 选择入企事由 // 选择入企事由
const selectMatter = ({ selectedOptions }) => { const selectMatter = ({ selectedOptions }) => {
@ -92,13 +106,33 @@ const selectMatter = ({ selectedOptions }) => {
showMatterPicker.value = false; showMatterPicker.value = false;
}; };
// 初始化加载入企事由字典 // 初始化加载入企事由字典、时间选择范围
onMounted(() => { onMounted(() => {
const range = getEnforcementTimeDateRange(10);
minDate.value = range.minDate;
maxDate.value = range.maxDate;
defaultPickerValue = range.currentDate;
datePickerValue.value = [...range.currentDate];
loadDict('no_check_category', (columns) => { loadDict('no_check_category', (columns) => {
matterOptions.value = columns; matterOptions.value = columns;
}); });
}); });
const openTimePicker = () => {
const parsed = parseEnforcementTimeToPicker(props.formData.enforcementTime);
datePickerValue.value = parsed ? [...parsed] : [...defaultPickerValue];
showTimePicker.value = true;
};
const onTimeConfirm = ({ selectedValues }) => {
const value = buildEnforcementTimeFromPicker(selectedValues);
if (value) {
props.formData.enforcementTime = value;
}
showTimePicker.value = false;
};
const props = defineProps({ const props = defineProps({
formData: { formData: {
type: Object, type: Object,
@ -289,4 +323,4 @@ const onAfterReadImage = (file) => {
border-radius: 0.1rem; border-radius: 0.1rem;
} }
} }
</style> </style>

5
zdxt-web-client/zdxt-efcode-enforcement-app/src/http/http.js

@ -15,7 +15,10 @@ const router = $globalRouter;
//请求拦截器添加head //请求拦截器添加head
http.interceptors.request.use( http.interceptors.request.use(
config => { config => {
if(!config.headers['Content-Type']){ // FormData 必须由浏览器/axios 自动设置 multipart boundary
if (config.data instanceof FormData) {
delete config.headers['Content-Type'];
} else if(!config.headers['Content-Type']){
config.headers['Content-Type'] = 'application/json' config.headers['Content-Type'] = 'application/json'
} }
const token = $globalStore.useCommon.token; const token = $globalStore.useCommon.token;

85
zdxt-web-client/zdxt-efcode-enforcement-app/src/util/fileUpload.js

@ -1,51 +1,53 @@
import {_form, _post} from '../http/index' import http from '../http/http';
import { baseUrl } from "../config/env";
import axios from 'axios'; /**
const http = axios.create({ * 从上传接口响应中解析文件访问路径(R<String>:data 字段为路径字符串)
traditional: true, */
contentType : "application/json", const parseUploadFilePath = (res) => {
timeout: 1000 * 500000, // 1 秒 const body = res?.data;
}); if (typeof body === 'string') {
const uploadFile = (files,callback) => { return body;
files.status = "uploading"; }
files.message = "上传中..."; if (body && typeof body.data === 'string') {
files.status = "uploading"; return body.data;
// 需要使用 FormData 进行文件上传 }
let form = new FormData(); if (body && typeof body.data === 'object' && body.data) {
form.append("file", files.file); return body.data.url || body.data.fileUrl || body.data.path || body.data.uploadPath || '';
}
// 获取 token(从 localStorage 或 sessionStorage 中获取) return body?.url || body?.fileUrl || body?.path || '';
};
const token = $globalStore.useCommon.token;
console.log(token); const uploadFile = (files, callback) => {
axios({ files.status = 'uploading';
method: "post", files.message = '上传中...';
url: baseUrl+ "/app-enf/common/file/upload", const form = new FormData();
data: form, form.append('file', files.file);
headers: {
'clientid': 'f0535c2a32ab4d0496ab9a699b2a7d36', http.post('/app-enf/common/file/upload', form)
'Authorization': 'Bearer ' + token
}
})
.then((res) => { .then((res) => {
files.status = "done"; const filePath = parseUploadFilePath(res);
files.message = "上传成功"; if (!filePath) {
console.log(res); files.status = 'failed';
callback && callback(res); files.message = '上传失败';
console.error('上传响应缺少文件路径', res?.data);
return;
}
files.status = 'done';
files.message = '上传成功';
files.url = filePath;
// 兼容 enforcementPlanAdd 等页面的 res.url 写法
callback && callback({ url: filePath, data: res?.data, raw: res });
}) })
.catch((err) => { .catch((err) => {
files.status = "failed"; files.status = 'failed';
files.message = "上传失败"; files.message = '上传失败';
console.log(err); console.error('文件上传失败', err?.response?.data || err);
}); });
};
}
const nameCorrect=(name)=>{ const nameCorrect=(name)=>{
//筛选出两个字人名
let name1=[{}]; let name1=[{}];
name1=String(name).split(" "); name1=String(name).split(" ");
// console.log(name1);
if(name1[0].length==2){ if(name1[0].length==2){
if(name1.length>1){ if(name1.length>1){
return (String(name1[0]).substr(0,1)+"\u3000"+String(name1[0]).substr(1)+" "+name1[1]); return (String(name1[0]).substr(0,1)+"\u3000"+String(name1[0]).substr(1)+" "+name1[1]);
@ -58,11 +60,10 @@ const nameCorrect=(name)=>{
} }
} }
// 手机号加密
const encryptPhone=(num)=>{ const encryptPhone=(num)=>{
if(!/^\d{11}$/.test(num))return num; if(!/^\d{11}$/.test(num))return num;
const al= num.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2"); const al= num.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2");
return al; return al;
} }
export{uploadFile,nameCorrect,encryptPhone}; export{uploadFile,nameCorrect,encryptPhone,parseUploadFilePath};

47
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/components/EnforcementRecordList.vue

@ -41,14 +41,22 @@
</template> </template>
<script setup name="EnforcementRecordList"> <script setup name="EnforcementRecordList">
import { ref } from 'vue'; import { ref, watch } from 'vue';
import { queryEnfRegistrationList } from '@/api/enforcement/index'; import { queryEnfRegistrationList } from '@/api/enforcement/index';
import useCommon from '@/store/Common.js';
const commonStore = useCommon();
const props = defineProps({ const props = defineProps({
enterpriseName: { enterpriseName: {
type: String, type: String,
default: '' default: ''
}, },
/** 企业统一社会信用代码 */
enterpriseNumber: {
type: String,
default: ''
},
isRecordExpanded: { isRecordExpanded: {
type: Boolean, type: Boolean,
default: false default: false
@ -64,22 +72,38 @@ const loading = ref(false);
// ========== 获取执法记录数据 ========== // ========== 获取执法记录数据 ==========
const fetchEnfRegistrationList = () => { const fetchEnfRegistrationList = () => {
if (!props.enterpriseNumber) {
cityRecords.value = [];
return;
}
loading.value = true; loading.value = true;
// warnType:1=全市,0=本单位(与后端 AppEnforcementRegistrationController 一致)
const params = { const params = {
warnType: recordTab.value === 0 ? 1 : 0, warnType: recordTab.value === 0 ? 1 : 0,
// pageSize: 20, enterpriseNumber: props.enterpriseNumber,
// pageNum: 1,
}; };
// 本单位:传执法单位 id,优先 bureauUnitId,否则用当前用户 deptId
if (recordTab.value === 1) {
const bureauDeptId = commonStore.bureauUnitId || commonStore.deptId;
if (bureauDeptId) {
params.bureauDeptId = bureauDeptId;
}
}
queryEnfRegistrationList(params, (res) => { queryEnfRegistrationList(params, (res) => {
loading.value = false; loading.value = false;
if (res.code === 200) { if (res.code === 200) {
const data = res.data || []; const payload = res.data || {};
cityRecords.value = data.filter(item => item !== null && item !== undefined); const rows = payload.list || payload.rows || (Array.isArray(payload) ? payload : []);
cityRecords.value = (Array.isArray(rows) ? rows : []).filter(
item => item !== null && item !== undefined
);
} else { } else {
cityRecords.value = [];
console.error('获取执法记录失败:', res.msg); console.error('获取执法记录失败:', res.msg);
} }
}, (err) => { }, (err) => {
loading.value = false; loading.value = false;
cityRecords.value = [];
console.error('获取执法记录接口失败', err); console.error('获取执法记录接口失败', err);
}); });
}; };
@ -91,8 +115,17 @@ const handleRecordTabChange = (tabIndex) => {
fetchEnfRegistrationList(); fetchEnfRegistrationList();
}; };
// 初始化加载 watch(
fetchEnfRegistrationList(); () => props.enterpriseNumber,
(val) => {
if (val) {
fetchEnfRegistrationList();
} else {
cityRecords.value = [];
}
},
{ immediate: true }
);
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>

26
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementRegister.vue

@ -511,37 +511,32 @@ const fetchDetail = (id) => {
formData.jointEnforcement = data.uniteCheck ? '1' : '0'; formData.jointEnforcement = data.uniteCheck ? '1' : '0';
formData.entrustedEnforcement = data.hasAuto === 1 ? '1' : '0'; formData.entrustedEnforcement = data.hasAuto === 1 ? '1' : '0';
formData.entrustedAgency = data.entrustDeptName || ''; formData.entrustedAgency = data.entrustDeptName || '';
// 回填执法依据 // 回填执法依据
if (data.lawEnforcementBasisText) { if (data.lawEnforcementBasisText) {
formData.enforcementBases = data.lawEnforcementBasisText.split(',').map(b => b.trim()); formData.enforcementBases = data.lawEnforcementBasisText.split(',').map(b => b.trim());
formData.enforcementBasesIds = new Array(formData.enforcementBases.length).fill(''); formData.enforcementBasesIds = new Array(formData.enforcementBases.length).fill('');
} }
// 回填执法人员 // 回填执法人员
if (data.lawEnforcer) { if (data.lawEnforcer) {
enforcementPersons.value = [{ enforcementPersons.value = [{
name: data.lawEnforcer, name: data.lawEnforcer,
id: data.lawEnforcerId || '', id: data.lawEnforcerId || '',
phonenumber: data.lawEnforcerId || '' phonenumber: data.lawEnforcerId || ''
}]; }];
} }
// 回填额外执法人员 // 回填额外执法人员
additionalPersons.value = []; additionalPersons.value = [];
if (data.lawEnforcerTwo) { if (data.lawEnforcerTwo) {
additionalPersons.value.push({ additionalPersons.value.push({
name: data.lawEnforcerTwo, name: data.lawEnforcerTwo,
id: data.lawEnforcerIdTwo || '', id: data.lawEnforcerIdTwo || '',
phonenumber: data.lawEnforcerIdTwo || '' phonenumber: data.lawEnforcerIdTwo || ''
}); });
} }
// 加载字典后设置默认时间
const now = new Date();
if (!formData.enforcementTime) {
formData.enforcementTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}`;
}
} else { } else {
showToast(res.msg || '获取详情失败'); showToast(res.msg || '获取详情失败');
} }
@ -624,9 +619,6 @@ onMounted(() => {
matterOptions.value = columns; matterOptions.value = columns;
}); });
// 设置当前时间
const now = new Date();
formData.enforcementTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}`;
}); });
</script> </script>
@ -723,4 +715,4 @@ onMounted(() => {
} }
} }
} }
</style> </style>

1
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enterpriseScanPreview.vue

@ -91,6 +91,7 @@
<!-- 执法记录 Tab(行政执法模式) --> <!-- 执法记录 Tab(行政执法模式) -->
<div v-if="currentTab === 1 && !isNonEnforcement" class="tab-content"> <div v-if="currentTab === 1 && !isNonEnforcement" class="tab-content">
<EnforcementRecordList :enterprise-name="enterpriseData?.enterpriseName" <EnforcementRecordList :enterprise-name="enterpriseData?.enterpriseName"
:enterprise-number="enterpriseData?.enterpriseNumber"
:is-record-expanded="isRecordExpanded" @toggle-expand="toggleRecordExpand" /> :is-record-expanded="isRecordExpanded" @toggle-expand="toggleRecordExpand" />
</div> </div>

4
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/planNoticeList.vue

@ -74,7 +74,7 @@ const fetchList = () => {
const params = { const params = {
pageNum: pageNum.value, pageNum: pageNum.value,
pageSize: pageSize.value, pageSize: pageSize.value,
planName: searchText.value || undefined, queryParam: searchText.value || undefined,
}; };
getLawNoticeList(params, (res) => { getLawNoticeList(params, (res) => {
if (res.code === 200) { if (res.code === 200) {
@ -294,4 +294,4 @@ onMounted(() => {
:deep(.van-empty) { :deep(.van-empty) {
padding: 60px 0; padding: 60px 0;
} }
</style> </style>

53
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/program/components/ProgramCreate.vue

@ -101,6 +101,7 @@ import { showToast, showSuccessToast } from 'vant';
import { reactive, ref, onMounted } from "vue"; import { reactive, ref, onMounted } from "vue";
import { publishInspectionProgram } from '@/api/enforcement/index'; import { publishInspectionProgram } from '@/api/enforcement/index';
import useCommon from '@/store/Common.js'; import useCommon from '@/store/Common.js';
import { uploadFile } from '@/util/fileUpload';
const commonStore = useCommon(); const commonStore = useCommon();
@ -179,27 +180,28 @@ const submitData = reactive({
}) })
const submit = () => { const submit = () => {
// 检查附件是否上传(必填)
if (!data.fileListObj || data.fileListObj.length === 0) { if (!data.fileListObj || data.fileListObj.length === 0) {
showToast('请上传PDF格式附件(5MB以下)'); showToast('请上传PDF格式附件(5MB以下)');
return; return;
} }
const uploading = data.fileListObj.some(f => f.status === 'uploading');
if (uploading) {
showToast('附件上传中,请稍候');
return;
}
if (!submitData.fileList.length || !submitData.fileList[0]?.uploadPath) {
showToast('附件上传失败,请重新上传');
return;
}
data.showIsPublish = true; data.showIsPublish = true;
} }
const addPlan = (val) => { const addPlan = (val) => {
data.showIsPublish = false; data.showIsPublish = false;
// 处理文件列表,转换为后端需要的格式
const fileList = data.fileListObj.map(file => ({
fileName: file.name,
fileUrl: file.url || ''
}));
// 构建提交数据
const params = { const params = {
...submitData, ...submitData,
fileList: fileList fileList: submitData.fileList
}; };
// 调用发布接口 // 调用发布接口
@ -282,20 +284,27 @@ const downloadFile = () => {
} }
const uploadFiles = (file) => { const uploadFiles = (file) => {
file.status = 'uploading'; const files = Array.isArray(file) ? file : [file];
file.message = '上传中...'; files.forEach(f => {
setTimeout(() => { uploadFile(f, (res) => {
file.status = 'done'; const uploadPath = res.url || '';
file.message = ''; if (!uploadPath) {
}, 1000); f.status = 'failed';
f.message = '上传失败';
showToast('附件上传失败,请重试');
return;
}
f.url = uploadPath;
submitData.fileList = [{
uploadPath,
fileName: f.file?.name || f.name || ''
}];
});
});
} }
const deleteFile = (file, index) => { const deleteFile = (file, detail) => {
submitData.fileList.filter((item, indexs) => { submitData.fileList.splice(detail.index, 1);
if (index.index == indexs) {
submitData.fileList.splice(indexs, 1);
}
});
return true; return true;
} }
@ -567,4 +576,4 @@ const dateQuarterOnConfirm = ({ selectedOptions }) => {
} }
} }
} }
</style> </style>

Loading…
Cancel
Save