fuliqi
2024-04-24 1a0b6c69df8bafa8d9c612a5ea04a34be712001c
Merge remote-tracking branch 'origin/master'

# Conflicts:
# src/router/index.js
17个文件已修改
2个文件已添加
3 文件已重命名
3个文件已删除
1268 ■■■■■ 已修改文件
.env.development 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.production 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/platform/calculate-money-rule.js 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/platform/calculate-record.js 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/platform/calculate-report.js 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/platform/calculate-rule.js 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/platform/contract-publish.js 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/platform/contract-result.js 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/platform/contract-score.js 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/platform/default-rule.js 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/index.vue 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/index_v1.vue 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login copy.vue 310 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/calculate/duty/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/calculate/record/index.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/calculate/report/index.vue 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/contract/index.vue 428 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/publish/default/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/result/default/detail.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/result/default/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/rule/default/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/score/default/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/template/default/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.development
@@ -1,5 +1,5 @@
# 页面标题
VUE_APP_TITLE = 自贡公安天网运维平台
VUE_APP_TITLE = 运维考核平台
# 开发环境配置
ENV = 'development'
@@ -9,3 +9,6 @@
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true
# websocket地址
VUE_APP_WEB_SOCKET_URL = 'ws://127.0.0.1:8044/ws'
.env.production
@@ -1,8 +1,11 @@
# 页面标题
VUE_APP_TITLE = 自贡公安天网运维平台
VUE_APP_TITLE = 运维考核平台
# 生产环境配置
ENV = 'production'
# 若依管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'
# websocket地址
VUE_APP_WEB_SOCKET_URL = 'ws://127.0.0.1:8044/ws'
src/api/platform/calculate-money-rule.js
New file
@@ -0,0 +1,44 @@
import request from '@/utils/request'
// 查询核算规则列表
export function listRule(query) {
  return request({
    url: '/calculate/money/rule/list',
    method: 'get',
    params: query
  })
}
// 查询核算规则详细
export function getRule(id) {
  return request({
    url: '/calculate/money/rule/' + id,
    method: 'get'
  })
}
// 新增核算规则
export function addRule(data) {
  return request({
    url: '/calculate/money/rule',
    method: 'post',
    data: data
  })
}
// 修改核算规则
export function updateRule(data) {
  return request({
    url: '/calculate/money/rule',
    method: 'put',
    data: data
  })
}
// 删除核算规则
export function delRule(id) {
  return request({
    url: '/calculate/money/rule/' + id,
    method: 'delete'
  })
}
src/api/platform/calculate-record.js
@@ -1,44 +1,61 @@
import request from '@/utils/request'
import axios from '@/utils/request';
// 查询核算记录列表
export function listRecord(query) {
  return request({
    url: '/calculate/record/list',
    method: 'get',
    params: query
// 获取核算记录分页
export const getCalculateRecords = (params) => {
  return axios({
    url: "/calculate-record/page",
    method: "GET",
    params: params
  })
}
// 查询核算记录详细
export function getRecord(id) {
  return request({
    url: '/calculate/record/' + id,
    method: 'get'
// 获取核算记录列表
export const getCalculateRecordList = () => {
  return axios({
    url: "/calculate-record/list",
    method: "GET"
  })
}
// 新增核算记录
export function addRecord(data) {
  return request({
    url: '/calculate/record',
    method: 'post',
    data: data
// 通过id获取核算记录
export const getCalculateRecordById = (params) => {
  return axios({
    url: "/calculate-record/" + params,
    method: "GET"
  })
}
// 通过id删除核算记录
export const deleteCalculateRecordById = (params) => {
  return axios({
    url: "/calculate-record/" + params,
    method: "DELETE"
  })
}
// 批量删除核算记录
export const deleteCalculateRecordByIds = (params) => {
  return axios({
    url: "/calculate-record/batch",
    method: "DELETE",
    data: params
  })
}
// 修改核算记录
export function updateRecord(data) {
  return request({
    url: '/calculate/record',
    method: 'put',
    data: data
export const editCalculateRecord = (params) => {
  return axios({
    url: "/calculate-record/",
    method: "PUT",
    data: params
  })
}
// 删除核算记录
export function delRecord(id) {
  return request({
    url: '/calculate/record/' + id,
    method: 'delete'
// 添加核算记录
export const addCalculateRecord = (params) => {
  return axios({
    url: "/calculate-record/",
    method: "POST",
    data: params
  })
}
src/api/platform/calculate-report.js
New file
@@ -0,0 +1,61 @@
import axios from '@/utils/request';
// 获取核算报告分页
export const getCalculateReports = (params) => {
    return axios({
        url: "/calculate-report/page",
        method: "GET",
        params: params
    })
}
// 获取核算报告列表
export const getCalculateReportList = () => {
    return axios({
        url: "/calculate-report/list",
        method: "GET"
    })
}
// 通过id获取核算报告
export const getCalculateReportById = (params) => {
    return axios({
        url: "/calculate-report/" + params,
        method: "GET"
    })
}
// 通过id删除核算报告
export const deleteCalculateReportById = (params) => {
    return axios({
        url: "/calculate-report/" + params,
        method: "DELETE"
    })
}
// 批量删除核算报告
export const deleteCalculateReportByIds = (params) => {
    return axios({
        url: "/calculate-report/batch",
        method: "DELETE",
        data: params
    })
}
// 修改核算报告
export const editCalculateReport = (params) => {
    return axios({
        url: "/calculate-report/",
        method: "PUT",
        data: params
    })
}
// 添加核算报告
export const addCalculateReport = (params) => {
    return axios({
        url: "/calculate-report/",
        method: "POST",
        data: params
    })
}
src/api/platform/calculate-rule.js
@@ -1,15 +1,23 @@
import request from '@/utils/request'
// 查询核算规则列表
export function listRule(query) {
// 查询违约规则列表
export function listRule(data) {
  return request({
    url: '/calculate/rule/list',
    method: 'get',
    params: query
    data: data
  })
}
// 查询核算规则详细
// 根据合同id查询违约规则列表
export function getRuleListByContractId(data) {
  return request({
    url: '/calculate/rule/getRuleListByContractId?contractId=' + data,
    method: 'get'
  })
}
// 查询违约规则详细
export function getRule(id) {
  return request({
    url: '/calculate/rule/' + id,
@@ -17,7 +25,7 @@
  })
}
// 新增核算规则
// 新增违约规则
export function addRule(data) {
  return request({
    url: '/calculate/rule',
@@ -26,7 +34,7 @@
  })
}
// 修改核算规则
// 修改违约规则
export function updateRule(data) {
  return request({
    url: '/calculate/rule',
@@ -35,10 +43,19 @@
  })
}
// 删除核算规则
// 删除违约规则
export function delRule(id) {
  return request({
    url: '/calculate/rule/' + id,
    method: 'delete'
  })
}
// 启用/停用违约规则
export function setRule(data) {
  return request({
    url: '/calculate/rule/set',
    method: 'post',
    data: data
  })
}
src/api/platform/contract-publish.js
File was renamed from src/api/platform/default-publish.js
@@ -3,7 +3,7 @@
// 查询合同考核发布列表
export function listPublish(query) {
  return request({
    url: '/default/publish/list',
    url: '/contract/publish/list',
    method: 'get',
    params: query
  })
@@ -12,7 +12,7 @@
// 查询合同考核发布详细
export function getPublish(id) {
  return request({
    url: '/default/publish/' + id,
    url: '/contract/publish/' + id,
    method: 'get'
  })
}
@@ -20,7 +20,7 @@
// 新增合同考核发布
export function addPublish(data) {
  return request({
    url: '/default/publish',
    url: '/contract/publish',
    method: 'post',
    data: data
  })
@@ -29,7 +29,7 @@
// 修改合同考核发布
export function updatePublish(data) {
  return request({
    url: '/default/publish',
    url: '/contract/publish',
    method: 'put',
    data: data
  })
@@ -38,7 +38,7 @@
// 删除合同考核发布
export function delPublish(id) {
  return request({
    url: '/default/publish/' + id,
    url: '/contract/publish/' + id,
    method: 'delete'
  })
}
@@ -46,7 +46,7 @@
// 获取合同考核下拉列表
export function publishSelect() {
  return request({
    url: '/default/publish/all',
    url: '/contract/publish/all',
    method: 'get'
  })
}
src/api/platform/contract-result.js
File was renamed from src/api/platform/default-result.js
@@ -3,7 +3,7 @@
// 查询合同考核结果列表
export function listResult(query) {
  return request({
    url: '/default/result/list',
    url: '/contract/result/list',
    method: 'get',
    params: query
  })
@@ -12,7 +12,7 @@
// 查询合同考核结果详细
export function getResult(id) {
  return request({
    url: '/default/result/' + id,
    url: '/contract/result/' + id,
    method: 'get'
  })
}
@@ -20,7 +20,7 @@
// 新增合同考核结果
export function addResult(data) {
  return request({
    url: '/default/result',
    url: '/contract/result',
    method: 'post',
    data: data
  })
@@ -29,7 +29,7 @@
// 修改合同考核结果
export function updateResult(data) {
  return request({
    url: '/default/result',
    url: '/contract/result',
    method: 'put',
    data: data
  })
@@ -38,7 +38,7 @@
// 删除合同考核结果
export function delResult(id) {
  return request({
    url: '/default/result/' + id,
    url: '/contract/result/' + id,
    method: 'delete'
  })
}
src/api/platform/contract-score.js
File was renamed from src/api/platform/default-score.js
@@ -3,7 +3,7 @@
// 查询违规审核列表
export function listAuditing(data) {
  return request({
    url: '/default/score/list',
    url: '/contract/score/list',
    method: 'get',
    data: data
  })
@@ -12,7 +12,7 @@
// 查询违规审核详细
export function getAuditing(id) {
  return request({
    url: '/default/score/' + id,
    url: '/contract/score/' + id,
    method: 'get'
  })
}
@@ -20,7 +20,7 @@
// 新增违规审核
export function addAuditing(data) {
  return request({
    url: '/default/score',
    url: '/contract/score',
    method: 'post',
    data: data
  })
@@ -29,7 +29,7 @@
// 修改违规审核
export function updateAuditing(data) {
  return request({
    url: '/default/score',
    url: '/contract/score',
    method: 'put',
    data: data
  })
@@ -38,7 +38,7 @@
// 删除违规审核
export function delAuditing(id) {
  return request({
    url: '/default/score/' + id,
    url: '/contract/score/' + id,
    method: 'delete'
  })
}
@@ -46,7 +46,7 @@
// 审核
export function auditing(data) {
  return request({
    url: '/default/score/auditing',
    url: '/contract/score/auditing',
    method: 'post',
    data: data
  })
src/api/platform/default-rule.js
File was deleted
src/main.js
@@ -76,6 +76,9 @@
Vue.use(dataV)
DictData.install()
// websocket
Vue.prototype.$websocket = null;
/**
 * If you don't want to use mock-server
 * you want to use MockJs for mock api
src/router/index.js
@@ -72,19 +72,6 @@
      }
    ]
  },
  // {
  //   path: '/contract/score',
  //   component: Layout,
  //   hidden: true,
  //   children: [
  //     {
  //       path: 'index',
  //       name: 'score',
  //       component: () => import('@/views/system/score/default/index'),
  //       meta: { title: '合同积分', activeMenu: '/system/score' }
  //     }
  //   ]
  // },
  {
    path: '/check-result/contract',
    component: Layout,
src/views/index.vue
@@ -8,6 +8,7 @@
<script>
import DataView from './home/data-view/index.vue';
import DataWrapper from './home/data-wrapper/index.vue';
import { getToken } from '@/utils/auth'
export default {
  name: "Index",
@@ -20,6 +21,59 @@
    };
  },
  methods: {
    senMsg(msg) {
      // 发送文本消息
      this.$websocket.send(msg);
    },
    // 发送心跳消息
    sendHeartbeat() {
      if (this.$websocket.readyState === WebSocket.OPEN) {
        // 发送心跳消息,可以是任意格式的字符串,用于表示心跳
        this.senMsg('ping');
      }
    },
    // 开始心跳定时器
    startHeartbeat() {
      this.heartbeatInterval = setInterval(() => {
        this.sendHeartbeat();
      }, 10000); // 每 10 秒发送一次心跳
    },
    // 停止心跳定时器
    stopHeartbeat() {
      clearInterval(this.heartbeatInterval);
    },
    initWebsocket() {
      this.$websocket = new WebSocket(process.env.VUE_APP_WEB_SOCKET_URL)
      // 监听 WebSocket 连接成功事件
      this.$websocket.onopen = event => {
        console.log('WebSocket 连接成功', event);
        let msg = {
          "token": getToken()
        }
        // 发送身份认证
        this.senMsg(JSON.stringify(msg))
        // 设置心跳定时器,定期发送心跳消息
        this.startHeartbeat();
      };
      // 监听 WebSocket 接收消息事件
      this.$websocket.onmessage = event => {
        const message = event.data;
        console.log('接收到消息:', message);
      };
      // 监听 WebSocket 连接关闭事件
      this.$websocket.onclose = event => {
        console.log('WebSocket 连接关闭', event);
        // 清除心跳定时器
        this.stopHeartbeat();
      };
    },
  },
  mounted() {
    this.initWebsocket();
  }
};
</script>
src/views/index_v1.vue
File was deleted
src/views/login copy.vue
File was deleted
src/views/system/calculate/duty/index.vue
@@ -88,9 +88,9 @@
</template>
<script>
import { listScore, getScore, delScore, addScore, updateScore } from "@/api/platform/default-score";
import { listScore, getScore, delScore, addScore, updateScore } from "@/api/platform/contract-score";
import { unitSelect } from "@/api/platform/unit";
import { publishSelect } from "@/api/platform/default-publish";
import { publishSelect } from "@/api/platform/contract-publish";
export default {
  name: "Score",
src/views/system/calculate/record/index.vue
@@ -159,7 +159,7 @@
</template>
<script>
import { listRecord, getRecord, delRecord, addRecord, updateRecord } from "@/api/platform/calculate-record";
import { getCalculateRecords, getCalculateRecordById,deleteCalculateRecordByIds, addCalculateRecord, editCalculateRecord } from "@/api/platform/calculate-record";
import {unitSelect} from "@/api/platform/unit";
export default {
  name: "Record",
@@ -218,7 +218,7 @@
    /** 查询核算记录列表 */
    getList() {
      this.loading = true;
      listRecord(this.queryParams).then(response => {
      getCalculateRecords(this.queryParams).then(response => {
        this.recordList = response.rows;
        this.total = response.total;
        this.loading = false;
@@ -268,7 +268,7 @@
    handleUpdate(row) {
      this.reset();
      const id = row.id || this.ids
      getRecord(id).then(response => {
      getCalculateRecordById(id).then(response => {
        this.form = response.data;
        this.open = true;
        this.title = "修改核算记录";
@@ -279,13 +279,13 @@
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.id != null) {
            updateRecord(this.form).then(response => {
            editCalculateRecord(this.form).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            addRecord(this.form).then(response => {
            addCalculateRecord(this.form).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
@@ -298,7 +298,7 @@
    handleDelete(row) {
      const ids = row.id || this.ids;
      this.$modal.confirm('是否确认删除核算记录编号为"' + ids + '"的数据项?').then(function() {
        return delRecord(ids);
        return deleteCalculateRecordByIds(ids);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess("删除成功");
src/views/system/calculate/report/index.vue
@@ -171,7 +171,7 @@
</template>
<script>
import { listCheckResult, getCheckResult, delCheckResult, addCheckResult, updateCheckResult,manualScore, publishCheckResult } from "@/api/platform/check-result";
import { getCalculateReports, getCalculateReportById, deleteCalculateReportByIds, addCalculateReport, editCalculateReport } from "@/api/platform/calculate-report";
export default {
  name: "CheckResult",
@@ -262,7 +262,7 @@
        this.queryParams["start"] = this.daterangeCheckTime[0];
        this.queryParams["end"] = this.daterangeCheckTime[1];
      }
      listCheckResult(this.queryParams).then(response => {
      getCalculateReports(this.queryParams).then(response => {
        this.checkResultList = response.rows;
        this.total = response.total;
        this.loading = false;
@@ -299,11 +299,11 @@
        this.$modal.msgWarning("请填写分数");
        return
      }
      manualScore(this.manualScoreForm).then(res => {
        this.$modal.msgSuccess("操作成功");
        this.cancelManualScore();
        this.getList();
      })
      // manualScore(this.manualScoreForm).then(res => {
      //   this.$modal.msgSuccess("操作成功");
      //   this.cancelManualScore();
      //   this.getList();
      // })
    },
    handleDetail(row) {
      console.log("row", row)
@@ -317,7 +317,7 @@
      let text = row.publish == 1 ? '取消发布' : '发布';
      const ids = row.id || this.ids;
      this.$modal.confirm('是否确认' + text + '考核结果编号为"' + ids + '"的数据项?').then(function() {
        return publishCheckResult(ids);
        // return publishCheckResult(ids);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess(text + "成功");
@@ -351,7 +351,7 @@
    handleUpdate(row) {
      this.reset();
      const id = row.id || this.ids
      getCheckResult(id).then(response => {
      getCalculateReportById(id).then(response => {
        this.form = response.data;
        this.open = true;
        this.title = "修改考核结果";
@@ -363,13 +363,13 @@
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.id != null) {
            updateCheckResult(this.form).then(response => {
            editCalculateReport(this.form).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            addCheckResult(this.form).then(response => {
            addCalculateReport(this.form).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
@@ -382,7 +382,7 @@
    handleDelete(row) {
      const ids = row.id || this.ids;
      this.$modal.confirm('是否确认删除考核结果编号为"' + ids + '"的数据项?').then(function() {
        return delCheckResult(ids);
        return deleteCalculateReportByIds(ids);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess("删除成功");
src/views/system/contract/index.vue
@@ -2,12 +2,15 @@
  <div class="app-container">
    <el-row>
      <el-col :span="8" v-for="(item) in tableData" :key="o" style="margin: 10px;width: 30%;">
      <el-col :span="8" v-for="(item) in contractList" :key="item" style="margin: 10px;width: 30%;">
        <el-card :body-style="{ padding: '0px' }">
          <el-image style="width: 420px;height: 187px;" :preview-src-list="['https://img2.baidu.com/it/u=68398439,1553004927&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=357']" fit="cover" src="https://img2.baidu.com/it/u=68398439,1553004927&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=357" class="image"/>
          <el-image style="width: 420px;height: 187px;"
            :preview-src-list="['https://img2.baidu.com/it/u=68398439,1553004927&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=357']"
            fit="cover" src="https://img2.baidu.com/it/u=68398439,1553004927&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=357"
            class="image" />
          <div style="padding: 14px;">
            <span>{{ item.companyName }}</span>
            <span class="time" style="margin-left: 10px;">{{ item.deptName }}</span>
            <span>{{ item.name }}</span>
            <span class="time" style="margin-left: 10px;">{{ item.unitName }}</span>
            <div class="bottom clearfix">
              <time class="time">{{ item.startTime }} — {{ item.endTime }}</time>
              <el-button type="text" class="button" @click="handleDetail(item)">查看详情</el-button>
@@ -19,172 +22,104 @@
    <el-row :gutter="10" class="mb8" style="margin-top: 40px;">
      <el-col :span="1.5">
        <el-button
          type="primary"
          plain
          icon="el-icon-plus"
          size="mini"
          v-hasPermi="['system:contract:add']"
          @click="handleAdd"
        >新增</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="warning"
          plain
          icon="el-icon-top"
          size="mini"
          v-hasPermi="['system:contract:import']"
          @click="handleImportPoint"
        >导入</el-button>
        <el-button type="primary" plain icon="el-icon-plus" size="mini" v-hasPermi="['system:contract:import']"
          @click="handleImport">新增</el-button>
      </el-col>
    </el-row>
    <!-- 添加或修改【请填写功能名称】对话框 -->
    <el-dialog :title="detailName" :visible.sync="open" width="500px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
        <el-form-item label="公司名" prop="companyName">
          <el-select v-model="form.companyName" placeholder="请选择">
            <el-option
              v-for="item in unitList"
              :key="item.id"
              :label="item.value"
              :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="部门名称" prop="deptName">
          <el-select v-model="form.deptName" placeholder="请选择">
            <el-option
              v-for="item in deptList"
              :key="item.id"
              :label="item.value"
              :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="合同时间" prop="timezone">
          <el-date-picker
            :disabled="title === '修改合同时间'"
            @change="dateChange"
            v-model="form.timezone"
            type="daterange"
            align="right"
            unlink-panels
            range-separator="至"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
          >
          </el-date-picker>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </el-dialog>
    <!-- 合同详情 -->
    <el-dialog :title="detailName" :visible.sync="detail" width="800px" append-to-body>
      <el-form label-position="left" inline class="table-expand">
        <el-collapse v-model="activeNames" @change="handleChange">
          <el-collapse-item title="视频平均在线率" name="1">
            <div>≥98%:不扣分</div>
            <div class="inline-input-container">
              95%≤视频平均在线率<98%:扣0.1分
            </div>
            <div class="inline-input-container">
              90%≤视频平均在线率<95%:扣0.5分
            </div>
            <div class="inline-input-container">
              <90%: 扣1分
              若有连续两次省厅考核在线率低于90%,招标人有权解除合同。
          <el-collapse-item  v-for="(item, index) in ruleData" :key="index" :title="item.ruleName" :name="index">
            <div class="inline-input-container" v-for="(item, index) in item.children" :key="index">
              <b>{{ item.ruleDesc }}</b> <br v-if="item.ruleDesc"/>
              <el-tooltip class="item" effect="dark" :content="item.deductCategory + ' ' + item.calcFraction + (item.calcUnit ? '/' + item.calcUnit : '')" placement="top">
                <span>{{ item.ruleCondition }}</span>
                <!-- {{ item.deductCategory }} {{ item.calcFraction }}{{ item.calcUnit ? "/" + item.calcUnit : ''  }} -->
            </el-tooltip>
            </div>
          </el-collapse-item>
          <el-collapse-item title="前端感知源治理工作" name="2">
            <div class="inline-input-container">
              时钟同步(超过±3秒为不合格)24小时内未修复的:扣除相关镜头数量*0.1分
            </div>
            <div class="inline-input-container">
              OSD标识不满足《GAT 751-2008 视频图像文字标注规范》,24小时内未修复的:标扣除相关镜头数量*0.1分
            </div>
            <div class="inline-input-container">
              用户抽检,一机一档数据项不合格(提供虚假数据或错误数据为不合格),24小时内未修复的:扣除相关镜头数量*0.1分
            </div>
          </el-collapse-item>
          <el-collapse-item title="后台系统的保障" name="3">
            <div class="inline-input-container">
              个别设备故障但不影响该功能模块整体应用情况下,超出72小时不足144小时的;扣0.2分/12小时
            </div>
            <div class="inline-input-container">
              个别设备故障但不影响该功能模块整体应用情况下,超出144小时以后,每超出12小时:扣0.1分/12小时
            </div>
            <div class="inline-input-container">
              个别设备故障但不影响该功能模块整体应用情况下,同一功能模块的相同或不同设备累计一个月内故障超过3次:扣0.2分/12小时
            </div>
            <div class="inline-input-container">
              后台功能模块不能正常运行影响正常使用的,超出24小时不足48小时的:扣0.3分/次
            </div>
            <div class="inline-input-container">
              个别设备故障但不影响该功能模块整体应用情况下,超出72小时不足144小时的;扣0.1分/12小时
            </div>
            <div class="inline-input-container">
              后台功能模块不能正常运行影响正常使用的,超出48小时以后:扣0.5分/12小时
            </div>
            <div class="inline-input-container">
              后台功能模块不能正常运行影响正常使用的,同一功能模块的相同或不同设备累计一个月内故障超过2次:扣0.5分/次
            </div>
          </el-collapse-item>
          <el-collapse-item title="存储故障" name="4">
            <div class="inline-input-container">
              因存储设备、云存储软件等引起平台不能正常查看历史图像,单次故障时长在24小时以内的:扣0.3分/小时
            </div>
            <div class="inline-input-container">
              因存储设备、云存储软件等引起平台不能正常查看历史图像,单次故障时长在24小时以内的:扣0.1分/小时
            </div>
            <div class="inline-input-container">
              因视频或者图片丢失导致重要案事件不能回放或查看,同一点位视频图像同一案件不累计计算:扣0.1分/次
            </div>
          </el-collapse-item>
          <el-collapse-item title="对于前端点位异常情况的处理" name="5">
            <div class="inline-input-container">
              24小时后未修复的:扣0.1分*镜头数量
            </div>
            <div class="inline-input-container">
              48小时后未修复,累计扣分:扣0.1分*镜头数量*天
            </div>
          </el-collapse-item>
          <el-form-item label="合同附件" prop="certificates">
            <el-upload>
              <el-button size="small" type="primary">点击上传</el-button>
              <div slot="tip" class="el-upload__tip">请上传大小不超过 5MB 格式为 doc/xls/ppt/txt/pdf/png/jpg 的文件</div>
            </el-upload>
          <el-form-item label="合同附件" prop="attachment" class="top">
            <file-upload v-model="form.attachment"/>
          </el-form-item>
          <el-dialog :visible.sync="dialogVisible" append-to-body="false">
            <img width="100%" :src="dialogImageUrl" alt="">
          </el-dialog>
            <el-link class="top" v-for="item in contractInfo.attachment != null ? contractInfo.attachment.split(',') : contractInfo.attachment" :underline="false" :key="item" @click="handleDownload(item)">{{ item.substring(item.lastIndexOf("/") + 1) }}</el-link>
          <div style="text-align: right; margin-top: 10px;">
            <el-button type="primary" @click="submitForm1(props.row)">提交</el-button>
            <el-button type="primary" @click="submitForm">提交</el-button>
          </div>
        </el-collapse>
      </el-form>
    </el-dialog>
    <!-- 合同导入对话框 -->
    <el-dialog :title="upload.title" :visible.sync="upload.open" width="550px" append-to-body>
      <el-form ref="form" :model="upload" :rules="rules" label-width="80px">
        <el-form-item label="合同名称" prop="name">
          <el-input v-model="upload.name" />
        </el-form-item>
        <el-form-item label="公司名称" prop="unitId">
          <el-select v-model="upload.unitId" placeholder="请选择">
            <el-option v-for="item in unitList" :key="item.id" :label="item.value" :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="合同时间" prop="timezone">
          <el-date-picker :disabled="title === '修改合同时间'" @change="dateChange" v-model="upload.timezone"
            value-format="yyyy-MM-dd HH:mm:ss" type="datetimerange" align="right" unlink-panels range-separator="至"
            start-placeholder="开始时间" end-placeholder="结束时间">
          </el-date-picker>
        </el-form-item>
      <el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
        :action="upload.url + '?unitId=' + upload.unitId + '&startTime=' + upload.startTime + '&endTime=' + upload.endTime + '&name=' + upload.name"
        :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess"
        :auto-upload="false" drag style="text-align: center;">
        <i class="el-icon-upload"></i>
        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
        <div class="el-upload__tip text-center" slot="tip">
          <span>仅允许导入xls、xlsx格式文件。</span>
          <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
            @click="importTemplate">下载模板</el-link>
        </div>
      </el-upload>
    </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitFileForm">确 定</el-button>
        <el-button @click="upload.open = false">取 消</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import { listContract, getContract, delContract, addContract, updateContract } from "@/api/platform/contract";
import {unitSelect} from "../../../api/platform/unit";
import {deptSelect} from "../../../api/system/dept";
import { listContract, getContract, updateContract } from "@/api/platform/contract";
import { getRuleListByContractId } from "../../../api/platform/calculate-rule";
import { unitSelect } from "../../../api/platform/unit";
import { deptSelect } from "../../../api/system/dept";
import { getToken } from "@/utils/auth";
export default {
  name: "Contract",
  data() {
    return {
      contractInfo: {},
      // 合同导入参数
      upload: {
        // 是否显示弹出层(合同导入)
        open: false,
        // 弹出层标题(合同导入)
        title: "",
        // 是否禁用上传
        isUploading: false,
        // 设置上传的请求头部
        headers: { Authorization: "Bearer " + getToken() },
        // 上传的地址
        url: process.env.VUE_APP_BASE_API + "/system/contract/importData",
        unitId: '',
        startTime: '',
        endTime: ''
      },
      dialogImageUrl: '',
      dialogVisible: false,
      disabled: false,
@@ -218,49 +153,21 @@
      open: false,
      // 是否显示详情
      detail: false,
      // 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        companyId: null,
        companyName: null,
        deptId: null,
        deptName: null,
        detail: null
      },
      tableData: [{
        id: '12987122',
        companyName: '运维公司甲',
        deptName: '自贡富顺公安局',
        startTime: '2023-12-11 10:20:20',
        endTime: '2024-12-11 10:20:20',
        shop: '王小虎夫妻店',
        shopId: '10333'
      }, {
        id: '12987123',
        companyName: '运维公司乙',
        deptName: '自贡大安公安局',
        startTime: '2023-12-11 10:20:20',
        endTime: '2023-12-11 10:20:20',
        shop: '王小虎夫妻店',
        shopId: '10333'
      }, {
        id: '12987125',
        companyName: '运维公司丙',
        deptName: '自贡自流井公安局',
        startTime: '2023-12-11 10:20:20',
        endTime: '2023-12-11 10:20:20',
        shop: '王小虎夫妻店',
        shopId: '10333'
      }],
      ruleData: [],
      // 表单参数
      form: {
      },
      // 表单校验
      rules: {
        companyId: [
          { required: true, message: "公司id不能为空", trigger: "blur" }
        name: [
          { required: true, message: "合同名称不能为空", trigger: "blur" }
        ],
        unitId: [
          { required: true, message: "运维单位不能为空", trigger: "change" }
        ],
        timezone: [
          { type: "array", required: true, message: "合同时间不能为空", trigger: "change" }
        ]
      }
    };
  },
@@ -270,15 +177,61 @@
    this.selectDept();
  },
  methods: {
    submitForm() {
      updateContract(this.form).then(response => {
        if (response.code != 200) {
          this.$message.error("操作失败");
        } else {
          this.$message.success("操作成功");
        }
      });
    },
    /** 导入按钮操作 */
    handleImport() {
      this.upload.title = "合同导入";
      this.upload.open = true;
    },
    /** 下载模板操作 */
    importTemplate() {
      this.download('system/contract/importTemplate', {
      }, `合同导入模板.xlsx`)
    },
    // 文件上传中处理
    handleFileUploadProgress(event, file, fileList) {
      this.upload.isUploading = true;
    },
    // 文件上传成功处理
    handleFileSuccess(response, file, fileList) {
      this.upload.open = false;
      this.upload.isUploading = false;
      this.$refs.upload.clearFiles();
      if (response.code != 200) {
        this.$message.warning(response.msg);
      } else {
        this.$message.success(response.msg);
      }
      this.getList();
    },
    // 提交上传文件
    submitFileForm() {
      let that = this;
      this.$refs["form"].validate(valid => {
        if (valid) {
          that.$refs.upload.submit();
        }
      })
    },
    // 时间选择发生变化
    dateChange() {
      this.upload.startTime = this.upload.timezone[0];
      this.upload.endTime = this.upload.timezone[1];
    },
    handleRemove(file) {
      console.log(file);
    },
    handlePictureCardPreview(file) {
      this.dialogImageUrl = file.url;
      this.dialogVisible = true;
    },
    handleDownload(file) {
      console.log(file);
    },
    // 运维公司下拉数据
    selectUnit() {
@@ -292,53 +245,22 @@
        this.deptList = res.data;
      })
    },
    submitForm1() {
      alert('提交成功!');
      },
    handleChange(val) {
      console.log(val);
    },
    /** 查询【请填写功能名称】列表 */
    getList() {
      this.loading = true;
      listContract(this.queryParams).then(response => {
        this.contractList = response.rows;
        this.contractList = response;
        this.total = response.total;
        this.loading = false;
      });
    },
    // 取消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // 表单重置
    reset() {
      this.form = {
        id: null,
        companyId: null,
        companyName: null,
        deptId: null,
        deptName: null,
        detail: null
      };
      this.resetForm("form");
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.resetForm("queryForm");
      this.handleQuery();
    },
    // 多选框选中数据
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.id)
      this.single = selection.length!==1
      this.multiple = !selection.length
    /** 获取合同规则 */
    getRuleList(item) {
      getRuleListByContractId(item.id).then(response => {
        this.ruleData = response.data;
        this.form.id = item.id;
        this.contractInfo = item;
      });
    },
    /** 新增按钮操作 */
    handleAdd() {
@@ -349,7 +271,8 @@
    /** 详情按钮操作 */
    handleDetail(item) {
      this.detail = true;
      this.detailName = item.companyName
      this.detailName = item.name;
      this.getRuleList(item);
    },
    /** 修改按钮操作 */
    handleUpdate(row) {
@@ -361,41 +284,9 @@
        this.title = "修改合同";
      });
    },
    /** 提交按钮 */
    submitForm() {
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.id != null) {
            updateContract(this.form).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            addContract(this.form).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
            });
          }
        }
      });
    },
    /** 删除按钮操作 */
    handleDelete(row) {
      const ids = row.id || this.ids;
      this.$modal.confirm('是否确认删除【请填写功能名称】编号为"' + ids + '"的数据项?').then(function() {
        return delContract(ids);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess("删除成功");
      }).catch(() => {});
    },
    /** 导出按钮操作 */
    handleExport() {
      this.download('system/contract/export', {
        ...this.queryParams
      }, `contract_${new Date().getTime()}.xlsx`)
    /** 下载按钮操作 */
    handleDownload (data) {
      this.$download.resource(data);
    }
  }
};
@@ -405,13 +296,17 @@
.table-expand {
  font-size: 0;
}
.table-expand  {
.table-expand {
  width: 100%;
  color: #99a9bf;
}
.inline-input-container {
  white-space: nowrap; /* 防止内容内部的换行 */
  margin-right: 50px;  /* 可选的,用于在元素之间添加一些间距 */
  white-space: nowrap;
  /* 防止内容内部的换行 */
  margin-right: 50px;
  /* 可选的,用于在元素之间添加一些间距 */
  width: 7%;
}
@@ -437,11 +332,16 @@
.clearfix:before,
.clearfix:after {
    display: table;
    content: "";
  display: table;
  content: "";
}
.clearfix:after {
    clear: both
  clear: both
}
.top {
  display: block;
  margin-top: 10px;
}
</style>
src/views/system/publish/default/index.vue
@@ -326,7 +326,7 @@
</template>
<script>
import { listPublish, getPublish, delPublish, addPublish, updatePublish } from "@/api/platform/default-publish";
import { listPublish, getPublish, delPublish, addPublish, updatePublish } from "@/api/platform/contract-publish";
import { templateSelect } from "@/api/platform/check-template";
export default {
  name: "Publish",
src/views/system/result/default/detail.vue
@@ -353,9 +353,9 @@
</template>
<script>
import { listCheckResult, getCheckResult, delCheckResult, addCheckResult, updateCheckResult,manualScore, publishCheckResult } from "@/api/platform/default-result";
import { listRule, getRule, delRule, addRule, updateRule, setRule } from "@/api/platform/default-rule";
import { listScore, getScore, delScore, addScore, updateScore } from "@/api/platform/default-score";
import { listCheckResult, getCheckResult, delCheckResult, addCheckResult, updateCheckResult,manualScore, publishCheckResult } from "@/api/platform/contract-result";
import { listRule, getRule, delRule, addRule, updateRule, setRule } from "@/api/platform/calculate-rule";
import { listScore, getScore, delScore, addScore, updateScore } from "@/api/platform/contract-score";
import {unitSelect} from "../../../../api/platform/unit";
import {publishSelect} from "../../../../api/platform/check-publish";
src/views/system/result/default/index.vue
@@ -178,7 +178,7 @@
</template>
<script>
import { listCheckResult, getCheckResult, delCheckResult, addCheckResult, updateCheckResult,manualScore, publishCheckResult } from "@/api/platform/default-result";
import { listCheckResult, getCheckResult, delCheckResult, addCheckResult, updateCheckResult,manualScore, publishCheckResult } from "@/api/platform/contract-result";
export default {
  name: "CheckResult",
src/views/system/rule/default/index.vue
@@ -143,7 +143,7 @@
</template>
<script>
import { listRule, getRule, delRule, addRule, updateRule } from "@/api/platform/default-rule";
import { listRule, getRule, delRule, addRule, updateRule } from "@/api/platform/calculate-rule";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
src/views/system/score/default/index.vue
@@ -228,7 +228,7 @@
</template>
<script>
import { listAuditing, getAuditing, delAuditing, addAuditing, updateAuditing,auditing } from "@/api/platform/default-score";
import { listAuditing, getAuditing, delAuditing, addAuditing, updateAuditing,auditing } from "@/api/platform/contract-score";
import { unitSelect } from "@/api/platform/unit";
export default {
src/views/system/template/default/index.vue
@@ -189,7 +189,7 @@
<script>
import { listTemplate, getTemplate, delTemplate, addTemplate, updateTemplate } from "@/api/platform/default-template";
// import { ruleSelect } from '@/api/platform/default-rule'
// import { ruleSelect } from '@/api/platform/calculate-rule'
import { unitSelect } from '@/api/platform/unit'
export default {