马宇豪
2024-07-08 20b0ce2db27b64a60de60aee05dedd448099e330
src/views/specialWorkSystem/specialIndex/index.vue
@@ -20,7 +20,7 @@
        <div class="chart-tit">
          <span class="tit">八大作业各分类分布图</span>
          <div class="filter-part filter-part2">
            <el-cascader :teleported="false" v-model="chartSearch1.searchDep" :options="departmentList" :props="casProps" :show-all-levels="false" size="small"/>
            <el-cascader :teleported="false" v-model="chartSearch1.depId" @change="changeDep1()" :options="departmentList" :props="casProps" :show-all-levels="false" size="small"/>
          </div>
        </div>
        <div class="chart" :id="zyfb"></div>
@@ -36,8 +36,8 @@
        <div class="chart-tit">
          <span class="tit">各事业部关联作业分析</span>
          <div class="filter-part">
            <el-cascader :teleported="false" v-model="chartSearch2.searchDep" :options="departmentList" :props="casProps" :show-all-levels="false" size="small"/>
            <el-select v-model="chartSearch2.type" size="small" :teleported="false">
            <el-cascader :teleported="false" v-model="chartSearch2.depId" @change="changeDep2()" :options="departmentList" :props="casProps" :show-all-levels="false" size="small"/>
            <el-select v-model="chartSearch2.type" size="small" :teleported="false" @change="changeType2()">
              <el-option
                  v-for="item in workType1"
                  :key="item.id"
@@ -56,7 +56,7 @@
        <div class="chart-tit">
          <span class="tit">关联作业趋势图</span>
          <div class="filter-part filter-part2">
            <el-cascader :teleported="false" v-model="chartSearch3.searchDep" :options="departmentList" :props="casProps" :show-all-levels="false" size="small"/>
            <el-cascader :teleported="false" v-model="chartSearch3.depId" @change="changeDep3()" :options="departmentList" :props="casProps" :show-all-levels="false" size="small"/>
          </div>
        </div>
        <div class="chart" :id="zyqs"></div>
@@ -64,22 +64,22 @@
      <div class="chart-item">
        <dv-border-box10 v-if="isFull==true" class="item-bg"></dv-border-box10>
        <div class="chart-tit">
          <span class="tit">异常警报关联人</span>
          <span class="tit">作业警报记录</span>
          <div class="filter-part">
            <el-switch
                v-model="chartSearch4.type"
                inline-prompt
                style="--el-switch-on-color: #13ce66; --el-switch-off-color: #13ce66"
                active-text="作业人"
                inactive-text="监护人"
            />
            <el-select :teleported="false" v-model="chartSearch4.period" size="small">
              <el-option label="近7天" value="week"/>
              <el-option label="近30天" value="month"/>
              <el-option label="近90天" value="season"/>
              <el-option label="近1年" value="year"/>
<!--            <el-switch-->
<!--                v-model="chartSearch4.type"-->
<!--                inline-prompt-->
<!--                style="&#45;&#45;el-switch-on-color: #13ce66; &#45;&#45;el-switch-off-color: #13ce66"-->
<!--                active-text="作业人"-->
<!--                inactive-text="监护人"-->
<!--            />-->
            <el-select :teleported="false" v-model="chartSearch4.days" size="small" @change="(value)=>changeTime4(value)">
              <el-option label="近7天" :value="7"/>
              <el-option label="近30天" :value="30"/>
              <el-option label="近90天" :value="90"/>
              <el-option label="近1年" :value="365"/>
            </el-select>
            <el-select :teleported="false" v-model="chartSearch4.workType" size="small">
            <el-select :teleported="false" v-model="chartSearch4.workType" size="small" @change="changeType4()">
              <el-option
                  v-for="item in workType1"
                  :key="item.id"
@@ -91,17 +91,17 @@
        </div>
        <div class="chart">
          <el-table ref="multipleTableRef" :data="warningData" style="width: 100%" stripe border :header-cell-style="{ background: '#fafafa' }">
            <el-table-column property="name" label="姓名" align="center"/>
            <el-table-column property="dep" label="所属部门" align="center"/>
            <el-table-column property="warning" label="异常报警次数" align="center"/>
            <el-table-column property="role" label="角色" align="center"/>
            <el-table-column property="isCard" label="是否持证" align="center">
              <template #default="scope">
                <span>{{scope.row.isCard == 1?'是':'否'}}</span>
              </template>
            </el-table-column>
            <el-table-column property="operatorUname" label="姓名" align="center"/>
            <el-table-column property="deptName" label="所属部门" align="center"/>
            <el-table-column property="warningCount" label="异常报警次数" align="center"/>
<!--            <el-table-column property="role" label="角色" align="center"/>-->
<!--            <el-table-column property="isCard" label="是否持证" align="center">-->
<!--              <template #default="scope">-->
<!--                <span>{{scope.row.isCard == 1?'是':'否'}}</span>-->
<!--              </template>-->
<!--            </el-table-column>-->
          </el-table>
          <el-button type="text" size="small" style="margin-top: 10px">所有记录>></el-button>
<!--          <el-button type="text" size="small" style="margin-top: 10px">所有记录>></el-button>-->
        </div>
        <!--            <div class="chart" :id="slfx"></div>-->
      </div>
@@ -110,12 +110,12 @@
      <div class="homeCard">
        <dv-border-box10 v-if="isFull==true" class="item-bg"></dv-border-box10>
        <el-row>
          <el-col :span="5" style="display:flex;align-items: center">
          <el-col :span="4" style="display:flex;align-items: center">
            <span style="white-space: nowrap">作业类型:</span>
            <div class="grid-content topInfo">
              <el-select :teleported="false" v-model="searchWord" size="small">
              <el-select :teleported="false" v-model="searchParams.workType" size="small">
                <el-option
                    v-for="item in workType"
                    v-for="item in workTypeList"
                    :key="item.id"
                    :label="item.name"
                    :value="item.id"
