Browse Source

Merge branch 'dev-V1.0.5' into dev

dev-V1.10.2-temp
vincent 2 months ago
parent
commit
91a64035df
  1. 5
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnterpriseInformationServiceImpl.java
  2. 16
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/biz/index.vue
  3. 4
      zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/plan.js
  4. 2
      zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/EnforcementInfoSection.vue
  5. 2
      zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/NonEnforcementInfoSection.vue
  6. 8
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/components/HistoryActivityDetail.vue
  7. 4
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementEvaluateDetail.vue
  8. 2
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/home/enforcementHome.vue
  9. 2
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/enforcementMy.vue
  10. 156
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/notice/cp_notice_edit.vue
  11. 2
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/notice/cp_notice_message.vue
  12. 161
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/plan/cp_plan_edit.vue
  13. 14
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/task/cp_task_mine.vue
  14. 114
      zdxt-web-server/zdxt-admin-web-server/src/main/resources/businessdatasyn/sys_dept.json
  15. 122
      zdxt-web-server/zdxt-admin-web-server/src/main/resources/businessdatasyn/sys_user.json

5
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnterpriseInformationServiceImpl.java

@ -407,7 +407,8 @@ public class EnterpriseInformationServiceImpl implements IEnterpriseInformationS
// 4. 仅在新增成功时生成二维码
if (!isUpdate && result > 0) {
generateQrCodeForNewEnterprise(enterpriseInformation);
// generateQrCodeForNewEnterprise(enterpriseInformation);
generateQrCode("zfjd", enterpriseInformation.getEnterpriseNumber(), "enterprise", "企业登记");
}
return result;
@ -462,6 +463,7 @@ public class EnterpriseInformationServiceImpl implements IEnterpriseInformationS
String qrContent = JSONObject.toJSONString(jsonMap);
try {
// 生成二维码文件
String logoPath = ruoYiConfig.getFile().getQrCodeUrl();
String uploadPath = ruoYiConfig.getFile().getUploadPath();
@ -476,6 +478,7 @@ public class EnterpriseInformationServiceImpl implements IEnterpriseInformationS
qrCodeHistory.setId(uuid);
qrCodeHistory.setGenerateTime(DateUtils.getNowDate());
qrCodeHistory.setQrCodeUrl(qrCodeUrl);
qrCodeHistory.setStatus(0L);
qrCodeHistory.setEnterpriseNumber(enterpriseInformation.getEnterpriseNumber());
qrCodeHistory.setReasonsChange("企业登记");
qrCodeGenerateHistoryService.insertByBo(qrCodeHistory);

16
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/biz/index.vue

@ -116,6 +116,22 @@ const syncConfigs = ref([
v2Table: 'enterprise_pub_qrcode',
syncDirection: '双向',
enabled: true
},
{
configKey: 'sys_dept',
description: '部门表双向同步',
v1Table: 'sys_dept',
v2Table: 'sys_dept',
syncDirection: '双向',
enabled: true
},
{
configKey: 'sys_user',
description: '用户表双向同步',
v1Table: 'sys_user',
v2Table: 'sys_user',
syncDirection: '双向',
enabled: true
}
]);

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

