Browse Source

Merge remote-tracking branch 'origin/dev' into dev

dev-V1.10.2-temp
zhuibobo 3 months ago
parent
commit
aea64342d1
  1. 3
      script/sql/zfjd-refactoring-v1/其他/njy/njy.sql
  2. 2
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpNoticeController.java
  3. 1
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfTodoItemController.java
  4. 4
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementEducationServicesBo.java
  5. 10
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementRegistrationBo.java
  6. 4
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EnforcementRegistrationVo.java
  7. 2
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpNoticeServiceImpl.java
  8. 14
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementEducationServicesServiceImpl.java
  9. 28
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementRegistrationServiceImpl.java
  10. 2
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpNoticeMessageMapper.xml
  11. 2
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpReserveMapper.xml
  12. 2
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpTaskMapper.xml
  13. 3
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EnforcementRegistrationMapper.xml
  14. 2
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/report/EnforcementRegistrationEINOFTReportMapper.xml
  15. 11
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/report/EnforcementRegistrationReportMapper.xml
  16. 3
      zdxt-modules/zdxt-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java
  17. 2
      zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java
  18. 2
      zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/index.js
  19. 15
      zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/EnforcementInfoSection.vue
  20. 14
      zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/NonEnforcementInfoSection.vue
  21. 110
      zdxt-web-client/zdxt-efcode-enforcement-app/src/util/lunar.js
  22. 17
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementList.vue
  23. 31
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementNoticeList.vue
  24. 5
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/law/lawServiceList.vue
  25. 5
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/enforcementEvaluateList.vue
  26. 80
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/enforcementReserveList.vue
  27. 75
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/enforcementTaskList.vue
  28. 5
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/planNoticeList.vue
  29. 11
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/reserve/cp_reserve_list.vue
  30. 4
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/reserve/cp_reserve_manual.vue
  31. 4
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/reserve/cp_reserve_system.vue
  32. 230
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/task/cp_task_mine.vue
  33. 44
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/scanEntQRCode.vue

3
script/sql/zfjd-refactoring-v1/其他/njy/njy.sql

@ -3,3 +3,6 @@ ALTER TABLE enterprise_complaint
AFTER enterprise_address;
ALTER TABLE enforcement_inspection_program ADD COLUMN create_by_name VARCHAR(64) COMMENT '创建人姓名';
ALTER TABLE enforcement_registration ADD COLUMN other_reasons varchar(500) DEFAULT NULL COMMENT '其他原因';

2
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpNoticeController.java