@@ -123,12 +123,12 @@
              </el-select>
            </div>
          </el-col>
          <el-col :span="5" style="display:flex;align-items: center">
          <el-col :span="4" style="display:flex;align-items: center">
            <span style="white-space: nowrap">作业状态:</span>
            <div class="grid-content topInfo">
              <el-select :teleported="false" v-model="searchStatus" size="small">
              <el-select :teleported="false" v-model="searchParams.workAllStatus" size="small">
                <el-option
                    v-for="item in workStatus"
                    v-for="item in workStatusList"
                    :key="item.value"
                    :label="item.name"
                    :value="item.value"
@@ -136,12 +136,12 @@
              </el-select>
            </div>
          </el-col>
          <el-col :span="5" style="display:flex;align-items: center">
            <span style="white-space: nowrap">作业部门:</span>
            <div class="grid-content topInfo">
              <el-cascader :teleported="false" size="small" v-model="searchDep" :options="departmentList" :props="casProps" :show-all-levels="false"/>
            </div>
          </el-col>
<!--          <el-col :span="4" style="display:flex;align-items: center">-->
<!--            <span style="white-space: nowrap">作业部门:</span>-->
<!--            <div class="grid-content topInfo">-->
<!--              <el-cascader :teleported="false" size="small" v-model="searchParams.workDepId" :options="departmentList" :props="casProps" :show-all-levels="false"/>-->
<!--            </div>-->
<!--          </el-col>-->
          <el-col :span="6" style="display:flex;align-items: center;">
            <span style="white-space: nowrap;margin-left: 20px">申请时间:</span>
            <div class="grid-content topInfo">
@@ -158,82 +158,124 @@
              />
            </div>
          </el-col>
          <el-col :span="4" style="display:flex;align-items: center">
            <span style="white-space: nowrap;margin-left: 20px">作业票编号:</span>
            <div class="grid-content topInfo">
              <el-input
                  v-model="searchParams.workPermitNo"
                  placeholder="请输入作业票编号"
                  size="small"
              />
            </div>
          </el-col>
          <el-button type="primary" style="margin-left: 20px" @click="searchRecord" size="small">查询</el-button>
          <el-button plain @click="clearSearch" size="small">重置</el-button>
        </el-row>
        <div class="main-card">
          <el-row class="cardTop" style="justify-content: space-between">
            <el-col :span="2" class="mainCardBtn">
              <el-button type="primary" :icon="Plus" size="default" @click="toApply()">新作业申请</el-button>
            </el-col>
            <el-col :span="22" style="display: flex;justify-content: end;align-items: center">
              <div class="top-info">
                <el-icon :size="18" color="#F3001E" style="margin-right: 4px"><BellFilled /></el-icon>
                作业编号
                <div v-if="unchecked != 0">
                  <el-tooltip
                      class="box-item"
                      effect="light"
                      content="查看预警详情"
                      placement="bottom-start"
                  ><span>123456</span></el-tooltip>
                </div>
                可燃气体浓度超过18%
                ,请及时处理!
              </div>
              <el-button type="primary" :icon="Refresh" size="default" @click="reLoadData()" />
            </el-col>
          </el-row>
