|
@@ -0,0 +1,1209 @@
|
|
|
+<template>
|
|
|
+ <div>
|
|
|
+ <div class="pageIndexClass" style="display:flex">
|
|
|
+ <div style="width:calc(65% - 10px);margin-right:10px">
|
|
|
+ <byTable :source="sourceList.data" :pagination="sourceList.pagination" :config="config" :loading="loading" highlight-current-row
|
|
|
+ :selectConfig="selectConfig" :action-list="[
|
|
|
+
|
|
|
+ ]" :table-events="{
|
|
|
+ //element talbe事件都能传
|
|
|
+ select: selectRow,
|
|
|
+ 'select-all':selectRow
|
|
|
+ }" @get-list="getList">
|
|
|
+
|
|
|
+ <template #orderCode="{ item }">
|
|
|
+ <div style="width: 100%" class="el-click" @click="lookDetails(item)">
|
|
|
+ {{item.orderCode}}
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template #pic="{ item }">
|
|
|
+ <div v-if="item.fileList &&item.fileList.length > 0">
|
|
|
+ <img :src="item.fileList[0].fileUrl" class="pic" @click="handleClickFile(item.fileList[0])" />
|
|
|
+ </div>
|
|
|
+ <div v-else></div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template #picOne="{ item }">
|
|
|
+ <div v-if="item.fileListOne &&item.fileListOne.length > 0">
|
|
|
+ <img :src="item.fileListOne[0].fileUrl" class="pic" @click="handleClickFile(item.fileListOne[0])" />
|
|
|
+ </div>
|
|
|
+ <div v-else></div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template #size="{ item }">
|
|
|
+ <div v-if="item.productLength && item.productWidth && item.productHeight">
|
|
|
+ <span>{{ item.productLength }}</span>*
|
|
|
+ <span>{{ item.productWidth }}</span>*
|
|
|
+ <span>{{ item.productHeight }}</span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template #isOverdue="{item}">
|
|
|
+ <div style="width: 100%">
|
|
|
+ <span class="red" v-if="item.isOverdue=='1'"> 逾期 </span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template #prodTag="{ item }">
|
|
|
+ <div style="width: 100%">
|
|
|
+ <el-popover placement="top-start" :width="300" trigger="hover">
|
|
|
+ <div>
|
|
|
+ 备注:{{item.prodRemark}}
|
|
|
+ </div>
|
|
|
+ <template #reference>
|
|
|
+ <div style="width:100%;display:inline-block">
|
|
|
+ <el-tag style="margin-right: 8px" type="success" v-for="(tag, index) in item.prodTags" :key="index">
|
|
|
+ {{ dictKeyValue(tag, contractTag) }}
|
|
|
+ </el-tag>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-popover>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-for="(slotItem, index) in processesData" v-slot:[slotItem.id]="{ item }" :key="slotItem.id">
|
|
|
+ <div style="width:100%">
|
|
|
+ <span v-if="isShowCotent(slotItem,item)" style="font-weight:700;min-width:50px;line-height:18px;display:inline-block"
|
|
|
+ :class="showCotentQuantity(slotItem,item)">
|
|
|
+ {{showCotent(slotItem,item)}}
|
|
|
+ </span>
|
|
|
+ <div v-else class="no-bk">
|
|
|
+ -
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </byTable>
|
|
|
+ </div>
|
|
|
+ <div style="width:35%">
|
|
|
+ <div class="schedule-right">
|
|
|
+ <div class="schedule-top">
|
|
|
+ <el-row>
|
|
|
+ <!-- <el-col :span="10" style="text-align: left">
|
|
|
+ <el-select v-model="status" style="width: 110px">
|
|
|
+ <el-option v-for="item in tableStatus" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
+ </el-select>
|
|
|
+ <el-button type="info" style="margin-left: 8px" @click="clickToday()" plain>今日</el-button>
|
|
|
+ </el-col> -->
|
|
|
+ <el-col :span="24" style="text-align: center; height: 32px; line-height: 32px">
|
|
|
+ <div style="display: flex; justify-content: space-between">
|
|
|
+ <el-button @click="clickToday()" plain>今日</el-button>
|
|
|
+ <el-button :icon="ArrowLeftBold" @click="prevMonth()" />
|
|
|
+ <span style="font-weight: 700">{{ month }}</span>
|
|
|
+ <el-button :icon="ArrowRightBold" @click="nextMonth()" />
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ <!-- <el-col :span="10" style="text-align: right">
|
|
|
+ <el-button type="primary" @click="newSchedule()">新建日程</el-button>
|
|
|
+ </el-col> -->
|
|
|
+ </el-row>
|
|
|
+ </div>
|
|
|
+ <div class="schedule-bottom">
|
|
|
+ <el-calendar v-model="today" ref="calendar">
|
|
|
+ <template #date-cell="{ data }">
|
|
|
+ <div>
|
|
|
+ <div style="font-size:14px;text-align:center;">
|
|
|
+ {{ data.day.substr(8, 10) }}
|
|
|
+ </div>
|
|
|
+ <div style="width:100%">
|
|
|
+ <div v-for="item in processesData" :key="item.id">
|
|
|
+ {{item.name}}:99999
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- <el-popover placement="left" :width="400" style="height" trigger="hover" @show="onShow(data.day)">
|
|
|
+ <template #reference>
|
|
|
+ <div v-if="isShow(data.day)">
|
|
|
+ <div style="height:5px;margin-bottom:5px;border-radius:2px" v-for="(item,index) in judgeDay(data.day)" :key="index"
|
|
|
+ :style="{ background: colorData[item]}">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <div style="height:500px;overflow:auto">
|
|
|
+ <div v-for="item in showData" :key="item" style="margin-bottom:20px">
|
|
|
+ <div style="display:flex">
|
|
|
+ <div>颜色:</div>
|
|
|
+ <div :style="{ background: colorData[item]}" style="width:20px;height:20px;border-radius:10px"></div>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ 订单号:<span v-if="rightDataObj[item]">{{rightDataObj[item]['code']}}</span>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ 产品:<span v-if="rightDataObj[item]">{{rightDataObj[item]['productName']}}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-popover> -->
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-calendar>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <el-dialog :title="'打印任务单'" v-model="dialogVisible" width="840px" destroy-on-close :before-close="beforeClose">
|
|
|
+ <div style="height:calc(100vh - 280px);overflow:auto;padding: 0 10px">
|
|
|
+ <div id="pdfDom" style="width:100%">
|
|
|
+ <!-- <div style="font-size:20px;text-align:center">
|
|
|
+ {{printData.name}}
|
|
|
+ </div> -->
|
|
|
+ <div v-for="item in printList" :key="item.id" style="margin-bottom:20px">
|
|
|
+ <div style="font-size:32px;font-weight:700;color:#000;text-align:center">
|
|
|
+ 生产任务单
|
|
|
+ </div>
|
|
|
+ <div style="float:right;margin: 20px 0px 5px 0;">
|
|
|
+ {{printTime}}
|
|
|
+ </div>
|
|
|
+ <table class="table" border>
|
|
|
+ <tr>
|
|
|
+ <td style="width:25%">
|
|
|
+ <div :ref="item.id">
|
|
|
+ </div>
|
|
|
+ </td>
|
|
|
+ <td style="width:75%">
|
|
|
+ <div style="display:flex;margin-bottom:10px">
|
|
|
+ <div style="width:50%">
|
|
|
+ <div class="top-title">
|
|
|
+ 订单号
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ {{item.orderCode}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div style="width:50%">
|
|
|
+ <div class="top-title">
|
|
|
+ 交期
|
|
|
+ </div>
|
|
|
+ <div v-if="item.deliveryPeriod">
|
|
|
+ {{item.deliveryPeriod.substr(0,10)}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div style="display:flex;margin-bottom:10px">
|
|
|
+ <div style="width:50%">
|
|
|
+ <div class="top-title">
|
|
|
+ 产品编码
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ {{item.productCode}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div style="width:50%">
|
|
|
+ <div class="top-title">
|
|
|
+ 生产数量
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ {{item.quantity}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div style="margin-bottom:10px">
|
|
|
+ <div class="top-title">
|
|
|
+ 产品名称
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ {{item.productName}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div style="margin-bottom:10px">
|
|
|
+ <div class="top-title">
|
|
|
+ 产品尺寸(cm)
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ {{item.productLength}} * {{item.productWidth}} * {{item.productHeight}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td style="text-align:center" rowspan="4">
|
|
|
+ <div>
|
|
|
+ <div style="font-weight:700">产品图</div>
|
|
|
+ <img v-if="item.fileList &&item.fileList.length > 0" class="bigImg" :src="item.fileList[0].fileUrl" alt="">
|
|
|
+ </div>
|
|
|
+ <div style="margin-top:20px">
|
|
|
+ <div style="font-weight:700">设计图</div>
|
|
|
+ <img v-if="item.fileListOne &&item.fileListOne.length > 0" class="bigImg" :src="item.fileListOne[0].fileUrl" alt="">
|
|
|
+ </div>
|
|
|
+ </td>
|
|
|
+ <td style="height:60px;vertical-align:top">
|
|
|
+ <div>
|
|
|
+ <div class="top-title">
|
|
|
+ 产品备注
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ {{item.productRemark}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td style="height:60px;vertical-align:top">
|
|
|
+ <div class="top-title">
|
|
|
+ 生产工序
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <!-- <el-checkbox v-for="proess in item.productionTaskProgressList" :key="proess.processesId" :label="proess.progressName"
|
|
|
+ size="small" /> -->
|
|
|
+ <span v-for="(proess,index) in item.productionTaskProgressList" :key="proess.processesId">{{proess.progressName}} <span
|
|
|
+ v-if="index<item.productionTaskProgressList.length-1"> > </span> </span>
|
|
|
+ </div>
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td style="height:107px">
|
|
|
+ <div style="margin-bottom:10px">
|
|
|
+ <div class="top-title">
|
|
|
+ 原材料编码
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ {{item.rawMaterialCode}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <div class="top-title">
|
|
|
+ 原材料名称
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ {{item.rawMaterialName}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td style="vertical-align:top">
|
|
|
+ <div class="top-title">BOM</div>
|
|
|
+ <div>
|
|
|
+ <table border class="table son">
|
|
|
+ <tr>
|
|
|
+ <td style="width:85%">名称</td>
|
|
|
+ <!-- <td style="width:15%">单价</td> -->
|
|
|
+ <td style="width:15%">数量</td>
|
|
|
+ </tr>
|
|
|
+ <tr v-for="son in item.contractProductBomList" :key="son.id">
|
|
|
+ <td>
|
|
|
+ <div>
|
|
|
+ {{son.productCode}}
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ {{son.productName}}
|
|
|
+ </div>
|
|
|
+ </td>
|
|
|
+ <!-- <td>{{son.price}}</td> -->
|
|
|
+ <td>{{son.quantity}}</td>
|
|
|
+ </tr>
|
|
|
+ </table>
|
|
|
+ </div>
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+
|
|
|
+ </table>
|
|
|
+ <div style="page-break-after: always"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <template #footer>
|
|
|
+ <el-button @click="dialogVisible = false" size="defualt">取 消</el-button>
|
|
|
+ <el-button type="primary" v-print="printObj" size="defualt">打 印</el-button>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <el-dialog title="备注" v-model="remarkDialog" width="500" destroy-on-close v-if="remarkDialog">
|
|
|
+ <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="formDom" v-loading="submitLoading">
|
|
|
+ </byForm>
|
|
|
+ <template #footer>
|
|
|
+ <el-button @click="remarkDialog = false" size="defualt" v-debounce>取 消</el-button>
|
|
|
+ <el-button type="primary" @click="submitForm()" size="defualt" v-debounce>
|
|
|
+ 确 定
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <el-dialog title="记录查看" v-model="recordDialog" width="70%" destroy-on-close v-if="recordDialog">
|
|
|
+ <byForm :formConfig="recordFormConfig" :formOption="recordFormOption" v-model="formData.recordData">
|
|
|
+ <template #detail1>
|
|
|
+ <div style="width:100%">
|
|
|
+ a
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template #detail2>
|
|
|
+ <div style="width:100%">
|
|
|
+ b
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </byForm>
|
|
|
+ <template #footer>
|
|
|
+ <el-button @click="recordDialog = false" size="defualt" v-debounce>关闭</el-button>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import byTable from "@/components/byTable/index";
|
|
|
+import byForm from "@/components/byForm/index";
|
|
|
+import QRCode from "qrcodejs2-fix";
|
|
|
+import moment from "moment";
|
|
|
+import { ArrowLeftBold, ArrowRightBold } from "@element-plus/icons-vue";
|
|
|
+
|
|
|
+const { proxy } = getCurrentInstance();
|
|
|
+const contractTag = computed(
|
|
|
+ () => proxy.useUserStore().allDict["contract_prod_tag"]
|
|
|
+);
|
|
|
+const companyData = ref([]);
|
|
|
+const loading = ref(false);
|
|
|
+const submitLoading = ref(false);
|
|
|
+const sourceList = ref({
|
|
|
+ data: [],
|
|
|
+ pagination: {
|
|
|
+ total: 3,
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ keyword: "",
|
|
|
+ produceStatus: "",
|
|
|
+ staDeliveryPeriod: "",
|
|
|
+ endDeliveryPeriod: "",
|
|
|
+ beginTime: "",
|
|
|
+ endTime: "",
|
|
|
+ isOverdue: "",
|
|
|
+ },
|
|
|
+});
|
|
|
+const treeData = ref([]);
|
|
|
+const dialogVisible = ref(false);
|
|
|
+const remarkDialog = ref(false);
|
|
|
+
|
|
|
+const modalType = ref("add");
|
|
|
+const statusData = ref([
|
|
|
+ {
|
|
|
+ label: "未开始",
|
|
|
+ value: "0",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: "进行中",
|
|
|
+ value: "1",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: "已完成",
|
|
|
+ value: "2",
|
|
|
+ },
|
|
|
+]);
|
|
|
+
|
|
|
+const isOverdueData = ref([
|
|
|
+ {
|
|
|
+ label: "是",
|
|
|
+ value: "1",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: "否",
|
|
|
+ value: "0",
|
|
|
+ },
|
|
|
+]);
|
|
|
+
|
|
|
+const selectConfig = computed(() => [
|
|
|
+ // {
|
|
|
+ // label: "生产公司",
|
|
|
+ // prop: "companyId",
|
|
|
+ // data: companyData.value,
|
|
|
+ // },
|
|
|
+ {
|
|
|
+ label: "生产状态",
|
|
|
+ prop: "produceStatus",
|
|
|
+ data: statusData.value,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: "是否逾期",
|
|
|
+ prop: "isOverdue",
|
|
|
+ data: isOverdueData.value,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "time",
|
|
|
+ label: "交期",
|
|
|
+ placeholder: "开始日期",
|
|
|
+ prop: "staDeliveryPeriod",
|
|
|
+ placeholderOne: "结束日期",
|
|
|
+ propOne: "endDeliveryPeriod",
|
|
|
+ },
|
|
|
+ // {
|
|
|
+ // type: "time",
|
|
|
+ // label: "下单日期",
|
|
|
+ // placeholder: "开始日期",
|
|
|
+ // prop: "beginTime",
|
|
|
+ // placeholderOne: "结束日期",
|
|
|
+ // propOne: "endTime",
|
|
|
+ // },
|
|
|
+]);
|
|
|
+const config = ref([
|
|
|
+ // {
|
|
|
+ // type: "selection",
|
|
|
+ // attrs: {
|
|
|
+ // checkAtt: "isCheck",
|
|
|
+ // width: 60,
|
|
|
+ // },
|
|
|
+ // },
|
|
|
+ // {
|
|
|
+ // attrs: {
|
|
|
+ // label: "操作",
|
|
|
+ // width: "160",
|
|
|
+ // align: "left",
|
|
|
+ // // fixed: "right",
|
|
|
+ // },
|
|
|
+ // renderHTML(row) {
|
|
|
+ // return [
|
|
|
+ // {
|
|
|
+ // attrs: {
|
|
|
+ // label: "打印任务单",
|
|
|
+ // type: "primary",
|
|
|
+ // text: true,
|
|
|
+ // },
|
|
|
+ // el: "button",
|
|
|
+ // click() {
|
|
|
+ // printQrCode(row);
|
|
|
+ // },
|
|
|
+ // },
|
|
|
+ // {
|
|
|
+ // attrs: {
|
|
|
+ // label: "备注",
|
|
|
+ // type: "primary",
|
|
|
+ // text: true,
|
|
|
+ // },
|
|
|
+ // el: "button",
|
|
|
+ // click() {
|
|
|
+ // openRemark(row);
|
|
|
+ // },
|
|
|
+ // },
|
|
|
+ // ];
|
|
|
+ // },
|
|
|
+ // },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "生产公司",
|
|
|
+ prop: "companyName",
|
|
|
+ width: 100,
|
|
|
+ // align: "center",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "订单号",
|
|
|
+ slot: "orderCode",
|
|
|
+ width: 130,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "产品图片",
|
|
|
+ slot: "pic",
|
|
|
+ width: 80,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "设计图",
|
|
|
+ slot: "picOne",
|
|
|
+ width: 80,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "产品编码",
|
|
|
+ prop: "productCode",
|
|
|
+ width: 130,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "产品名称",
|
|
|
+ prop: "productName",
|
|
|
+ "min-width": 200,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "产品尺寸 (cm)",
|
|
|
+ slot: "size",
|
|
|
+ width: 160,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "产品颜色",
|
|
|
+ prop: "productColor",
|
|
|
+ width: 80,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "生产件数",
|
|
|
+ prop: "quantity",
|
|
|
+ width: 100,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "已完成",
|
|
|
+ prop: "finishQuantity",
|
|
|
+ width: 100,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "未完成",
|
|
|
+ prop: "incomplete",
|
|
|
+ width: 100,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "生产状态",
|
|
|
+ prop: "produceStatus",
|
|
|
+ width: 100,
|
|
|
+ },
|
|
|
+ render(val) {
|
|
|
+ return proxy.dictValueLabel(val, statusData.value);
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "是否逾期",
|
|
|
+ slot: "isOverdue",
|
|
|
+ width: 80,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "生产指示",
|
|
|
+ slot: "prodTag",
|
|
|
+ "min-width": 220,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "下单时间",
|
|
|
+ prop: "orderCreateTime",
|
|
|
+ width: 160,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "交期",
|
|
|
+ prop: "deliveryPeriod",
|
|
|
+ width: 160,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "投产时间",
|
|
|
+ prop: "produceTime",
|
|
|
+ width: 160,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "完成时间",
|
|
|
+ prop: "finishTime",
|
|
|
+ width: 160,
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "生产用时",
|
|
|
+ prop: "usageTime",
|
|
|
+ width: 100,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ attrs: {
|
|
|
+ label: "备注",
|
|
|
+ prop: "remark",
|
|
|
+ "min-width": 200,
|
|
|
+ },
|
|
|
+ },
|
|
|
+]);
|
|
|
+const formData = reactive({
|
|
|
+ data: {},
|
|
|
+ recordData: {},
|
|
|
+});
|
|
|
+const formOption = reactive({
|
|
|
+ inline: true,
|
|
|
+ labelWidth: 100,
|
|
|
+ itemWidth: 100,
|
|
|
+});
|
|
|
+const formDom = ref(null);
|
|
|
+const formConfig = computed(() => {
|
|
|
+ return [
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ prop: "remark",
|
|
|
+ itemType: "textarea",
|
|
|
+ label: "备注",
|
|
|
+ itemWidth: 100,
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ ];
|
|
|
+});
|
|
|
+const rules = ref({
|
|
|
+ remark: [{ required: true, message: "请输入备注", trigger: "blur" }],
|
|
|
+});
|
|
|
+
|
|
|
+const getList = async (req) => {
|
|
|
+ sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
|
|
|
+ loading.value = true;
|
|
|
+ proxy
|
|
|
+ .post("/produceOrderDetail/page", sourceList.value.pagination)
|
|
|
+ .then((res) => {
|
|
|
+ res.rows.forEach((x) => {
|
|
|
+ if (x.prodTag) {
|
|
|
+ x.prodTags = x.prodTag.split(",");
|
|
|
+ } else {
|
|
|
+ x.prodTags = [];
|
|
|
+ }
|
|
|
+ x.incomplete = x.quantity - x.finishQuantity;
|
|
|
+ });
|
|
|
+ sourceList.value.data = res.rows.map((x) => ({ ...x, isCheck: true }));
|
|
|
+ sourceList.value.pagination.total = res.total;
|
|
|
+ setTimeout(() => {
|
|
|
+ loading.value = false;
|
|
|
+ }, 200);
|
|
|
+ const productIdList = res.rows.map((x) => x.productId);
|
|
|
+ // 请求文件数据并回显
|
|
|
+ if (productIdList.length > 0) {
|
|
|
+ // proxy.getFile(productIdList, sourceList.value.data, "productId");
|
|
|
+ proxy
|
|
|
+ .post("/fileInfo/getList", { businessIdList: productIdList })
|
|
|
+ .then((fileObj) => {
|
|
|
+ for (let i = 0; i < sourceList.value.data.length; i++) {
|
|
|
+ const ele = sourceList.value.data[i];
|
|
|
+ for (const key in fileObj) {
|
|
|
+ if (
|
|
|
+ ele.productId == key &&
|
|
|
+ fileObj[ele.productId] &&
|
|
|
+ fileObj[ele.productId].length > 0
|
|
|
+ ) {
|
|
|
+ ele.fileList = fileObj[ele.productId].filter(
|
|
|
+ (x) => x.businessType == "0"
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ const productIdListOne = res.rows.map((x) => x.contractDetailId);
|
|
|
+ // 请求文件数据并回显
|
|
|
+ if (productIdListOne.length > 0) {
|
|
|
+ proxy
|
|
|
+ .post("/fileInfo/getList", { businessIdList: productIdListOne })
|
|
|
+ .then((fileObj) => {
|
|
|
+ for (let i = 0; i < sourceList.value.data.length; i++) {
|
|
|
+ const ele = sourceList.value.data[i];
|
|
|
+ for (const key in fileObj) {
|
|
|
+ if (
|
|
|
+ ele.contractDetailId == key &&
|
|
|
+ fileObj[ele.contractDetailId] &&
|
|
|
+ fileObj[ele.contractDetailId].length > 0
|
|
|
+ ) {
|
|
|
+ ele.fileListOne = fileObj[ele.contractDetailId].filter(
|
|
|
+ (x) => x.businessType == "0"
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // proxy.getFile(
|
|
|
+ // productIdListOne,
|
|
|
+ // sourceList.value.data,
|
|
|
+ // "contractDetailId",
|
|
|
+ // "fileListOne"
|
|
|
+ // );
|
|
|
+ }
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+const printList = ref([]);
|
|
|
+
|
|
|
+const selectIds = ref([]);
|
|
|
+const selectRow = (data) => {
|
|
|
+ selectIds.value = data.map((x) => x.id);
|
|
|
+};
|
|
|
+const printTime = ref("");
|
|
|
+const openModal = () => {
|
|
|
+ proxy.msgTip("请稍后", 2);
|
|
|
+ proxy
|
|
|
+ .post("/produceOrderDetail/detailByIds", { taskIds: selectIds.value })
|
|
|
+ .then((res) => {
|
|
|
+ printList.value = res;
|
|
|
+ for (let i = 0; i < printList.value.length; i++) {
|
|
|
+ const iele = printList.value[i];
|
|
|
+ for (let j = 0; j < sourceList.value.data.length; j++) {
|
|
|
+ const jele = sourceList.value.data[j];
|
|
|
+ if (iele.id == jele.id) {
|
|
|
+ iele.fileList = jele.fileList;
|
|
|
+ iele.fileListOne = jele.fileListOne;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ printTime.value = moment().format("yyyy-MM-DD HH:mm:ss");
|
|
|
+ dialogVisible.value = true;
|
|
|
+ nextTick(() => {
|
|
|
+ for (let i = 0; i < printList.value.length; i++) {
|
|
|
+ const row = printList.value[i];
|
|
|
+ proxy.$refs[row.id][0].innerHTML = ""; //清除二维码方法一
|
|
|
+ new QRCode(proxy.$refs[row.id][0], {
|
|
|
+ text: row.id,
|
|
|
+ width: 200,
|
|
|
+ height: 200,
|
|
|
+ colorDark: "#000000",
|
|
|
+ colorLight: "#ffffff",
|
|
|
+ correctLevel: QRCode.CorrectLevel.H,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+const submitForm = () => {
|
|
|
+ formDom.value.handleSubmit((valid) => {
|
|
|
+ submitLoading.value = true;
|
|
|
+ proxy.post("/produceOrderDetail/editRemark", formData.data).then(
|
|
|
+ (res) => {
|
|
|
+ proxy.msgTip("操作成功", 1);
|
|
|
+ remarkDialog.value = false;
|
|
|
+ submitLoading.value = false;
|
|
|
+ getList();
|
|
|
+ },
|
|
|
+ (err) => {
|
|
|
+ submitLoading.value = false;
|
|
|
+ }
|
|
|
+ );
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+const getDtl = (row) => {
|
|
|
+ modalType.value = "edit";
|
|
|
+ proxy.post("/shopInfo/detail", { id: row.id }).then((res) => {
|
|
|
+ formData.data = res;
|
|
|
+ dialogVisible.value = true;
|
|
|
+ });
|
|
|
+};
|
|
|
+const processesData = ref([]);
|
|
|
+const getProcesses = () => {
|
|
|
+ proxy
|
|
|
+ .post("/productionProcesses/page", { pageNum: 1, pageSize: 9999 })
|
|
|
+ .then((res) => {
|
|
|
+ for (let i = 0; i < res.rows.length; i++) {
|
|
|
+ const ele = res.rows[i];
|
|
|
+ let attrs = {
|
|
|
+ label: `[ ${ele.name} ]`,
|
|
|
+ slot: ele.id,
|
|
|
+ isNeedHeaderSlot: false,
|
|
|
+ width: 90,
|
|
|
+ align: "center",
|
|
|
+ fixed: "right",
|
|
|
+ };
|
|
|
+ config.value.push({
|
|
|
+ attrs,
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // config.value.push({
|
|
|
+ // attrs: {
|
|
|
+ // label: "操作",
|
|
|
+ // width: "160",
|
|
|
+ // align: "center",
|
|
|
+ // fixed: "right",
|
|
|
+ // },
|
|
|
+ // renderHTML(row) {
|
|
|
+ // return [
|
|
|
+ // {
|
|
|
+ // attrs: {
|
|
|
+ // label: "打印任务单",
|
|
|
+ // type: "primary",
|
|
|
+ // text: true,
|
|
|
+ // },
|
|
|
+ // el: "button",
|
|
|
+ // click() {
|
|
|
+ // printQrCode(row);
|
|
|
+ // },
|
|
|
+ // },
|
|
|
+ // {
|
|
|
+ // attrs: {
|
|
|
+ // label: "备注",
|
|
|
+ // type: "primary",
|
|
|
+ // text: true,
|
|
|
+ // },
|
|
|
+ // el: "button",
|
|
|
+ // click() {
|
|
|
+ // openRemark(row);
|
|
|
+ // },
|
|
|
+ // },
|
|
|
+ // ];
|
|
|
+ // },
|
|
|
+ // });
|
|
|
+ processesData.value = res.rows;
|
|
|
+ });
|
|
|
+};
|
|
|
+getProcesses();
|
|
|
+getList();
|
|
|
+const printType = ref(false);
|
|
|
+
|
|
|
+const printQrCode = (row) => {
|
|
|
+ printType.value = true;
|
|
|
+ selectIds.value = [row.id];
|
|
|
+ openModal();
|
|
|
+};
|
|
|
+const beforeClose = () => {
|
|
|
+ if (printType.value) {
|
|
|
+ selectIds.value = [];
|
|
|
+ }
|
|
|
+ dialogVisible.value = false;
|
|
|
+};
|
|
|
+const printObj = ref({
|
|
|
+ id: "pdfDom",
|
|
|
+ popTitle: "",
|
|
|
+ extraCss:
|
|
|
+ "https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.compat.css, https://cdn.bootcdn.net/ajax/libs/hover.css/2.3.1/css/hover-min.css",
|
|
|
+ extraHead: '<meta http-equiv="Content-Language"content="zh-cn"/>',
|
|
|
+});
|
|
|
+
|
|
|
+const handleClickFile = (file) => {
|
|
|
+ window.open(file.fileUrl, "_blank");
|
|
|
+};
|
|
|
+
|
|
|
+const isShowCotent = (slot, item) => {
|
|
|
+ if (item && item.productionTaskProgressList) {
|
|
|
+ return item.productionTaskProgressList.some(
|
|
|
+ (x) => x.processesId == slot.id
|
|
|
+ );
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+};
|
|
|
+const showCotent = (slot, item) => {
|
|
|
+ if (item && item.productionTaskProgressList) {
|
|
|
+ const current = item.productionTaskProgressList.find(
|
|
|
+ (x) => x.processesId == slot.id
|
|
|
+ );
|
|
|
+ if (current) {
|
|
|
+ return current.finishQuantity;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const showCotentQuantity = (slot, item) => {
|
|
|
+ if (item && item.productionTaskProgressList) {
|
|
|
+ const current = item.productionTaskProgressList.find(
|
|
|
+ (x) => x.processesId == slot.id
|
|
|
+ );
|
|
|
+ if (current && Number(current.finishQuantity) > 0) {
|
|
|
+ if (Number(current.finishQuantity) >= item.quantity) {
|
|
|
+ return "tag-active";
|
|
|
+ } else if (Number(current.finishQuantity) < item.quantity) {
|
|
|
+ return "tag-active-1";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const getDict = () => {
|
|
|
+ proxy
|
|
|
+ .get("/tenantDept/list", {
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 9999,
|
|
|
+ keyword: "",
|
|
|
+ tenantId: proxy.useUserStore().user.tenantId,
|
|
|
+ type: 0,
|
|
|
+ })
|
|
|
+ .then((res) => {
|
|
|
+ companyData.value = res.data.map((x) => ({
|
|
|
+ ...x,
|
|
|
+ label: x.deptName,
|
|
|
+ value: x.deptId,
|
|
|
+ }));
|
|
|
+ // treeData.value = proxy.handleTree(res.data, "deptId");
|
|
|
+ });
|
|
|
+};
|
|
|
+getDict();
|
|
|
+
|
|
|
+const openRemark = (row) => {
|
|
|
+ formData.data = {
|
|
|
+ id: row.id,
|
|
|
+ remark: row.remark,
|
|
|
+ };
|
|
|
+ remarkDialog.value = true;
|
|
|
+};
|
|
|
+const recordDialog = ref(false);
|
|
|
+const recordFormOption = reactive({
|
|
|
+ inline: true,
|
|
|
+ labelWidth: 40,
|
|
|
+ itemWidth: 100,
|
|
|
+});
|
|
|
+const recordFormConfig = computed(() => {
|
|
|
+ return [
|
|
|
+ {
|
|
|
+ type: "title1",
|
|
|
+ title: "采购记录",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "slot",
|
|
|
+ slotName: "detail1",
|
|
|
+ label: " ",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "title1",
|
|
|
+ title: "出入库流水记录",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "slot",
|
|
|
+ slotName: "detail2",
|
|
|
+ label: " ",
|
|
|
+ },
|
|
|
+ ];
|
|
|
+});
|
|
|
+const lookDetails = (item) => {
|
|
|
+ recordDialog.value = true;
|
|
|
+};
|
|
|
+const today = ref(moment().format("yyyy-MM-DD"));
|
|
|
+const dateList = ref({});
|
|
|
+const month = ref(moment().format("yyyy年MM月"));
|
|
|
+const monthOne = ref(moment().format("yyyy-MM"));
|
|
|
+
|
|
|
+const calendar = ref(null);
|
|
|
+const rightData = ref([]);
|
|
|
+const rightDataObj = ref({});
|
|
|
+const colorData = ref({});
|
|
|
+let colorList = [
|
|
|
+ "#BBFF00",
|
|
|
+ "#FFFF00",
|
|
|
+ "#FFBB00",
|
|
|
+ "#FF3333",
|
|
|
+ "#D28EFF",
|
|
|
+ "#CCEEFF",
|
|
|
+ "#FFC8B4",
|
|
|
+ "#CCDDFF",
|
|
|
+ "#007799",
|
|
|
+ "#550088",
|
|
|
+ "#AAFFEE",
|
|
|
+ "#FFB3FF",
|
|
|
+ "#FFFF33",
|
|
|
+];
|
|
|
+const getRightData = () => {
|
|
|
+ proxy
|
|
|
+ .post("/produceOrder/schedulingList", {
|
|
|
+ beginDate: monthOne.value,
|
|
|
+ companyId: sourceList.value.pagination.companyId,
|
|
|
+ })
|
|
|
+ .then(
|
|
|
+ (res) => {
|
|
|
+ rightDataObj.value = {};
|
|
|
+ rightData.value = res.map((x, index) => ({
|
|
|
+ ...x,
|
|
|
+ produceTimeOne: x.produceTime,
|
|
|
+ produceTime: x.produceTime.substr(0, 10),
|
|
|
+ deliveryPeriod: x.deliveryPeriod.substr(0, 10),
|
|
|
+ }));
|
|
|
+
|
|
|
+ for (let i = 0; i < res.length; i++) {
|
|
|
+ const ele = res[i];
|
|
|
+ rightDataObj.value[ele.id] = ele;
|
|
|
+ if (i <= 12) {
|
|
|
+ colorData.value[ele.id] = colorList[i];
|
|
|
+ } else {
|
|
|
+ let index = Math.floor(i % 12);
|
|
|
+ colorData.value[ele.id] = colorList[index];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ (err) => {
|
|
|
+ loading.value = false;
|
|
|
+ }
|
|
|
+ );
|
|
|
+};
|
|
|
+getRightData();
|
|
|
+
|
|
|
+const clickToday = () => {
|
|
|
+ today.value = moment().format("yyyy-MM-DD");
|
|
|
+ month.value = moment().format("yyyy年MM月");
|
|
|
+ monthOne.value = moment().format("yyyy-MM");
|
|
|
+ getRightData();
|
|
|
+};
|
|
|
+
|
|
|
+const isShow = (day) => {
|
|
|
+ let nowDay = new Date(day + " 23:59:59").getTime();
|
|
|
+ let flag = false;
|
|
|
+ for (let i = 0; i < rightData.value.length; i++) {
|
|
|
+ const e = rightData.value[i];
|
|
|
+ let startDay = new Date(e.produceTime).getTime();
|
|
|
+ let endDay = new Date(e.deliveryPeriod + " 23:59:59").getTime();
|
|
|
+ if (nowDay >= startDay && nowDay <= endDay) {
|
|
|
+ flag = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return flag;
|
|
|
+};
|
|
|
+
|
|
|
+const judgeDay = (day) => {
|
|
|
+ // return dateList.value[day] && dateList.value[day].length > 0;
|
|
|
+ let nowDay = new Date(day + " 23:59:59").getTime();
|
|
|
+ let rows = [];
|
|
|
+ for (let i = 0; i < rightData.value.length; i++) {
|
|
|
+ const e = rightData.value[i];
|
|
|
+ let startDay = new Date(e.produceTime).getTime();
|
|
|
+ let endDay = new Date(e.deliveryPeriod + " 23:59:59").getTime();
|
|
|
+ if (nowDay >= startDay && nowDay <= endDay) {
|
|
|
+ rows.push(e.id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return rows;
|
|
|
+};
|
|
|
+
|
|
|
+const showData = ref([]);
|
|
|
+const onShow = (day) => {
|
|
|
+ let rows = judgeDay(day);
|
|
|
+ showData.value = rows;
|
|
|
+};
|
|
|
+
|
|
|
+const getData = (id, att) => {
|
|
|
+ const current = rightData.value.find((x) => x.id == id);
|
|
|
+ if (current && current[att]) {
|
|
|
+ return current[att];
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const selectDate = (val) => {
|
|
|
+ calendar.value.selectDate(val);
|
|
|
+};
|
|
|
+
|
|
|
+const prevMonth = () => {
|
|
|
+ month.value = moment(
|
|
|
+ moment(month.value, "yyyy年MM月").add(-1, "month").calendar()
|
|
|
+ ).format("yyyy年MM月");
|
|
|
+ monthOne.value = moment(moment(month.value, "yyyy年MM月")).format("yyyy-MM");
|
|
|
+ selectDate("prev-month");
|
|
|
+ getRightData();
|
|
|
+};
|
|
|
+const nextMonth = () => {
|
|
|
+ month.value = moment(
|
|
|
+ moment(month.value, "yyyy年MM月").add(+1, "month").calendar()
|
|
|
+ ).format("yyyy年MM月");
|
|
|
+ monthOne.value = moment(moment(month.value, "yyyy年MM月")).format("yyyy-MM");
|
|
|
+ selectDate("next-month");
|
|
|
+ getRightData();
|
|
|
+};
|
|
|
+
|
|
|
+watch(
|
|
|
+ () => today.value,
|
|
|
+ (newValue) => {
|
|
|
+ if (month.value !== moment(newValue).format("yyyy年MM月")) {
|
|
|
+ month.value = moment(newValue).format("yyyy年MM月");
|
|
|
+ monthOne.value = moment(moment(month.value, "yyyy年MM月")).format(
|
|
|
+ "yyyy-MM"
|
|
|
+ );
|
|
|
+ getRightData();
|
|
|
+ }
|
|
|
+ }
|
|
|
+);
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+::v-deep(.el-progress__text) {
|
|
|
+ font-size: 14px !important;
|
|
|
+}
|
|
|
+.content {
|
|
|
+ padding: 20px;
|
|
|
+}
|
|
|
+.pic {
|
|
|
+ object-fit: contain;
|
|
|
+ width: 50px;
|
|
|
+ height: 50px;
|
|
|
+ cursor: pointer;
|
|
|
+ vertical-align: middle;
|
|
|
+}
|
|
|
+.table {
|
|
|
+ border-collapse: collapse;
|
|
|
+ border-spacing: 0;
|
|
|
+ width: 100%;
|
|
|
+ td {
|
|
|
+ text-align: left;
|
|
|
+ padding: 10px;
|
|
|
+ font-size: 13px;
|
|
|
+ // padding: 5px 10px;
|
|
|
+ .top-title {
|
|
|
+ font-weight: 700;
|
|
|
+ margin-bottom: 5px;
|
|
|
+ }
|
|
|
+ .bigImg {
|
|
|
+ object-fit: contain;
|
|
|
+ width: 160px;
|
|
|
+ height: 320px;
|
|
|
+ cursor: pointer;
|
|
|
+ margin-top: 10px;
|
|
|
+ vertical-align: middle;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+.son {
|
|
|
+ td {
|
|
|
+ text-align: left;
|
|
|
+ padding: 5px !important;
|
|
|
+ }
|
|
|
+}
|
|
|
+.no-bk {
|
|
|
+ // background: #f3f3f3;
|
|
|
+ // height: 50px;
|
|
|
+}
|
|
|
+.red {
|
|
|
+ background: red;
|
|
|
+ border-radius: 2px;
|
|
|
+ padding: 4px;
|
|
|
+ color: #fff;
|
|
|
+}
|
|
|
+
|
|
|
+.schedule-right {
|
|
|
+ // width: 400px;
|
|
|
+ .schedule-top {
|
|
|
+ width: 100%;
|
|
|
+ background: #fff;
|
|
|
+ padding: 20px;
|
|
|
+ }
|
|
|
+ .schedule-bottom {
|
|
|
+ width: 100%;
|
|
|
+ background: #fff;
|
|
|
+ height: calc(100vh - 100px - 20px - 83px);
|
|
|
+ padding: 10px;
|
|
|
+ margin-top: 10px;
|
|
|
+ overflow-y: auto;
|
|
|
+ &::-webkit-scrollbar {
|
|
|
+ width: 0px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .line-class {
|
|
|
+ height: 18px;
|
|
|
+ line-height: 18px;
|
|
|
+ overflow: hidden;
|
|
|
+ white-space: nowrap;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ -o-text-overflow: ellipsis;
|
|
|
+ margin: 1px 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+::v-deep(.el-calendar__header) {
|
|
|
+ display: none;
|
|
|
+}
|
|
|
+::v-deep(.el-calendar__body) {
|
|
|
+ padding: 0;
|
|
|
+}
|
|
|
+::v-deep(.el-calendar-table .el-calendar-day) {
|
|
|
+ // padding: 0;
|
|
|
+ // min-height: 50px;
|
|
|
+ font-size: 12px;
|
|
|
+ // min-height: calc((100vh - 100px - 20px - 83px - 80px) / 5);
|
|
|
+ height: auto;
|
|
|
+ overflow-y: hidden;
|
|
|
+}
|
|
|
+</style>
|