Browse Source

执法端-计划

dev-V1.0.1
庄锐波 5 months ago
parent
commit
32ff0b4a38
  1. 12
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enterprise/AppEntPlanNoticeController.java
  2. 7
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpNoticeMessageService.java
  3. 17
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpNoticeMessageServiceImpl.java
  4. 6
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/notice/cp_notice_edit.vue
  5. 34
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/notice/cp_notice_message.vue
  6. 5
      zdxt-web-client/zdxt-efcode-enterprise-app/src/api/enterprise/planNotice.js
  7. 2
      zdxt-web-client/zdxt-efcode-enterprise-app/src/router/enterprise-app/ent-main-router.js
  8. 43
      zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/plan/planNoticeMessage.vue

12
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enterprise/AppEntPlanNoticeController.java

@ -116,4 +116,16 @@ public class AppEntPlanNoticeController {
efcodeCpNoticeMessageService.insertByBo(bo); efcodeCpNoticeMessageService.insertByBo(bo);
return R.ok(); return R.ok();
} }
/**
* 标记某个预告下所有消息为企业已读
*
* @param noticeId 预告ID
* @return 操作结果
*/
@PutMapping("/message/markViewed")
public R<Void> markViewed(@RequestParam String noticeId) {
efcodeCpNoticeMessageService.markEnterpriseViewed(noticeId);
return R.ok();
}
} }

7
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpNoticeMessageService.java

@ -73,4 +73,11 @@ public interface IEfcodeCpNoticeMessageService {
* @return 未读消息数量 * @return 未读消息数量
*/ */
Long countUnreadNoticeMessage(String enterpriseNumber); Long countUnreadNoticeMessage(String enterpriseNumber);
/**
* 标记某个预告下所有消息为企业已读
*
* @param noticeId 预告ID
*/
void markEnterpriseViewed(String noticeId);
} }

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

@ -6,6 +6,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -166,4 +167,20 @@ public class EfcodeCpNoticeMessageServiceImpl implements IEfcodeCpNoticeMessageS
msgWrapper.eq(EfcodeCpNoticeMessage::getIsDelete, 0); msgWrapper.eq(EfcodeCpNoticeMessage::getIsDelete, 0);
return baseMapper.selectCount(msgWrapper); return baseMapper.selectCount(msgWrapper);
} }
/**
* 标记某个预告下所有消息为企业已读
*/
@Override
public void markEnterpriseViewed(String noticeId) {
if (StringUtils.isBlank(noticeId)) {
return;
}
LambdaUpdateWrapper<EfcodeCpNoticeMessage> updateWrapper = Wrappers.lambdaUpdate();
updateWrapper.eq(EfcodeCpNoticeMessage::getNoticeId, noticeId)
.eq(EfcodeCpNoticeMessage::getEnterpriseViewed, 0)
.eq(EfcodeCpNoticeMessage::getIsDelete, 0)
.set(EfcodeCpNoticeMessage::getEnterpriseViewed, 1);
baseMapper.update(null, updateWrapper);
}
} }

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