<!--          <el-row class="cardTop" style="justify-content: space-between">-->
<!--            <el-col :span="2" class="mainCardBtn">-->
<!--              <el-button type="primary" :icon="Plus" size="default" @click="toApply()">新作业申请</el-button>-->
<!--            </el-col>-->
<!--            <el-col :span="22" style="display: flex;justify-content: end;align-items: center">-->
<!--              <div class="top-info">-->
<!--                <el-icon :size="18" color="#F3001E" style="margin-right: 4px"><BellFilled /></el-icon>-->
<!--                作业编号-->
<!--                <div v-if="unchecked != 0">-->
<!--                  <el-tooltip-->
<!--                      class="box-item"-->
<!--                      effect="light"-->
<!--                      content="查看预警详情"-->
<!--                      placement="bottom-start"-->
<!--                  ><span>123456</span></el-tooltip>-->
<!--                </div>-->
<!--                可燃气体浓度超过18%-->
<!--                ,请及时处理!-->
<!--              </div>-->
<!--              <el-button type="primary" :icon="Refresh" size="default" @click="reLoadData()" />-->
<!--            </el-col>-->
<!--          </el-row>-->
          <el-table ref="multipleTableRef" stripe border :data="workData" style="width: 100%" :header-cell-style="{ background: '#fafafa' }">
            <el-table-column property="num" label="作业证编号" align="center"/>
            <el-table-column property="dep" label="部门" align="center"/>
            <el-table-column property="applyer" label="申请人" align="center"/>
            <el-table-column property="worker" label="作业人" align="center"/>
            <el-table-column property="type" label="作业类型" align="center"/>
            <el-table-column property="level" label="作业等级" align="center"/>
            <el-table-column property="workPermitNo" label="作业证编号" align="center"/>
            <el-table-column label="作业单位" align="center">
              <template #default="scope">
                <span v-if="scope.row.workDepList && scope.row.workDepList.length>0">{{scope.row.workDepList.map(i=>i.workDepName).join(',')}}</span>
                <span v-else>{{scope.row.workDepName }}</span>
              </template>
            </el-table-column>
            <el-table-column property="applyUname" label="申请人" align="center"/>
            <el-table-column property="applyDepName" label="申请单位" align="center"/>
            <el-table-column property="applyTime" label="申请时间" align="center"/>
            <el-table-column property="startTime" label="作业开始时间" align="center"/>
            <el-table-column property="endTime" label="作业结束时间" align="center"/>
            <el-table-column label="作业状态" align="center">
            <el-table-column property="startUname" label="开始人" align="center">
              <template #default="scope">
                <el-tag>{{ scope.row.status==0?'进行中':scope.row.status==1?'作业中止':scope.row.status==2?'作业结束验收': '作业完成'}}</el-tag>
                <span>{{scope.row.startUname?scope.row.startUname:'--'}}</span>
              </template>
            </el-table-column>
            <el-table-column property="reason" label="中止原因" align="center"/>
            <el-table-column label="安全预警" align="center">
            <el-table-column property="finishUname" label="结束人" align="center">
              <template #default="scope">
                <el-tag :type="scope.row.warning==0?'success':(scope.row.warning==1||scope.row.warning==2)?'warning':'danger'">{{ scope.row.warning==0?'正常':'报警' }}</el-tag>
                <span>{{scope.row.finishUname?scope.row.finishUname:'--'}}</span>
              </template>
            </el-table-column>
            <el-table-column property="message" label="报警信息" align="center">
            <el-table-column property="workStartTime" label="作业开始时间" align="center">
              <template #default="scope">
                <el-button type="text" size="small" v-if="scope.row.message == 1">查看</el-button>
                <span v-else>无</span>
                <span>{{scope.row.workStartTime?scope.row.workStartTime:'--'}}</span>
              </template>
            </el-table-column>
            <el-table-column property="workFinishTime" label="作业结束时间" align="center">
              <template #default="scope">
                <span>{{scope.row.workFinishTime?scope.row.workFinishTime:'--'}}</span>
              </template>
            </el-table-column>
            <el-table-column property="acceptUname" label="验收人" align="center">
              <template #default="scope">
                <span>{{scope.row.acceptUname?scope.row.acceptUname:'--'}}</span>
              </template>
            </el-table-column>
            <el-table-column property="workAcceptContent" label="验收内容" align="center">
              <template #default="scope">
                <span>{{scope.row.workAcceptContent?scope.row.workAcceptContent:'--'}}</span>
              </template>
            </el-table-column>
            <el-table-column property="workAcceptTime" label="验收时间" align="center">
              <template #default="scope">
                <span>{{scope.row.workAcceptTime?scope.row.workAcceptTime:'--'}}</span>
              </template>
            </el-table-column>
            <el-table-column property="workTypeDesc" label="作业类型" align="center"/>
            <el-table-column property="workLevelDesc" label="作业等级" align="center"/>
            <el-table-column property="abortReason" label="中止原因" align="center">
              <template #default="scope">
                <span>{{scope.row.abortReason?scope.row.abortReason:'--'}}</span>
              </template>
            </el-table-column>
            <el-table-column property="workAllStatusDesc" label="作业状态" align="center"/>
            <el-table-column fixed="right" label="操作" align="center" width="250">
              <template #default="scope">
                <el-button link type="primary" size="small" :icon="View" @click="viewRecord(scope.row)">查看作业票</el-button>
                <el-button link type="primary" size="small" :icon="FolderChecked" @click="handleReview(scope.row)">验收</el-button>
                <el-button link type="primary" size="small" :icon="VideoPlay" @click="openVideo(scope.row)">查看实时监控</el-button>
                <el-button link
                 v-if="scope.row.workAllStatus == -1|| scope.row.workAllStatus == 1 || scope.row.workAllStatus == 3 || scope.row.workAllStatus == 7"
                  type="primary" size="small" :icon="VideoPlay" @click="openVideo(scope.row)">查看监控视频</el-button>
                <el-button link type="primary" size="small" :icon="View" @click="viewRecord(scope.row.workApplyId)">查看记录</el-button>
                <el-button link type="primary" size="small" :icon="View" @click="viewTicket(scope.row)">查看作业票</el-button>
                <el-button link type="primary" size="small" :icon="Download" @click="downLoadTicket(scope.row)">导出作业票</el-button>
<!--                <el-button link type="primary" size="small" :icon="FolderChecked" @click="handleReview(scope.row)">验收</el-button>-->
              </template>
            </el-table-column>
          </el-table>
          <div class="pageBtn">
            <el-pagination v-model:currentPage="pageIndex1" v-model:page-size="pageSize1" :page-sizes="[10, 15]" small="false" background layout="total, sizes, prev, pager, next, jumper" :total="totalSize1" @size-change="handleSizeChange1" @current-change="handleCurrentChange1" />
            <el-pagination v-model:currentPage="pageIndex" v-model:page-size="pageSize" :page-sizes="[10, 15]" small="false" background layout="total, sizes, prev, pager, next, jumper" :total="totalSize" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
          </div>
        </div>
      </div>
    </div>
    <el-dialog v-model="dialogDetails" title="作业申请详情" center>
      <fire v-if="dialogType == 1" :details = details></fire>
      <space v-else-if="dialogType == 2" :details = details></space>
      <hoist v-else-if="dialogType == 3" :details = details></hoist>
      <ground v-else-if="dialogType == 4" :details = details></ground>
      <broken v-else-if="dialogType == 5" :details = details></broken>
      <height v-else-if="dialogType == 6" :details = details></height>
      <power v-else-if="dialogType == 7" :details = details></power>
      <plate v-else :details = details></plate>
<!--      <fire v-if="dialogType == 1" :details = details></fire>-->
<!--      <space v-else-if="dialogType == 2" :details = details></space>-->
<!--      <hoist v-else-if="dialogType == 3" :details = details></hoist>-->
<!--      <ground v-else-if="dialogType == 4" :details = details></ground>-->
<!--      <broken v-else-if="dialogType == 5" :details = details></broken>-->
<!--      <height v-else-if="dialogType == 6" :details = details></height>-->
<!--      <power v-else-if="dialogType == 7" :details = details></power>-->
<!--      <plate v-else :details = details></plate>-->
<!--      <detail-log :type=dialogType :statusList=statusList :details = details></detail-log>-->
      <template #footer>
              <span class="dialog-footer">
                <el-button type="primary" @click="dialogDetails = false"
