# Conflicts:
#	.env.development
#	pages/views/shengchan/ribaoshuju/rbsjLsxq.vue
#	pages/views/shengchan/ribaoshuju/trqRbsj.vue
#	pages/views/shengchan/ribaoshuju/yyRbsj.vue
#	uni_modules/cxc-szcx-dateRangeSelect/readme.md
This commit is contained in:
ldeyun 2025-03-14 09:09:49 +08:00
commit 036b2ecb05
9 changed files with 2178 additions and 894 deletions

View File

@ -13,4 +13,20 @@ export function initDictOption(dictCode) { // 获取部门所有人员信息
method: 'get', method: 'get',
data: dictCode data: dictCode
}) })
}
export function writeCommonJsonDisplay(dictCode) { // 通用json数据写入API
return https({
url: ' /sys/dict/getDictItems',
method: 'get',
data: dictCode
})
}
export function readCommonJsonDisplay(params) { // 通用json数据写入API
return https({
url: '/cxcPersonalTailor/cxcPersonalTailor/getByRules',
method: 'get',
data: params
})
} }

View File

@ -5,6 +5,9 @@
<uni-card :is-shadow="false"> <uni-card :is-shadow="false">
<button type="primary" @click="toTaizhang">人员台账</button> <button type="primary" @click="toTaizhang">人员台账</button>
</uni-card> </uni-card>
<uni-card :is-shadow="false">
<button v-if="roleDetail" type="primary" @click="toSzcs">通过素质测试</button>
</uni-card>
</uni-section> </uni-section>
<uni-section title="统计信息" type="line"> <uni-section title="统计信息" type="line">
<uni-card :is-shadow="false"> <uni-card :is-shadow="false">
@ -16,10 +19,37 @@
</uni-card> </uni-card>
</uni-section> </uni-section>
</uni-card> </uni-card>
<uni-popup ref="popup" type="bottom" background-color="#fff">
<cxc-szcx-jsonDataViewer :username="username" :persionalKey="persionalKey"
:type="type"></cxc-szcx-jsonDataViewer>
</uni-popup>
</view> </view>
</template> </template>
<script setup> <script setup>
import {
ref
} from 'vue';
import {
useStore
} from '@/store';
const store = useStore();
const roleDetail = ref(store.userinfo.realname === '廖德云' || store.userinfo.realname === '马敬朝');
//
const username = ref('');
const persionalKey = ref('');
const type = ref('');
const popup = ref(null);
function toSzcs() {
username.value = 'liaody'
persionalKey.value = 'szcsRy'
type.value = '5'
popup.value.open();
}
function toTaizhang() { function toTaizhang() {
uni.navigateTo({ uni.navigateTo({
url: '/pages/views/renliziyuan/renyuanxinxi/taizhang' url: '/pages/views/renliziyuan/renyuanxinxi/taizhang'

View File

@ -1,14 +1,15 @@
<template> <template>
<view> <view>
<view class="stats-container"> <view class="stats-container">
<uni-title :title="name.unit + '历史数据---单位(万方)'" color="blue" type="h2"></uni-title> <uni-title v-if="type === 'trq'" :title="name.unit + '天然气---单位(万方)'" color="blue" type="h2"></uni-title>
<uni-title v-if="type === 'yy'" :title="name.dw + '原油---单位(吨)'" color="blue" type="h2"></uni-title>
</view> </view>
<view class="dateSelect"> <view class="dateSelect">
<cxc-szcx-dateRangeSelect :mode="'range'" v-model="dateRange"></cxc-szcx-dateRangeSelect> <cxc-szcx-dateRangeSelect :mode="'range'" v-model="dateRange"></cxc-szcx-dateRangeSelect>
</view> </view>
<cxc-szcx-lineChart v-if="type === 'trq'" :dataList="dataList" x-field="rqDate" y-field="rq" legend-field="unit" :reference-value="0"></cxc-szcx-lineChart>
<cxc-szcx-lineChart :dataList="dataList" x-field="rqDate" y-field="rq" legend-field="unit" <cxc-szcx-lineChart v-if="type === 'yy'" :dataList="dataList" x-field="scrq" y-field="rcwy" legend-field="dw" :reference-value="0"></cxc-szcx-lineChart>
:reference-value="0"></cxc-szcx-lineChart>
<view style="margin: 0 15px"> <view style="margin: 0 15px">
<view class="stats-container"> <view class="stats-container">
<view class="stats-item">最大值: {{ dataStats.max }}</view> <view class="stats-item">最大值: {{ dataStats.max }}</view>
@ -16,7 +17,7 @@
<view class="stats-item">平均值: {{ dataStats.average }}</view> <view class="stats-item">平均值: {{ dataStats.average }}</view>
</view> </view>
<view class="table-container"> <view v-if="type === 'trq'" class="table-container">
<!-- 表头 --> <!-- 表头 -->
<view class="tr header"> <view class="tr header">
<view class="th1">序号</view> <view class="th1">序号</view>
@ -39,304 +40,309 @@
<view v-if="!dataList.length" class="empty">暂无相关数据</view> <view v-if="!dataList.length" class="empty">暂无相关数据</view>
</scroll-view> </scroll-view>
</view> </view>
<view v-if="type === 'yy'" class="table-container">
<!-- 表头 -->
<view class="tr header">
<view class="th1">序号</view>
<view class="th">名称</view>
<view class="th">日期</view>
<view class="th">日油量</view>
</view>
<scroll-view scroll-Y="true" class="scroll-wrapper">
<!-- 表格内容 -->
<view class="tr" v-for="(item, index) in dataList" :key="index" :class="{ even: index % 2 === 0 }">
<view class="td1">{{ index + 1 }}</view>
<view class="td">{{ item.dw }}</view>
<view class="td">{{ item.scrq }}</view>
<view class="td" :class="{ negative: item.rcwy < 0 }">
{{ item.rcwy }}
</view>
</view>
<!-- 空数据提示 -->
<view v-if="!dataList.length" class="empty">暂无相关数据</view>
</scroll-view>
</view>
</view> </view>
</view> </view>
</template> </template>
<script setup> <script setup>
import { import { ref, onMounted, computed, nextTick, watchEffect, warn, watch } from 'vue';
ref, import { onLoad } from '@dcloudio/uni-app';
onMounted, import { queryJinriShengchansj, queryJinriYuanyouShengchansj } from '@/api/shengchan.js';
computed, import { formatDate, getDateAfterDays, getDateAfterMonths } from '@/utils/dateTime.js';
nextTick, const name = ref({});
watchEffect, const type = ref('');
warn, const dateRange = ref([]);
watch const dataList = ref([]);
} from 'vue'; const endDate = ref('');
import { const startDate = ref('');
onLoad const dataStats = ref({
} from '@dcloudio/uni-app'; min: 0,
import { max: 0,
queryJinriShengchansj, avg: 0
queryJinriYuanyouShengchansj });
} from '@/api/shengchan.js'; const getJinriShengchansj = (tempDateRange) => {
import { // console.log(tempDateRange);
formatDate, //
getDateAfterDays, if (!tempDateRange || tempDateRange.some((date) => !convertToDate(date))) {
getDateAfterMonths console.error('收到无效日期范围:', tempDateRange);
} from '@/utils/dateTime.js'; return;
const name = ref({}); }
const type = ref(''); let queryParms = {};
const dateRange = ref([]); dataList.value = [];
const dataList = ref([]); queryParms.gas = name.value.gas;
const endDate = ref(''); queryParms.unit = name.value.unit;
const startDate = ref(''); queryParms.rqDate_begin = formatDate(tempDateRange[0]);
const dataStats = ref({ queryParms.rqDate_end = formatDate(tempDateRange[1]);
min: 0, queryParms.pageSize = 500;
max: 0,
avg: 0 //
if (!queryParms.rqDate_begin || !queryParms.rqDate_end) {
console.error('参数格式化失败:', queryParms);
return;
}
// console.log(queryParms);
queryJinriShengchansj(queryParms).then((res) => {
if (res.success) {
// console.log(res);
dataList.value = res.result.records;
dataStats.value = calculateStats(dataList.value, 'rq');
}
}); });
const getJinriShengchansj = (tempDateRange) => { };
// console.log(tempDateRange);
//
if (!tempDateRange || tempDateRange.some((date) => !convertToDate(date))) {
console.error('收到无效日期范围:', tempDateRange);
return;
}
let queryParms = {};
dataList.value = [];
queryParms.gas = name.value.gas;
queryParms.unit = name.value.unit;
queryParms.rqDate_begin = formatDate(tempDateRange[0]);
queryParms.rqDate_end = formatDate(tempDateRange[1]);
queryParms.pageSize = 500;
// const getJinriYuanyouShengchansj = (tempDateRange) => {
if (!queryParms.rqDate_begin || !queryParms.rqDate_end) { console.log(tempDateRange);
console.error('参数格式化失败:', queryParms); //
return; if (!tempDateRange || tempDateRange.some((date) => !convertToDate(date))) {
} console.error('收到无效日期范围:', tempDateRange);
// console.log(queryParms); return;
queryJinriShengchansj(queryParms).then((res) => { }
if (res.success) { let queryParms = {};
// console.log(res); dataList.value = [];
dataList.value = res.result.records; queryParms.dw = name.value.dw;
dataStats.value = calculateStats(dataList.value, 'rq'); queryParms.scrq_begin = formatDate(tempDateRange[0]);
} queryParms.scrq_end = formatDate(tempDateRange[1]);
}); queryParms.pageSize = 500;
};
const getJinriYuanyouShengchansj = (tempDateRange) => { //
console.log(tempDateRange); if (!queryParms.scrq_begin || !queryParms.scrq_end) {
// console.error('参数格式化失败:', queryParms);
if (!tempDateRange || tempDateRange.some((date) => !convertToDate(date))) { return;
console.error('收到无效日期范围:', tempDateRange); }
return; console.log(queryParms);
queryJinriYuanyouShengchansj(queryParms).then((res) => {
if (res.success) {
console.log(res);
dataList.value = res.result.records;
dataStats.value = calculateStats(dataList.value, 'rcwy').reverse();
} }
let queryParms = {}; });
dataList.value = []; };
queryParms.dw = name.value.dw;
queryParms.scrq_begin = formatDate(tempDateRange[0]);
queryParms.scrq_end = formatDate(tempDateRange[1]);
queryParms.pageSize = 500;
//
if (!queryParms.rqDate_begin || !queryParms.rqDate_end) {
console.error('参数格式化失败:', queryParms);
return;
}
console.log(queryParms);
queryJinriYuanyouShengchansj(queryParms).then((res) => {
if (res.success) {
console.log(res);
dataList.value = res.result.records;
dataStats.value = calculateStats(dataList.value, 'rcwy');
}
});
};
function calculateStats(data, field) {
// field null undefined
const validData = data.filter((item) => item[field] !== null && item[field] !== undefined);
if (validData.length === 0) {
return {
max: null,
min: null,
average: null
};
}
//
let max = validData[0][field];
let min = validData[0][field];
let sum = 0;
//
for (let i = 0; i < validData.length; i++) {
const value = validData[i][field];
//
if (value > max) {
max = value;
}
//
if (value < min) {
min = value;
}
//
sum += value;
}
//
const average = (sum / validData.length).toFixed(4);
function calculateStats(data, field) {
// field null undefined
const validData = data.filter((item) => item[field] !== null && item[field] !== undefined);
if (validData.length === 0) {
return { return {
max: max, max: null,
min: min, min: null,
average: average average: null
}; };
} }
//
let max = validData[0][field];
let min = validData[0][field];
let sum = 0;
function convertToDate(str) { //
try { for (let i = 0; i < validData.length; i++) {
const date = new Date(str); const value = validData[i][field];
// //
if (isNaN(date.getTime())) { if (value > max) {
return false; max = value;
}
return true;
} catch (error) {
return false;
//TODO handle the exception
} }
//
if (value < min) {
min = value;
}
//
sum += value;
} }
// //
watch( const average = (sum / validData.length).toFixed(4);
[() => type.value, dateRange], // type dateRange
([newType, newDateRange]) => {
if (!newDateRange || !convertToDate(newDateRange[0]) || !convertToDate(newDateRange[1])) {
// console.error(':', newDateRange);
return;
}
// console.log(newType, newDateRange);
switch ( return {
newType // 使 newType max: max,
) { min: min,
case 'trq': average: average
getJinriShengchansj(newDateRange); };
break; }
case 'yy':
getJinriYuanyouShengchansj(newDateRange); function convertToDate(str) {
break; try {
default: const date = new Date(str);
console.warn('未知类型:', newType); //
} if (isNaN(date.getTime())) {
}, { return false;
immediate: true,
deep: true
} }
); return true;
onMounted(() => { } catch (error) {
// nextTick(); return false;
// getJinriShengchansj(dateRange.value); //TODO handle the exception
}); }
}
onLoad((options) => { //
name.value = JSON.parse(options.data); watch(
type.value = options.type; [() => type.value, dateRange], // type dateRange
// console.log(name.value, type.value); ([newType, newDateRange]) => {
const now = new Date(); if (!newDateRange || !convertToDate(newDateRange[0]) || !convertToDate(newDateRange[1])) {
// console.error(':', newDateRange);
if (now.getHours() < 11) { return;
endDate.value = getDateAfterDays(now, -1); //11
startDate.value = getDateAfterMonths(endDate.value, -1); //11
} else {
endDate.value = now;
startDate.value = getDateAfterMonths(endDate.value, -1); //11
} }
dateRange.value = [startDate.value, endDate.value]; // console.log(newType, newDateRange);
// console.log(1111, dateRange.value);
}); switch (
newType // 使 newType
) {
case 'trq':
getJinriShengchansj(newDateRange);
break;
case 'yy':
getJinriYuanyouShengchansj(newDateRange);
break;
default:
console.warn('未知类型:', newType);
}
},
{
immediate: true,
deep: true
}
);
onMounted(() => {
// nextTick();
// getJinriShengchansj(dateRange.value);
});
onLoad((options) => {
name.value = JSON.parse(options.data);
type.value = options.type;
// console.log(name.value, type.value);
const now = new Date();
if (now.getHours() < 11) {
endDate.value = getDateAfterDays(now, -1); //11
startDate.value = getDateAfterMonths(endDate.value, -1); //11
} else {
endDate.value = now;
startDate.value = getDateAfterMonths(endDate.value, -1); //11
}
dateRange.value = [startDate.value, endDate.value];
// console.log(1111, dateRange.value);
});
</script> </script>
<style scoped> <style scoped>
.table-container { .table-container {
width: 100%; width: 100%;
height: 40vh; height: 40vh;
overflow: hidden; overflow: hidden;
} }
.scroll-wrapper { .scroll-wrapper {
width: 100%; width: 100%;
height: 35vh; height: 35vh;
} }
.tr { .tr {
display: flex; display: flex;
min-height: 18px; min-height: 14px;
font-size: 12px; font-size: 12px;
border-bottom: 1px solid #e8e8e8; border-bottom: 1px solid #e8e8e8;
} }
.th,
.td {
flex: 1;
min-width: 80px;
padding: 10px;
font-size: 12px;
font-weight: bold;
color: #333;
text-align: center;
white-space: nowrap;
height: 18px;
vertical-align: middle;
overflow: hidden;
text-overflow: ellipsis;
}
.th1,
.td1 {
flex: 1;
max-width: 40px;
padding: 10px;
font-size: 12px;
font-weight: bold;
color: #333;
text-align: center;
white-space: nowrap;
height: 14px;
vertical-align: middle;
}
.th, .th {
.td { background-color: #f0f0f0;
flex: 1; }
min-width: 80px;
padding: 10px;
font-size: 14px;
font-weight: bold;
color: #333;
text-align: center;
white-space: nowrap;
height: 18px;
vertical-align: middle;
overflow: hidden;
text-overflow: ellipsis;
}
.th1, .td.negative {
.td1 { color: #ff4444;
flex: 1; font-weight: 500;
max-width: 40px; }
padding: 10px;
font-size: 14px;
font-weight: bold;
color: #333;
text-align: center;
white-space: nowrap;
height: 18px;
vertical-align: middle;
}
.th { .empty {
background-color: #f0f0f0; padding: 40px;
} text-align: center;
color: #888;
font-size: 16px;
}
.td.negative { .stats-container {
color: #ff4444; display: flex;
font-weight: 500; justify-content: space-around;
} align-items: center;
text-align: center;
background-color: #f5f5f5;
border-radius: 4px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
padding: 10px;
margin: 15 15px;
}
.dateSelect {
display: flex;
justify-content: space-around;
align-items: center;
text-align: center;
background-color: #f5f5f5;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
padding: 5px;
margin: 10px;
}
.empty { .stats-item {
padding: 40px; font-size: 12px;
text-align: center; color: #00aa00;
color: #888; font-weight: bold;
font-size: 16px; }
}
.stats-container { .stats-item + .stats-item {
display: flex; border-left: 1px solid #ccc;
justify-content: space-around; padding-left: 16px;
align-items: center; }
text-align: center; </style>
background-color: #f5f5f5;
border-radius: 4px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
padding: 10px;
margin: 15 15px;
}
.dateSelect {
display: flex;
justify-content: space-around;
align-items: center;
text-align: center;
background-color: #f5f5f5;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
padding: 5px;
margin: 10px;
}
.stats-item {
font-size: 12px;
color: #00aa00;
font-weight: bold;
}
.stats-item+.stats-item {
border-left: 1px solid #ccc;
padding-left: 16px;
}
</style>

File diff suppressed because it is too large Load Diff

View File

@ -2,10 +2,18 @@
<view :class="{ gray: store.isgray == 1 }"> <view :class="{ gray: store.isgray == 1 }">
<!-- <view style="margin-left: 20rpx;"> <uni-title :title="strDate + ':生产数据'" type="h1" color="red" /> --> <!-- <view style="margin-left: 20rpx;"> <uni-title :title="strDate + ':生产数据'" type="h1" color="red" /> -->
<!-- </view> --> <!-- </view> -->
<view class="content">
<!-- 标题行 -->
<view class="header-row">
<view class="title">原油产量</view>
<view class="more"></view>
</view>
</view>
<view class="container"> <view class="container">
<view v-for="(item, index) in shishiArr" :key="index" class="card-item" @click="handleCardClick(item.gas)"> <view v-for="(item, index) in shishiArr" :key="index" class="card-item" @click="handleCardClick(item.gas)">
<view class="card"> <view class="card">
<text class="title">{{ item.gas }}</text> <!-- <text class="title">{{ item.gas }}</text> -->
<view class="content"> <view class="content">
<text class="label">日油量</text> <text class="label">日油量</text>
<text class="value">{{ item.rcwy || '-' }}</text> <text class="value">{{ item.rcwy || '-' }}</text>
@ -200,6 +208,41 @@ function sumByOil(records) {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.header-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15rpx 0;
border-bottom: 1rpx solid #eee;
}
.title {
font-size: 30rpx;
font-weight: bold;
color: #333;
}
.more {
font-size: 26rpx;
color: #666;
cursor: pointer;
}
.more::after {
content: '';
width: 8rpx;
height: 8rpx;
border-top: 2rpx solid #666;
border-right: 2rpx solid #666;
transform: rotate(45deg);
margin-left: 8rpx;
vertical-align: middle;
}
/* 鼠标悬停效果 */
.more:hover {
color: #007aff;
}
.container { .container {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
@ -304,10 +347,10 @@ function sumByOil(records) {
} }
.card { .card {
background: #ffffff; background: #ececec;
border-radius: 16rpx; border-radius: 16rpx;
padding: 10rpx; padding: 15rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08); box-shadow: 0 4rpx 12rpx rgba(197, 197, 197, 0.1);
.title { .title {
display: block; display: block;

947
static/data/nlszcs.json Normal file
View File

@ -0,0 +1,947 @@
[{
"序号": "1",
"单位职务": "安全环保室主管",
"姓名": "方超",
"性别": "男",
"劳动合同号": "239603",
"2024.02考试成绩": "",
"2024.08考试成绩": "90.0",
"2025.02考试成绩": "",
"截止有效期": "2025年8月"
},
{
"序号": "2",
"单位职务": "安全环保督查中心(工程监督中心)助理员",
"姓名": "孔玉",
"性别": "男",
"劳动合同号": "239616",
"2024.02考试成绩": "",
"2024.08考试成绩": "87.0",
"2025.02考试成绩": "",
"截止有效期": "2025年8月"
},
{
"序号": "3",
"单位职务": "人力资源服务中心副主任",
"姓名": "陈康朝",
"性别": "男",
"劳动合同号": "103333",
"2024.02考试成绩": "",
"2024.08考试成绩": "88.0",
"2025.02考试成绩": "",
"截止有效期": "2025年8月"
},
{
"序号": "4",
"单位职务": "人力资源服务中心主管师",
"姓名": "韩斌",
"性别": "男",
"劳动合同号": "018733",
"2024.02考试成绩": "",
"2024.08考试成绩": "84.0",
"2025.02考试成绩": "",
"截止有效期": "2025年8月"
},
{
"序号": "5",
"单位职务": "治安保卫中心主办",
"姓名": "齐显琛",
"性别": "男",
"劳动合同号": "100496",
"2024.02考试成绩": "",
"2024.08考试成绩": "87.0",
"2025.02考试成绩": "",
"截止有效期": "2025年8月"
},
{
"序号": "6",
"单位职务": "柳屯输气管理区主管师",
"姓名": "殷丽丽",
"性别": "女",
"劳动合同号": "008925",
"2024.02考试成绩": "",
"2024.08考试成绩": "87.0",
"2025.02考试成绩": "",
"截止有效期": "2025年8月"
},
{
"序号": "7",
"单位职务": "东濮采气管理区副经理",
"姓名": "王全超",
"性别": "男",
"劳动合同号": "009115",
"2024.02考试成绩": "",
"2024.08考试成绩": "82.0",
"2025.02考试成绩": "",
"截止有效期": "2025年8月"
},
{
"序号": "8",
"单位职务": "东濮采气管理项目部副经理",
"姓名": "彭江苏",
"性别": "男",
"劳动合同号": "018645",
"2024.02考试成绩": "",
"2024.08考试成绩": "86.0",
"2025.02考试成绩": "",
"截止有效期": "2025年8月"
},
{
"序号": "9",
"单位职务": "天然气计量化验中心助理师",
"姓名": "张海波",
"性别": "男",
"劳动合同号": "237229",
"2024.02考试成绩": "",
"2024.08考试成绩": "90.0",
"2025.02考试成绩": "",
"截止有效期": "2025年8月"
},
{
"序号": "10",
"单位职务": "开发研究所助理师",
"姓名": "王瑞浩",
"性别": "男",
"劳动合同号": "241327",
"2024.02考试成绩": "",
"2024.08考试成绩": "86.0",
"2025.02考试成绩": "",
"截止有效期": "2025年8月"
},
{
"序号": "11",
"单位职务": "天津LNG项目部助理师",
"姓名": "史航",
"性别": "男",
"劳动合同号": "100474",
"2024.02考试成绩": "",
"2024.08考试成绩": "88.0",
"2025.02考试成绩": "",
"截止有效期": "2025年8月"
},
{
"序号": "12",
"单位职务": "通南巴项目主管师",
"姓名": "黄卓",
"性别": "男",
"劳动合同号": "039385",
"2024.02考试成绩": "",
"2024.08考试成绩": "87.0",
"2025.02考试成绩": "",
"截止有效期": "2025年8月"
},
{
"序号": "13",
"单位职务": "输气管理项目部助理师",
"姓名": "孙宇明",
"性别": "男",
"劳动合同号": "102625",
"2024.02考试成绩": "",
"2024.08考试成绩": "85.0",
"2025.02考试成绩": "",
"截止有效期": "2025年8月"
},
{
"序号": "14",
"单位职务": "输气管理项目部助理师",
"姓名": "张艺皓",
"性别": "男",
"劳动合同号": "240971",
"2024.02考试成绩": "",
"2024.08考试成绩": "83.0",
"2025.02考试成绩": "",
"截止有效期": "2025年8月"
},
{
"序号": "15",
"单位职务": "生产调度室主管",
"姓名": "向龙",
"性别": "男",
"劳动合同号": "103812",
"2024.02考试成绩": "98.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "16",
"单位职务": "计划财务室助理员",
"姓名": "吴曾科",
"性别": "男",
"劳动合同号": "236709",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "86.0",
"截止有效期": "2026年2月"
},
{
"序号": "17",
"单位职务": "经营管理室主办",
"姓名": "穆丽",
"性别": "女",
"劳动合同号": "001334",
"2024.02考试成绩": "87.0",
"2024.08考试成绩": "82.0",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "18",
"单位职务": "综合办公室助理员",
"姓名": "杨非非",
"性别": "男",
"劳动合同号": "236635",
"2024.02考试成绩": "93.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "19",
"单位职务": "群众工作办公室助理员",
"姓名": "余杰",
"性别": "男",
"劳动合同号": "236739",
"2024.02考试成绩": "95.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "20",
"单位职务": "群众工作办公室助理员",
"姓名": "马婷",
"性别": "女",
"劳动合同号": "239720",
"2024.02考试成绩": "94.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "21",
"单位职务": "市场开发室主管",
"姓名": "靳丽娟",
"性别": "女",
"劳动合同号": "022648",
"2024.02考试成绩": "95.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "22",
"单位职务": "安全环保督查中心(工程监督中心)主办",
"姓名": "杨家田",
"性别": "男",
"劳动合同号": "239723",
"2024.02考试成绩": "91.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "23",
"单位职务": "安全环保督查中心(工程监督中心)主办",
"姓名": "罗继勇",
"性别": "男",
"劳动合同号": "239766",
"2024.02考试成绩": "92.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "24",
"单位职务": "天然气计量化验中心副主任",
"姓名": "张杰",
"性别": "男",
"劳动合同号": "240802",
"2024.02考试成绩": "93.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "25",
"单位职务": "天然气计量化验中心主管师",
"姓名": "姜文峰",
"性别": "男",
"劳动合同号": "237664",
"2024.02考试成绩": "94.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "26",
"单位职务": "治安保卫中心助理员",
"姓名": "李巍",
"性别": "男",
"劳动合同号": "098529",
"2024.02考试成绩": "97.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "27",
"单位职务": "开发研究所助理师",
"姓名": "王志远",
"性别": "男",
"劳动合同号": "241278",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "80.0",
"截止有效期": "2026年2月"
},
{
"序号": "28",
"单位职务": "东濮采气管理区副经理",
"姓名": "王鹏",
"性别": "男",
"劳动合同号": "237338",
"2024.02考试成绩": "98.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "29",
"单位职务": "东濮采气管理区主管师",
"姓名": "于蔚兰",
"性别": "女",
"劳动合同号": "101355",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "83.0",
"截止有效期": "2026年2月"
},
{
"序号": "30",
"单位职务": "东濮采气管理区主管师",
"姓名": "何战波",
"性别": "男",
"劳动合同号": "239771",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "87.0",
"截止有效期": "2026年2月"
},
{
"序号": "31",
"单位职务": "东濮采气管理区助理师",
"姓名": "裴昱赫",
"性别": "男",
"劳动合同号": "239561",
"2024.02考试成绩": "92.0",
"2024.08考试成绩": "83.0",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "32",
"单位职务": "东濮采气管理区助理师",
"姓名": "李锡原",
"性别": "男",
"劳动合同号": "241174",
"2024.02考试成绩": "94.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "33",
"单位职务": "文留输气管理区副经理",
"姓名": "王京健",
"性别": "男",
"劳动合同号": "239543",
"2024.02考试成绩": "100.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "34",
"单位职务": "文留输气管理区副经理",
"姓名": "胡海",
"性别": "男",
"劳动合同号": "095325",
"2024.02考试成绩": "98.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "35",
"单位职务": "文留输气管理区主管",
"姓名": "刘先振",
"性别": "男",
"劳动合同号": "013995",
"2024.02考试成绩": "96.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "36",
"单位职务": "文留输气管理区主管师",
"姓名": "张琦",
"性别": "男",
"劳动合同号": "239530",
"2024.02考试成绩": "97.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "37",
"单位职务": "柳屯输气管理区主管师",
"姓名": "韩宣春",
"性别": "男",
"劳动合同号": "022645",
"2024.02考试成绩": "98.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "38",
"单位职务": "巡线大队主管师",
"姓名": "王斌",
"性别": "男",
"劳动合同号": "025333",
"2024.02考试成绩": "100.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "39",
"单位职务": "压缩机维保项目部副经理",
"姓名": "郭阳",
"性别": "男",
"劳动合同号": "013992",
"2024.02考试成绩": "94.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "40",
"单位职务": "压缩机维保项目部副经理",
"姓名": "张恒立",
"性别": "男",
"劳动合同号": "240655",
"2024.02考试成绩": "93.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "41",
"单位职务": "压缩机维保项目部助理师",
"姓名": "张博",
"性别": "男",
"劳动合同号": "241196",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "89.0",
"截止有效期": "2026年2月"
},
{
"序号": "42",
"单位职务": "普光项目部副经理",
"姓名": "王宝华",
"性别": "男",
"劳动合同号": "017889",
"2024.02考试成绩": "97.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "43",
"单位职务": "普光项目部党支部副书记",
"姓名": "杨申",
"性别": "男",
"劳动合同号": "239677",
"2024.02考试成绩": "100.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "44",
"单位职务": "普光项目部主管师",
"姓名": "周峰",
"性别": "男",
"劳动合同号": "095931",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "89.0",
"截止有效期": "2026年2月"
},
{
"序号": "45",
"单位职务": "普光项目部助理师",
"姓名": "安克法",
"性别": "男",
"劳动合同号": "239718",
"2024.02考试成绩": "92.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "46",
"单位职务": "输气管理项目部副主任师",
"姓名": "蔡小虎",
"性别": "男",
"劳动合同号": "043004",
"2024.02考试成绩": "96.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "47",
"单位职务": "人力资源服务中心主管师",
"姓名": "熊文",
"性别": "男",
"劳动合同号": "041870",
"2024.02考试成绩": "98.0",
"2024.08考试成绩": "",
"2025.02考试成绩": "",
"截止有效期": "2026年2月"
},
{
"序号": "48",
"单位职务": "生产调度室主管",
"姓名": "孙东阳",
"性别": "男",
"劳动合同号": "013998",
"2024.02考试成绩": "",
"2024.08考试成绩": "94.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "49",
"单位职务": "综合办公室主办",
"姓名": "王谦",
"性别": "男",
"劳动合同号": "236681",
"2024.02考试成绩": "",
"2024.08考试成绩": "92.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "50",
"单位职务": "综合办公室助理师",
"姓名": "王云尧",
"性别": "男",
"劳动合同号": "240974",
"2024.02考试成绩": "",
"2024.08考试成绩": "95.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "51",
"单位职务": "安全环保室助理员",
"姓名": "高晨峰",
"性别": "男",
"劳动合同号": "240477",
"2024.02考试成绩": "",
"2024.08考试成绩": "94.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "52",
"单位职务": "组织人事室助理员",
"姓名": "吕晓路",
"性别": "男",
"劳动合同号": "237039",
"2024.02考试成绩": "",
"2024.08考试成绩": "92.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "53",
"单位职务": "市场开发室主办",
"姓名": "郑慧研",
"性别": "男",
"劳动合同号": "101099",
"2024.02考试成绩": "",
"2024.08考试成绩": "100.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "54",
"单位职务": "安全环保督查中心(工程监督中心)主办",
"姓名": "张龙超",
"性别": "男",
"劳动合同号": "236628",
"2024.02考试成绩": "",
"2024.08考试成绩": "94.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "55",
"单位职务": "安全环保督查中心(工程监督中心)助理师",
"姓名": "杨高峰",
"性别": "男",
"劳动合同号": "240973",
"2024.02考试成绩": "",
"2024.08考试成绩": "91.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "56",
"单位职务": "生产服务中心党支部副书记",
"姓名": "柳彬",
"性别": "男",
"劳动合同号": "098107",
"2024.02考试成绩": "",
"2024.08考试成绩": "95.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "57",
"单位职务": "治安保卫中心副主任",
"姓名": "杨舜",
"性别": "男",
"劳动合同号": "100521",
"2024.02考试成绩": "",
"2024.08考试成绩": "93.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "58",
"单位职务": "天然气计量化验中心主管",
"姓名": "程志伟",
"性别": "男",
"劳动合同号": "101359",
"2024.02考试成绩": "",
"2024.08考试成绩": "91.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "59",
"单位职务": "开发研究所副所长",
"姓名": "曹正安",
"性别": "男",
"劳动合同号": "039383",
"2024.02考试成绩": "",
"2024.08考试成绩": "93.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "60",
"单位职务": "开发研究所主管师",
"姓名": "龙一慧",
"性别": "女",
"劳动合同号": "240318",
"2024.02考试成绩": "",
"2024.08考试成绩": "93.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "61",
"单位职务": "开发研究所主管师",
"姓名": "李香芹",
"性别": "女",
"劳动合同号": "040224",
"2024.02考试成绩": "",
"2024.08考试成绩": "92.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "62",
"单位职务": "文留输气管理区副经理",
"姓名": "张海波",
"性别": "男",
"劳动合同号": "042449",
"2024.02考试成绩": "",
"2024.08考试成绩": "98.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "63",
"单位职务": "柳屯输气管理区党支部副书记、副经理",
"姓名": "张超",
"性别": "男",
"劳动合同号": "103814",
"2024.02考试成绩": "",
"2024.08考试成绩": "94.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "64",
"单位职务": "通南巴项目助理师",
"姓名": "梁鹏辉",
"性别": "男",
"劳动合同号": "240534",
"2024.02考试成绩": "",
"2024.08考试成绩": "98.0",
"2025.02考试成绩": "",
"截止有效期": "2026年8月"
},
{
"序号": "65",
"单位职务": "市场开发室主管",
"姓名": "徐胜愿",
"性别": "男",
"劳动合同号": "043083",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "96.0",
"截止有效期": "2027年2月"
},
{
"序号": "66",
"单位职务": "安全环保室主办",
"姓名": "鲍灵云",
"性别": "女",
"劳动合同号": "098095",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "95.0",
"截止有效期": "2027年2月"
},
{
"序号": "67",
"单位职务": "组织人事室主办",
"姓名": "高俊华",
"性别": "女",
"劳动合同号": "097139",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "99.0",
"截止有效期": "2027年2月"
},
{
"序号": "68",
"单位职务": "人力资源服务中心助理师",
"姓名": "周正葳",
"性别": "男",
"劳动合同号": "240970",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "99.0",
"截止有效期": "2027年2月"
},
{
"序号": "69",
"单位职务": "人力资源服务中心业务员",
"姓名": "武文斌",
"性别": "男",
"劳动合同号": "236789",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "94.0",
"截止有效期": "2027年2月"
},
{
"序号": "70",
"单位职务": "纪检监督室助理员",
"姓名": "屈倩竹",
"性别": "女",
"劳动合同号": "240735",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "93.0",
"截止有效期": "2027年2月"
},
{
"序号": "71",
"单位职务": "天然气计量化验中心副主任",
"姓名": "郭照祥",
"性别": "男",
"劳动合同号": "237637",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "92.0",
"截止有效期": "2027年2月"
},
{
"序号": "72",
"单位职务": "天然气计量化验中心副主任师",
"姓名": "段善友",
"性别": "男",
"劳动合同号": "096248",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "92.0",
"截止有效期": "2027年2月"
},
{
"序号": "73",
"单位职务": "东濮采气管理区主管",
"姓名": "张凯",
"性别": "男",
"劳动合同号": "018913",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "98.0",
"截止有效期": "2027年2月"
},
{
"序号": "74",
"单位职务": "东濮采气管理区主办",
"姓名": "胡小光",
"性别": "男",
"劳动合同号": "097043",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "95.0",
"截止有效期": "2027年2月"
},
{
"序号": "75",
"单位职务": "东濮采气管理项目部主管",
"姓名": "贾福东",
"性别": "男",
"劳动合同号": "026356",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "93.0",
"截止有效期": "2027年2月"
},
{
"序号": "76",
"单位职务": "柳屯输气管理区助理师",
"姓名": "刘子敬",
"性别": "男",
"劳动合同号": "240638",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "95.0",
"截止有效期": "2027年2月"
},
{
"序号": "77",
"单位职务": "柳屯输气管理区助理师",
"姓名": "马天娇",
"性别": "女",
"劳动合同号": "241155",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "93.0",
"截止有效期": "2027年2月"
},
{
"序号": "78",
"单位职务": "压缩机维保项目部助理师",
"姓名": "王帅",
"性别": "男",
"劳动合同号": "103322",
"2024.02考试成绩": "83.0",
"2024.08考试成绩": "93.0",
"2025.02考试成绩": "",
"截止有效期": "2027年2月"
},
{
"序号": "79",
"单位职务": "山东管道项目部业务员",
"姓名": "侯明路",
"性别": "男",
"劳动合同号": "238781",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "91.0",
"截止有效期": "2027年2月"
},
{
"序号": "80",
"单位职务": "普光项目部副经理",
"姓名": "姚文涛",
"性别": "男",
"劳动合同号": "073696",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "99.0",
"截止有效期": "2027年2月"
},
{
"序号": "81",
"单位职务": "普光项目部主管师",
"姓名": "彭端勇",
"性别": "男",
"劳动合同号": "101106",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "98.0",
"截止有效期": "2027年2月"
},
{
"序号": "82",
"单位职务": "普光项目部助理师",
"姓名": "陈饷",
"性别": "男",
"劳动合同号": "023239",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "96.0",
"截止有效期": "2027年2月"
},
{
"序号": "83",
"单位职务": "通南巴项目部主管",
"姓名": "李鹏辉",
"性别": "男",
"劳动合同号": "101104",
"2024.02考试成绩": "87.0",
"2024.08考试成绩": "96.0",
"2025.02考试成绩": "",
"截止有效期": "2027年2月"
},
{
"序号": "84",
"单位职务": "通南巴项目部助理师",
"姓名": "付小波",
"性别": "男",
"劳动合同号": "013974",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "93.0",
"截止有效期": "2027年2月"
},
{
"序号": "85",
"单位职务": "天津LNG项目部技术员",
"姓名": "江嘉俊",
"性别": "男",
"劳动合同号": "103317",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "99.0",
"截止有效期": "2027年2月"
},
{
"序号": "86",
"单位职务": "天津LNG项目部业务员",
"姓名": "周晓亮",
"性别": "男",
"劳动合同号": "026622",
"2024.02考试成绩": "",
"2024.08考试成绩": "",
"2025.02考试成绩": "93.0",
"截止有效期": "2027年2月"
}
]

View File

@ -1,139 +1,162 @@
# cxc-szcx-dateRangeSelect
# # 紧凑型日期时间选择器组件说明书
## 一、组件概述 ### 紧凑型日期时间选择器组件说明
`compact-datetime-picker` 是一个基于 Vue 开发的紧凑型日期时间选择器组件,用于在页面中选择日期范围。组件提供了自然周期和相对周期两种选择模式,并且支持快捷选择本周、本月、本季、本年、近一周、近一月、近一季、近一年等常见时间范围。
## 二、组件依赖
- **Vue**:组件基于 Vue 框架开发。
- **uni-popup**:来自 `uni-app` 的弹窗组件,用于显示日期选择器的弹出层。
## 三、组件使用方法 #### 一、组件功能
该组件是基于 UniApp 开发的紧凑型日期选择器,支持以下功能:
1. **三种选择模式**
- 单选single
- 范围选择range
- 多选multiple
2. **弹出式日历选择**
- 支持月份滑动切换
- 显示农历日期
- 支持同天范围选择
3. **数据双向绑定**
- 通过 `modelValue` 实现父子组件数据同步
4. **自定义样式**
- 紧凑型输入框设计
- 支持自定义主题颜色
- 响应式布局适配
### 1. 引入组件
在需要使用该组件的 Vue 文件中,引入 `compact-datetime-picker` 组件。 #### 二、组件Props
| 参数名 | 类型 | 默认值 | 说明 |
|--------------|------------|----------|--------------------------|
| `modelValue` | Array/Date | `[null]` | 双向绑定的值(根据模式变化) |
| `mode` | String | `single` | 选择模式single/range/multiple |
#### 三、组件数据
| 名称 | 类型 | 说明 |
|------------|--------|--------------------------|
| `dateRange` | Array | 当前选中的日期范围(内部状态) |
#### 四、组件方法
| 方法名 | 参数 | 说明 |
|----------------|------------|--------------------------|
| `openPicker` | 无 | 打开日历选择器 |
| `calendarConfirm` | `e` | 日历确认回调(处理选中数据) |
#### 五、事件说明
| 事件名 | 说明 | 返回值 |
|--------------|--------------------------|----------------------|
| `update:modelValue` | 数据更新时触发 | 当前选中的日期数组 |
#### 六、样式说明
```vue
<style scoped>
.input-container {
display: flex;
align-items: center;
gap: 10px;
}
.compact-input {
flex: 1;
padding: 6px 8px;
font-size: 16px;
height: 20px;
line-height: 20px;
border: 1px solid #dcdfe6;
border-radius: 4px;
text-align: center;
width: 120px;
}
.compact-input.active {
border-color: #409eff;
background-color: #f5f7ff;
}
</style>
```
**关键样式点**
1. 输入框宽度固定为 120px
2. 紧凑型设计height: 20px
3. 活动状态样式增强
4. 水平排列布局
#### 七、使用示例
```vue ```vue
<template> <template>
<view> <view>
<compact-datetime-picker v-model="dateRange" /> <!-- 单选模式 -->
<compact-datetime-picker
v-model="singleDate"
mode="single"
/>
<!-- 范围选择模式 -->
<compact-datetime-picker
v-model="rangeDate"
mode="range"
/>
<!-- 多选模式 -->
<compact-datetime-picker
v-model="multipleDate"
mode="multiple"
/>
</view> </view>
</template> </template>
<script> <script>
import CompactDateTimePicker from '@/components/compact-datetime-picker.vue';
export default { export default {
components: {
CompactDateTimePicker
},
data() { data() {
return { return {
dateRange: [null, null] singleDate: null,
rangeDate: [null, null],
multipleDate: []
}; };
} }
}; };
</script> </script>
``` ```
### 2. 组件属性
| 属性名 | 类型 | 默认值 | 描述 |
| ---- | ---- | ---- | ---- |
| `modelValue` | `Array` | `[null, null]` | 双向绑定的日期范围数组,第一个元素为开始日期,第二个元素为结束日期。 |
## 四、组件内部实现 #### 八、注意事项
1. **日期格式要求**
- 单选模式:`YYYY-MM-DD` 字符串格式
- 范围模式:`[startDate, endDate]` 数组格式
- 多选模式:`[date1, date2, ...]` 数组格式
2. **依赖组件**
- 需安装 `wu-calendar` 组件(第三方库)
3. **异常处理**
```javascript
calendarConfirm(e) {
this.dateRange = [];
try {
this.dateRange.push(formatDate(new Date(e.range.before)));
this.dateRange.push(formatDate(new Date(e.range.after)));
} catch (error) {
return; // 异常处理
}
this.$emit('update:modelValue', this.dateRange);
}
```
4. **性能优化**
- 建议使用 `:range-end-repick="true"` 开启范围重新选择
- 通过 `:item-height="45"` 控制日历行高
### 1. 模板部分
- **输入框区域**:显示开始日期和结束日期的输入框,点击输入框可打开日期选择弹窗。
- **日期选择弹窗**
- **快捷按钮区域**:包含自然周期和相对周期的切换按钮,以及不同模式下的快捷操作按钮。
- **日历选择区域**:显示当前月份的日历,可选择日期。
- **操作按钮**:包含取消和确定按钮,用于关闭弹窗和确认选择的日期范围。
### 2. 脚本部分 #### 九、扩展功能建议
1. 添加时间选择功能
2. 支持自定义日期禁用范围
3. 增加国际化支持
4. 添加动画过渡效果
5. 支持预设常用日期范围
#### 2.1 数据属性 如果需要进一步定制化,可以修改以下部分:
```javascript 1. 日历组件配置(`wu-calendar` 参数)
data() { 2. 日期格式化函数(`formatDate`
return { 3. 输入框样式和交互逻辑
isNatural: true, // 是否为自然周期模式 4. 异常处理机制
activeType: 'start', // 当前活跃的日期选择类型(开始或结束)
currentMonth: new Date(), // 当前显示的月份
tempStart: null, // 临时开始日期
tempEnd: null, // 临时结束日期
weekDays: ['日', '一', '二', '三', '四', '五', '六'], // 星期几的显示文本
quickButtonszr: [
{ label: '本周', type: 'week' },
{ label: '本月', type: 'month' },
{ label: '本季', type: 'quarter' },
{ label: '本年', type: 'year' }
], // 自然周期模式下的快捷按钮
quickButtonsxd: [
{ label: '近一周', type: 'week' },
{ label: '近一月', type: 'month' },
{ label: '近一季', type: 'quarter' },
{ label: '近一年', type: 'year' }
] // 相对周期模式下的快捷按钮
};
}
```
#### 2.2 计算属性
- `formattedStart`:格式化后的开始日期。
- `formattedEnd`:格式化后的结束日期。
- `calendarDays`:生成当前月份的日历数据。
- `monthText`:当前月份的显示文本。
#### 2.3 监听属性
```javascript
watch: {
modelValue: {
immediate: true,
handler(newVal) {
this.tempStart = newVal[0];
this.tempEnd = newVal[1];
}
}
}
```
监听 `modelValue` 的变化,初始化临时日期。
#### 2.4 方法
- **打开弹窗并初始化临时值**`openPicker(type)`,打开日期选择弹窗,并根据活跃类型初始化临时日期。
- **日期点击处理**`handleDayClick(day)`,处理日期点击事件,更新临时开始或结束日期。
- **确认选择**`confirmSelection()`,确认选择的日期范围,触发 `update:modelValue` 事件并关闭弹窗。
- **关闭弹窗**`closePicker()`,关闭日期选择弹窗,并重置临时日期。
- **重置临时日期**`resetTempDates()`,将临时日期重置为当前的 `modelValue`
- **生成日历数据**`generateCalendar(date)`,根据给定的月份生成日历数据。
- **日期选择处理**`selectDate(date)`,处理日期选择,更新 `modelValue`
- **切换月份**`changeMonth(offset)`,切换当前显示的月份。
- **判断日期状态**
- `isSelected(date)`:判断日期是否被选中。
- `isEnd(date)`:判断日期是否为结束日期。
- `isToday(date)`:判断日期是否为今天。
- `isStart(date)`:判断日期是否为开始日期。
- `isInRange(date)`:判断日期是否在选择的范围内。
- `isSameDay(d1, d2)`:判断两个日期是否为同一天。
- **快捷范围设置**`setQuickRange(type)`,根据快捷按钮的类型设置日期范围,并关闭弹窗。
- **自然周期计算**`calcNaturalRange(type, currentDate)`,计算自然周期模式下的日期范围。
- **相对周期计算**`calcRelativeRange(type, currentDate)`,计算相对周期模式下的日期范围。
- **周计算(周一为起点)**
- `getWeekStart(date)`:获取一周的开始日期。
- `getWeekEnd(startDate)`:获取一周的结束日期。
- **月末处理**`lastDayOfMonth(date)`,获取给定月份的最后一天。
- **月末日调整**`adjustMonthEnd(start, end)`,调整开始日期到合适的月末日期。
- **闰年判断**`isLeapYear(year)`,判断给定年份是否为闰年。
- **模式切换**`toggleMode(isNatural)`,切换自然周期和相对周期模式。
- **日期格式化**`formatDate(date)`,将日期格式化为 `YYYY-MM-DD` 的字符串。
### 3. 样式部分
- **输入框区域**:设置输入框的样式,包括边框、背景色、字体大小等。
- **紧凑弹窗**:设置弹窗的整体样式,包括背景色、边框半径等。
- **紧凑头部**:设置月份标题和导航箭头的样式。
- **紧凑日期网格**:设置星期几和日期的显示样式,以及不同状态下的日期背景色和字体颜色。
- **快捷按钮区域**:设置模式切换按钮和快捷操作按钮的样式。
- **底部操作**:设置取消和确定按钮的样式。
## 五、注意事项
- 组件使用了 `uni-popup` 组件,确保项目中已正确引入和配置。
- 日期范围的选择逻辑较为复杂,特别是在自然周期和相对周期的切换以及快捷范围设置时,需注意日期的计算和显示。
- 组件的样式是基于 `scoped` 作用域的,可根据项目需求进行调整和扩展。

View File

@ -1 +1,90 @@
# cxc-szcx-dictSelect # cxc-szcx-dictSelect
### 组件说明:`uni-data-checkbox` 多选字典项选择组件
#### 一、组件概述
该组件基于 Vue 3 和 `uni-data-checkbox` 实现了一个多选的字典项选择器。它通过传入字典编码(`dictCode`)从后端接口获取字典项数据,并将其展示为多选框列表。组件支持双向数据绑定,可将选中的值同步给父组件,同时在选中值发生变化时触发 `change` 事件。
#### 二、组件使用的技术栈
- **框架**Vue 3使用组合式 API
- **UI 组件**`uni-data-checkbox`(用于展示多选框列表)
- **请求库**:假设使用了自定义的 `getDictItemsApi` 函数进行后端数据请求
#### 三、组件输入Props
| 属性名 | 类型 | 是否必填 | 默认值 | 说明 |
| ---- | ---- | ---- | ---- | ---- |
| `dictCode` | String | 是 | 无 | 用于从后端获取字典项数据的字典编码 |
| `modelValue` | String | 否 | '' | 双向绑定的选中值,多个值以逗号分隔 |
#### 四、组件输出Emits
| 事件名 | 说明 | 参数 |
| ---- | ---- | ---- |
| `update:modelValue` | 当选中值发生变化时,用于更新父组件的 `modelValue` | 选中值的字符串,多个值以逗号分隔 |
| `change` | 当选中值发生变化时触发 | 选中值的字符串,多个值以逗号分隔 |
#### 五、组件内部数据
| 变量名 | 类型 | 说明 |
| ---- | ---- | ---- |
| `dictItems` | Ref<Array> | 存储从后端获取的字典项数据 |
| `selectedValuesArray` | Ref<Array> | 存储当前选中的值,以数组形式存储 |
#### 六、组件方法
##### 1. `loadDictItems`
- **功能**:异步从后端接口获取字典项数据,并将其赋值给 `dictItems`
- **实现逻辑**
- 调用 `getDictItemsApi` 函数,传入 `props.dictCode` 进行数据请求。
- 若请求成功,将响应数据的 `result` 字段赋值给 `dictItems.value`
- 若请求失败,在控制台输出错误信息。
##### 2. 监听 `selectedValuesArray` 的变化
- **功能**:当 `selectedValuesArray` 发生变化时,将选中的值转换为字符串,并触发 `update:modelValue``change` 事件通知父组件。
- **实现逻辑**
- 使用 `watch` 函数监听 `selectedValuesArray` 的变化。
- 当变化发生时,将新的选中值数组使用 `join(',')` 方法转换为字符串。
- 触发 `update:modelValue``change` 事件,将转换后的字符串作为参数传递。
##### 3. 监听 `props.modelValue` 的变化
- **功能**:当父组件传递的 `modelValue` 发生变化时,更新 `selectedValuesArray`
- **实现逻辑**
- 使用 `watch` 函数监听 `props.modelValue` 的变化。
- 当变化发生时,将新的 `modelValue` 使用 `split(',')` 方法转换为数组,并赋值给 `selectedValuesArray.value`
- `immediate: true` 表示在组件初始化时就会执行一次监听回调,确保初始值能正确同步。
#### 七、组件生命周期钩子
##### `onMounted`
- **功能**:在组件挂载后调用 `loadDictItems` 函数,从后端获取字典项数据。
#### 八、使用示例
```vue
<template>
<div>
<MyDictCheckbox
:dictCode="myDictCode"
v-model="selectedValues"
@change="handleChange"
/>
<p>当前选中的值: {{ selectedValues }}</p>
</div>
</template>
<script setup>
import { ref } from 'vue';
import MyDictCheckbox from './MyDictCheckbox.vue';
const myDictCode = 'exampleDictCode';
const selectedValues = ref('');
const handleChange = (newValue) => {
console.log('选中值发生变化:', newValue);
};
</script>
```
#### 九、注意事项
- 确保 `getDictItemsApi` 函数能正确获取后端数据,且响应数据的格式符合 `{ result: [...] }`
- 若 `modelValue` 初始值为空字符串,`selectedValuesArray` 会初始化为空数组。
- 由于使用了 `watch``deep: true` 选项,在 `selectedValuesArray` 内部元素发生变化时也会触发监听回调,可能会影响性能,需注意。

View File

@ -1,35 +1,106 @@
# trq-depart-select # trq-depart-select
# 1.0.1 ### 组件说明:单位选择组件
更新,添加返回值,将整个机构对象返回父组件
```javascript #### 一、组件概述
const onpopupclosed = ((e) => { 此组件为基于 UniApp 和 Vue 3 构建的单位选择组件,借助 `uni-data-picker` 组件实现单位的选择功能。组件支持依据传入的 `returnCodeOrID` 属性,返回单位的 `orgCode` 或者 `id`。组件会从后端获取单位列表数据,并在用户选择单位时触发 `change` 事件通知父组件。
selectDepartID.value = tempSelectDepartID.value
$emit('change', selectDepartID.value, departInfo) #### 二、组件使用的技术栈
}) - **框架**Vue 3使用组合式 API
- **状态管理**`@/store` (推测使用了 Vuex 或 Pinia 进行状态管理)
- **UI 组件**`uni-data-picker` (用于展示单位选择器)
- **请求库**:自定义的 API 请求函数(如 `queryMyDeptTreeListApi`
#### 三、组件输入Props
| 属性名 | 类型 | 是否必填 | 默认值 | 说明 |
| ---- | ---- | ---- | ---- | ---- |
| `returnCodeOrID` | String | 否 | "orgCode" | 决定返回单位的 `orgCode` 还是 `id` |
#### 四、组件输出Emits
| 事件名 | 说明 | 参数 |
| ---- | ---- | ---- |
| `change` | 当用户选择单位时触发,用于通知父组件选择结果 | 选中单位的 `orgCode``id`,以及单位的全部信息对象 |
#### 五、组件内部数据
| 变量名 | 类型 | 说明 |
| ---- | ---- | ---- |
| `departList` | Ref<Array> | 存储从后端获取的单位列表数据 |
| `selectDepartID` | Ref<String> | 当前选中的单位 ID |
| `selectDepartIDS` | Ref<Array> | 选中的级联单位 ID 数组 |
| `tempSelectDepartID` | Ref<String> | 临时选择的单位 ID |
| `depart` | Ref<Object> | 对 `uni-data-picker` 组件的引用 |
| `departInfo` | Ref<Object> | 选中单位的全部信息 |
#### 六、组件方法
##### 1. `getDepartList`
- **功能**:异步从后端获取单位列表数据,并将其赋值给 `departList`
- **实现逻辑**
- 调用 `queryMyDeptTreeListApi` 函数进行数据请求。
- 若请求成功,将响应数据的 `result` 字段赋值给 `departList.value`
- 若请求失败,在控制台输出错误信息。
##### 2. `onnodeclick`
- **功能**:处理用户点击单位节点的事件,更新 `departInfo``tempSelectDepartID`
- **实现逻辑**
- 将点击的单位信息赋值给 `departInfo.value`
- 根据 `props.returnCodeOrID` 的值,将点击单位的 `orgCode``value` 赋值给 `tempSelectDepartID.value`
##### 3. `onchange`
- **功能**:处理 `uni-data-picker``change` 事件,更新 `selectDepartID`
- **实现逻辑**:将选择的单位 ID 赋值给 `selectDepartID.value`
##### 4. `onpopupclosed`
- **功能**:处理 `uni-data-picker` 弹出框关闭的事件,将 `tempSelectDepartID` 的值赋给 `selectDepartID`
- **实现逻辑**:将 `tempSelectDepartID.value` 赋值给 `selectDepartID.value`
##### 5. 监听 `tempSelectDepartID` 的变化
- **功能**:当 `tempSelectDepartID` 发生变化时,触发 `change` 事件通知父组件。
- **实现逻辑**
- 使用 `watch` 函数监听 `tempSelectDepartID` 的变化。
- 当变化发生时,触发 `change` 事件,将 `tempSelectDepartID` 的新值和 `departInfo` 作为参数传递。
- `immediate: true` 表示在组件初始化时就会执行一次监听回调。
- `deep: true` 表示深度监听,确保 `tempSelectDepartID` 内部属性变化也能被捕获。
#### 七、组件生命周期钩子
##### `onLoad`
- **功能**:在页面加载时调用 `getDepartList` 函数,从后端获取单位列表数据。
#### 八、样式说明
```css
.no-wrap-picker::v-deep .uni-data-picker-item {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
``` ```
增加选择到最后层级触发的change时间返回数据到父组件的功能 - 此样式规则用于强制 `uni-data-picker` 的选项不换行,超出部分隐藏并显示省略号。
```javascript #### 九、使用示例
const onchange = ((e) => { ```vue
$emit('change', e.detail.value[e.detail.value.length - 1].value, {}) <template>
}) <div>
<UnitSelector
:returnCodeOrID="'id'"
@change="handleUnitChange"
/>
</div>
</template>
<script setup>
import UnitSelector from './UnitSelector.vue';
const handleUnitChange = (selectedId, unitInfo) => {
console.log('选中的单位 ID:', selectedId);
console.log('选中单位的信息:', unitInfo);
};
</script>
``` ```
#### 十、注意事项
- 确保 `queryMyDeptTreeListApi` 函数能正确获取后端数据,且响应数据的格式符合 `{ success: true, result: [...] }`
# 1.0 - 由于使用了 `watch``deep: true` 选项,在 `tempSelectDepartID` 内部元素发生变化时也会触发监听回调,可能会影响性能,需注意。
- 代码中注释掉的部分(如 `onnodeclick``onpopupclosed` 中触发 `change` 事件的代码)可能是之前的实现逻辑,若需要可根据实际情况恢复使用。
属性 returnCodeOrID 默认值 orgCode 组件返回单位的orgCode 不设置属性或设置为其他,组件返回 单位ID
事件change 选择内容发生变化时发生通过emit 返回给父组件 选择单位的ID或code
由于uni-data-picker 无法选择任意节点数据,通过关闭组件事件返回当前选择的节点数据。
```javascript
const onpopupclosed = ((e) => {
selectDepartID.value = tempSelectDepartID.value
$emit('change', selectDepartID.value)
})
```