jiangping
2024-01-27 bd25d9a8a058e8c618ee4188ed5f15a898c0f7e8
Merge remote-tracking branch 'origin/master'
已添加10个文件
已修改5个文件
1165 ■■■■■ 文件已修改
company/.env.development 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/api/system/menuCom.js 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/common/MenuSelect.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/system/menu/OperaMenuComWindow.vue 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/views/system/menuCom.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/.env.development 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/business/dispatchUnit.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/business/duWorktype.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/business/worktype.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/system/menu.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/business/OperaDispatchUnitWindow.vue 293 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/business/addJobType.vue 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/business/dispatchUnitDetails.vue 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/UploadAvatarVideo.vue 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/views/business/dispatchUnit.vue 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/.env.development
@@ -1,7 +1,11 @@
# å¼€å‘环境配置
NODE_ENV = 'development'
VUE_APP_API = 'http://192.168.0.104:10023/'
# VUE_APP_API = 'http://192.168.0.104:10023/'
<<<<<<< HEAD
VUE_APP_API = 'http://192.168.0.134:10023/'
=======
VUE_APP_API = 'http://localhost:10023/'
# VUE_APP_API = 'http://192.168.0.134:10023/'
>>>>>>> c6c95a49be6194989c124b8fd316fb5d434bd153
company/src/api/system/menuCom.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
import request from '@/utils/request'
// æŸ¥è¯¢----平台菜单
export function fetchTree () {
    return request.post(`/system/menu/treeList/0`)
}
// æŸ¥è¯¢----企业菜单
export function fetchTree1 () {
    return request.post(`/system/menu/treeList/1`)
}
// æ–°å»º
export function create (data) {
    return request.post('/system/menu/create', data)
}
// ä¿®æ”¹
export function updateById (data) {
    return request.post('/system/menu/updateById', data)
}
// ä¿®æ”¹çŠ¶æ€
export function updateStatus (data) {
    return request.post('/system/menu/updateStatus', data)
}
// åˆ é™¤
export function deleteById (id) {
    return request.get(`/system/menu/delete/${id}`)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
    return request.get('/system/menu/delete/batch', {
        params: {
            ids
        }
    })
}
// æŸ¥è¯¢èœå•æ ‘
export function fetchMenuTree () {
    return request.get('/system/menu/treeNodes?type=0')
}
// æŽ’序
export function sort (data) {
    return request.post('/system/menu/updateSort', data)
}
company/src/components/common/MenuSelect.vue
@@ -12,7 +12,7 @@
<script>
import TreeSelect from './TreeSelect'
import { fetchTree } from '@/api/system/menu'
import { fetchTree, fetchTree1 } from '@/api/system/menu'
export default {
  name: 'MenuSelect',
  components: { TreeSelect },
@@ -20,6 +20,9 @@
    value: {},
    inline: {
      default: true
    },
    type: {
      default: '0'
    },
    placeholder: {
      default: '请选择菜单'
@@ -47,6 +50,16 @@
  methods: {
    // èŽ·å–æ‰€æœ‰èœå•
    fetchData () {
      if (this.type === '1') {
        fetchTree1()
          .then(records => {
            this.data = []
            this.__fillData(this.data, records)
          })
          .catch(e => {
            this.$tip.apiFailed(e)
          })
      } else {
      fetchTree()
        .then(records => {
          this.data = []
@@ -55,6 +68,7 @@
        .catch(e => {
          this.$tip.apiFailed(e)
        })
      }
    },
    // å¡«å……菜单树
    __fillData (list, pool) {
company/src/components/system/menu/OperaMenuComWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,164 @@
<template>
    <GlobalWindow
        class="handle-table-dialog"
        :title="title"
        :visible.sync="visible"
        :confirm-working="isWorking"
        @confirm="confirm"
    >
        <p class="tip" v-if="form.parent != null && form.id == null">为 <em>{{parentName}}</em> æ–°å»ºå­èœå•</p>
        <el-form :model="form" ref="form" :rules="rules">
            <el-form-item label="上级菜单" prop="parentId">
                <MenuSelect v-if="visible" type="1" v-model="form.parentId" placeholder="请选择上级菜单" :exclude-id="excludeMenuId" clearable :inline="false"/>
            </el-form-item>
            <el-form-item label="菜单名称" prop="name" required>
                <el-input v-model="form.name" placeholder="请输入菜单名称" v-trim maxlength="50"/>
            </el-form-item>
            <el-form-item label="访问路径" prop="path">
                <el-input v-model="form.path" placeholder="请输入访问路径" v-trim maxlength="200"/>
            </el-form-item>
            <el-form-item label="图标" prop="icon" class="form-item-icon">
                <el-radio-group v-model="form.icon">
                    <el-radio :label="icon" v-for="icon in icons" :key="icon">
                        <i :class="{[icon]: true}"></i>
                    </el-radio>
                </el-radio-group>
            </el-form-item>
            <el-form-item label="备注" prop="remark">
                <el-input type="textarea" v-model="form.remark" placeholder="请输入菜单备注" v-trim :rows="3" maxlength="500"/>
            </el-form-item>
        </el-form>
    </GlobalWindow>
</template>
<script>
    import BaseOpera from '@/components/base/BaseOpera'
    import GlobalWindow from '@/components/common/GlobalWindow'
    import MenuSelect from '@/components/common/MenuSelect'
    import icons from '@/utils/icons'
    export default {
        name: 'OperaMenuWindow',
        extends: BaseOpera,
        components: { MenuSelect, GlobalWindow },
        data () {
            return {
                icons,
                // ä¸Šçº§èœå•名称
                parentName: '',
                // éœ€æŽ’除选择的菜单ID
                excludeMenuId: null,
                // è¡¨å•数据
                form: {
                    id: null,
                    parentId: null,
                    name: '',
                    path: '',
                    icon: '',
                    remark: '',
                    type: '1'
                },
                // éªŒè¯è§„则
                rules: {
                    name: [
                        { required: true, message: '请输入菜单名称' }
                    ]
                }
            }
        },
        methods: {
            /**
             * @title: çª—口标题
             * @target: ç¼–辑的菜单对象
             * @parent: æ–°å»ºæ—¶çš„上级菜单
             */
            open (title, target, parent) {
                this.title = title
                this.visible = true
                // æ–°å»ºï¼Œmenu为空时表示新建菜单
                if (target == null) {
                    this.excludeMenuId = null
                    this.$nextTick(() => {
                        this.$refs.form.resetFields()
                        this.form.id = null
                        this.form.type = parent.type
                        this.form.parentId = parent == null ? null : parent.id
                        this.parentName = parent == null ? null : parent.name
                    })
                    return
                }
                // ç¼–辑
                this.$nextTick(() => {
                    this.excludeMenuId = target.id
                    for (const key in this.form) {
                        this.form[key] = target[key]
                    }
                })
            }
        },
        created () {
            this.config({
                api: '/system/menu'
            })
        }
    }
</script>
<style scoped lang="scss">
    @import "@/assets/style/variables";
    $icon-background-color: $primary-color;
    .global-window {
        .tip {
            margin-bottom: 12px;
            em {
                font-style: normal;
                color: $primary-color;
                font-weight: bold;
            }
        }
        // å›¾æ ‡
        /deep/ .form-item-icon {
            .el-form-item__content {
                height: 193px;
                overflow-y: auto;
            }
            .el-radio-group {
                background: $icon-background-color;
                padding: 4px;
                .el-radio {
                    margin-right: 0;
                    color: #fff;
                    padding: 6px;
                    &.is-checked {
                        background: $icon-background-color - 30;
                        border-radius: 10px;
                    }
                    .el-radio__input.is-checked + .el-radio__label {
                        color: #fff;
                    }
                }
                .el-radio__input {
                    display: none;
                }
                .el-radio__label {
                    padding-left: 0;
                    // element-ui图标
                    i {
                        font-size: 30px;
                    }
                    // è‡ªå®šä¹‰å›¾æ ‡
                    [class^="eva-icon-"], [class*=" eva-icon-"] {
                        width: 30px;
                        height: 30px;
                        background-size: 25px;
                        vertical-align: bottom;
                    }
                }
                .el-radio--small {
                    height: auto;
                    padding: 8px;
                    margin-left: 0;
                }
            }
        }
    }
</style>
company/src/views/system/menuCom.vue
@@ -3,7 +3,7 @@
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['system:menu:create', 'system:menu:delete', 'system:menu:sort']">
                <li><el-button type="primary" @click="$refs.operaMenuWindow.open('新建一级菜单')" icon="el-icon-plus" v-permissions="['system:menu:create']">新建</el-button></li>
                <li><el-button type="primary" @click="$refs.OperaMenuComWindow.open('新建一级菜单')" icon="el-icon-plus" v-permissions="['system:menu:create']">新建</el-button></li>
                <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['system:menu:delete']">删除</el-button></li>
                <li><el-button @click="sort('top')" :loading="isWorking.sort" icon="el-icon-sort-up" v-permissions="['system:menu:sort']">上移</el-button></li>
                <li><el-button @click="sort('bottom')" :loading="isWorking.sort" icon="el-icon-sort-down" v-permissions="['system:menu:sort']">下移</el-button></li>
@@ -48,27 +48,27 @@
                        fixed="right"
                >
                    <template slot-scope="{row}">
                        <el-button type="text" icon="el-icon-edit" @click="$refs.operaMenuWindow.open('编辑菜单', row)" v-permissions="['system:menu:update']">编辑</el-button>
                        <el-button type="text" icon="el-icon-plus" @click="$refs.operaMenuWindow.open('新建子菜单', null, row)" v-permissions="['system:menu:create']">新建子菜单</el-button>
                        <el-button type="text" icon="el-icon-edit" @click="$refs.OperaMenuComWindow.open('编辑菜单', {...row, type: 1})" v-permissions="['system:menu:update']">编辑</el-button>
                        <el-button type="text" icon="el-icon-plus" @click="$refs.OperaMenuComWindow.open('新建子菜单', null, {...row, type: 1})" v-permissions="['system:menu:create']">新建子菜单</el-button>
                        <el-button v-if="!row.fixed" type="text" icon="el-icon-delete" @click="deleteById(row)" v-permissions="['system:menu:delete']">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>
        </template>
        <!-- æ–°å»º/修改 -->
        <OperaMenuWindow ref="operaMenuWindow" @success="handlePageChange(tableData.pagination.pageIndex)"/>
        <OperaMenuComWindow ref="OperaMenuComWindow" @success="handlePageChange(tableData.pagination.pageIndex)"/>
    </TableLayout>
</template>
<script>
    import TableLayout from '@/layouts/TableLayout'
    import BaseTable from '@/components/base/BaseTable'
    import OperaMenuWindow from '@/components/system/menu/OperaMenuWindow'
    import { fetchTree, updateStatus, sort } from '@/api/system/menu'
    import OperaMenuComWindow from '@/components/system/menu/OperaMenuComWindow'
    import { fetchTree1, updateStatus, sort } from '@/api/system/menu'
    export default {
        name: 'SystemMenu',
        extends: BaseTable,
        components: { OperaMenuWindow, TableLayout },
        components: { OperaMenuComWindow, TableLayout },
        data () {
            return {
                // æ˜¯å¦æ­£åœ¨å¤„理中
@@ -81,7 +81,7 @@
            // æŸ¥è¯¢æ•°æ®
            handlePageChange () {
                this.isWorking.search = true
                fetchTree(1)
                fetchTree1()
                    .then(records => {
                        this.tableData.list = records
                    })
platform/.env.development
@@ -1,6 +1,9 @@
# å¼€å‘环境配置
NODE_ENV = 'development'
<<<<<<< HEAD
VUE_APP_API = 'http://192.168.0.134:10025/'
=======
VUE_APP_CONTEXT_PATH = '/'
VUE_APP_API_PREFIX = '/api'
@@ -13,3 +16,4 @@
# #测试服务器
#VUE_APP_API = 'https://dmtest.ahapp.net/preselect_admin_interface'
>>>>>>> c6c95a49be6194989c124b8fd316fb5d434bd153
platform/src/api/business/dispatchUnit.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
import request from '../../utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/business/dispatchUnit/page', data, {
    trim: true
  })
}
// åˆ›å»º
export function create (data) {
  return request.post('/business/dispatchUnit/create', data)
}
// ä¿®æ”¹
export function updateById (data) {
  return request.post('/business/dispatchUnit/updateById', data)
}
// æ ¹æ®ID查询
export function getById (id) {
  return request.get(`/business/dispatchUnit/${id}`)
}
platform/src/api/business/duWorktype.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
import request from '../../utils/request'
// æ ¹æ®ID删除
export function deleteById (id) {
  return request.get(`/business/duWorktype/delete/${id}`)
}
platform/src/api/business/worktype.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
import request from '../../utils/request'
// æ ¹æ®æ¡ä»¶å·¥ç§åˆ—表
export function findListByDTO (data) {
  return request.post('/business/worktype/findListByDTO', data)
}
platform/src/api/system/menu.js
@@ -1,8 +1,19 @@
import request from '@/utils/request'
<<<<<<< HEAD
// æŸ¥è¯¢----平台菜单
export function fetchTree () {
  return request.post('/system/menu/treeList/0')
}
// æŸ¥è¯¢----企业菜单
export function fetchTree1 () {
  return request.post('/system/menu/treeList/1')
=======
// æŸ¥è¯¢
export function fetchTree (data, type) {
  return request.post(`/system/menu/treeList/${type}`, data)
>>>>>>> c6c95a49be6194989c124b8fd316fb5d434bd153
}
// æ–°å»º
@@ -35,8 +46,13 @@
}
// æŸ¥è¯¢èœå•æ ‘
<<<<<<< HEAD
export function fetchMenuTree () {
  return request.get('/system/menu/treeNodes?type=1')
=======
export function fetchMenuTree (params) {
  return request.get('/system/menu/treeNodes', { params })
>>>>>>> c6c95a49be6194989c124b8fd316fb5d434bd153
}
// æŽ’序
platform/src/components/business/OperaDispatchUnitWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,293 @@
<template>
    <GlobalWindow
        :title="title"
        :visible.sync="visible"
        :confirm-working="isWorking"
        @confirm="confirm"
    >
        <el-form :model="form" ref="form" :rules="rules">
            <el-form-item label="派遣单位名称" prop="name">
                <el-input v-model="form.name" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item label="派遣单位信用代码" prop="code">
                <el-input v-model="form.code" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item label="派遣单位描述" prop="content">
                <el-input v-model="form.content" placeholder="请输入" v-trim/>
            </el-form-item>
        </el-form>
        <div class="list">
            <el-button type="primary" style="margin-bottom: 15px;" @click="add">添加方案</el-button>
            <div class="list_item" v-for="(item, index) in form.saveDuSolutionDTOList" :key="index">
                <div class="list_item_input">
                    <div class="list_item_input_label"><span>*</span>保险方案</div>
                    <div class="list_item_input_val">
                        <el-select v-model="item.solutionId" @change="changeTypeWork($event, index)" placeholder="请选择">
                            <el-option
                                v-for="item in insuranceScheme"
                                :key="item.id"
                                :label="item.name"
                                :value="item.id">
                            </el-option>
                        </el-select>
                        <div style="display: flex; align-items: center;">
                            <el-button type="primary" @click="addItem(index)">添加</el-button>
                            <el-button type="danger" @click="deleItem(index)">删除</el-button>
                        </div>
                    </div>
                </div>
                <div class="list_item_table">
                    <el-table
                        :data="item.saveDuWorkTypeDTOList"
                        border
                        style="width: 100%">
                        <el-table-column label="序号" width="80px">
                            <template slot-scope="scope">
                                <span>{{scope.$index + 1}}</span>
                            </template>
                        </el-table-column>
                        <el-table-column
                            prop="name"
                            label="所属工种">
                            <template slot-scope="scope">
                                <el-select v-model="scope.row.workTypeId" @change="changeGZ($event, index, scope.$index)" placeholder="请选择">
                                    <el-option
                                        v-for="item in item.typeWork"
                                        :key="item.id"
                                        :label="item.name"
                                        :value="item.id">
                                    </el-option>
                                </el-select>
                            </template>
                        </el-table-column>
                        <el-table-column
                            prop="address"
                            label="操作视频(非必填)">
                            <template slot-scope="scope">
                                <div style="width: 100px; height: 100px;">
                                    <UploadAvatarVideo :uploadData="{ folder: 'unit' }" :file="scope.row.file" @uploadSuccess="result($event, index, scope.$index)" />
                                </div>
                            </template>
                        </el-table-column>
                        <el-table-column
                            label="操作"
                            width="90"
                            fixed="right">
                            <template slot-scope="scope">
                                <el-button type="text" @click="dele(index, scope.$index)">删除</el-button>
                            </template>
                        </el-table-column>
                    </el-table>
                </div>
            </div>
        </div>
    </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadAvatarVideo from '@/components/common/UploadAvatarVideo'
import { all } from '@/api/business/solutions'
import { findListByDTO } from '@/api/business/worktype'
export default {
  name: 'OperaDispatchUnitWindow',
  extends: BaseOpera,
  components: { GlobalWindow, UploadAvatarVideo },
  data () {
    return {
      // è¡¨å•数据
      form: {
        id: null,
        name: '',
        code: '',
        content: '',
        saveDuSolutionDTOList: [
          {
            id: '',
            saveDuWorkTypeDTOList: [
              {
                videoUrl: '',
                workTypeId: '',
                workTypeName: '',
                file: {
                  videourl: '',
                  videourlfull: ''
                }
              }
            ],
            typeWork: [],
            solutionId: '',
            solutionName: ''
          }
        ]
      },
      // éªŒè¯è§„则
      rules: {
        name: [
          { required: true, message: '请输入派遣单位名称' }
        ],
        code: [
          { required: true, message: '请输入派遣单位信用代码' }
        ],
        content: [
          { required: true, message: '请输入派遣单位描述' }
        ]
      },
      insuranceScheme: []
    }
  },
  created () {
    this.config({
      api: '/business/dispatchUnit',
      'field.id': 'id'
    })
    all({})
      .then(res => {
        this.insuranceScheme = res
      })
  },
  methods: {
    open (title, target) {
      this.title = title
      this.visible = true
      this.form.saveDuSolutionDTOList = [
        {
          id: '',
          saveDuWorkTypeDTOList: [
            {
              videoUrl: '',
              workTypeId: '',
              workTypeName: '',
              file: {
                videourl: '',
                videourlfull: ''
              }
            }
          ],
          typeWork: [],
          solutionId: '',
          solutionName: ''
        }
      ]
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
        })
        return
      }
      // ç¼–辑
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
        }
      })
    },
    // åˆ‡æ¢å·¥ç§
    changeGZ(a, b, c) {
      let text = ''
      this.form.saveDuSolutionDTOList[b].typeWork.forEach(item => {
        if (item.id === a) {
          text = item.name
        }
      })
      this.form.saveDuSolutionDTOList[b].saveDuWorkTypeDTOList[c].workTypeName = text
    },
    // åˆ‡æ¢æ–¹æ¡ˆ
    changeTypeWork(id, index) {
      findListByDTO({ queryType: 0, id })
        .then(res => {
          this.form.saveDuSolutionDTOList[index].typeWork = res
        })
      let text = ''
      this.insuranceScheme.forEach(item => {
        if (item.id === id) {
          text = item.name
        }
      })
      this.form.saveDuSolutionDTOList[index].solutionName = text
    },
    add() {
      this.form.saveDuSolutionDTOList.unshift({
        id: '',
        saveDuWorkTypeDTOList: [
          {
            videoUrl: '',
            workTypeId: '',
            file: {
              videourl: '',
              videourlfull: ''
            }
          }
        ],
        solutionId: ''
      })
    },
    addItem(index) {
      this.form.saveDuSolutionDTOList[index].saveDuWorkTypeDTOList.push({
        videoUrl: '',
        workTypeId: '',
        file: {
          videourl: '',
          videourlfull: ''
        }
      })
    },
    deleItem(index) {
      if (this.form.saveDuSolutionDTOList.length === 1) {
        this.$message.warning('至少保留一项内容')
        return
      }
      this.form.saveDuSolutionDTOList.splice(index, 1)
    },
    result(e, a, b) {
      this.form.saveDuSolutionDTOList[a].saveDuWorkTypeDTOList[b].videoUrl = e.imgurl
    },
    dele(a, b) {
      if (this.form.saveDuSolutionDTOList[a].saveDuWorkTypeDTOList.length === 1) {
        this.$message.warning('至少保留一项内容')
        return
      }
      this.form.saveDuSolutionDTOList[a].saveDuWorkTypeDTOList.splice(b, 1)
    }
  }
}
</script>
<style lang="scss" scoped>
    .list {
        width: 100%;
        margin-bottom: 20px;
        .list_item {
            width: 100%;
            margin-bottom: 20px;
            &:last-child {
                margin: 0 !important;
            }
            .list_item_input {
                width: 100%;
                margin-bottom: 15px;
                .list_item_input_label {
                    margin-bottom: 10px;
                    font-size: 14px;
                    color: #606266;
                    span {
                        color: red;
                        margin-right: 4px;
                    }
                }
                .list_item_input_val {
                    width: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: space-between;
                }
            }
            .list_item_table {
            }
        }
    }
</style>
platform/src/components/business/addJobType.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
<template>
    <GlobalWindow
        :title="title"
        :visible.sync="visible"
        :confirm-working="isWorking"
        @confirm="confirm"
    >
        ä¿é™©æ–¹æ¡ˆ
    </GlobalWindow>
</template>
<script>
  import BaseOpera from '@/components/base/BaseOpera'
  import GlobalWindow from '@/components/common/GlobalWindow'
  export default {
    name: 'addJobType',
    extends: BaseOpera,
    components: { GlobalWindow },
    data () {
      return {
        // è¡¨å•数据
        form: {
          id: null,
          duSolutionList: [],
          saveDuSolutionDTOList: [
            {
              id: '',
              saveDuWorkTypeDTOList: [
                {
                  videoUrl: '',
                  workTypeId: '',
                  file: {
                    videourl: '',
                    videourlfull: ''
                  }
                }
              ],
              typeWork: [],
              solutionId: ''
            }
          ]
        },
        insuranceScheme: []
      }
    },
    created () {
      this.config({
        api: '/business/dispatchUnit',
        'field.id': 'id'
      })
    },
    methods: {
    }
  }
</script>
<style lang="scss" scoped>
</style>
platform/src/components/business/dispatchUnitDetails.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,261 @@
<template>
    <GlobalWindow
        :title="title"
        :visible.sync="visible"
        :confirm-working="isWorking"
        @confirm="confirm"
    >
        <div class="info">
            <div class="info_list">
                <div class="info_list_item">
                    <div class="info_list_item_label">派遣单位:</div>
                    <div class="info_list_item_val">{{form.name}}</div>
                </div>
                <div class="info_list_item">
                    <div class="info_list_item_label">派遣单位信用代码:</div>
                    <div class="info_list_item_val">{{form.code}}</div>
                </div>
                <div class="info_list_item">
                    <div class="info_list_item_label">派遣单位状态:</div>
                    <div class="info_list_item_val" v-if="form.unitStatus === 0">待审核</div>
                    <div class="info_list_item_val" style="color: green;" v-if="form.unitStatus === 1">审核通过</div>
                    <div class="info_list_item_val" style="color: red;" v-if="form.unitStatus === 2">审核不通过</div>
                </div>
                <div class="info_list_item">
                    <div class="info_list_item_label">派遣单位详述:</div>
                    <div class="info_list_item_val">{{form.content}}</div>
                </div>
            </div>
            <div class="info_btns">
                <el-button type="primary">修改派遣单位</el-button>
                <el-button type="primary">添加工种</el-button>
            </div>
            <div class="info_table">
                <div class="info_table_item" v-for="(item, index) in form.duSolutionList" :key="index">
                    <div class="info_table_item_label">保险方案:{{item.solutionName}}</div>
                    <div class="info_table_item_content">
                        <el-table
                            :data="item.duWorktypeList"
                            border
                            style="width: 100%">
                            <el-table-column label="序号" width="80px">
                                <template slot-scope="scope">
                                    <span>{{scope.$index + 1}}</span>
                                </template>
                            </el-table-column>
                            <el-table-column
                                prop="workTypeName"
                                label="所属工种">
                            </el-table-column>
                            <el-table-column
                                prop="name"
                                label="操作视频">
                                <template slot-scope="{row}">
                                    <video loop controls width="150px" height="150px" :src="row.videoUrlFull"></video>
                                </template>
                            </el-table-column>
                            <el-table-column
                                prop="checkDate"
                                label="审核通过日期">
                            </el-table-column>
                            <el-table-column
                                label="状态">
                                <template slot-scope="{row}">
                                    <span v-if="row.status === 0">待审核</span>
                                    <span v-if="row.status === 1">审核通过</span>
                                    <span v-if="row.status === 2">审核不通过</span>
                                </template>
                            </el-table-column>
                            <el-table-column
                                label="操作">
                                <template slot-scope="scope">
                                    <el-button type="text" style="color: red;" v-if="scope.row.status === 2" @click="dele(scope.row.id, index, scope.$index)">删除</el-button>
                                </template>
                            </el-table-column>
                        </el-table>
                    </div>
                </div>
            </div>
            <div class="info_status">
                <div class="info_status_label">审核流程</div>
                <div class="info_status_list">
                    <el-timeline :reverse="reverse">
                        <el-timeline-item
                            v-for="(activity, index) in form.duLogList"
                            :key="index">
                            <div style="display: flex; flex-direction: column;">
                                <span style="font-size: 16px; font-weight: 400; color: black;">
                                    {{activity.title}}
                                    <span style="font-size: 16px; font-weight: 400; color: black; margin-left: 10px;" v-if="activity.objType === 5 || activity.objType === 6 || activity.objType === 1 || activity.objType === 2">
                                        æäº¤æ„è§: -
                                    </span>
                                </span>
                                <span style="margin-top: 5px; font-size: 12px; font-weight: 400; color: #999999;">
                                    æ“ä½œå‘˜-{{activity.creatorName}}({{activity.companyName}}){{activity.createDate}}
                                </span>
                            </div>
                        </el-timeline-item>
                    </el-timeline>
                </div>
            </div>
        </div>
    </GlobalWindow>
</template>
<script>
  import BaseOpera from '@/components/base/BaseOpera'
  import GlobalWindow from '@/components/common/GlobalWindow'
  import { getById } from '@/api/business/dispatchUnit'
  import { deleteById } from '@/api/business/duWorktype'
  export default {
    name: 'OperaDispatchUnitWindow',
    extends: BaseOpera,
    components: { GlobalWindow },
    data () {
      return {
        // è¡¨å•数据
        form: {
          id: null,
          name: '',
          code: '',
          content: '',
          unitStatus: '',
          duLogList: [],
          duSolutionList: [],
          saveDuSolutionDTOList: [
            {
              id: '',
              saveDuWorkTypeDTOList: [
                {
                  videoUrl: '',
                  workTypeId: '',
                  file: {
                    videourl: '',
                    videourlfull: ''
                  }
                }
              ],
              typeWork: [],
              solutionId: ''
            }
          ]
        },
        tableData: [],
        insuranceScheme: [],
        reverse: true,
        activities: [{
          content: '活动按期开始',
          timestamp: '2018-04-15'
        }, {
          content: '通过审核',
          timestamp: '2018-04-13'
        }, {
          content: '创建成功',
          timestamp: '2018-04-11'
        }]
      }
    },
    created () {
      this.config({
        api: '/business/dispatchUnit',
        'field.id': 'id'
      })
    },
    methods: {
      dele (id, b, c) {
        this.$confirm('此操作将永久删除该工种, æ˜¯å¦ç»§ç»­?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          deleteById(id)
            .then(res => {
              this.$message.success('删除成功')
              this.getDetails()
            })
        }).catch(() => {
        });
      },
      open (title, target) {
        this.title = title
        this.form.id = target.id
        this.visible = true
        this.getDetails()
      },
      async getDetails() {
        let res = await getById(this.form.id)
        for (const key in this.form) {
          this.form[key] = res[key]
        }
      }
    }
  }
</script>
<style lang="scss" scoped>
    .info {
        width: 100%;
        .info_list {
            width: 100%;
            display: flex;
            align-items: center;
            flex-wrap: wrap;
            .info_list_item {
                width: 33.3%;
                display: flex;
                align-items: center;
                margin-bottom: 15px;
                .info_list_item_label {
                    flex-shrink: 0;
                    width: 150px;
                    font-size: 14px;
                    color: black;
                }
                .info_list_item_val {
                    flex: 1;
                    font-size: 14px;
                    color: black;
                }
            }
        }
        .info_btns {
            width: 100%;
            display: flex;
            align-items: center;
            margin-bottom: 15px;
        }
        .info_table {
            width: 100%;
            display: flex;
            flex-direction: column;
            margin-bottom: 15px;
            .info_table_item {
                width: 100%;
                display: flex;
                flex-direction: column;
                margin-bottom: 15px;
                &:last-child {
                    margin: 0 !important;
                }
                .info_table_item_label {
                    font-size: 14px;
                    color: black;
                    margin-bottom: 10px;
                }
                .info_table_item_content {
                    width: 100%;
                }
            }
        }
        .info_status {
            width: 100%;
            .info_status_label {
                width: 100%;
                font-size: 18px;
                font-weight: bold;
                margin-bottom: 15px;
            }
        }
    }
</style>
platform/src/components/common/UploadAvatarVideo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,128 @@
<template>
  <div>
    <el-upload
      class="avatar-uploader"
      accept=".mp4"
      :style="customStyle"
      :action="uploadImgUrl"
      :data="uploadData"
      :show-file-list="false"
      :on-success="handleAvatarSuccess"
      :on-error="uploadError"
      :before-upload="beforeAvatarUpload">
      <video v-if="file.videourlfull" :src="file.videourlfull" :style="customStyle" class="avatar" />
      <div v-else :style="customStyle">
        <i class="el-icon-plus avatar-uploader-icon"></i>
        <div class="tips-style">{{ tipsLabel }}</div>
      </div>
    </el-upload>
  </div>
</template>
<script>
export default {
  props: {
    file: {
      type: Object,
      default: () => {}
    },
    tipsLabel: '',
    customStyle: {
      type: String,
      default: 'width: 90px; height: 90px;'
    },
    uploadData: Object
  },
  data() {
    return {
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/upload'
    }
  },
  methods: {
    // ä¸Šä¼ å›¾ç‰‡
    handleAvatarSuccess(res, file) {
      if (res.code == 200) {
        let { data } = res
        this.file.videourl = data.imgaddr;
        this.file.videourlfull = data.url;
        this.$message.success('上传成功')
        this.$emit('uploadSuccess', { imgurl: data.imgaddr, imgurlfull: data.url, name: data.originname })
      } else {
        this.$tip.apiFailed('上传失败')
      }
      this.$emit('uploadEnd')
    },
    uploadError() {
      this.$tip.apiFailed('上传失败')
      this.$emit('endUpload')
    },
    // // æ‹¦æˆª
    beforeAvatarUpload(file) {
      this.$emit('uploadBegin')
      return true
    }
  }
}
</script>
<style lang="scss" scoped>
$image-width: 100px;
.avatar-uploader {
  width: $image-width;
  height: $image-width;
}
::v-deep .el-upload {
  border: 1px dashed #d9d9d9;
  border-radius: 6px;
  cursor: pointer;
  position: relative;
  width: $image-width;
  height: $image-width;
  overflow: hidden;
}
.avatar-uploader .el-upload:hover {
  border-color: #409EFF;
}
.avatar-uploader-icon {
  line-height: 90px;
  font-size: 28px;
  color: #8c939d;
  width: $image-width;
  height: $image-width;
  text-align: center;
}
.avatar {
  width: $image-width;
  height: $image-width;
  display: block;
}
.tips-style {
  height: 13px;
  font-size: 13px;
  font-weight: 400;
  color: #999999;
  line-height: 13px;
}
</style>
<style lang="scss" scoped>
::v-deep .el-upload--picture-card{
  width: 90px !important;
  height: 90px !important;
}
::v-deep .el-upload-list__item {
  width: 90px !important;
  height: 90px !important;
}
.icon {
  -webkit-transform: translate(-50%,-50%);
  -ms-transform: translate(-50%,-50%);
  transform: translate(0%, -85%);
}
::v-deep .el-upload-list__item {
  width: 90px !important;
  height: 90px !important;
}
</style>
platform/src/views/business/dispatchUnit.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,116 @@
<template>
    <TableLayout :permissions="['business:dispatchunit:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="派遣单位" prop="name">
                <el-input v-model="searchForm.name" placeholder="请输入用工单位名称" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <section>
                <el-button type="primary" @click="search">搜索</el-button>
                <el-button @click="reset">重置</el-button>
            </section>
        </el-form>
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['business:dispatchunit:create']">
                <li><el-button type="primary" @click="$refs.operaDispatchUnitWindow.open('添加派遣单位')" v-permissions="['business:dispatchunit:create']">新增派遣单位</el-button></li>
            </ul>
            <el-table
                v-loading="isWorking.search"
                :data="tableData.list"
                stripe
            >
                <el-table-column label="序号" width="80px">
                    <template slot-scope="scope">
                        <span>{{scope.$index + 1}}</span>
                    </template>
                </el-table-column>
                <el-table-column prop="name" label="派遣单位"></el-table-column>
                <el-table-column label="企业状态">
                    <template slot-scope="{row}">
                        <span v-if="row.unitStatus === 0">待审核</span>
                        <span v-if="row.unitStatus === 1" style="color: green;">审核通过</span>
                        <span v-if="row.unitStatus === 2" style="color: red;">审核不通过</span>
                    </template>
                </el-table-column>
                <el-table-column prop="createDate" label="添加日期"></el-table-column>
                <el-table-column label="是否停用">
                    <template slot-scope="{row}">
                        <el-switch
                            @change="changeStatus($event, row)"
                            v-model="row.status"
                            active-color="#13ce66"
                            inactive-color="#ff4949"
                            :active-value="1"
                            :inactive-value="0">
                        </el-switch>
                    </template>
                </el-table-column>
                <el-table-column
                    v-if="containPermissions(['business:dispatchunit:update', 'business:dispatchunit:delete'])"
                    label="操作"
                    min-width="120"
                    fixed="right"
                >
                    <template slot-scope="{row}">
                        <el-button type="text" @click="$refs.dispatchUnitDetails.open('派遣单位详情', row)" v-permissions="['business:dispatchunit:update']">查看详情</el-button>
                    </template>
                </el-table-column>
            </el-table>
            <pagination
                @size-change="handleSizeChange"
                @current-change="handlePageChange"
                :pagination="tableData.pagination"
            >
            </pagination>
        </template>
        <!-- æ–°å»º/修改 -->
        <OperaDispatchUnitWindow ref="operaDispatchUnitWindow" @success="handlePageChange"/>
        <!-- è¯¦æƒ… -->
        <dispatchUnitDetails ref="dispatchUnitDetails" @success="handlePageChange"/>
    </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaDispatchUnitWindow from '@/components/business/OperaDispatchUnitWindow'
import dispatchUnitDetails from '@/components/business/dispatchUnitDetails'
import { updateById } from '@/api/business/dispatchUnit'
export default {
  name: 'DispatchUnit',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaDispatchUnitWindow, dispatchUnitDetails },
  data () {
    return {
      // æœç´¢
      searchForm: {
        name: '',
        dataType: 0
      }
    }
  },
  created () {
    this.config({
      module: '派遣单位信息表',
      api: '/business/dispatchUnit',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    // ä¿®æ”¹çŠ¶æ€
    changeStatus(status, row) {
      updateById({ status, id: row.id })
        .then(res => {
          this.search()
        })
        .catch(err => {
          row.status = row.status === 0 ? 1 : 0
        })
    }
  }
}
</script>