@@ -242,24 +284,25 @@
              </span>
      </template>
    </el-dialog>
    <el-dialog v-model="dialogReview" title="填报验收意见" center>
      <el-form ref="reviewFormRef" :model="reviewForm" :rules="reviewRules" label-width="120px">
        <el-form-item label="填报验收意见:" prop="advice">
          <el-input
              v-model="reviewForm.advice"
              :autosize="{ minRows: 4, maxRows: 10 }"
              type="textarea"
              placeholder="请填写验收意见"
          />
        </el-form-item>
      </el-form>
      <template #footer>
              <span class="dialog-footer">
                <el-button type="primary" @click="submitReview(reviewFormRef)">提交验收</el-button>
              </span>
      </template>
    </el-dialog>
<!--    <el-dialog v-model="dialogReview" title="填报验收意见" center>-->
<!--      <el-form ref="reviewFormRef" :model="reviewForm" :rules="reviewRules" label-width="120px">-->
<!--        <el-form-item label="填报验收意见:" prop="advice">-->
<!--          <el-input-->
<!--              v-model="reviewForm.advice"-->
<!--              :autosize="{ minRows: 4, maxRows: 10 }"-->
<!--              type="textarea"-->
<!--              placeholder="请填写验收意见"-->
<!--          />-->
<!--        </el-form-item>-->
<!--      </el-form>-->
<!--      <template #footer>-->
<!--              <span class="dialog-footer">-->
<!--                <el-button type="primary" @click="submitReview(reviewFormRef)">提交验收</el-button>-->
<!--              </span>-->
<!--      </template>-->
<!--    </el-dialog>-->
    <video-detail ref="videoRef"></video-detail>
    <Work-record ref="recordRef"></Work-record>
  </div>
