| | |
| | | }); |
| | | } |
| | | |
| | | // 导åºå·¥æ¶æ±æ» |
| | | export function exportWorkHoursTotal(query) { |
| | | return request({ |
| | | url: "/auxiliaryOriginalHours/exportWorkHoursTotal", |
| | | method: "get", |
| | | params: query, |
| | | responseType : "blob", |
| | | }); |
| | | } |
| | | |
| | | // æ¥è¯¢è¾
å©å·¥æ¶ |
| | | export function selectAuxiliaryWorkingHoursDay(query) { |
| | | return request({ |
| | |
| | | import dayjs from 'dayjs'; |
| | | /** |
| | | * è·åå¹´ææ¥ |
| | | */ |
| | |
| | | * @param date |
| | | * @returns {string} |
| | | */ |
| | | export function getYearAndMonthAndDaysZTZB(date = new Date()) { |
| | | export function getYearAndMonthAndDaysZTNS(date = new Date()) { |
| | | let year = date.getFullYear(); |
| | | let month = date.getMonth(); |
| | | let days = date.getDate(); |
| | |
| | | year++; |
| | | } |
| | | } |
| | | |
| | | month += 1; |
| | | month = month < 10 ? '0' + month + '-' : month + '-'; |
| | | year = year + '-'; |
| | | days = days < 10 ? '0' + days : days; |
| | | |
| | | return (year + month + days); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è·åæ¶é´èå´ï¼26å·-25å· |
| | | * åå§åé»è®¤æ¥æèå´ï¼è¿ä¸ä¸ªæï¼å½åæ¥æ - 30天 è³ å½åæ¥æï¼ |
| | | * @param format |
| | | * @returns {*[]} |
| | | */ |
| | | export function getTimeRange(format = 'YYYY-MM-DD HH:mm:ss') { |
| | | // è·åå½åæ¶é´ |
| | | const now = dayjs(); |
| | | // è·åå½åæ¥æçãæ¥ãï¼1-31ï¼ |
| | | const currentDate = now.date(); |
| | | |
| | | let startTime, endTime; |
| | | |
| | | // æ ¸å¿é»è¾ï¼å¤æå½åæ¥ææ¯å¦å¤§äº25å· |
| | | if (currentDate > 25) { |
| | | // â
æ
åµ1ï¼å½åæ¥>25 â 彿26å· ~ 次æ25å· |
| | | startTime = now.startOf('month').add(25, 'day'); // 彿1å· +25天 = 26å· |
| | | endTime = startTime.add(1, 'month').date(25).hour(23) |
| | | .minute(59) |
| | | .second(59); // 次æ25å·ï¼dayjsèªå¨å¤çè·¨å¹´ï¼ |
| | | } else { |
| | | // â
æ
åµ2ï¼å½åæ¥â¤25 â 䏿26å· ~ 彿25å· |
| | | startTime = now.subtract(1, 'month').startOf('month').add(25, 'day'); // 䏿26å· |
| | | endTime = now.date(25).hour(23) |
| | | .minute(59) |
| | | .second(59); // 彿25å· |
| | | } |
| | | |
| | | // è¿åæ ¼å¼ååçæ¶é´æ°ç» |
| | | return [startTime.format(format), endTime.format(format)]; |
| | | } |
| | | |
| | | /** |
| | | * è·åçæ¬¡æä»½ |
| | | * @returns {*} |
| | | */ |
| | | export function getWorkMonth(){ |
| | | // è·åå½åæ¶é´ |
| | | const now = dayjs(); |
| | | // è·åå½åæ¥æçãæ¥ãï¼1-31ï¼ |
| | | const currentDate = now.date(); |
| | | let workMonth; |
| | | // æ ¸å¿é»è¾ï¼å¤æå½åæ¥ææ¯å¦å¤§äº25å· |
| | | if (currentDate > 25) { |
| | | workMonth = now.add(1, 'month') |
| | | }else{ |
| | | workMonth = now |
| | | } |
| | | return workMonth |
| | | } |
| | |
| | | <el-button :loading="dataAcquisitionLoading" v-if="state == 1" size="small" type="primary" |
| | | @click="getDataAcquisitionDevice">æ°æ®éé</el-button> |
| | | <el-button :type="dataAcquisitionEidtAble ? '' : 'primary'" v-if="state == 1" size="small" |
| | | @click="dataAcquisitionEidtAble = !dataAcquisitionEidtAble,disconnect()">{{ dataAcquisitionEidtAble ? "å
³éç¼è¾" : "ç¼è¾æ°é" |
| | | @click="dataAcquisitionEidtAble = !dataAcquisitionEidtAble">{{ dataAcquisitionEidtAble ? "å
³éç¼è¾" : "ç¼è¾æ°é" |
| | | }}</el-button> |
| | | </div> |
| | | </div> |
| | |
| | | import html2canvas from "html2canvas"; |
| | | import { mapGetters } from "vuex"; |
| | | import viewManHourDia from "@/views/business/inspectionTask/components/viewManHourDia.vue"; |
| | | import {connect,disconnect,weightList} from "@/utils/connect"; |
| | | import {getOneByIfsId,saveOrUpdateProps} from "@/api/business/ifsPartProps.js"; |
| | | import {getDicts} from "@/api/system/dict/data"; |
| | | export default { |
| | |
| | | sampleName: null, |
| | | state: null, |
| | | }, |
| | | isSerialConnected: false, // æ°å¢ç¶æåéï¼ä¸²å£è¿æ¥ç¶æ |
| | | serialPort: null, // åå¨ä¸²å£å¯¹è±¡ |
| | | id: null, |
| | | changeType: null, |
| | | insOrder: {}, |
| | |
| | | beforeDestroy() { |
| | | // å¨ç»ä»¶éæ¯åç¡®ä¿åæ¢ Workerï¼é¿å
å
åæ³æ¼ |
| | | this.stopWorker(); |
| | | disconnect(); |
| | | // è°ç¨åå
å¤ææ¹æ³æ¯å¦åå¨ï¼é¿å
æ¥é |
| | | if (this.closeSerialPort) { |
| | | this.closeSerialPort();// ç»ä»¶éæ¯åå
³éä¸²å£ |
| | | } |
| | | }, |
| | | methods: { |
| | | validateQuality(){ |
| | |
| | | this.$nextTick(()=>{ |
| | | this.ifsMaterialPropsVisible = true; |
| | | }) |
| | | }, |
| | | disconnect() { |
| | | return disconnect |
| | | }, |
| | | // æä»¶ç®¡ç--å¼å§ |
| | | getList() { |
| | |
| | | // æ°æ®éé |
| | | |
| | | getDataAcquisitionDevice() { |
| | | (async () => { |
| | | try { |
| | | // æ£æ¥é¡µé¢ä¸æ£æµé¡¹æ¯å¦å
å«å¯åº¦ |
| | | const hasDensityItem = this.currentSample.insProduct.some(item => { |
| | | // å设å¯åº¦ç¸å
³çæ£æµé¡¹åç§°å
å« "å¯åº¦" å
³é®åï¼å¯æéä¿®æ¹ |
| | | return item.inspectionItem && item.inspectionItem.includes('å¯åº¦'); |
| | | }); |
| | | if (hasDensityItem) { |
| | | // æ£æ¥æ¯å¦æ¯æ Web Serial API |
| | | if ('serial' in navigator) { |
| | | // 请æ±å¯ç¨ä¸²å£ |
| | | const ports = await navigator.serial.getPorts(); |
| | | if (ports.length > 0) { |
| | | await connect(); |
| | | } else { |
| | | console.log('没æå¯ç¨ç串å£'); |
| | | } |
| | | } else { |
| | | console.log('å½åæµè§å¨ä¸æ¯æ Web Serial API'); |
| | | } |
| | | } |
| | | } catch (error) { |
| | | console.error('æ£æµä¸²å£æ¶åºé:', error); |
| | | } |
| | | })().then(() => { |
| | | let itemIds = []; |
| | | this.currentSample.insProduct.forEach((item) => { |
| | | if (item.inspectionItemType === "1") { |
| | | itemIds.push(item.id); |
| | | } |
| | | }); |
| | | const params = { |
| | | entrustCode: this.insOrder.entrustCode, |
| | | lotBatchNo: this.insOrder.lotBatchNo, |
| | | sampleCode: this.currentSample.sampleCode, |
| | | id: this.currentSample.id, |
| | | itemIds: itemIds, |
| | | }; |
| | | this.dataAcquisitionLoading = true; |
| | | dataCollection(params).then((res) => { |
| | | this.dataAcquisitionLoading = false; |
| | | if (res.code != 200) { |
| | | return; |
| | | } |
| | | this.dataAcquisitionInfoNew = this.HaveJson(res.data); |
| | | // 对æ°é忥çå¼è¿è¡å¤ç |
| | | this.handleDataAcquisition(res.data); |
| | | }).catch(err => { |
| | | this.dataAcquisitionLoading = false; |
| | | }); |
| | | }); |
| | | }, |
| | | let itemIds = []; |
| | | this.currentSample.insProduct.forEach((item) => { |
| | | if (item.inspectionItemType === "1") { |
| | | itemIds.push(item.id); |
| | | } |
| | | }); |
| | | const params = { |
| | | entrustCode: this.insOrder.entrustCode, |
| | | lotBatchNo: this.insOrder.lotBatchNo, |
| | | sampleCode: this.currentSample.sampleCode, |
| | | id: this.currentSample.id, |
| | | itemIds: itemIds, |
| | | }; |
| | | this.dataAcquisitionLoading = true; |
| | | dataCollection(params).then((res) => { |
| | | this.dataAcquisitionLoading = false; |
| | | if (res.code != 200) { |
| | | return; |
| | | } |
| | | this.dataAcquisitionInfoNew = this.HaveJson(res.data); |
| | | // 对æ°é忥çå¼è¿è¡å¤ç |
| | | this.handleDataAcquisition(res.data); |
| | | }).catch(err => { |
| | | this.dataAcquisitionLoading = false; |
| | | }); |
| | | }, |
| | | objectOrder(obj) { |
| | | let newkey = Object.keys(obj).sort(); |
| | | let newObj = {}; |
| | |
| | | goback() { |
| | | this.$router.go(-1) |
| | | } |
| | | }, |
| | | destroyed() { |
| | | disconnect() |
| | | }, |
| | | }; |
| | | </script> |
| | |
| | | //è¿åºé¨ç±»åå表 |
| | | enterOrExitList:[ |
| | | { |
| | | effect:'', |
| | | type:'success', |
| | | label:'è¿é¨', |
| | | value:1 |
| | | }, |
| | | { |
| | | effect:'', |
| | | type:'', |
| | | label:'åºé¨', |
| | | value:2 |
| | | }, |
| | | { |
| | | effect:'', |
| | | type:'info', |
| | | label:'è¿/åºé¨', |
| | | value:3 |
| | | } |
| | |
| | | return label; |
| | | }, |
| | | formatterEnterOrExitType(value){ |
| | | let label = ""; |
| | | let type = { |
| | | effect:'plain', |
| | | type:'warning', |
| | | label:'æªç¥', |
| | | value:value |
| | | }; |
| | | this.enterOrExitList.forEach(item=>{ |
| | | if(item.value===value){ |
| | | label = item.label |
| | | type = item |
| | | } |
| | | }) |
| | | return label; |
| | | return type; |
| | | }, |
| | | getDataSourceTypeTag(type) { |
| | | const tagMap = { |
| | |
| | | :data="tableData" |
| | | border |
| | | style="width: 100%" |
| | | height="300" |
| | | max-height="900" |
| | | :header-cell-style="{textAlign:'center'}" |
| | | :cell-style="{textAlign:'center'}" |
| | | > |
| | | <el-table-column type="index" label="åºå·" width="60"></el-table-column> |
| | | <el-table-column label="æ¯å¦çº³å
¥èå¤" prop="enableReport" width="120"> |
| | | <el-table-column fixed="left" type="index" label="åºå·" width="60"></el-table-column> |
| | | <el-table-column fixed="left" label="æ¯å¦çº³å
¥èå¤" prop="enableReport" width="120"> |
| | | <template slot-scope="scope"> |
| | | <el-switch |
| | | @change="changeEnableReport(scope.row)" |
| | |
| | | </el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="personCode" label="å·¥å·" min-width="150" width="150"></el-table-column> |
| | | <el-table-column prop="personName" label="å§å" min-width="150" width="150"></el-table-column> |
| | | <el-table-column prop="deptName" label="é¨é¨åç§°" min-width="150" width="150"></el-table-column> |
| | | <el-table-column prop="cardNumber" label="å¡å·" min-width="150" width="150"></el-table-column> |
| | | <el-table-column fixed="left" prop="personCode" label="å·¥å·" min-width="120" width="120"></el-table-column> |
| | | <el-table-column fixed="left" prop="personName" label="å§å" min-width="120" width="120"></el-table-column> |
| | | <el-table-column prop="deptName" label="é¨é¨åç§°" min-width="100" width="100"></el-table-column> |
| | | <el-table-column prop="cardNumber" label="å¡å·" min-width="120" width="120" show-overflow-tooltip></el-table-column> |
| | | <el-table-column prop="enterOrExit" label="è¿åºé¨ç±»å" min-width="100" width="100" > |
| | | <template slot-scope="scope"> |
| | | <el-tag :type="formatterEnterOrExitType(scope.row.enterOrExit).type" :effect="formatterEnterOrExitType(scope.row.enterOrExit).effect">{{formatterEnterOrExitType(scope.row.enterOrExit).label}}</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="swingTime" label="å·å¡æ¶é´" min-width="180" width="180"></el-table-column> |
| | | <el-table-column prop="channelName" label="èå¤ç¹ééåç§°" min-width="180" width="180"></el-table-column> |
| | | <el-table-column prop="deviceName" label="èå¤è®¾å¤åç§°" min-width="150" width="150"></el-table-column> |
| | | <el-table-column prop="deviceCode" label="èå¤è®¾å¤ç¼ç " min-width="150" width="150"></el-table-column> |
| | | <el-table-column prop="enterOrExit" label="è¿åºé¨ç±»å" min-width="150" width="150" :formatter="(row)=>formatterEnterOrExitType(row.enterOrExit)"></el-table-column> |
| | | <el-table-column prop="openType" label="å¼é¨ç±»å" min-width="150" width="150" :formatter="(row)=>formatterAttendanceType(row.openType)"></el-table-column> |
| | | <el-table-column prop="isSync" label="æ°æ®æ¥æº" min-width="150" width="150"> |
| | | <template slot-scope="scope"> |
| | |
| | | syncAttendanceRecord |
| | | } from '@/api/performance/attendance' |
| | | import {getDicts} from "@/api/system/dict/data"; |
| | | import dayjs from 'dayjs'; |
| | | import {getTimeRange} from "@/utils/date"; |
| | | export default { |
| | | name: "Attendance", |
| | | components: { |
| | |
| | | this.selectEnumByCategory() |
| | | this.getUserList() |
| | | this.getTableHeight(); |
| | | this.dateRange = this.getTimeRange() |
| | | this.dateRange = getTimeRange() |
| | | this.resizeHandler = this.debounce(() => { |
| | | this.getTableHeight(); |
| | | }, 200); |
| | |
| | | this.dailyTypeList = response.data; |
| | | }); |
| | | }, |
| | | /** |
| | | * åå§åé»è®¤æ¥æèå´ï¼è¿ä¸ä¸ªæï¼å½åæ¥æ - 30天 è³ å½åæ¥æï¼ |
| | | */ |
| | | getTimeRange(format = 'YYYY-MM-DD HH:mm:ss') { |
| | | // è·åå½åæ¶é´ |
| | | const now = dayjs(); |
| | | // è·åå½åæ¥æçãæ¥ãï¼1-31ï¼ |
| | | const currentDate = now.date(); |
| | | |
| | | let startTime, endTime; |
| | | |
| | | // æ ¸å¿é»è¾ï¼å¤æå½åæ¥ææ¯å¦å¤§äº25å· |
| | | if (currentDate > 25) { |
| | | // â
æ
åµ1ï¼å½åæ¥>25 â 彿26å· ~ 次æ25å· |
| | | startTime = now.startOf('month').add(25, 'day'); // 彿1å· +25天 = 26å· |
| | | endTime = startTime.add(1, 'month').date(25).hour(23) |
| | | .minute(59) |
| | | .second(59); // 次æ25å·ï¼dayjsèªå¨å¤çè·¨å¹´ï¼ |
| | | } else { |
| | | // â
æ
åµ2ï¼å½åæ¥â¤25 â 䏿26å· ~ 彿25å· |
| | | startTime = now.subtract(1, 'month').startOf('month').add(25, 'day'); // 䏿26å· |
| | | endTime = now.date(25).hour(23) |
| | | .minute(59) |
| | | .second(59); // 彿25å· |
| | | } |
| | | |
| | | // è¿åæ ¼å¼ååçæ¶é´æ°ç» |
| | | return [startTime.format(format), endTime.format(format)]; |
| | | }, |
| | | //忥èå¤è®°å½ |
| | | confirmSyncAttendance(){ |
| | | if(!this.syncDateRange || this.syncDateRange.length<2){ |
| | |
| | | }, |
| | | //æå¼åæ¥èå¤è®°å½å¼¹æ¡ |
| | | openSyncAttendanceDialog(){ |
| | | this.syncAttendanceVisible = true |
| | | this.syncDateRange = getTimeRange() |
| | | this.$nextTick(()=>{ |
| | | this.syncAttendanceVisible = true |
| | | }) |
| | | }, |
| | | //å é¤èå¤è®°å½ |
| | | confirmRemoveRecord(row){ |
| | |
| | | }, |
| | | //éç½®æé® |
| | | resetQuery() { |
| | | this.dateRange = this.getTimeRange(); |
| | | this.dateRange = getTimeRange(); |
| | | this.queryParams = { |
| | | startDate: "", |
| | | endDate: "", |
| | |
| | | editAnnotationText, |
| | | delAnnotationText |
| | | } from "@/api/performance/class"; |
| | | import {getWorkMonth} from "@/utils/date"; |
| | | export default { |
| | | name: 'Class', |
| | | data() { |
| | |
| | | userName: "", |
| | | laboratory: "", |
| | | year: new Date(), |
| | | month: new Date().getMonth() + 1, |
| | | // month:'' |
| | | month: getWorkMonth().month()+1, |
| | | }, |
| | | monthOptions: [ |
| | | { |
| | |
| | | }" |
| | | border |
| | | > |
| | | <el-table-column type="index" label="åºå·" width="80"></el-table-column> |
| | | <el-table-column type="index" label="åºå·" width="80" fixed="left"></el-table-column> |
| | | <el-table-column |
| | | prop="userName" |
| | | label="人ååç§°" |
| | | min-width="120" |
| | | fixed="left" |
| | | width="120" |
| | | ></el-table-column> |
| | | <el-table-column |
| | | prop="postName" |
| | | label="å²ä½" |
| | | fixed="left" |
| | | min-width="120" |
| | | width="120" |
| | | ></el-table-column> |
| | |
| | | this.getLevelDict() |
| | | this.getTableHeader(); |
| | | this.getList(); |
| | | this.getTableHeight() |
| | | this.getPostList() |
| | | this.$nextTick(()=>{ |
| | | this.getTableHeight() |
| | | }) |
| | | }, |
| | | mounted() { |
| | | window.addEventListener("resize", this.getTableHeight); |
| | |
| | | <el-form-item> |
| | | <el-button type="primary" size="mini" @click="refreshTable">æ¥è¯¢</el-button> |
| | | <el-button size="mini" @click="refresh">éç½®</el-button> |
| | | <el-button :loading="downloadLoading" type="success" size="mini" @click="exportWorkHoursTotal">导åº</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </div> |
| | | <limsTable |
| | | :column="tableColumn" |
| | | :table-data="tableData" |
| | | :table-loading="tableLoading" |
| | | :page="page" |
| | | <!-- <limsTable--> |
| | | <!-- :column="tableColumn"--> |
| | | <!-- :table-data="tableData"--> |
| | | <!-- :table-loading="tableLoading"--> |
| | | <!-- :page="page"--> |
| | | <!-- :height="'calc(100vh - 290px)'"--> |
| | | <!-- @pagination="pagination"--> |
| | | <!-- >--> |
| | | <!-- </limsTable>--> |
| | | <el-table |
| | | :data="tableData" |
| | | v-loading="tableLoading" |
| | | :height="'calc(100vh - 290px)'" |
| | | @pagination="pagination" |
| | | :cell-style="{ textAlign: 'center' }" |
| | | :header-cell-style="{ background: '#f8f8f9', color: '#515a6e', textAlign: 'center' }" |
| | | border |
| | | > |
| | | </limsTable> |
| | | <el-table-column type="index" label="åºå·"></el-table-column> |
| | | <el-table-column prop="userName" label="å§å" min-width="120"></el-table-column> |
| | | <el-table-column prop="month" label="æä»½" min-width="120"></el-table-column> |
| | | <el-table-column label="LIMS"> |
| | | <el-table-column prop="yieldHour" label="产éå·¥æ¶" min-width="120"></el-table-column> |
| | | <el-table-column prop="subsidiaryHour" label="è¾
å©å·¥æ¶" min-width="120"></el-table-column> |
| | | <el-table-column prop="totalHour" label="æ»å·¥æ¶" min-width="120"></el-table-column> |
| | | </el-table-column> |
| | | <el-table-column label="èä¸åMES"> |
| | | <el-table-column prop="operationPerformanceByNS" label="å·¥åºç»©æ" min-width="120"></el-table-column> |
| | | <el-table-column prop="productPerformanceByNS" label="æå绩æ" min-width="120"></el-table-column> |
| | | <el-table-column prop="onsiteInspWageByNS" label="å·¡æ£ç»©æ" min-width="120"></el-table-column> |
| | | <el-table-column prop="handymanWageByNS" label="æå·¥å·¥èµ" min-width="120"></el-table-column> |
| | | </el-table-column> |
| | | <el-table-column label="ç§æåMES"> |
| | | <el-table-column prop="operationPerformanceByKJ" label="å·¥åºç»©æ" min-width="120"></el-table-column> |
| | | <el-table-column prop="productPerformanceByKJ" label="æå绩æ" min-width="120"></el-table-column> |
| | | <el-table-column prop="onsiteInspWageByKJ" label="å·¡æ£ç»©æ" min-width="120"></el-table-column> |
| | | <el-table-column prop="handymanWageByKJ" label="æå·¥å·¥èµ" min-width="120"></el-table-column> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getYearAndMonthAndDays, getYearAndMonthAndDaysZTZB } from "@/utils/date"; |
| | | import {transformExcel} from '@/utils/file' |
| | | import { getYearAndMonthAndDays, getWorkMonth } from "@/utils/date"; |
| | | import limsTable from "@/components/Table/lims-table.vue"; |
| | | import { selectAuxiliaryAllByMonth } from "@/api/performance/manHour"; |
| | | import { selectAuxiliaryAllByMonth,exportWorkHoursTotal } from "@/api/performance/manHour"; |
| | | export default { |
| | | components: { |
| | | limsTable |
| | |
| | | data() { |
| | | return { |
| | | queryParams: { |
| | | month: getYearAndMonthAndDaysZTZB().slice(0, 7), |
| | | month: getWorkMonth().format('YYYY-MM'), |
| | | name: "", |
| | | departLims: "", |
| | | }, |
| | |
| | | size: 20, |
| | | current: 0, |
| | | }, |
| | | downloadLoading: false, |
| | | }; |
| | | }, |
| | | mounted() { |
| | | this.refreshTable(); |
| | | }, |
| | | methods: { |
| | | exportWorkHoursTotal(){ |
| | | this.downloadLoading = true |
| | | exportWorkHoursTotal(this.queryParams).then(res=>{ |
| | | transformExcel(res, "ä¸å¤©èä¸è´¨éé¨å·¥æ¶æ±æ».xlsx") |
| | | this.$message.success("å¯¼åºæå") |
| | | this.$nextTick(()=>{ |
| | | this.downloadLoading = false |
| | | }) |
| | | }).catch((error)=>{ |
| | | console.error(error) |
| | | }) |
| | | }, |
| | | refreshTable() { |
| | | this.tableLoading = true; |
| | | selectAuxiliaryAllByMonth(this.queryParams) |
| | |
| | | }, |
| | | refresh() { |
| | | this.queryParams = { |
| | | month: getYearAndMonthAndDaysZTZB().slice(0, 7), |
| | | month: getWorkMonth().format('YYYY-MM'), |
| | | name: "", |
| | | departLims: "", |
| | | }; |