@ -53,8 +53,8 @@ export const getManualMatchDays = (success, error) => _get(settingBaseUrl + "/ma
const enterpriseSearchBaseUrl = "/enforcementcode/enterpriseSearch";
// 按企业名称联合检索(>=3字符)
export const searchUnionByEnterpriseName = (enterpriseName, success, error) =>
_get(enterpriseSearchBaseUrl + "/searchUnionByEnterpriseName", { enterpriseName }, success, error);
export const searchUnionByEnterpriseName = (searchValue, success, error) =>
_post("/app-enf/enterpriseInfo/queryListAndQrInfo", { searchValue }, success, error);
// 根据企业信用代码查询联系人和联系电话
export const getEnterpriseContactInfo = (enterpriseNumber, success, error) =>

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

@ -69,7 +69,7 @@
<!-- 原因 -->
<template v-if="showReason">
<van-field v-model="formData.reason" name="reason" label="原因" :placeholder="formData.reason || '请选择'" readonly
<van-field v-model="formData.reason" name="reason" label="未扫码原因" :placeholder="formData.reason || '请选择'" readonly
:clickable="canSelectReason" :is-link="canSelectReason"
:rules="canSelectReason ? [{ required: true, message: '请选择原因' }] : []"
:required="canSelectReason"

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

@ -64,7 +64,7 @@
<!-- 原因 -->
<template v-if="showReason">
<van-field v-model="formData.reason" name="reason" label="原因" :placeholder="formData.reason || '请选择'" readonly
<van-field v-model="formData.reason" name="reason" label="未扫码原因" :placeholder="formData.reason || '请选择'" readonly
:clickable="canSelectReason" :is-link="canSelectReason"
:rules="canSelectReason ? [{ required: true, message: '请选择原因' }] : []"
:required="canSelectReason"

8
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/components/HistoryActivityDetail.vue

@ -61,7 +61,7 @@
</div>
</div>
<div class="custom-cell">
<span class="custom-cell-label">原因</span>
<span class="custom-cell-label">未扫码原因</span>
<span class="custom-cell-value">{{ activityDetail.reason }}</span>
</div>
<div class="custom-cell" v-if="activityDetail.otherReasons">
@ -138,11 +138,11 @@ onMounted(() => {
<style lang="less" scoped>
.history-activity-detail {
min-height: 100vh;
height: 100vh;
background-color: #fbfdff;
box-sizing: border-box;
padding-top: 12px;
overflow: auto;
.detail-content {
margin: 0px 15px 15px 15px;
@ -171,7 +171,7 @@ onMounted(() => {
}
.custom-cell-label {
width: 68px;
width: 75px;
flex-shrink: 0;
color: #666;
font-size: 14px;

4
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementEvaluateDetail.vue

@ -60,7 +60,7 @@
</div>
</template>
<div class="info-row" v-if="detail.enforceReason">
<span class="info-label">原因</span>
<span class="info-label">未扫码原因</span>
<span class="info-value">{{ detail.enforceReason }}</span>
</div>
<div class="info-row" v-if="detail.otherReasons">
@ -500,7 +500,7 @@ const onSubmit = () => {
color: #333;
margin-right: 24px;
font-size: 14px;
width: 60px;
width: 70px;
}
.info-value {
color: #999;

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

@ -108,7 +108,7 @@ const isLoading = ref(!useCommon.token);
// 非执法人员点击受限模块时的提示
const checkLawPermission = () => {
if (!hasLaw.value) {
showToast('您非执法人员,无法使用该功能');
showToast('非行政执法人员无法使用该功能');
return false;
}
return true;

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

@ -118,7 +118,7 @@ const settingItem = {
// ========== 菜单点击 ==========
const onMenuClick = (item) => {
if (!commonStore.hasLaw) {
showToast('该功能仅执法人员可用');
showToast('非行政执法人员无法使用该功能');
return;
}
switch (item.key) {

156
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/notice/cp_notice_edit.vue

@ -260,28 +260,38 @@
<span class="enterprise-picker-title">选择企业</span>
<van-icon name="cross" @click="showEnterprisePicker = false" />
</div>
<van-search
v-model="enterpriseSearchKeyword"
placeholder="输入≥ 2 个字符检索企业,不要输入深圳,深圳市"
shape="round"
@update:model-value="onEnterpriseSearchInput"
/>
<div class="search-bar">
<van-search
v-model="enterpriseSearchKeyword"
placeholder="请输入企业名称/统一信用代码搜索"
@search="handleEnterpriseSearch"
@clear="clearEnterpriseSearch"
/>
<van-button class="search-btn" type="primary" @click="handleEnterpriseSearch">搜索</van-button>
</div>
<div class="enterprise-picker-body">
<div v-if="enterpriseSearching" class="enterprise-loading">
<van-loading size="18" />&nbsp;检索中...
</div>
<template v-else>
<van-list
v-model:loading="enterpriseLoading"
:finished="enterpriseFinished"
:finished-text="enterpriseFinishedText"
:offset="50"
@load="onEnterpriseLoad"
>
<div
v-for="(item, idx) in enterpriseOptions"
:key="idx"
:key="item.enterpriseNumber || idx"
class="enterprise-item"
@click="onSelectEnterprise(item)"
>
<div class="enterprise-item-name">{{ item.enterpriseName }}</div>
<div class="enterprise-item-number">{{ item.enterpriseNumber }}</div>
</div>
<van-empty v-if="enterpriseSearchKeyword.length >= 2 && !enterpriseOptions.length" description="未检索到匹配企业" image-size="80" />
</template>
<van-empty
v-if="!enterpriseLoading && !enterpriseOptions.length"
:description="enterpriseEmptyText"
image-size="80"
/>
</van-list>
</div>
</div>
</van-popup>
@ -292,7 +302,8 @@
import { useRouter, useRoute } from 'vue-router';
import { showToast, showSuccessToast, showConfirmDialog } from 'vant';
import { addNotice, editNotice, getNoticeDetail } from '@/api/enforcement/notice';
import { getPlanList, searchUnionByEnterpriseName, searchBureauUnitUsers, getEnterpriseContactInfo } from '@/api/enforcement/plan';
import { getPlanList, searchBureauUnitUsers, getEnterpriseContactInfo } from '@/api/enforcement/plan';
import { queryEnterpriseListAndQrInfo } from '@/api/enforcement/index';
import { maskPhone } from '@/util/util';
const router = useRouter();
const route = useRoute();
@ -404,10 +415,16 @@ const planImportDisplay = computed(() => {
const enterpriseOptions = ref([]);
const showEnterprisePicker = ref(false);
const enterpriseSearchKeyword = ref('');
const enterpriseSearching = ref(false);
let enterpriseSearchTimer = null;
const enterpriseLoading = ref(false);
const enterpriseFinished = ref(false);
const enterprisePageNum = ref(1);
const enterprisePageSize = 10;
const enterpriseSearched = ref(false);
let enterpriseSearchSeq = 0;
const enterpriseEmptyText = computed(() => enterpriseSearched.value ? '未检索到匹配企业' : '请输入至少2个字搜索');
const enterpriseFinishedText = computed(() => enterpriseOptions.value.length > 0 ? '没有更多了' : '');
// 执法人员检索
const showPersonPicker = ref(false);
const personSearchKeyword = ref('');
@ -503,34 +520,88 @@ const onTimeConfirm = ({ selectedValues }) => {
const onOpenEnterprisePicker = () => {
enterpriseSearchKeyword.value = '';
enterpriseOptions.value = [];
enterprisePageNum.value = 1;
enterpriseFinished.value = true;
enterpriseLoading.value = false;
enterpriseSearched.value = false;
showEnterprisePicker.value = true;
};
// 企业检索
const onEnterpriseSearchInput = (val) => {
if (enterpriseSearchTimer) clearTimeout(enterpriseSearchTimer);
const keyword = (val || '').trim();
// 企业检索(搜索按钮/回车)
const handleEnterpriseSearch = () => {
const keyword = (enterpriseSearchKeyword.value || '').trim();
if (keyword.length < 2) {
showToast('请输入至少2个字搜索');
enterpriseOptions.value = [];
enterpriseFinished.value = true;
enterpriseSearched.value = false;
return;
}
enterprisePageNum.value = 1;
enterpriseFinished.value = false;
enterpriseOptions.value = [];
enterpriseLoading.value = true;
enterpriseSearched.value = true;
fetchEnterpriseList(keyword);
};
// 清除企业搜索
const clearEnterpriseSearch = () => {
enterpriseSearchKeyword.value = '';
enterpriseOptions.value = [];
enterprisePageNum.value = 1;
enterpriseFinished.value = true;
enterpriseLoading.value = false;
enterpriseSearched.value = false;
};
// van-list 触底加载
const onEnterpriseLoad = () => {
fetchEnterpriseList(enterpriseSearchKeyword.value.trim());
};
// 实际发起企业检索(分页追加)
const fetchEnterpriseList = (keyword) => {
if ((keyword || '').trim().length < 2) {
enterpriseFinished.value = true;
enterpriseLoading.value = false;
return;
}
enterpriseSearchTimer = setTimeout(() => {
const seq = ++enterpriseSearchSeq;
enterpriseSearching.value = true;
searchUnionByEnterpriseName(keyword, (res) => {
const seq = ++enterpriseSearchSeq;
enterpriseLoading.value = true;
queryEnterpriseListAndQrInfo(
{
pageNum: enterprisePageNum.value,
pageSize: enterprisePageSize,
searchValue: keyword,
},
(res) => {
if (seq !== enterpriseSearchSeq) return;
enterpriseSearching.value = false;
if (res && res.code === 200 && Array.isArray(res.data)) {
enterpriseOptions.value = res.data;
enterpriseLoading.value = false;
if (res && res.code === 200 && Array.isArray(res.rows)) {
const data = res.rows;
if (enterprisePageNum.value === 1) {
enterpriseOptions.value = data;
} else {
enterpriseOptions.value = [...enterpriseOptions.value, ...data];
}
const total = res.total || 0;
if (total <= enterprisePageSize * enterprisePageNum.value) {
enterpriseFinished.value = true;
} else {
enterprisePageNum.value++;
}
} else {
enterpriseOptions.value = [];
if (enterprisePageNum.value === 1) enterpriseOptions.value = [];
enterpriseFinished.value = true;
}
}, () => {
},
() => {
if (seq !== enterpriseSearchSeq) return;
enterpriseSearching.value = false;
enterpriseOptions.value = [];
});
}, 350);
enterpriseLoading.value = false;
enterpriseFinished.value = true;
}
);
};
const onSelectEnterprise = (item) => {
@ -863,6 +934,20 @@ const doSubmit = (isDraft) => {
.enterprise-picker-title { font-size: 16px; font-weight: 600; color: #333; }
:deep(.van-icon) { font-size: 18px; color: #999; cursor: pointer; }
}
.search-bar {
display: flex;
align-items: center;
margin: 0.3rem;
:deep(.van-search) {
padding-right: 0px;
flex: 1;
height: 34px;
}
.search-btn {
flex: none;
height: 34px;
}
}
.enterprise-picker-body {
flex: 1;
overflow-y: auto;
@ -992,8 +1077,7 @@ const doSubmit = (isDraft) => {
.person-item {
padding: 12px 14px;
background: #fff;
border: 1px solid #e6edf5;
border-radius: 10px;
border-bottom: 1px solid #f5f5f5;
margin-bottom: 8px;
cursor: pointer;
&:active { background: #f5faff; }
@ -1001,7 +1085,7 @@ const doSubmit = (isDraft) => {
.person-item-meta {
display: flex;
gap: 12px;
margin-top: 4px;
margin-top: 8px;
font-size: 12px;
color: #999;
.person-item-login { color: #b8c1cc; }

2
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/notice/cp_notice_message.vue

@ -38,7 +38,7 @@
@touchmove="onTouchMove"
>
<div class="msg-sender">{{ msg.msgFrom === 0 ? (msg.bureauDeptName || useCommon.bureauUnitName || '执法单位') : msg.userName }}</div>
<span>{{ msg.message }}</span>
<span v-html="msg.message"></span>
</div>
</div>
<div v-if="msg.msgFrom === 0" class="msg-avatar right-avatar">执</div>

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

@ -222,28 +222,38 @@
<span class="enterprise-picker-title">选择企业</span>
<van-icon name="cross" @click="showEnterprisePicker = false" />
</div>
<van-search
v-model="enterpriseSearchKeyword"
placeholder="输入≥ 2 个字符检索企业,不要输入深圳,深圳市"
shape="round"
@update:model-value="onEnterpriseSearchInput"
/>
<div class="search-bar">
<van-search
v-model="enterpriseSearchKeyword"
placeholder="请输入企业名称/统一信用代码搜索"
@search="handleEnterpriseSearch"
@clear="clearEnterpriseSearch"
/>
<van-button class="search-btn" type="primary" @click="handleEnterpriseSearch">搜索</van-button>
</div>
<div class="enterprise-picker-body">
<div v-if="enterpriseSearching" class="enterprise-loading">
<van-loading size="18" />&nbsp;检索中...
</div>
<template v-else>
<van-list
v-model:loading="enterpriseLoading"
:finished="enterpriseFinished"
:finished-text="enterpriseFinishedText"
:offset="50"
@load="onEnterpriseLoad"
>
<div
v-for="(item, idx) in enterpriseOptions"
:key="idx"
:key="item.enterpriseNumber || idx"
class="enterprise-item"
@click="onSelectEnterprise(item)"
>
<div class="enterprise-item-name">{{ item.enterpriseName }}</div>
<div class="enterprise-item-number">{{ item.enterpriseNumber }}</div>
</div>
<van-empty v-if="enterpriseSearchKeyword.length >= 2 && !enterpriseOptions.length" description="未检索到匹配企业" image-size="80" />
</template>
<van-empty
v-if="!enterpriseLoading && !enterpriseOptions.length"
:description="enterpriseEmptyText"
image-size="80"
/>
</van-list>
</div>
</div>
</van-popup>
@ -253,7 +263,8 @@
<script setup name="cpPlanEdit">
import { useRouter, useRoute } from 'vue-router';
import { showToast, showSuccessToast, showConfirmDialog } from 'vant';
import { addPlan, editPlan, getPlanDetail, getSubmitDeadline, getManualMatchDays, getMaxInnerUnitAcPersonNum, searchUnionByEnterpriseName, searchBureauUnitUsers } from '@/api/enforcement/plan';
import { addPlan, editPlan, getPlanDetail, getSubmitDeadline, getManualMatchDays, getMaxInnerUnitAcPersonNum, searchBureauUnitUsers } from '@/api/enforcement/plan';
import { queryEnterpriseListAndQrInfo } from '@/api/enforcement/index';
import { maskPhone } from '@/util/util';
const router = useRouter();
const route = useRoute();
@ -345,10 +356,16 @@ const maxPersonNum = ref(3);
const enterpriseOptions = ref([]);
const showEnterprisePicker = ref(false);
const enterpriseSearchKeyword = ref('');
const enterpriseSearching = ref(false);
let enterpriseSearchTimer = null;
const enterpriseLoading = ref(false);
const enterpriseFinished = ref(false);
const enterprisePageNum = ref(1);
const enterprisePageSize = 10;
const enterpriseSearched = ref(false);
let enterpriseSearchSeq = 0;
const enterpriseEmptyText = computed(() => enterpriseSearched.value ? '未检索到匹配企业' : '请输入至少2个字搜索');
const enterpriseFinishedText = computed(() => enterpriseOptions.value.length > 0 ? '没有更多了' : '');
// 执法人员检索弹层状态
const showPersonPicker = ref(false);
const personSearchKeyword = ref('');
@ -553,36 +570,88 @@ const onDateConfirm = ({ selectedValues }) => {
const onOpenEnterprisePicker = () => {
enterpriseSearchKeyword.value = '';
enterpriseOptions.value = [];
enterprisePageNum.value = 1;
enterpriseFinished.value = true;
enterpriseLoading.value = false;
enterpriseSearched.value = false;
showEnterprisePicker.value = true;
};
// 企业名称输入(防抖检索)
const onEnterpriseSearchInput = (val) => {
if (enterpriseSearchTimer) {
clearTimeout(enterpriseSearchTimer);
}
const keyword = (val || '').trim();
// 企业检索(搜索按钮/回车)
const handleEnterpriseSearch = () => {
const keyword = (enterpriseSearchKeyword.value || '').trim();
if (keyword.length < 2) {
showToast('请输入至少2个字搜索');
enterpriseOptions.value = [];
enterpriseFinished.value = true;
enterpriseSearched.value = false;
return;
}
enterprisePageNum.value = 1;
enterpriseFinished.value = false;
enterpriseOptions.value = [];
enterpriseLoading.value = true;
enterpriseSearched.value = true;
fetchEnterpriseList(keyword);
};
// 清除企业搜索
const clearEnterpriseSearch = () => {
enterpriseSearchKeyword.value = '';
enterpriseOptions.value = [];
enterprisePageNum.value = 1;
enterpriseFinished.value = true;
enterpriseLoading.value = false;
enterpriseSearched.value = false;
};
// van-list 触底加载
const onEnterpriseLoad = () => {
fetchEnterpriseList(enterpriseSearchKeyword.value.trim());
};
// 实际发起企业检索(分页追加)
const fetchEnterpriseList = (keyword) => {
if ((keyword || '').trim().length < 2) {
enterpriseFinished.value = true;
enterpriseLoading.value = false;
return;
}
enterpriseSearchTimer = setTimeout(() => {
const seq = ++enterpriseSearchSeq;
enterpriseSearching.value = true;
searchUnionByEnterpriseName(keyword, (res) => {
const seq = ++enterpriseSearchSeq;
enterpriseLoading.value = true;
queryEnterpriseListAndQrInfo(
{
pageNum: enterprisePageNum.value,
pageSize: enterprisePageSize,
searchValue: keyword,
},
(res) => {
if (seq !== enterpriseSearchSeq) return;
enterpriseSearching.value = false;
if (res && res.code === 200 && Array.isArray(res.data)) {
enterpriseOptions.value = res.data;
enterpriseLoading.value = false;
if (res && res.code === 200 && Array.isArray(res.rows)) {
const data = res.rows;
if (enterprisePageNum.value === 1) {
enterpriseOptions.value = data;
} else {
enterpriseOptions.value = [...enterpriseOptions.value, ...data];
}
const total = res.total || 0;
if (total <= enterprisePageSize * enterprisePageNum.value) {
enterpriseFinished.value = true;
} else {
enterprisePageNum.value++;
}
} else {
enterpriseOptions.value = [];
if (enterprisePageNum.value === 1) enterpriseOptions.value = [];
enterpriseFinished.value = true;
}
}, () => {
},
() => {
if (seq !== enterpriseSearchSeq) return;
enterpriseSearching.value = false;
enterpriseOptions.value = [];
});
}, 350);
enterpriseLoading.value = false;
enterpriseFinished.value = true;
}
);
};
// 选择某个企业
@ -993,6 +1062,23 @@ const doSubmit = () => {
}
}
.search-bar {
display: flex;
align-items: center;
margin: 0.3rem;
:deep(.van-search) {
padding-right: 0px;
flex: 1;
height: 34px;
}
.search-btn {
flex: none;
height: 34px;
}
}
.enterprise-picker-body {
flex: 1;
overflow-y: auto;
@ -1106,8 +1192,7 @@ const doSubmit = () => {
.person-item {
padding: 12px 14px;
background: #fff;
border: 1px solid #e6edf5;
border-radius: 10px;
border-bottom: 1px solid #f5f5f5;
margin-bottom: 8px;
cursor: pointer;
@ -1124,7 +1209,7 @@ const doSubmit = () => {
.person-item-meta {
display: flex;
gap: 12px;
margin-top: 4px;
margin-top: 8px;
font-size: 12px;
color: #999;

14
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/task/cp_task_mine.vue

@ -63,7 +63,7 @@
<div class="task-content-col">
<div class="task-title-row">
<span class="task-title">{{ item.enterpriseName || '-' }}</span>
<span v-if="item.isUnion === 1" class="union-badge">联</span>
<span v-if="item.isUnion === 1 && item.associatedPlans && item.associatedPlans.length" class="union-badge">联</span>
</div>
<div class="task-time-info">
<van-icon name="clock-o" size="14" color="#999" />
@ -302,6 +302,7 @@ const getTimeStart = (item) => {
const time = item.planActualTime || item.planTime;
if (time === 1) return '09:00';
if (time === 2) return '14:00';
if (time === 3) return '18:00';
return '';
};
@ -309,12 +310,13 @@ const getTimeEnd = (item) => {
const time = item.planActualTime || item.planTime;
if (time === 1) return '12:00';
if (time === 2) return '18:00';
if (time === 3) return '21:00';
return '';
};
const getTimeRange = (item) => {
const time = item.planActualTime || item.planTime;
if (time === 3) return '其他';
// if (time === 3) return '其他';
return `${getTimeStart(item)}-${getTimeEnd(item)}`;
};
@ -371,6 +373,14 @@ const loadTaskList = () => {
loading.value = false;
if (res.code === 200 && res.data) {
taskList.value = res.data;
// 按时段固定排序:上午(1) → 下午(2) → 其他,同一时段的多条任务相邻
taskList.value.sort((a, b) => {
const ta = a.planActualTime || a.planTime;
const tb = b.planActualTime || b.planTime;
const ra = ta === 1 ? 0 : ta === 2 ? 1 : 2;
const rb = tb === 1 ? 0 : tb === 2 ? 1 : 2;
return ra - rb;
});
// 第二次请求:加载联合执法任务的关联单位信息
loadAssociatedPlans();
} else {

114
zdxt-web-server/zdxt-admin-web-server/src/main/resources/businessdatasyn/sys_dept.json

@ -0,0 +1,114 @@
{
"configKey": "sys_dept",
"description": "部门表双向同步",
"enabled": true,
"v1": {
"table": "sys_dept",
"primaryKey": ["dept_id"],
"updateTimeColumn": "update_time",
"deleteFlagColumn": "del_flag",
"columns": [
"dept_id", "parent_id", "ancestors", "dept_name", "order_num",
"phone", "email", "status", "del_flag",
"create_time", "update_time",
"dept_type",
"zzLevel", "code", "mappingUnitParentId", "updateAt", "createAt",
"effectOn", "organizationId", "sequence", "isDeleted", "zzDisplayPath",
"name", "guid", "zzIsLeaf", "isDisabled", "fullname", "isMappingUnit",
"srzUnitId", "taskId", "organizationParentId", "systemId", "creditcode",
"zone", "unitStatusCode", "unitStatus", "unitTypeCode", "area_node"
]
},
"v2": {
"table": "sys_dept",
"primaryKey": ["dept_id"],
"updateTimeColumn": "update_time",
"deleteFlagColumn": "del_flag",
"columns": [
"dept_id", "parent_id", "ancestors", "dept_name", "order_num",
"phone", "email", "status", "del_flag",
"create_time", "update_time",
"dept_type",
"zzLevel", "code", "mappingUnitParentId", "updateAt", "createAt",
"effectOn", "organizationId", "sequence", "isDeleted", "zzDisplayPath",
"name", "guid", "zzIsLeaf", "isDisabled", "fullname", "isMappingUnit",
"srzUnitId", "taskId", "organizationParentId", "systemId", "creditcode",
"zone", "unitStatusCode", "unitStatus", "unitTypeCode", "area_node",
"tenant_id", "create_dept"
]
},
"columnMapping": {
"dept_id": "dept_id",
"parent_id": "parent_id",
"ancestors": "ancestors",
"dept_name": "dept_name",
"order_num": "order_num",
"phone": "phone",
"email": "email",
"status": "status",
"del_flag": "del_flag",
"create_time": "create_time",
"update_time": "update_time",
"dept_type": "dept_type",
"zzLevel": "zzLevel",
"code": "code",
"mappingUnitParentId": "mappingUnitParentId",
"updateAt": "updateAt",
"createAt": "createAt",
"effectOn": "effectOn",
"organizationId": "organizationId",
"sequence": "sequence",
"isDeleted": "isDeleted",
"zzDisplayPath": "zzDisplayPath",
"name": "name",
"guid": "guid",
"zzIsLeaf": "zzIsLeaf",
"isDisabled": "isDisabled",
"fullname": "fullname",
"isMappingUnit": "isMappingUnit",
"srzUnitId": "srzUnitId",
"taskId": "taskId",
"organizationParentId": "organizationParentId",
"systemId": "systemId",
"creditcode": "creditcode",
"zone": "zone",
"unitStatusCode": "unitStatusCode",
"unitStatus": "unitStatus",
"unitTypeCode": "unitTypeCode",
"area_node": "area_node"
},
"hashColumns": [
"parent_id", "ancestors", "dept_name", "order_num",
"phone", "email", "status",
"dept_type",
"zzLevel", "code", "mappingUnitParentId", "updateAt", "createAt",
"effectOn", "organizationId", "sequence", "isDeleted", "zzDisplayPath",
"name", "guid", "zzIsLeaf", "isDisabled", "fullname", "isMappingUnit",
"srzUnitId", "taskId", "organizationParentId", "systemId", "creditcode",
"zone", "unitStatusCode", "unitStatus", "unitTypeCode", "area_node"
],
"typeConverters": {},
"v2OnlyColumnsIgnoredOnV1": ["tenant_id", "create_dept"],
"v2OnlyColumnsDefaults": {
"tenant_id": "000000",
"create_dept": null
},
"firstOwnerFallback": "V1",
"deleteMode": "logical",
"logicalDelete": {
"v1": { "column": "del_flag", "value": 1 },
"v2": { "column": "del_flag", "value": 1 }
},
"strictOwnerMode": false,
"scanBatchSize": 1000,
"maxRetry": 5
}

122
zdxt-web-server/zdxt-admin-web-server/src/main/resources/businessdatasyn/sys_user.json

@ -0,0 +1,122 @@
{
"configKey": "sys_user",
"description": "用户表双向同步",
"enabled": true,
"v1": {
"table": "sys_user",
"primaryKey": ["user_id"],
"updateTimeColumn": "update_time",
"deleteFlagColumn": "del_flag",
"columns": [
"user_id", "dept_id", "login_name", "user_name",
"email", "phonenumber", "sex", "avatar", "salt",
"status", "del_flag", "login_ip", "login_date",
"create_time", "update_time", "remark",
"type", "law_certificate_num",
"fullname", "taskId", "systemId", "effectOn",
"isDeleted", "isDisabled", "createAt", "updateAt",
"mobileNumber", "certificateNumber", "srzUserid",
"isMappingPerson", "units", "organizationId",
"certificateTypeId", "certificateTypeIdCode", "strUserId",
"user_source", "rylbCode", "rylb"
]
},
"v2": {
"table": "sys_user",
"primaryKey": ["user_id"],
"updateTimeColumn": "update_time",
"deleteFlagColumn": "del_flag",
"columns": [
"user_id", "dept_id", "login_name", "user_name",
"email", "phonenumber", "sex", "avatar", "salt",
"status", "del_flag", "login_ip", "login_date",
"create_time", "update_time", "remark",
"type", "law_certificate_num",
"fullname", "taskId", "systemId", "effectOn",
"isDeleted", "isDisabled", "createAt", "updateAt",
"mobileNumber", "certificateNumber", "srzUserid",
"isMappingPerson", "units", "organizationId",
"certificateTypeId", "certificateTypeIdCode", "strUserId",
"user_source", "rylbCode", "rylb",
"tenant_id", "nick_name", "user_type", "create_dept"
]
},
"columnMapping": {
"user_id": "user_id",
"dept_id": "dept_id",
"login_name": "login_name",
"user_name": "user_name",
"email": "email",
"phonenumber": "phonenumber",
"sex": "sex",
"avatar": "avatar",
"salt": "salt",
"status": "status",
"del_flag": "del_flag",
"login_ip": "login_ip",
"login_date": "login_date",
"create_time": "create_time",
"update_time": "update_time",
"remark": "remark",
"type": "type",
"law_certificate_num": "law_certificate_num",
"fullname": "fullname",
"taskId": "taskId",
"systemId": "systemId",
"effectOn": "effectOn",
"isDeleted": "isDeleted",
"isDisabled": "isDisabled",
"createAt": "createAt",
"updateAt": "updateAt",
"mobileNumber": "mobileNumber",
"certificateNumber": "certificateNumber",
"srzUserid": "srzUserid",
"isMappingPerson": "isMappingPerson",
"units": "units",
"organizationId": "organizationId",
"certificateTypeId": "certificateTypeId",
"certificateTypeIdCode": "certificateTypeIdCode",
"strUserId": "strUserId",
"user_source": "user_source",
"rylbCode": "rylbCode",
"rylb": "rylb"
},
"hashColumns": [
"dept_id", "login_name", "user_name",
"email", "phonenumber", "sex", "avatar", "salt",
"status", "login_ip", "login_date", "remark",
"type", "law_certificate_num",
"fullname", "taskId", "systemId", "effectOn",
"isDeleted", "isDisabled", "createAt", "updateAt",
"mobileNumber", "certificateNumber", "srzUserid",
"isMappingPerson", "units", "organizationId",
"certificateTypeId", "certificateTypeIdCode", "strUserId",
"user_source", "rylbCode", "rylb"
],
"typeConverters": {},
"v2OnlyColumnsIgnoredOnV1": ["tenant_id", "nick_name", "user_type", "create_dept"],
"v2OnlyColumnsDefaults": {
"tenant_id": "000000",
"nick_name": "${v1.user_name}",
"user_type": "sys_user",
"create_dept": null
},
"firstOwnerFallback": "V1",
"deleteMode": "logical",
"logicalDelete": {
"v1": { "column": "del_flag", "value": 1 },
"v2": { "column": "del_flag", "value": 1 }
},
"strictOwnerMode": false,
"scanBatchSize": 1000,
"maxRetry": 5
}
Loading…
Cancel
Save