</template>
@@ -273,16 +316,17 @@
import { Edit, View, Plus, Delete, Refresh, Search, Finished, Download, FolderChecked, VideoPlay } from '@element-plus/icons-vue';
import { ElTable, ElMessage } from 'element-plus';
import { specialIndexApi } from '/@/api/specialWorkSystem/specialIndex';
import { workApplyApi } from '/@/api/specialWorkSystem/workApply';
import type { TabsPaneContext } from 'element-plus';
import type { FormInstance, FormRules } from 'element-plus'
import {teamManageApi} from "/@/api/systemManage/basicDateManage/personShiftManage/teamManage";
import { workApplyApi } from '/@/api/specialWorkSystem/workApply'
import Cookies from 'js-cookie';
import axios from 'axios';
import * as echarts from "echarts";
import screenfull from "screenfull";
import VideoDetail from "/@/views/specialWorkSystem/specialIndex/components/videoDetail.vue";
import WorkRecord from "/@/views/specialWorkSystem/specialIndex/components/workRecord.vue";
import { BorderBox10 as DvBorderBox10 } from '@kjgl77/datav-vue3'
import {productionDeviceApi} from "/@/api/doublePreventSystem/productionDevice";
// 定义接口来定义对象的类型
interface stateType {
@@ -293,10 +337,11 @@
  approveInfo: Object;
  dialogDetails: boolean;
  dialogReview: boolean;
  pageIndex1: number;
  pageSize1: number;
  chosenIndex: null | number;
  searchWord: number | null;
  pageIndex: number;
  pageSize: number;
  searchParams: {};
  workStatusList: Array<status>;
  workTypeList: Array<type>;
  searchStatus: number | null;
  chartSearch1: object;
  chartSearch2: object;
@@ -305,23 +350,23 @@
  searchDep2: number | null;
  searchDep: number | null;
  searchDate: Array<any>,
  totalSize1: number;
  totalSize: number;
  details: {};
  workType: Array<type>;
  workType1: Array<type>;
  dialogType: number | null;
  departmentList: Array<any>;
  departmentRecursionList: Array<DepartmentState>;
  workStatus: Array<status>;
  reviewForm: object;
  reviewRules: object;
  warningData: Array<any>;
  isFull:boolean;
  themeColor:string;
  endTime:string
  pieData: Array<status>
  squareData: Array<status>
}
interface type {
  id: number;
  id: number | null;
  name: string;
}
interface status {
@@ -341,133 +386,66 @@
  name: 'specialIndex',
  components: {
    VideoDetail,
    fire: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsq/components/fireLog.vue')),
    space: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsq/components/spaceLog.vue')),
    hoist: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsq/components/hoistLog.vue')),
    ground: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsq/components/groundLog.vue')),
    broken: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsq/components/brokenLog.vue')),
    height: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsq/components/heightLog.vue')),
    power: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsq/components/powerLog.vue')),
    plate: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsq/components/plateLog.vue'))
    WorkRecord,
    // fire: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/fireLog.vue')),
    // space: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/spaceLog.vue')),
    // hoist: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/hoistLog.vue')),
    // ground: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/groundLog.vue')),
    // broken: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/brokenLog.vue')),
    // height: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/heightLog.vue')),
    // power: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/powerLog.vue')),
    // plate: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/plateLog.vue'))
  },
  setup() {
    const userInfo = useUserInfo();
    const { userInfos } = storeToRefs(userInfo);
    const router = useRouter();
    const userInfo = useUserInfo()
    const { userInfos } = storeToRefs(userInfo)
    const router = useRouter()
    const reviewFormRef = ref<FormInstance>()
    const zyfb = ref("eChartZyfb" + Date.now() + Math.random())
    const slfx = ref("eChartSlfx" + Date.now() + Math.random())
    const zyqs = ref("eChartZyqs" + Date.now() + Math.random())
    const videoRef = ref();
    const videoRef = ref()
    const recordRef = ref()
    const state = reactive<stateType>({
      pageIndex1: 1,
      pageSize1: 10,
      totalSize1: 0,
      pageIndex: 1,
      pageSize: 10,
      totalSize: 0,
      dialogType: null,
      searchParams: {
        workType: null,
        workDepId: null,
        workPermitNo: '',
        startTime: '',
        endTime: '',
        workAllStatus: null
      },
      dialogReview: false,
      departmentList: [],
      departmentRecursionList: [],
      chosenIndex: null,
      searchWord: null,
      searchStatus: null,
      endTime: '',
      chartSearch1: {
        searchDep: null,
        depId: 1,
        startTime: '',
        days: 30
      },
      chartSearch2: {
        searchDep: null,
        type: 0
        depId: 1,
        // startTime: '',
        type: null
      },
      chartSearch3: {
        searchDep: null
        depId: 1
      },
      chartSearch4: {
        searchDep: null,
        startTime: '',
        days: 30
        days: 30,
        workType: 1
      },
      searchDep2: null,
      searchDep: null,
      searchDate: [],
      workData: [
        {
          num: '111',
          dep: '部门1',
          applyer: '张凤',
          worker: '李羽飞',
          type: '动火作业',
          level: '一级',
          applyTime: '2023-03-08',
          startTime: '2023-03-08',
          endTime: '2023-03-08',
          status: 0,
          reason: '分析超时',
          warning: 0,
          message: 1
        },
        {
          num: '222',
          dep: '部门2',
          applyer: '张凤',
          worker: '李羽飞',
          type: '动土作业',
          level: '一级',
          applyTime: '2023-03-08',
          startTime: '2023-03-08',
          endTime: '2023-03-08',
          status: 1,
          reason: '分析超时',
          warning: 1,
          message: 0
        },
        {
          num: '333',
          dep: '部门3',
          applyer: '张凤',
          worker: '李羽飞',
          type: '动火作业',
          level: '一级',
          applyTime: '2023-03-08',
          startTime: '2023-03-08',
          endTime: '2023-03-08',
          status: 2,
          reason: '分析超时',
          warning: 2,
          message: 0
        },
        {
          num: '222',
          dep: '部门2',
          applyer: '张凤',
          worker: '李羽飞',
          type: '动土作业',
          level: '一级',
          applyTime: '2023-03-08',
          startTime: '2023-03-08',
          endTime: '2023-03-08',
          status: 1,
          reason: '分析超时',
          warning: 1,
          message: 0
        },
        {
          num: '333',
          dep: '部门3',
          applyer: '张凤',
          worker: '李羽飞',
          type: '动火作业',
          level: '一级',
          applyTime: '2023-03-08',
          startTime: '2023-03-08',
          endTime: '2023-03-08',
          status: 2,
          reason: '分析超时',
          warning: 2,
          message: 0
        }
      ],
      workData: [],
      isFull: false,
      themeColor: '#333',
      workTimeList: [],
@@ -486,7 +464,7 @@
      dialogDetails: false,
      details: {},
      workType1: [
        { id: 0, name: '所有作业' },
        { id: null, name: '所有作业' },
        { id: 1, name: '动火作业' },
        { id: 2, name: '受限空间作业' },
        { id: 3, name: '吊装作业' },
@@ -496,7 +474,7 @@
        { id: 7, name: '临时用电作业' },
        { id: 8, name: '盲板抽堵作业' }
      ],
      workType: [
      workTypeList: [
        { id: 1, name: '动火作业' },
        { id: 2, name: '受限空间作业' },
        { id: 3, name: '吊装作业' },
@@ -506,47 +484,23 @@
        { id: 7, name: '临时用电作业' },
        { id: 8, name: '盲板抽堵作业' }
      ],
      workStatus: [
      workStatusList: [
        {
          name: '作业进行中',
          value: 0
          name: '未开始',
          value: -1
        },
        {
          name: '作业终止',
          name: '开始',
          value: 1
        },
        {
          name: '作业结束待验收',
          name: '结束',
          value: 2
        },
        {
          name: '作业完成',
          value: 3
        }
      ],
      warningData: [
        {
          name: '黄公子',
          dep: '有机事业部',
          warning: 69,
          role: '作业人',
          isCard: 1
        },
        {
          name: '李飞飞',
          dep: '有机事业部',
          warning: 51,
          role: '监护人',
          isCard: 0
        },
        {
          name: '黄公子',
          dep: '有机事业部',
          warning: 69,
          role: '作业人',
          isCard: 1
        }
      ],
      pieData: [],
      squareData: [],
      warningData: [],
      reviewForm: {
        advice: ''
      },
@@ -556,34 +510,56 @@
    });
    // 页面载入时执行方法
    onMounted(() => {
      // getListByPage();
      initTime()
      getMydepList()
      getAllDepartment();
      initZyfb()
      initSlfx()
      initZyqs()
      state.endTime = formatDate(new Date())
      // state.chartSearch1.startTime = getPeriod(30)
      console.log(state.chartSearch1.startTime,state.endTime,'默认时间段')
      getTypePie()
      getWorkDep()
      getDepMonth()
      getWarningList()
    });
    const initTime =()=>{
      state.chartSearch1.startTime = getPeriod(30)
      state.chartSearch2.startTime = getPeriod(30)
      state.chartSearch4.startTime = getPeriod(30)
      state.endTime = formatDate(new Date())
    }
    const getPeriod =(num)=> {
      const currentDate = new Date();
      const startTime = new Date();
      startTime.setDate(currentDate.getDate() - num);
      startTime.setDate(currentDate.getDate() - num - 1);
      return formatDate(startTime)
    }
    const formatDate =(date)=> {
      const year = date.getFullYear().toString().slice(-2);
      const year = date.getFullYear().toString();
      const month = ('0' + (date.getMonth() + 1)).slice(-2);
      const day = ('0' + date.getDate()).slice(-2);
      return `${year}-${month}-${day} 00:00:00`;
      return `${year}-${month}-${day} 23:59:59`;
    }
    const changeTime1=(value:number)=>{
      state.chartSearch1.startTime = getPeriod(value)
      console.log(state.chartSearch1.startTime,state.endTime,'结束段')
      getTypePie()
    }
    const changeTime2=(value:number)=>{
    const changeTime4=(value:number)=>{
      state.chartSearch4.startTime = getPeriod(value)
      console.log(state.chartSearch4.startTime,state.endTime,'结束段')
      getWarningList()
    }
    const changeDep1=()=>{
      getTypePie()
    }
    const changeDep2=()=>{
      getWorkDep()
    }
    const changeType2=()=>{
      getWorkDep()
    }
    const changeType4=()=>{
      getWarningList()
    }
    const changeDep3=()=>{
      getDepMonth()
    }
    const toFullscreen =()=>{
      const element = document.getElementById('bigScreen')
@@ -598,14 +574,95 @@
      }else{
        state.themeColor = '#333'
      }
      initZyfb()
      initSlfx()
      initZyqs()
      initTime()
      getMydepList()
      getAllDepartment();
      getTypePie()
      getWorkDep()
      getDepMonth()
    }
    const getTypePie = async ()=>{
      let res = await specialIndexApi().analyseType(state.chartSearch1.startTime,state.chartSearch1.endTime,state.chartSearch1.searchDep);
      const data = {
        startTime: state.chartSearch1.startTime,
        endTime:state.endTime,
        depId:state.chartSearch1.depId
      }
      let res = await specialIndexApi().analyseType(data);
      if (res.data.code === '200') {
        console.log(res.data,'666666666')
        // console.log('饼图数据>>>', res.data.data)
        state.pieData = JSON.parse(JSON.stringify(res.data.data))
        initZyfb()
      } else {
        ElMessage({
          type: 'warning',
          message: res.data.msg
        });
      }
    }
    const getWorkDep = async ()=>{
      const data = {
        // startTime: state.chartSearch2.startTime,
        // endTime: state.endTime,
        depId:state.chartSearch2.depId,
        type: state.chartSearch2.type
      }
      let res = await specialIndexApi().analyseAllWork(data);
      if (res.data.code === '200') {
        state.squareData = JSON.parse(JSON.stringify(res.data.data))
        let names = state.squareData.map(i=>i.name)
        let vals = state.squareData.map(i=>i.value)
        initSlfx(names,vals)
      } else {
        ElMessage({
          type: 'warning',
          message: res.data.msg
        });
      }
    }
    const getDepMonth = async ()=>{
      let res = await specialIndexApi().analyseDepMonth(state.chartSearch3.depId);
      if (res.data.code === '200') {
        state.squareData = JSON.parse(JSON.stringify(res.data.data))
        let names = state.squareData.map(i=>i.name)
        let vals = state.squareData.map(i=>i.value)
        initZyqs(names,vals)
      } else {
        ElMessage({
          type: 'warning',
          message: res.data.msg
        });
      }
    }
    const getMydepList = async()=>{
      const dateRange = JSON.parse(JSON.stringify(state.searchDate))
      if(dateRange[1]){
        dateRange[1] = dateRange[1].replace('00:00:00','23:59:59')
        state.searchParams.startTime = dateRange[0]
        state.searchParams.endTime = dateRange[1]
      }else{
        state.searchParams.startTime = ''
        state.searchParams.endTime = ''
      }
      let res = await specialIndexApi().getMydepList({pageIndex: state.pageIndex,pageSize: state.pageSize,searchParams: state.searchParams})
      if (res.data.code === '200') {
        state.workData = JSON.parse(JSON.stringify(res.data.data))
        state.totalSize = res.data.total
      } else {
        ElMessage({
          type: 'warning',
          message: res.data.msg
        });
      }
    }
    const getWarningList = async()=>{
      const data = {
        startTime: state.chartSearch4.startTime,
        endTime: state.endTime,
        workType:state.chartSearch4.workType
      }
      let res = await specialIndexApi().getWorkWarning(data)
      if (res.data.code === '200') {
        state.warningData = JSON.parse(JSON.stringify(res.data.data))
      } else {
        ElMessage({
          type: 'warning',
@@ -637,7 +694,7 @@
        },
        series: [
          {
            name: 'Access From',
            name: '',
            type: 'pie',
            radius: ['40%', '70%'],
            avoidLabelOverlap: false,
@@ -668,16 +725,7 @@
                shadowColor: 'rgba(0, 0, 0, 0.5)'
              },
            },
            data: [
              { value: 1048, name: '动火作业' },
              { value: 735, name: '受限空间作业' },
              { value: 580, name: '吊装作业' },
              { value: 484, name: '动土作业' },
              { value: 735, name: '断路作业' },
              { value: 580, name: '高处作业' },
              { value: 484, name: '临时用电作业' },
              { value: 300, name: '盲板抽堵作业' }
            ]
            data: state.pieData
          }
        ]
      }
@@ -687,7 +735,7 @@
        myChart.resize();
      });
    }
    const initSlfx =()=>{
    const initSlfx =(names:Array<string>,vals:Array<any>)=>{
      let dom = document.getElementById(slfx.value);
      let myChart = echarts.init(dom);
      let option: EChartsOption;
@@ -707,7 +755,7 @@
        xAxis: [
          {
            type: 'category',
            data: ['事业部1', '事业部2', '事业部3', '事业部4', '事业部5', '事业部6', '事业部7'],
            data: names,
            axisTick: {
              alignWithLabel: true
            },
@@ -726,7 +774,7 @@
            name: 'Direct',
            type: 'bar',
            barWidth: '60%',
            data: [10, 52, 200, 334, 390, 330, 220]
            data: vals,
          }
        ]
      }
@@ -736,14 +784,14 @@
        myChart.resize();
      });
    }
    const initZyqs =()=>{
    const initZyqs =(names:Array<string>,vals:Array<any>)=>{
      let dom = document.getElementById(zyqs.value);
      let myChart = echarts.init(dom);
      let option: EChartsOption;
      option = {
        xAxis: {
          type: 'category',
          data: ['四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月', '一月', '二月', '三月'],
          data: names,
          axisLabel: {
            color: state.themeColor
          }
@@ -767,7 +815,7 @@
        },
        series: [
          {
            data: [150, 230, 224, 218, 135, 147, 230, 224, 218, 135, 147, 260],
            data: vals,
            type: 'line',
            label:{
              show: true
@@ -783,7 +831,7 @@
    }
    // 刷新
    const reLoadData = async () => {
      // getListByPage();
      getMydepList()
    };
    // 填写表单
@@ -832,107 +880,153 @@
    //   }
    // };
    // 表格数据格式化
    const toNames = (row, column, cellValue, index) => {
      if (row.list == []) {
        return [];
      } else {
        const nameList = [];
        for (let i = 0; i < row.list.length; i++) {
          for (let t = 0; t < state.workTimeList.length; t++) {
            if (row.list[i] == state.workTimeList[t].id) {
              nameList.push(state.workTimeList[t].name);
            }
          }
        }
        return nameList.join();
      }
    };
    // 关键词查询记录
    const searchRecord = async () => {
      if (state.searchWord == null && state.searchStatus == null && state.searchDep == null && state.searchDate == []) {
        ElMessage({
          type: 'warning',
          message: '请输入查询关键词'
        });
      } else {
        // getListByPage();
      }
      getMydepList()
    };
    // 重置搜索
    const clearSearch = async () => {
      state.searchWord = null;
      state.searchDep = null;
      state.searchParams = {
            workType:null,
            workDepId:null,
            workPermitNo: '',
            startTime: '',
            endTime: '',
            workAllStatus: null
      }
      state.searchDate = []
      // getListByPage();
      state.pageIndex = 1
      getMydepList()
    };
    const handleSizeChange1 = (val: number) => {
      state.pageSize1 = val;
      // getListByPage();
    const handleSizeChange = (val: number) => {
      state.pageSize = val;
      getMydepList()
    };
    const handleCurrentChange1 = (val: number) => {
      state.pageIndex1 = val;
      // getListByPage();
    const handleCurrentChange = (val: number) => {
      state.pageIndex = val;
      getMydepList()
    };
    // 查看记录
    const viewRecord = (row: any) => {
      state.dialogType = row.workType
      state.details = JSON.parse(JSON.stringify(row));
      if(state.details.workDetail.otherSpecialWork == '' || !state.details.workDetail.otherSpecialWork){
        state.details.workDetail.otherSpecialWork=[]
      }
      else {
        const a = state.details.workDetail.otherSpecialWork
        state.details.workDetail.otherSpecialWork = a.split(',').map((item) => {
          return state.workType.find((i: { id: number }) => i.id === Number(item))?.name;
        });
      }
      if(state.details.workDetail.involvedDepIds == '' || !state.details.workDetail.involvedDepIds){
        state.details.workDetail.involvedDepIds=[]
      }
      else {
        const a = state.details.workDetail.involvedDepIds
        state.details.workDetail.involvedDepIds = a.split(',').map((item) => {
          return state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(item))?.depName;
        });
      }
      if(state.details.workDetail.csDepId){
        state.details.workDetail.csDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.csDepId))?.depName;
      }
      if(state.details.workDetail.operationDepId){
        state.details.workDetail.operationDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.operationDepId))?.depName;
      }
      if(state.details.workDetail.gbPath){
        state.details.workDetail.gbPath = state.details.workDetail.gbPath.split(',')
      }
      if(state.details.workDetail.bcPath){
        state.details.workDetail.bcPath = state.details.workDetail.bcPath.split(',')
      }
      if(state.details.workDetail.bpLocationMapPath){
        state.details.workDetail.bpLocationMapPath = state.details.workDetail.bpLocationMapPath.split(',')
      }
      state.dialogDetails = true;
    };
    // const viewDetail = (row: any) => {
    //   state.dialogType = row.workType
    //   state.details = JSON.parse(JSON.stringify(row));
    //   if(state.details.workDetail.otherSpecialWork == '' || !state.details.workDetail.otherSpecialWork){
    //     state.details.workDetail.otherSpecialWork=[]
    //   }
    //   else {
    //     const a = state.details.workDetail.otherSpecialWork
    //     state.details.workDetail.otherSpecialWork = a.split(',').map((item) => {
    //       return state.workTypeList.find((i: { id: number }) => i.id === Number(item))?.name;
    //     });
    //   }
    //   if(state.details.workDetail.involvedDepIds == '' || !state.details.workDetail.involvedDepIds){
    //     state.details.workDetail.involvedDepIds=[]
    //   }
    //   else {
    //     const a = state.details.workDetail.involvedDepIds
    //     state.details.workDetail.involvedDepIds = a.split(',').map((item) => {
    //       return state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(item))?.depName;
    //     });
    //   }
    //   if(state.details.workDetail.csDepId){
    //     state.details.workDetail.csDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.csDepId))?.depName;
    //   }
    //   if(state.details.workDetail.operationDepId){
    //     state.details.workDetail.operationDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.operationDepId))?.depName;
    //   }
    //   if(state.details.workDetail.gbPath){
    //     state.details.workDetail.gbPath = state.details.workDetail.gbPath.split(',')
    //   }
    //   if(state.details.workDetail.bcPath){
    //     state.details.workDetail.bcPath = state.details.workDetail.bcPath.split(',')
    //   }
    //   if(state.details.workDetail.bpLocationMapPath){
    //     state.details.workDetail.bpLocationMapPath = state.details.workDetail.bpLocationMapPath.split(',')
    //   }
    //   state.dialogDetails = true;
    // };
    const handleReview = (row)=>{
      state.dialogReview = true
    // const handleReview = (row: object)=>{
    //   state.dialogReview = true
    // }
    const openVideo = (row:object)=>{
      videoRef.value.openDialog(row)
    }
    const openVideo = ()=>{
      videoRef.value.openDialog()
    const viewRecord = (id: string | null)=>{
      recordRef.value.openDialog(id)
    }
    const submitReview = async (formEl: FormInstance | undefined) => {
      if (!formEl) return
      await formEl.validate((valid, fields) => {
        if (valid) {
          console.log('submit!')
    const viewTicket = async(row)=>{
      let res = await workApplyApi().viewTicket({id:row.workApplyId})
      if(res.data.code == 200){
        console.log(res.data,666)
      }
      axios.post(import.meta.env.VITE_API_URL + `/specialwork9step/work/down/load/pdf`,{id: row.workApplyId},{headers:{'Content-Type': 'application/json','Authorization': `${Cookies.get('token')}`,'uid':`${Cookies.get('uid')}`},responseType: 'blob'}).then(res=>{
        if (res) {
          const link = document.createElement('a')
          let blob = new Blob([res.data],{type: 'application/pdf'})
          link.style.display = "none";
          link.href = URL.createObjectURL(blob); // 创建URL
          link.setAttribute("download", row.workPermitNo + "(" + row.workTypeDesc +")作业证.pdf");
          window.open(link)
        } else {
          console.log('error submit!', fields)
          ElMessage({
            type: 'warning',
            message: '预览失败'
          });
        }
      })
    }
    // 导出方法
    const downLoadTicket = async (row) => {
      // let res = await workApplyApi().postPrinting(data);
      axios.post(import.meta.env.VITE_API_URL + `/specialwork9step/work/down/load/pdf`,{id: row.workApplyId},{headers:{'Content-Type': 'application/json','Authorization': `${Cookies.get('token')}`,'uid':`${Cookies.get('uid')}`},responseType: 'blob'}).then(res=>{
        if (res) {
          const link = document.createElement('a')
          let blob = new Blob([res.data],{type: 'application/pdf'})
          link.style.display = "none";
          link.href = URL.createObjectURL(blob); // 创建URL
          link.setAttribute("download", row.workPermitNo + "(" + row.workTypeDesc +")作业证.pdf");
          document.body.appendChild(link);
          link.click();
          document.body.removeChild(link);
        } else {
          ElMessage({
            type: 'warning',
            message: '导出失败'
          });
        }
      })
    }
    // const submitReview = async (formEl: FormInstance | undefined) => {
    //   if (!formEl) return
    //   await formEl.validate(async(valid, fields) => {
    //     if (valid) {
    //       let res = await workApplyApi().acceptWork(state.reviewForm);
    //       if (res.data.code === '200') {
    //         ElMessage({
    //           type: 'success',
    //           message: '作业验收成功',
    //           duration: 2000
    //         });
    //         state.dialogReview = false;
    //         await getMydepList()
    //       } else {
    //         ElMessage({
    //           type: 'warning',
    //           message: res.data.msg
    //         });
    //       }
    //     } else {
    //       console.log('error submit!', fields)
    //     }
    //   })
    // }
    // 折线图
    const renderMenu = async (value: string) => {
@@ -953,24 +1047,32 @@
      VideoPlay,
      reviewFormRef,
      videoRef,
      recordRef,
      zyfb,
      slfx,
      zyqs,
      changeTime1,
      changeTime2,
      changeTime4,
      changeDep1,
      changeDep2,
      changeType2,
      changeType4,
      changeDep3,
      toFullscreen,
      handleReview,
      // handleReview,
      openVideo,
      submitReview,
      // submitReview,
      reLoadData,
      toApply,
      toNames,
      searchRecord,
      clearSearch,
      // viewDetail,
      viewRecord,
      viewTicket,
      downLoadTicket,
      // getListByPage,
      handleSizeChange1,
      handleCurrentChange1,
      handleSizeChange,
      handleCurrentChange,
      ...toRefs(state)
    };
  }
@@ -1075,57 +1177,57 @@
      .chart{
        width: 100%;
        height: 85%;
        overflow-y: scroll;
        .el-table{
          height: 90% !important;
          :deep(.el-table__inner-wrapper){
            height: 100% !important;
            .el-table__header-wrapper {
              height: 20% !important;
              .el-table__header{
                height: 100% !important;
                th{
                  height: 100% !important;
                  padding: 0 0 !important;
                  .cell{
                    white-space: nowrap;
                    overflow: hidden;
                    text-overflow: ellipsis;
                  }
                }
              }
            }
            .el-table__body-wrapper {
              height: 80% !important;
              .el-scrollbar__view{
                height: 100% !important;
                .el-table__body{
                  height: 100% !important;
                  tbody{
                    height: 100% !important;
                    .el-table__row{
                      height: 25% !important;
                      td{
                        height: 25% !important;
                        padding: 0 0 !important;
                        .left-info{
                          display: flex;
                          align-items: center;
                        }
                        .cell{
                          white-space: nowrap;
                          overflow: hidden;
                          text-overflow: ellipsis;
                        }
                        .el-button{
                          padding: 0 !important;
                        }
                      }
                    }
                  }
                }
              }
            }
          }
          //:deep(.el-table__inner-wrapper){
          //  height: 100% !important;
          //  .el-table__header-wrapper {
          //    height: 20% !important;
          //    .el-table__header{
          //      height: 100% !important;
          //      th{
          //        height: 100% !important;
          //        padding: 0 0 !important;
          //        .cell{
          //          white-space: nowrap;
          //          overflow: hidden;
          //          text-overflow: ellipsis;
          //        }
          //      }
          //    }
          //  }
          //  .el-table__body-wrapper {
          //    height: 80% !important;
          //    .el-scrollbar__view{
          //      height: 100% !important;
          //      .el-table__body{
          //        height: 100% !important;
          //        tbody{
          //          height: 100% !important;
          //          .el-table__row{
          //            height: 25% !important;
          //            td{
          //              height: 25% !important;
          //              padding: 0 0 !important;
          //              .left-info{
          //                display: flex;
          //                align-items: center;
          //              }
          //              .cell{
          //                white-space: nowrap;
          //                overflow: hidden;
          //                text-overflow: ellipsis;
          //              }
          //              .el-button{
          //                padding: 0 !important;
          //              }
          //            }
          //          }
          //        }
          //      }
          //    }
          //  }
          //}
        }
      }
      .el-radio-group{
@@ -1441,6 +1543,7 @@
.container{
  padding: 20px;
  background: url('../../../assets/spwbg.png') no-repeat center;
  background-size: 100% 100%;
  .full{
    position:fixed;