@ -256,7 +256,7 @@
</div> </div>
<van-search <van-search
v-model="enterpriseSearchKeyword" v-model="enterpriseSearchKeyword"
placeholder="输入≥ 3 个字符检索企业,不要输入深圳,深圳市" placeholder="输入≥ 2 个字符检索企业,不要输入深圳,深圳市"
shape="round" shape="round"
@update:model-value="onEnterpriseSearchInput" @update:model-value="onEnterpriseSearchInput"
/> />
@ -274,7 +274,7 @@
<div class="enterprise-item-name">{{ item.enterpriseName }}</div> <div class="enterprise-item-name">{{ item.enterpriseName }}</div>
<div class="enterprise-item-number">{{ item.enterpriseNumber }}</div> <div class="enterprise-item-number">{{ item.enterpriseNumber }}</div>
</div> </div>
<van-empty v-if="enterpriseSearchKeyword.length >= 3 && !enterpriseOptions.length" description="未检索到匹配企业" image-size="80" /> <van-empty v-if="enterpriseSearchKeyword.length >= 2 && !enterpriseOptions.length" description="未检索到匹配企业" image-size="80" />
</template> </template>
</div> </div>
</div> </div>
@ -463,7 +463,7 @@ const onOpenEnterprisePicker = () => {
const onEnterpriseSearchInput = (val) => { const onEnterpriseSearchInput = (val) => {
if (enterpriseSearchTimer) clearTimeout(enterpriseSearchTimer); if (enterpriseSearchTimer) clearTimeout(enterpriseSearchTimer);
const keyword = (val || '').trim(); const keyword = (val || '').trim();
if (keyword.length < 3) { if (keyword.length < 2) {
enterpriseOptions.value = []; enterpriseOptions.value = [];
return; return;
} }

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

@ -73,11 +73,45 @@ const loading = ref(false);
const inputMessage = ref(''); const inputMessage = ref('');
const sending = ref(false); const sending = ref(false);
const messageAreaRef = ref(null); const messageAreaRef = ref(null);
let pollTimer = null;
onMounted(() => { onMounted(() => {
loadMessages(); loadMessages();
startPolling();
}); });
onUnmounted(() => {
stopPolling();
});
const startPolling = () => {
stopPolling();
pollTimer = setInterval(() => {
pollMessages();
}, 16000);
};
const stopPolling = () => {
if (pollTimer) {
clearInterval(pollTimer);
pollTimer = null;
}
};
// 轮询加载新消息(静默,不显示loading)
const pollMessages = () => {
if (!noticeId.value) return;
getNoticeMessages(noticeId.value, (res) => {
if (res.code === 200 && Array.isArray(res.data)) {
const oldCount = messageList.value.length;
messageList.value = res.data;
if (res.data.length > oldCount) {
scrollToBottom();
}
}
});
};
const loadMessages = () => { const loadMessages = () => {
if (!noticeId.value) return; if (!noticeId.value) return;
loading.value = true; loading.value = true;

5
zdxt-web-client/zdxt-efcode-enterprise-app/src/api/enterprise/planNotice.js

@ -1,4 +1,4 @@
import { _get, _post } from "../../http/index"; import { _get, _post, _put } from "../../http/index";
let enterpriseAppBaseUrl = "/app-ent"; let enterpriseAppBaseUrl = "/app-ent";
@ -13,3 +13,6 @@ export const getPlanNoticeMessageList = (params, success, error) => _get(enterpr
//执法预告新增留言 //执法预告新增留言
export const addPlanNoticeMessage = (params, success, error) => _post(enterpriseAppBaseUrl +"/planNotice/message",params,success,error); export const addPlanNoticeMessage = (params, success, error) => _post(enterpriseAppBaseUrl +"/planNotice/message",params,success,error);
//标记预告消息为企业已读
export const markMessageViewed = (noticeId, success, error) => _put(enterpriseAppBaseUrl +"/planNotice/message/markViewed?noticeId=" + noticeId, {}, success, error);

2
zdxt-web-client/zdxt-efcode-enterprise-app/src/router/enterprise-app/ent-main-router.js

@ -8,7 +8,7 @@ const routes = [
{ {
path: "/enterprisetest", path: "/enterprisetest",
redirect: "/enterprise/enterpriseHome", redirect: "/enterprise/enterpriseHome",
name: "enterpriseRoot", name: "enterpriseRootTest",
}, },
// 企业端登录 // 企业端登录
{ {

43
zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/plan/planNoticeMessage.vue

@ -59,7 +59,7 @@
<script setup name="planNoticeMessage"> <script setup name="planNoticeMessage">
import { showToast } from 'vant'; import { showToast } from 'vant';
import 'vant/es/toast/style'; import 'vant/es/toast/style';
import { getPlanNoticeMessageList, addPlanNoticeMessage } from '@/api/enterprise/planNotice'; import { getPlanNoticeMessageList, addPlanNoticeMessage, markMessageViewed } from '@/api/enterprise/planNotice';
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
@ -72,11 +72,52 @@ const loading = ref(false);
const inputMessage = ref(''); const inputMessage = ref('');
const sending = ref(false); const sending = ref(false);
const messageAreaRef = ref(null); const messageAreaRef = ref(null);
let pollTimer = null;
onMounted(() => { onMounted(() => {
loadMessages(); loadMessages();
// 打开页面时标记所有消息为企业已读
if (noticeId.value) {
markMessageViewed(noticeId.value);
}
// 启动15秒轮询
startPolling();
});
onUnmounted(() => {
stopPolling();
}); });
const startPolling = () => {
stopPolling();
pollTimer = setInterval(() => {
pollMessages();
}, 15000);
};
const stopPolling = () => {
if (pollTimer) {
clearInterval(pollTimer);
pollTimer = null;
}
};
// 轮询加载新消息(静默加载,不显示loading)
const pollMessages = () => {
if (!noticeId.value) return;
getPlanNoticeMessageList({ noticeId: noticeId.value }, (res) => {
if (res.code === 200 && Array.isArray(res.data)) {
const oldCount = messageList.value.length;
messageList.value = res.data;
// 有新消息时滚动到底部,并标记已读
if (res.data.length > oldCount) {
scrollToBottom();
markMessageViewed(noticeId.value);
}
}
});
};
const loadMessages = () => { const loadMessages = () => {
if (!noticeId.value) return; if (!noticeId.value) return;
loading.value = true; loading.value = true;

Loading…
Cancel
Save