@ -1,5 +1,6 @@
package com.zdxt.enforcementcode.controller.app.enforcement;
import cn.dev33.satoken.annotation.SaIgnore;
import com.zdxt.enforcementcode.domain.bo.EfcodeCpNoticeBo;
import com.zdxt.enforcementcode.domain.bo.EfcodeCpNoticeMessageBo;
import com.zdxt.enforcementcode.domain.vo.EfcodeCpNoticeMessageVo;
@ -37,6 +38,7 @@ public class AppEnfCpNoticeController {
* 查询我的预告列表(分页,只返回当前用户创建的预告)
* 通过status区分tab:0=草稿, 1=待执法(已发布), 3=历史(已执行)
*/
@SaIgnore
@GetMapping("/myList")
public TableDataInfo<EfcodeCpNoticeVo> myList(EfcodeCpNoticeBo bo, PageQuery pageQuery) {
return efcodeCpNoticeService.queryMyPageList(bo, pageQuery);

1
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfTodoItemController.java

@ -71,6 +71,7 @@ public class AppEnfTodoItemController extends BaseController {
* 获取待办个数
* 返回普法服务、执法评价、执法预告的未读个数及总数
*/
@SaIgnore
@GetMapping("/statisticsUnReadCount")
public R<TodoStatisticsVo> statisticsUnReadCount() {
TodoStatisticsVo statistics = new TodoStatisticsVo();

4
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementEducationServicesBo.java

@ -123,4 +123,8 @@ public class EnforcementEducationServicesBo extends BaseEntity {
*/
private Date endTime;
/**
* 搜索值
*/
private String searchValue;
}

10
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementRegistrationBo.java

@ -321,4 +321,14 @@ public class EnforcementRegistrationBo extends BaseEntity {
*/
private Integer warnType;
/**
* 其他原因
*/
private String otherReasons;
/**
* 搜索值
*/
private String searchValue;
}

4
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EnforcementRegistrationVo.java

@ -410,4 +410,8 @@ public class EnforcementRegistrationVo implements Serializable {
private List<ZdxtFileVo> fileList;
/**
* 其他原因
*/
private String otherReasons;
}

2
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpNoticeServiceImpl.java

@ -84,7 +84,7 @@ public class EfcodeCpNoticeServiceImpl implements IEfcodeCpNoticeService {
LambdaQueryWrapper<EfcodeCpNotice> lqw = buildQueryWrapper(bo);
// 只看自己发布的预告
Long userId = LoginHelper.getUserId();
lqw.eq(EfcodeCpNotice::getCreateBy, userId);
lqw.eq(userId != null, EfcodeCpNotice::getCreateBy, userId);
// 过滤已删除
lqw.eq(EfcodeCpNotice::getIsDelete, 0);
// 按创建时间倒序

14
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementEducationServicesServiceImpl.java

@ -2,6 +2,7 @@ package com.zdxt.enforcementcode.service.impl;
import com.zdxt.enforcementcode.common.commonenum.MsgSourceTypeEnum;
import com.zdxt.enforcementcode.common.commonenum.PlatformTypeEnums;
import com.zdxt.enforcementcode.domain.EnforcementRegistration;
import com.zdxt.enforcementcode.domain.bean.EnforcementEducationServices;
import com.zdxt.enforcementcode.domain.vo.ZdxtFileVo;
import com.zdxt.enforcementcode.service.ISysMessageViewLogService;
@ -268,6 +269,19 @@ public class EnforcementEducationServicesServiceImpl implements IEnforcementEduc
lqw.like(StringUtils.isNotBlank(bo.getUpdateByName()), EnforcementEducationServices::getUpdateByName, bo.getUpdateByName());
lqw.eq(bo.getIsDelete() != null, EnforcementEducationServices::getIsDelete, bo.getIsDelete());
// 搜索值(多字段模糊匹配)
if (StringUtils.isNotBlank(bo.getSearchValue())) {
String sv = bo.getSearchValue();
lqw.and(wrapper -> wrapper
.like(EnforcementEducationServices::getTitle, sv)
.or().like(EnforcementEducationServices::getForwardUrl, sv)
.or().like(EnforcementEducationServices::getContent, sv)
.or().like(EnforcementEducationServices::getCreateByName, sv)
.or().like(EnforcementEducationServices::getUpdateByName, sv)
.or().like(EnforcementEducationServices::getRemark, sv)
);
}
// 创建时间范围筛选
if (bo.getStartTime() != null && bo.getEndTime() != null) {
lqw.between(EnforcementEducationServices::getCreateTime, bo.getStartTime(), bo.getEndTime());

28
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementRegistrationServiceImpl.java

@ -815,9 +815,31 @@ public class EnforcementRegistrationServiceImpl implements IEnforcementRegistrat
// 是否自动
lqw.eq(bo.getHasAuto() != null, EnforcementRegistration::getHasAuto, bo.getHasAuto());
// 搜索值(企业名称)
lqw.like(StringUtils.isNotBlank(bo.getSearchValue()),
EnforcementRegistration::getEnterpriseName, bo.getSearchValue());
// 搜索值(多字段模糊匹配)
if (StringUtils.isNotBlank(bo.getSearchValue())) {
String sv = bo.getSearchValue();
lqw.and(wrapper -> wrapper
.like(EnforcementRegistration::getEnterpriseNumber, sv)
.or().like(EnforcementRegistration::getEnterpriseAddress, sv)
.or().like(EnforcementRegistration::getEnterpriseName, sv)
.or().like(EnforcementRegistration::getLawEnforcementCode, sv)
.or().like(EnforcementRegistration::getLawEnforcement, sv)
.or().like(EnforcementRegistration::getBureauDeptName, sv)
.or().like(EnforcementRegistration::getLawEnforcer, sv)
.or().like(EnforcementRegistration::getLawEnforcerTwo, sv)
.or().like(EnforcementRegistration::getLawEnforcementItemText, sv)
.or().like(EnforcementRegistration::getLawEnforcementBasis, sv)
.or().apply("DATE_FORMAT(enforcement_time, '%Y-%m-%d') LIKE CONCAT('%',{0},'%')", sv)
.or().like(EnforcementRegistration::getCheckCss, sv)
.or().like(EnforcementRegistration::getCheckCategory, sv)
.or().like(EnforcementRegistration::getEnforceReason, sv)
.or().like(EnforcementRegistration::getRemark, sv)
.or().like(EnforcementRegistration::getLawEnforcementBasisText, sv)
.or().like(EnforcementRegistration::getLawText, sv)
.or().like(EnforcementRegistration::getEnforce, sv)
.or().like(EnforcementRegistration::getLawEnforcementItem, sv)
);
}
// 日期搜索(年月)
if (StringUtils.isNotBlank(bo.getDateSearch())) {

2
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpNoticeMessageMapper.xml

@ -8,7 +8,7 @@
<select id="countUnreadNoticeMessageForCurrentUser" resultType="java.lang.Long">
SELECT COUNT(1)
FROM efcode_cp_notice ecn
WHERE ecn.is_delete = 0
WHERE ecn.is_delete = 0 and ecn.create_by = #{userId}
AND NOT EXISTS (
SELECT 1
FROM sys_message_view_log smvl

2
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpReserveMapper.xml

@ -62,7 +62,7 @@
FROM efcode_cp_reserve r
LEFT JOIN efcode_cp_plan p ON r.plan_id = p.id
LEFT JOIN efcode_cp_plan p2 ON r.plan_group_id = p2.id
WHERE r.sender_id != 'manual_system_sender'
WHERE r.sender_id != 'manual_system_sender' and r.create_by = #{userId}
AND NOT EXISTS (
SELECT 1
FROM sys_message_view_log smvl

2
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpTaskMapper.xml

@ -87,7 +87,7 @@
SELECT COUNT(1)
FROM efcode_cp_plan p
INNER JOIN efcode_cp_task t ON t.id = p.task_id
AND p.is_delete = 0
AND p.is_delete = 0 and p.create_by = #{userId}
AND NOT EXISTS (
SELECT 1
FROM sys_message_view_log smvl

3
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EnforcementRegistrationMapper.xml

@ -315,6 +315,7 @@
<if test="lawEnforceCategory != null and lawEnforceCategory!=''"> law_enforce_category = #{lawEnforceCategory},</if>
<if test="entrustDeptId != null and entrustDeptId!=''"> entrust_dept_id=#{entrustDeptId},</if>
<if test="entrustDeptName != null and entrustDeptName!=''"> entrust_dept_name=#{entrustDeptName},</if>
<if test="otherReasons != null and otherReasons != ''"> other_reasons = #{otherReasons},</if>
</trim>
where id = #{id}
</update>
@ -383,6 +384,7 @@
<if test="lawEnforceCategory != null and lawEnforceCategory!=''"> law_enforce_category,</if>
<if test="entrustDeptId != null and entrustDeptId!=''"> entrust_dept_id,</if>
<if test="entrustDeptName != null and entrustDeptName!=''"> entrust_dept_name,</if>
<if test="otherReasons != null and otherReasons != ''"> other_reasons,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null and id != ''">#{id},</if>
@ -437,6 +439,7 @@
<if test="lawEnforceCategory != null and lawEnforceCategory!=''"> #{lawEnforceCategory},</if>
<if test="entrustDeptId != null and entrustDeptId!=''"> #{entrustDeptId},</if>
<if test="entrustDeptName != null and entrustDeptName!=''"> #{entrustDeptName},</if>
<if test="otherReasons != null and otherReasons != ''"> #{otherReasons},</if>
</trim>
</insert>

2
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/report/EnforcementRegistrationEINOFTReportMapper.xml

@ -41,7 +41,7 @@
<where>
<include refid="einoftWhereCondition"/>
</where>
GROUP BY er.enterprise_number
GROUP BY er.enterprise_number, er.enterprise_name, er.district, er.street
) t
<where>
<if test="bo.num != null and bo.num != ''">

11
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/report/EnforcementRegistrationReportMapper.xml

@ -152,7 +152,8 @@
er.is_evaluate, er.law_id, er.law_text,
er.has_union, er.has_auto, er.union_no, er.law_enforce_category,
er.entrust_dept_id, er.entrust_dept_name,
er.enterprise_address, er.district, er.street, er.zone, er.is_real_union
er.enterprise_address, er.district, er.street, er.zone, er.is_real_union,
er.other_reasons
FROM enforcement_registration er
LEFT JOIN sys_dict_data area
ON area.dict_type = 'address_type'
@ -351,7 +352,9 @@
<include refid="reportWhereCondition"/>
AND enterprise_number IS NOT NULL AND enterprise_number != ''
</where>
GROUP BY enterprise_number
GROUP BY enterprise_number, enterprise_name, district, street,
bureau_dept_name, law_enforcer, law_enforcer_two,
law_enforcement_item_text, enforcement_time
ORDER BY enforcement_time DESC
) t
<where>
@ -453,7 +456,9 @@
${dataFilter}
</if>
</where>
GROUP BY er.enterprise_number
GROUP BY er.enterprise_number, er.enterprise_name, er.district, er.street,
er.bureau_dept_id, er.bureau_dept_name, er.law_enforcer, er.law_enforcer_two,
er.law_enforcement_item_text
) t
LEFT JOIN sys_dict_data area
ON area.dict_type = 'address_type'

3
zdxt-modules/zdxt-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java

@ -1,6 +1,7 @@
package org.dromara.system.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.util.ObjectUtil;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
@ -81,7 +82,7 @@ public class SysDictDataController extends BaseController {
}
return R.ok(data);
}
@SaIgnore
@GetMapping(value = "/dictType")
public R<List<SysDictDataVo>> dictTypes(String dictType) {
List<SysDictDataVo> data = dictTypeService.selectDictDataByType(dictType);

2
zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java

@ -101,7 +101,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
* @param dictType 字典类型
* @return 字典数据集合信息
*/
@Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType")
//@Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType")
@Override
public List<SysDictDataVo> selectDictDataByType(String dictType) {
List<SysDictDataVo> dictDatas = dictDataMapper.selectDictDataByType(dictType);

2
zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/index.js

@ -75,7 +75,7 @@ export const addNonRegistration = (params, success, error) => _post(baseUrl + "/
export const queryEnforcementNoticeList = (params, success, error) => _post(baseUrl + "/enforcement/queryList", params, success, error);
// 执法预告列表
export const getLawNoticeList = (params, success, error) => _post(baseUrl + "/enforcement/queryList", params, success, error);
export const getLawNoticeList = (params, success, error) => _get(baseUrl + "/cpNotice/myList", params, success, error);
//计划通知列表
export const queryListNoPermission = (params, success, error) => _get(baseUrl + "/inspectionProgram/queryListNoPermission", params, success, error);

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

@ -165,6 +165,7 @@ import {
buildEnforcementTimeFromPicker,
} from '@/util/enforcementTimePicker';
import { queryUnionByHour } from '@/api/enforcement';
import { loadDict } from '@/util/dictUtil';
const props = defineProps({
formData: {
@ -216,12 +217,7 @@ const unionList = ref([]);
const unionLoading = ref(false);
const showReasonPicker = ref(false);
const reasonOptions = [
{ text: '企业原因', value: '企业原因' },
{ text: '系统原因', value: '系统原因' },
{ text: '扫码未能显示企业信息', value: '扫码未能显示企业信息' },
{ text: '其他', value: '其他' }
];
const reasonOptions = ref([]);
onMounted(() => {
const range = getEnforcementTimeDateRange(7);
@ -229,6 +225,10 @@ onMounted(() => {
maxDate.value = range.maxDate;
defaultPickerValue = range.currentDate;
datePickerValue.value = [...range.currentDate];
loadDict('no-scan-reason', (columns) => {
reasonOptions.value = columns;
});
});
watch(() => props.formData.jointEnforcement, (newVal) => {
@ -291,7 +291,8 @@ const onTimeConfirm = ({ selectedValues }) => {
const selectReason = ({ selectedOptions }) => {
props.formData.reason = selectedOptions[0]?.text || '';
if (props.formData.reason !== '其他') {
const selectedValue = selectedOptions[0]?.value || '';
if (selectedValue !== '其他' && selectedOptions[0]?.text !== '其他') {
props.formData.other_reasons = '';
}
showReasonPicker.value = false;

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

@ -109,13 +109,8 @@ const matterOptions = ref([]);
const showMatterPicker = ref(false);
const showTimePicker = ref(false);
const showReasonPicker = ref(false);
const reasonOptions = ref([]);
const reasonOptions = [
{ text: '企业原因', value: '企业原因' },
{ text: '系统原因', value: '系统原因' },
{ text: '扫码未能显示企业信息', value: '扫码未能显示企业信息' },
{ text: '其他', value: '其他' }
];
const datePickerValue = ref([]);
const minDate = ref(new Date());
const maxDate = ref(new Date());
@ -130,7 +125,8 @@ const selectMatter = ({ selectedOptions }) => {
// 选择原因
const selectReason = ({ selectedOptions }) => {
props.formData.reason = selectedOptions[0]?.text || '';
if (props.formData.reason !== '其他') {
const selectedValue = selectedOptions[0]?.value || '';
if (selectedValue !== '其他' && selectedOptions[0]?.text !== '其他') {
props.formData.other_reasons = '';
}
showReasonPicker.value = false;
@ -147,6 +143,10 @@ onMounted(() => {
loadDict('no_check_category', (columns) => {
matterOptions.value = columns;
});
loadDict('no-scan-reason', (columns) => {
reasonOptions.value = columns;
});
});
const openTimePicker = () => {

110
zdxt-web-client/zdxt-efcode-enforcement-app/src/util/lunar.js

@ -0,0 +1,110 @@
const lunarMonths = ['', '正月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '冬月', '腊月'];
const lunarDays = ['', '初一', '初二', '初三', '初四', '初五', '初六', '初七', '初八', '初九', '初十',
'十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十',
'廿一', '廿二', '廿三', '廿四', '廿五', '廿六', '廿七', '廿八', '廿九', '三十',
];
const lunarInfo = [
0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,
0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,
0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,
0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,
0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,
0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950, 0x06aa0,
0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,
0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6,
0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,
0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0,
0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,
0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,
0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,
0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,
0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0
];
const lYearDays = (y) => {
let i, sum = 348;
for (i = 0x8000; i > 0x8; i >>= 1) {
sum += (lunarInfo[y - 1900] & i) ? 1 : 0;
}
return (sum + leapDays(y));
};
const leapMonth = (y) => {
return (lunarInfo[y - 1900] & 0xf);
};
const leapDays = (y) => {
if (leapMonth(y)) {
return ((lunarInfo[y - 1900] & 0x10000) ? 30 : 29);
}
return (0);
};
const monthDays = (y, m) => {
return ((lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29);
};
export const getLunarDay = (date) => {
const year = date.getFullYear();
const month = date.getMonth() + 1;
const day = date.getDate();
if (year < 1900 || year > 2100) return '';
let i, leap = 0, temp = 0;
let offset = (Date.UTC(year, month - 1, day) - Date.UTC(1900, 0, 31)) / 86400000;
for (i = 1900; i < 2101 && offset > 0; i++) {
temp = lYearDays(i);
offset -= temp;
}
if (offset < 0) {
offset += temp;
i--;
}
const lunarYear = i;
leap = leapMonth(i);
let isLeap = false;
for (i = 1; i < 13 && offset > 0; i++) {
if (leap > 0 && i === leap + 1 && isLeap === false) {
--i;
isLeap = true;
temp = leapDays(lunarYear);
} else {
temp = monthDays(lunarYear, i);
}
if (isLeap === true && i === leap + 1) {
isLeap = false;
}
offset -= temp;
}
if (offset === 0 && leap > 0 && i === leap + 1) {
if (isLeap) {
isLeap = false;
} else {
isLeap = true;
--i;
}
}
if (offset < 0) {
offset += temp;
--i;
}
const lunarMonth = i;
const lunarDay = Math.floor(offset) + 1;
if (lunarDay === 1) {
return lunarMonths[lunarMonth] || '';
}
return lunarDays[lunarDay] || '';
};

17
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementList.vue

@ -1,13 +1,7 @@
<template>
<div class="registration-list-page">
<SearchFilterBar
:search-value="searchText"
:date-type="dateType"
:date-search="dateSearch"
@search="onSearch"
@clear="onClear"
@date-change="onDateChange"
/>
<SearchFilterBar :search-value="searchText" :date-type="dateType" :date-search="dateSearch" @search="onSearch"
@clear="onClear" @date-change="onDateChange" />
<!-- 可滚动列表区域 -->
<div class="list-container">
@ -112,7 +106,6 @@ const fetchList = () => {
if (dateSearch.value) {
params.dateSearch = dateSearch.value;
}
queryEnforcementRegistrationPageList(params, (res) => {
if (res.code === 200 || res.code === 0) {
const rows = res.data || res.rows || [];
@ -159,7 +152,10 @@ const onRefresh = () => {
};
// ========== 搜索 ==========
const onSearch = () => {
const onSearch = ({ searchValue } = {}) => {
if (searchValue !== undefined) {
searchText.value = searchValue;
}
pageNum.value = 1;
list.value = [];
finished.value = false;
@ -320,5 +316,4 @@ onMounted(() => {
padding: 6px;
}
}
</style>

31
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementNoticeList.vue

@ -14,12 +14,7 @@
</van-nav-bar>
<!-- 搜索栏 -->
<van-search v-model="searchText" show-action placeholder="请输入关键字查询" clearable clear-trigger="always"
@clear="onClear" @search="onSearch">
<template #action>
<div @click="onSearch">搜索</div>
</template>
</van-search>
<SearchFilterBar :search-value="searchText" @search="onSearch" @clear="onClear" />
<!-- 列表区域 -->
<div class="list-container">
@ -66,6 +61,7 @@ import { useRouter } from 'vue-router';
import { showToast } from 'vant';
import 'vant/es/toast/style';
import { getLawNoticeList } from '@/api/enforcement';
import SearchFilterBar from '@/components/common/SearchFilterBar.vue';
const router = useRouter();
@ -140,7 +136,10 @@ const onClickLeft = () => {
};
// ========== 搜索 ==========
const onSearch = () => {
const onSearch = ({ searchValue } = {}) => {
if (searchValue !== undefined) {
searchText.value = searchValue;
}
pageNum.value = 1;
list.value = [];
finished.value = false;
@ -283,22 +282,4 @@ const onFeedback = (item) => {
}
}
}
/* ===== Vant 搜索框样式覆盖 ===== */
:deep(.van-search__content) {
height: 0.9rem;
border: 1px solid #ececec;
border-radius: 0.15rem 0 0 0.15rem;
}
:deep(.van-search__action) {
margin: 0 3% 0 0;
width: 10%;
height: 0.9rem;
background: #1367fe;
border: 0.01rem solid #1367fe;
border-radius: 0 0.15rem 0.15rem 0;
color: #fff;
text-align: center;
line-height: 0.9rem;
}
</style>

5
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/law/lawServiceList.vue

@ -182,7 +182,10 @@ const onClickLeft = () => {
};
// ========== 搜索 ==========
const onSearch = () => {
const onSearch = ({ searchValue } = {}) => {
if (searchValue !== undefined) {
searchText.value = searchValue;
}
pageNum.value = 1;
list.value = [];
finished.value = false;

5
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/enforcementEvaluateList.vue

@ -168,7 +168,10 @@ const onRefresh = () => {
};
// ========== 搜索 ==========
const onSearch = () => {
const onSearch = ({ searchValue } = {}) => {
if (searchValue !== undefined) {
searchText.value = searchValue;
}
pageNum.value = 1;
list.value = [];
finished.value = false;

80
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/enforcementReserveList.vue

@ -45,7 +45,9 @@
<script setup name="enforcementReserveList">
import { ref, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import { showToast } from 'vant';
import SearchFilterBar from '@/components/common/SearchFilterBar.vue';
import { getReserveList } from '@/api/enforcement/reserve';
const router = useRouter();
@ -53,47 +55,57 @@ const reserveList = ref([]);
const loading = ref(false);
const finished = ref(false);
const refreshing = ref(false);
const pageNum = ref(1);
const pageSize = ref(10);
const searchText = ref('');
const dateType = ref(null);
const dateSearch = ref(null);
const fetchReserveList = () => {
loading.value = true;
setTimeout(() => {
const mockData = [
{
time: '2026-02-19 16:20',
enterpriseName: '深圳市新粤云有限公司',
reserveUnit: '深圳市生态环境局',
checkTime: '2026-02-20 上午'
},
{
time: '2026-03-20 15:23',
enterpriseName: '深圳市新粤云有限公司',
enforcementUnit: '深圳市生态环境局',
checkTime: '2026-04-21 上午'
},
{
time: '2026-04-18 10:23',
enterpriseName: '深圳市新粤云有限公司',
enforcementUnit: '深圳市生态环境局',
checkTime: '2026-04-20 上午'
}
];
let filteredData = mockData;
const params = {
pageNum: pageNum.value,
pageSize: pageSize.value,
};
if (searchText.value) {
const keyword = searchText.value.toLowerCase();
filteredData = filteredData.filter(item =>
(item.enterpriseName || '').toLowerCase().includes(keyword) ||
(item.reserveUnit || '').toLowerCase().includes(keyword) ||
(item.enforcementUnit || '').toLowerCase().includes(keyword)
);
}
reserveList.value = filteredData;
params.searchValue = searchText.value;
}
if (dateType.value !== null && dateType.value !== undefined) {
params.dateType = dateType.value;
}
if (dateSearch.value) {
params.dateSearch = dateSearch.value;
}
getReserveList(params, (res) => {
if (res.code === 200) {
const rows = res.rows || res.data?.rows || res.data?.list || res.data || [];
const total = res.total ?? res.data?.total ?? 0;
if (refreshing.value) {
reserveList.value = Array.isArray(rows) ? rows : [];
refreshing.value = false;
} else {
reserveList.value = [...reserveList.value, ...(Array.isArray(rows) ? rows : [])];
}
if (!Array.isArray(rows) || rows.length === 0 || reserveList.value.length >= total) {
finished.value = true;
} else {
pageNum.value++;
}
loading.value = false;
} else {
finished.value = true;
loading.value = false;
refreshing.value = false;
showToast(res.msg || '加载失败');
}
}, () => {
finished.value = true;
loading.value = false;
refreshing.value = false;
}, 500);
showToast('网络请求失败');
});
};
const onLoad = () => {
@ -106,7 +118,10 @@ const onRefresh = () => {
fetchReserveList();
};
const onSearch = () => {
const onSearch = ({ searchValue } = {}) => {
if (searchValue !== undefined) {
searchText.value = searchValue;
}
finished.value = false;
loading.value = true;
fetchReserveList();
@ -140,6 +155,7 @@ onMounted(() => {
flex: 1;
overflow-y: auto;
padding: 12px;
padding-top: 0px;
}
.reserve-item {

75
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/enforcementTaskList.vue

@ -46,7 +46,9 @@
<script setup name="enforcementTaskList">
import { ref, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import { showToast } from 'vant';
import SearchFilterBar from '@/components/common/SearchFilterBar.vue';
import { getMyTaskList } from '@/api/enforcement/task';
const router = useRouter();
@ -66,40 +68,49 @@ const goBack = () => {
const fetchTaskList = () => {
loading.value = true;
setTimeout(() => {
const mockData = [
{
time: '2026-02-19 16:20',
enterpriseName: '深圳市新粤云有限公司',
checkTime: '2026-02-20 上午',
enforcementItem: '日常检查'
},
{
time: '2026-03-20 14:20',
enterpriseName: '深圳市新粤云有限公司',
checkTime: '2026-03-21 上午',
enforcementItem: '日常检查'
},
{
time: '2026-4-19 15:20',
enterpriseName: '深圳市新粤云有限公司',
checkTime: '2026-04-20 上午',
enforcementItem: '日常检查'
}
];
let filteredData = mockData;
const params = {
pageNum: pageNum.value,
pageSize: pageSize.value,
};
if (searchText.value) {
const keyword = searchText.value.toLowerCase();
filteredData = filteredData.filter(item =>
item.enterpriseName.toLowerCase().includes(keyword) ||
item.enforcementItem.toLowerCase().includes(keyword)
);
params.searchValue = searchText.value;
}
if (dateType.value !== null && dateType.value !== undefined) {
params.dateType = dateType.value;
}
if (dateSearch.value) {
params.dateSearch = dateSearch.value;
}
getMyTaskList(params, (res) => {
if (res.code === 200) {
const rows = res.rows || res.data?.rows || res.data?.list || res.data || [];
const total = res.total ?? res.data?.total ?? 0;
if (refreshing.value) {
taskList.value = Array.isArray(rows) ? rows : [];
refreshing.value = false;
} else {
taskList.value = [...taskList.value, ...(Array.isArray(rows) ? rows : [])];
}
if (!Array.isArray(rows) || rows.length === 0 || taskList.value.length >= total) {
finished.value = true;
} else {
pageNum.value++;
}
taskList.value = filteredData;
loading.value = false;
} else {
finished.value = true;
loading.value = false;
refreshing.value = false;
showToast(res.msg || '加载失败');
}
}, () => {
finished.value = true;
loading.value = false;
refreshing.value = false;
}, 500);
showToast('网络请求失败');
});
};
const onLoad = () => {
@ -113,7 +124,10 @@ const onRefresh = () => {
fetchTaskList();
};
const onSearch = () => {
const onSearch = ({ searchValue } = {}) => {
if (searchValue !== undefined) {
searchText.value = searchValue;
}
pageNum.value = 1;
taskList.value = [];
finished.value = false;
@ -149,6 +163,7 @@ onMounted(() => {
flex: 1;
overflow-y: auto;
padding: 12px;
padding-top: 0px;
}
.task-item {

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

@ -157,7 +157,10 @@ const onDateChange = ({ dateType: type, dateSearch: search }) => {
};
// ========== 搜索 ==========
const onSearch = () => {
const onSearch = ({ searchValue } = {}) => {
if (searchValue !== undefined) {
searchText.value = searchValue;
}
pageNum.value = 1;
list.value = [];
finished.value = false;

11
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/reserve/cp_reserve_list.vue

@ -1,12 +1,12 @@
<template>
<div class="reserve-page app_content">
<!-- 顶部导航 -->
<van-nav-bar
<!-- <van-nav-bar
title="预约处理"
left-arrow
@click-left="onBack"
>
</van-nav-bar>
</van-nav-bar> -->
<!-- Tab 切换 -->
<van-tabs
@ -14,8 +14,6 @@
title-active-color="#111"
title-inactive-color="#666"
color="#2f8bd3"
line-width="36px"
line-height="2px"
:border="false"
>
<van-tab title="手动预约" name="manual">
@ -67,15 +65,14 @@ const onAutoMatch = () => {
display: flex;
flex-direction: column;
height: 100%;
background: #fff;
background: #EBF4FB;
position: relative;
overflow: hidden;
}
:deep(.van-nav-bar) {
background: #347bc3;
flex-shrink: 0;
// flex-shrink: 0;
.van-nav-bar__title {
color: #fff;
font-size: 18px;

4
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/reserve/cp_reserve_manual.vue

@ -1,7 +1,7 @@
<template>
<div class="reserve-tab">
<!-- 状态过滤 -->
<div class="filter-bar">
<!-- <div class="filter-bar">
<div
v-for="opt in filterOptions"
:key="opt.value"
@ -11,7 +11,7 @@
>
{{ opt.label }}
</div>
</div>
</div> -->
<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
<van-list

4
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/reserve/cp_reserve_system.vue

@ -1,7 +1,7 @@
<template>
<div class="reserve-tab">
<!-- 状态过滤 -->
<div class="filter-bar">
<!-- <div class="filter-bar">
<div
v-for="opt in filterOptions"
:key="opt.value"
@ -11,7 +11,7 @@
>
{{ opt.label }}
</div>
</div>
</div> -->
<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
<van-list

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

@ -1,24 +1,24 @@
<template>
<div class="task-page">
<!-- 顶部导航 -->
<div class="nav-bar">
<!-- <div class="nav-bar">
<div class="nav-back" @click="onBack">
<van-icon name="arrow-left" size="20" color="#333" />
</div>
<div class="nav-title">我的任务</div>
<div class="nav-right"></div>
</div>
</div> -->
<!-- 月份切换 -->
<div class="month-switch">
<div class="month-arrow" @click="onPrevMonth">
<van-icon name="arrow-left" size="16" color="#2382cf" />
<van-icon name="arrow-left" size="16" color="#333333" />
</div>
<div class="month-text" @click="showMonthPicker = true">
{{ currentYear }}年{{ currentMonth }}月
</div>
<div class="month-arrow" @click="onNextMonth">
<van-icon name="arrow" size="16" color="#2382cf" />
<van-icon name="arrow" size="16" color="#333333" />
</div>
</div>
@ -28,17 +28,12 @@
<div class="week-cell" v-for="w in weekDays" :key="w">{{ w }}</div>
</div>
<div class="date-grid">
<div
v-for="(cell, idx) in calendarCells"
:key="idx"
class="date-cell"
:class="{
<div v-for="(cell, idx) in calendarCells" :key="idx" class="date-cell" :class="{
'other-month': !cell.isCurrentMonth,
'is-today': cell.isToday,
'is-selected': cell.isSelected,
}"
@click="onSelectDate(cell)"
>
'is-weekend': cell.isWeekend,
}" @click="onSelectDate(cell)">
<span class="date-num">{{ cell.day }}</span>
<span class="date-lunar">{{ cell.lunar }}</span>
<span v-if="cell.hasDot && cell.isCurrentMonth" class="date-dot"></span>
@ -60,12 +55,7 @@
<van-empty description="当天暂无任务" />
</div>
<div v-else class="task-list">
<div
v-for="item in taskList"
:key="item.id"
class="task-card"
@click="onTaskClick(item)"
>
<div v-for="item in taskList" :key="item.id" class="task-card" @click="onTaskClick(item)">
<div class="task-time-col">
<div class="time-label">{{ getTimeLabel(item) }}</div>
<div class="time-date">{{ getShortDate(item) }}</div>
@ -91,7 +81,8 @@
</div>
<div class="detail-row">
<div class="detail-label">执法人员:</div>
<div class="detail-value">{{ formatUserInfo(item.enforceUserNames, item.enforceUserTels) }}</div>
<div class="detail-value">{{ formatUserInfo(item.enforceUserNames, item.enforceUserTels)
}}</div>
</div>
</div>
<!-- 联合执法关联计划 -->
@ -107,7 +98,8 @@
</div>
<div class="detail-row">
<div class="detail-label">执法人员:</div>
<div class="detail-value">{{ formatUserInfo(ap.enforceUserNames, ap.enforceUserTels) }}</div>
<div class="detail-value">{{ formatUserInfo(ap.enforceUserNames, ap.enforceUserTels)
}}</div>
</div>
</div>
</template>
@ -118,13 +110,8 @@
<!-- 月份选择弹窗 -->
<van-popup v-model:show="showMonthPicker" position="bottom" round>
<van-date-picker
v-model="monthPickerValue"
title="选择月份"
:columns-type="['year', 'month']"
@confirm="onMonthPickerConfirm"
@cancel="showMonthPicker = false"
/>
<van-date-picker v-model="monthPickerValue" title="选择月份" :columns-type="['year', 'month']"
@confirm="onMonthPickerConfirm" @cancel="showMonthPicker = false" />
</van-popup>
</div>
</template>
@ -132,12 +119,13 @@
<script setup name="cpTaskMine">
import { useRouter, useRoute } from 'vue-router';
import { getMyTaskList, getMyTaskDates, getMyTaskAssociatedPlans } from '@/api/enforcement/task';
import { getLunarDay } from '@/util/lunar';
const router = useRouter();
const route = useRoute();
// ========== 日历相关 ==========
const weekDays = ['日', '一', '二', '三', '四', '五', '六'];
const weekDays = ['一', '二', '三', '四', '五', '六', '日'];
const today = new Date();
// 从路由参数恢复年月日,若无则默认当天
@ -157,26 +145,14 @@ const monthPickerValue = ref([
String(today.getMonth() + 1).padStart(2, '0'),
]);
// 简易农历(仅用于展示,不做精确计算)
const lunarDays = [
'', '初一', '初二', '初三', '初四', '初五', '初六', '初七', '初八', '初九', '初十',
'十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十',
'廿一', '廿二', '廿三', '廿四', '廿五', '廿六', '廿七', '廿八', '廿九', '三十',
];
const getLunarDay = (date) => {
// 简化处理:使用日期的日数模拟农历显示
const d = date.getDate();
return lunarDays[d] || '';
};
// 生成日历单元格
const calendarCells = computed(() => {
const year = currentYear.value;
const month = currentMonth.value;
const firstDay = new Date(year, month - 1, 1);
const lastDay = new Date(year, month, 0);
const startWeekDay = firstDay.getDay(); // 0=Sunday
let startWeekDay = firstDay.getDay();
startWeekDay = (startWeekDay + 6) % 7;
const totalDays = lastDay.getDate();
const cells = [];
@ -186,6 +162,7 @@ const calendarCells = computed(() => {
for (let i = startWeekDay - 1; i >= 0; i--) {
const day = prevMonthLastDay - i;
const d = new Date(year, month - 2, day);
const weekDay = d.getDay();
cells.push({
day,
date: d,
@ -194,6 +171,7 @@ const calendarCells = computed(() => {
isToday: false,
isSelected: false,
hasDot: false,
isWeekend: weekDay === 0 || weekDay === 6,
});
}
@ -203,6 +181,7 @@ const calendarCells = computed(() => {
const dateStr = formatDateStr(d);
const isToday = dateStr === formatDateStr(today);
const isSelected = dateStr === formatDateStr(selectedDate.value);
const weekDay = d.getDay();
cells.push({
day,
date: d,
@ -211,6 +190,7 @@ const calendarCells = computed(() => {
isToday,
isSelected,
hasDot: taskDatesSet.value.has(dateStr),
isWeekend: weekDay === 0 || weekDay === 6,
});
}
@ -218,6 +198,7 @@ const calendarCells = computed(() => {
const remaining = 42 - cells.length;
for (let day = 1; day <= remaining; day++) {
const d = new Date(year, month, day);
const weekDay = d.getDay();
cells.push({
day,
date: d,
@ -226,6 +207,7 @@ const calendarCells = computed(() => {
isToday: false,
isSelected: false,
hasDot: false,
isWeekend: weekDay === 0 || weekDay === 6,
});
}
@ -436,8 +418,7 @@ onMounted(() => {
display: flex;
flex-direction: column;
height: 100%;
background: #f0f6ff;
font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Microsoft YaHei', sans-serif;
background: #EBF4FB;
}
/* 导航栏 */
@ -453,11 +434,13 @@ onMounted(() => {
width: 32px;
cursor: pointer;
}
.nav-title {
font-size: 18px;
font-weight: 600;
color: #1a1a2e;
}
.nav-right {
width: 32px;
}
@ -466,12 +449,15 @@ onMounted(() => {
/* 月份切换 */
.month-switch {
display: flex;
align-items: center;
justify-content: center;
gap: 20px;
padding: 8px 0;
// align-items: center;
// justify-content: center;
gap: 40px;
margin: 8px 12px 0px 12px;
padding: 8px;
background: #fff;
flex-shrink: 0;
border-top-left-radius: 8px;
border-top-right-radius: 8px;
.month-arrow {
width: 24px;
@ -481,30 +467,36 @@ onMounted(() => {
justify-content: center;
cursor: pointer;
}
.month-text {
font-size: 15px;
font-weight: 600;
color: #2382cf;
font-size: 18px;
font-weight: 700;
color: #333;
cursor: pointer;
text-align: center;
width: 600px;
}
}
/* 日历 */
.calendar {
background: #fff;
padding: 0 8px 8px;
padding: 0 12px 12px;
flex-shrink: 0;
margin: 0px 12px;
border-bottom-left-radius: 8px;
border-bottom-right-radius: 8px;
}
.week-header {
display: grid;
grid-template-columns: repeat(7, 1fr);
text-align: center;
padding: 4px 0;
padding: 8px 0;
.week-cell {
font-size: 11px;
color: #999;
color: #333333;
font-weight: 500;
}
}
@ -512,59 +504,87 @@ onMounted(() => {
.date-grid {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 1px 0;
gap: 4px 0;
}
.date-cell {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 3px 0;
min-height: 38px;
// justify-content: center;
padding: 4px 4px;
cursor: pointer;
position: relative;
border-radius: 6px;
transition: background 0.15s;
border-radius: 50%;
width: 47px;
height: 47px;
box-sizing: border-box;
.date-num {
font-size: 13px;
font-size: 16px;
font-weight: 600;
color: #333;
line-height: 1.3;
color: #1D1F24;
height: 19px;
// line-height: 1.3;
}
.date-lunar {
font-size: 9px;
color: #999;
line-height: 1.1;
font-size: 10px;
color: #666666;
// line-height: 1.1;
// margin-top: 2px;
}
.date-dot {
width: 4px;
height: 4px;
width: 8px;
height: 8px;
border-radius: 50%;
background: #2382cf;
margin-top: 1px;
background: #1978F8;
margin-top: 2px;
position: absolute;
bottom: 2px;
}
&.other-month {
.date-num { color: #ccc; }
.date-lunar { color: #ddd; }
.date-num {
color: #ccc;
}
.date-lunar {
color: #ddd;
}
}
&.is-today:not(.is-selected) {
.date-num {
color: #2382cf;
color: #1978F8;
font-weight: 700;
}
}
&.is-selected {
background: #2382cf;
.date-num { color: #fff; font-weight: 700; }
.date-lunar { color: rgba(255,255,255,0.8); }
.date-dot { background: #fff; }
background: #1978F8;
// width:47px;
// height: 47px;
.date-num {
color: #fff;
font-weight: 700;
}
.date-lunar {
color: rgba(255, 255, 255, 0.8);
}
.date-dot {
background: #fff;
}
}
&.is-weekend:not(.is-selected) {
.date-num {
color: #999999;
}
}
}
@ -572,13 +592,13 @@ onMounted(() => {
.task-count {
padding: 12px 16px 8px;
font-size: 14px;
color: #666;
color: #999;
flex-shrink: 0;
.count-num {
font-size: 18px;
font-weight: 700;
color: #2382cf;
font-size: 14px;
// font-weight: 700;
color: #1367FE;
}
}
@ -616,9 +636,9 @@ onMounted(() => {
padding-top: 10px;
.time-label {
font-size: 15px;
font-size: 16px;
font-weight: 700;
color: #1a1a2e;
color: #1D1F24;
}
.time-date {
@ -632,41 +652,37 @@ onMounted(() => {
flex: 1;
min-width: 0;
background: #fff;
border-left: 3px solid #2382cf;
border-radius: 10px;
padding: 14px 16px;
border-radius: 8px;
padding: 12px;
box-shadow: 0 2px 10px rgba(44, 116, 190, 0.07);
}
.task-title-row {
display: flex;
align-items: center;
gap: 6px;
margin-bottom: 6px;
}
.task-title {
font-size: 15px;
font-size: 14px;
font-weight: 700;
color: #1a1a2e;
color: #1D1F24;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
flex: 1;
}
.union-badge {
display: inline-flex;
align-items: center;
justify-content: center;
width: 22px;
height: 22px;
border-radius: 4px;
background: #2382cf;
text-align: center;
line-height: 20px;
width: 18px;
height: 17px;
border-radius: 2px;
background: #1367FE;
color: #fff;
font-size: 12px;
font-size: 10px;
font-weight: 600;
flex-shrink: 0;
margin-left: 4px;
box-sizing: border-box;
}
.task-time-info {
@ -675,18 +691,18 @@ onMounted(() => {
gap: 4px;
font-size: 13px;
color: #999;
margin-bottom: 10px;
padding: 8px 0px;
}
.task-divider {
border-bottom: 1px dashed #999;
border-bottom: 1px solid #f6f6f6;
margin-bottom: 10px;
}
.task-detail-section {
padding-bottom: 10px;
margin-bottom: 10px;
border-bottom: 1px dashed #999;
// margin-bottom: 10px;
// border-bottom: 1px dashed #999
&:last-child {
border-bottom: none;
@ -710,13 +726,15 @@ onMounted(() => {
.detail-label {
width: 72px;
flex-shrink: 0;
color: #222;
color: #1D1F24;
font-weight: 500;
font-size: 12px;
}
.detail-value {
flex: 1;
color: #444;
color: #666666;
white-space: pre-line;
font-size: 12px;
}
</style>

44
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/scanEntQRCode.vue

@ -45,7 +45,7 @@
<div class="reason-tags">
<div v-for="(reason, index) in reasonOptions" :key="index" class="reason-tag"
:class="{ active: selectedReason === index }" @click="selectedReason = index">
{{ reason }}
{{ reason.text }}
</div>
</div>
</div>
@ -96,6 +96,7 @@ import { useRouter, useRoute } from 'vue-router';
import { showFailToast, showSuccessToast, showToast, showConfirmDialog } from 'vant';
import { baseUrl, appEnv } from '@/config/env.js';
import { getEntInfoByQRCode, queryEnterpriseListAndQrInfo, szyptGetToken } from '@/api/enforcement/index';
import { loadDict } from '@/util/dictUtil';
import wx from 'weixin-js-sdk';
const router = useRouter();
@ -326,19 +327,14 @@ const isHttpLink = (url) => {
// ========== 手动搜索企业弹窗 ==========
const showSearchModal = ref(false);
const selectedReason = ref(3); // 默认选中"其他"
const selectedReason = ref(-1); // 默认未选中,字典加载后设置
const searchKeyword = ref('');
const enterpriseList = ref([]);
const loading = ref(false);
const finished = ref(false);
const error = ref(false);
const reasonOptions = [
'企业原因',
'系统原因',
'扫码未能显示企业信息',
'其他'
];
const reasonOptions = ref([]);
const showSearchPopup = () => {
showSearchModal.value = true;
@ -346,9 +342,25 @@ const showSearchPopup = () => {
enterpriseList.value = [];
finished.value = false;
error.value = false;
if (reasonOptions.value.length === 0) {
loadDict('no-scan-reason', (columns) => {
reasonOptions.value = columns;
const otherIndex = columns.findIndex(item => item.text === '其他' || item.value === '其他');
selectedReason.value = otherIndex !== -1 ? otherIndex : 0;
nextTick(() => {
loadEnterprises();
});
});
} else {
if (selectedReason.value === -1) {
const otherIndex = reasonOptions.value.findIndex(item => item.text === '其他' || item.value === '其他');
selectedReason.value = otherIndex !== -1 ? otherIndex : 0;
}
nextTick(() => {
loadEnterprises();
});
}
};
const closeSearchModal = () => {
@ -415,7 +427,7 @@ const onLoad = () => {
const selectEnterprise = (item) => {
console.log('选中企业:', item);
// 保存无法扫码原因到 sessionStorage
const selectedReasonText = reasonOptions[selectedReason.value];
const selectedReasonText = reasonOptions.value[selectedReason.value]?.text || '';
sessionStorage.setItem('scanReason', selectedReasonText);
showSearchModal.value = false;
router.push({
@ -430,7 +442,7 @@ const selectEnterprise = (item) => {
// 市外注册企业信息录入
const handleOutOfCityEnterprise = () => {
const selectedReasonText = reasonOptions[selectedReason.value];
const selectedReasonText = reasonOptions.value[selectedReason.value]?.text || '';
sessionStorage.setItem('scanReason', selectedReasonText);
showSearchModal.value = false;
router.push({
@ -459,6 +471,18 @@ const toSign = () => {
// ========== 生命周期 ==========
onMounted(() => {
loadDict('no-scan-reason', (columns) => {
reasonOptions.value = columns;
const otherIndex = columns.findIndex(item => item.text === '其他' || item.value === '其他');
if (otherIndex !== -1) {
selectedReason.value = otherIndex;
} else if (columns.length > 0) {
selectedReason.value = 0;
}
});
});
onBeforeUnmount(() => {
// 页面销毁时确保关闭摄像头
if (html5QrCode) {

Loading…
Cancel
Save