jiangping
2024-02-18 05cf6324ea8322164d99a3d3d4161fe374534b3b
Merge remote-tracking branch 'origin/master'
已删除12个文件
已修改79个文件
20565 ■■■■■ 文件已修改
company/src/api/business/company.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/OperaCompanyDescWindow.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/OperaCompanyWindow.vue 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/OperaInsuranceApplyWindow.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/OperaSolutionsWindow.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/OperaTaxesWindow.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/modification.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/system/user/allocationEnterprises.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/views/business/company.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/views/business/dispatchUnit.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/views/business/dispatchUnitReview.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/.env.staging 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/package-lock.json 17526 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/package.json 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/public/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
platform/public/index.html 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/public/template/goods_import_modle.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/App.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/business/baseData.js 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/business/brand.js 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/business/category.js 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/business/company.js 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/business/companyUser.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/business/dispatchUnit.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/business/fileRecord.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/business/solutions.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/business/worktype.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/system/common.js 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/system/menu.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/system/permission.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/system/user.js 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/assets/images/alipay.jpeg 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/assets/images/man.png 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/assets/images/qq.png 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/assets/images/woman.png 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/assets/images/wxpay.jpeg 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/assets/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/assets/style/element-variables.scss 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/assets/style/style.scss 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/assets/style/variables.scss 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/base/BaseOpera.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/base/BaseTable.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/business/OperaDispatchUnitWindow.vue 385 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/business/addJobType.vue 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/business/dispatchUnitDetails.vue 262 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/DepartmentSelect.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/GlobalAlertWindow.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/GlobalWindow.vue 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/Header.vue 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/ImportButton.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/ImportWindow.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/Light.vue 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/Menu.vue 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/MenuSelect.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/Pagination.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/PositionSelect.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/SearchFormCollapse.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/TreeSelect.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/UploadAvatarImage.vue 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/UploadImage.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/system/menu/OperaMenuWindow.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/system/role/MenuConfigWindow.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/system/role/OperaRoleWindow.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/system/role/PermissionConfigWindow.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/system/user/OperaUserWindow.vue 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/layouts/AppLayout.vue 82 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/layouts/TableLayout.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/main.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/plugins/download.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/plugins/messagebox.js 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/router/index.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/store/index.js 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/utils/form.js 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/utils/request.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/utils/util.js 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/views/business/dispatchUnit.vue 81 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/views/index.vue 645 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/views/login.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/views/system/menu.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/views/system/menuCom.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/views/system/role.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/views/system/user.vue 104 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/vue.config.js 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/company/src/main/java/com/doumee/api/business/CompanyController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/platform/src/main/java/com/doumee/api/business/CompanyController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/model/CompanySolution.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/model/Solutions.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/ApplyChangeServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/InsuranceApplyServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/SolutionsServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/api/business/company.js
@@ -17,8 +17,12 @@
    return request.post('/business/company/updateById', data)
}
// æŸ¥è¯¢å…¨éƒ¨æ•°æ®(账号分配企业使用)
export function pageAll (data) {
    return request.post('/business/company/list', data)
}
// æŸ¥è¯¢å…¨éƒ¨æ•°æ®(账号分配企业使用)
export function allForFp (data) {
    return request.post('/business/company/pageAll', data)
}
company/src/components/business/OperaCompanyDescWindow.vue
@@ -197,6 +197,7 @@
                    phone: '',
                    code: ''
                },
      dataId: null,
                num: 0,
                timer: null,
                // è¡¨å•数据
@@ -266,13 +267,18 @@
                }, 1000)
            },
            open (title, target) {
                const that = this;
      const that = this
                this.title = title
      this.dataId = target.id
                this.phone = ''
                this.code = ''
                clearInterval(this.timer)
                this.num = 0
                getById(target.id)
      this.getDetail()
    },
    getDetail () {
      var that =this
      getById(this.dataId)
                    .then(res => {
                        this.form = res
                        this.form.type = 1
@@ -303,7 +309,7 @@
                        this.form.file3.imgurl = res.signImg.fileurl
                        this.form.file3.imgurlfull = res.signImg.fileurlFull
                        listForCompany({ companyId: target.id })
          listForCompany({ companyId: this.dataId })
                            .then(resa => {
                                that.form.solutionList = resa.map(item => {
                                    return {
@@ -325,8 +331,9 @@
                    })
            },
            callback() {
      this.getDetail()
                this.$emit('success')
                this.visible = false
      // this.visible = false
            }
        }
    }
company/src/components/business/OperaCompanyWindow.vue
@@ -50,17 +50,17 @@
            <el-form-item label="纸质发票接收地址" prop="invoiceAddr">
                <el-input v-model="form.invoiceAddr" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item label="营业执照" prop="businessImg">
            <el-form-item label="营业执照" prop="businessImg"  style="height: 120px">
                <UploadAvatarImage :uploadData="{ folder: 'company' }" :file="form.file" @uploadSuccess="result" />
            </el-form-item>
            <el-form-item label="法人身份证" prop="idcardImgList">
            <el-form-item label="法人身份证" prop="idcardImgList"  style="height: 120px">
                <div style="width: 100%; display: flex; align-items: center;">
                    <UploadAvatarImage :uploadData="{ folder: 'company' }" :file="form.file1" @uploadSuccess="result1" />
                    <div style="width: 15px;height: 100%;"></div>
                    <UploadAvatarImage :uploadData="{ folder: 'company' }" :file="form.file2" @uploadSuccess="result2" />
                </div>
            </el-form-item>
            <el-form-item label="电子签章" prop="signImg">
            <el-form-item label="电子签章" prop="signImg" style="height: 120px">
                <UploadAvatarImage :uploadData="{ folder: 'company' }" :file="form.file3" @uploadSuccess="result3" />
            </el-form-item>
        </el-form>
@@ -81,13 +81,13 @@
            <el-table-column
                align="center"
                label="保险方案">
                <template slot-scope="{row}">
                    <el-select v-model="row.solutionBaseId" placeholder="请选择">
                <template slot-scope="scope">
                  <el-select  v-model="scope.row.solution"  value-key="id" placeholder="请选择" change="changeSolution($event,scope.$index)">
                        <el-option
                            v-for="item in programme"
                            :key="item.id"
                            :label="item.name"
                            :value="item.id">
                        :value="item">
                        </el-option>
                    </el-select>
                </template>
@@ -125,7 +125,7 @@
  data () {
    return {
      // è¡¨å•数据
      form: {
      initParam:{
        id: null,
        name: '',
        code: '',
@@ -151,12 +151,12 @@
        },
        solutionList: [
          {
            solutionBaseId: '',
            solution: null,
            canAdd: 0,
            canReduce: 0
          }
        ],
        type: '',
        type: '0',
        file: {
          imgurl: '',
          imgurlfull: ''
@@ -172,8 +172,9 @@
        file3: {
          imgurl: '',
          imgurlfull: ''
        }
      },
      },
      form: {},
      timer: null,
      num: 0,
      // éªŒè¯è§„则
@@ -233,6 +234,10 @@
    }
  },
  methods: {
    changeSolution(row,index){
     this.form.solutionList[index].solution=row
   //   console.log(this.form.solutionList)
    },
    send () {
      if (!this.form.phone) {
        this.$message.warning('请输入手机号')
@@ -253,9 +258,10 @@
        }
      }, 1000)
    },
    open (title, target) {
    open (title, target,type) {
      this.title = title
      this.visible = true
      this.form = this.initParam
      this.getAll()
      // æ–°å»º
      if (target == null) {
@@ -288,7 +294,8 @@
    },
    add () {
      this.form.solutionList.push({
        solutionName: '',
        solutionId:null,
        solution: {},
        canAdd: '',
        canReduce: ''
      })
company/src/components/business/OperaInsuranceApplyWindow.vue
@@ -34,6 +34,9 @@
                    <template v-else>
                      <el-button type="primary" @click="$refs.InsuranceDetails.open('投保详情单',model,0)">导出详单</el-button>
                      <el-button v-if="[2, 3, 5, 7, 8].includes(model.status)" type="primary" @click="viewToubaodan">查看投保单</el-button>
<!--
                      <el-button v-if="model.status == 2" type="primary" @click="goSign">签署投保单</el-button>
-->
                      <el-button v-if="model.status == 5" type="primary" @click="viewBaoxiandan">查看保险单</el-button>
                      <el-button v-if="model.status == 10" type="primary" @click="$refs.OperaInsuranceApplyCheckWindow.open('上传投保单',model,2)">上传投保单</el-button>
                      <el-button v-if="model.status == 3" type="primary" @click="$refs.OperaInsuranceApplyCheckWindow.open('上传保险单',model,3)">上传保险单</el-button>
company/src/components/business/OperaSolutionsWindow.vue
@@ -1,6 +1,7 @@
<template>
    <GlobalWindow
        :title="title"
        width="100%"
        :visible.sync="visible"
        :confirm-working="isWorking"
        @confirm="confirm"
@@ -82,8 +83,8 @@
            <el-form-item label="接收文件邮箱" prop="email">
                <el-input v-model="form.email" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item label="投保单签章关键字" prop="signKeyword">
                <el-input v-model="form.signKeyword" placeholder="多个英文逗号隔开" v-trim/>
            <el-form-item label="投保单签章关键字(如有多个关键字,请使用英文分号 ; éš”开)" prop="signKeyword">
                <el-input v-model="form.signKeyword" placeholder="多个英文分号 ; éš”å¼€" v-trim/>
            </el-form-item>
            <el-button type="primary" @click="add">添加工种</el-button>
            <el-table
company/src/components/business/OperaTaxesWindow.vue
@@ -51,7 +51,7 @@
                    <div class="info_list_item_val" style="color:rgba(249, 86, 1, 0.996078431372549);">{{ model.price }}</div>
                </div>
            </div>
            <el-table v-if="model.type ==0"
            <el-table v-if="model.applyType ==0"
                :data="tableData"
                border
                show-summary
@@ -89,7 +89,7 @@
                  </template>
                </el-table-column>
            </el-table>
          <el-table v-if="model.type ==1"
          <el-table v-if="model.applyType ==1"
                    :data="tableData1"
                    border
                    show-summary
@@ -127,7 +127,7 @@
              </template>
            </el-table-column>
          </el-table>
            <el-table v-if="model.type == 1"
            <el-table v-if="model.applyType == 1"
                :data="tableData2"
                border
                show-summary
company/src/components/business/modification.vue
@@ -23,12 +23,12 @@
                align="center"
                label="保险方案">
                <template slot-scope="{row}">
                    <el-select v-model="row.solutionBaseId" placeholder="请选择">
                    <el-select v-model="row.solution" placeholder="请选择">
                        <el-option
                            v-for="item in programme"
                            :key="item.id"
                            :label="item.name"
                            :value="item.id">
                            :value="{id:item.id,baseId:item.baseId}">
                        </el-option>
                    </el-select>
                </template>
@@ -71,7 +71,7 @@
                    id: null,
                    solutionList: [
                        {
                            solutionBaseId: '',
                            solution: {id: null, baseId: null },
                            canAdd: 0,
                            canReduce: 0
                        }
@@ -126,7 +126,7 @@
                    .then(resa => {
                        that.form.solutionList = resa.map(item => {
                            return {
                                solutionBaseId: item.solutionBaseId,
                                solution: {id: item.baseSolutionId, baseId: item.solutionId },
                                canAdd: item.canAdd,
                                canReduce: item.canReduce
                            }
@@ -136,7 +136,7 @@
            },
            add() {
                this.form.solutionList.push({
                    solutionName: '',
                    solution: {id: null, baseId: null },
                    canAdd: '',
                    canReduce: ''
                })
company/src/components/system/user/allocationEnterprises.vue
@@ -23,7 +23,7 @@
<script>
    import BasePage from '@/components/base/BasePage'
    import GlobalWindow from '@/components/common/GlobalWindow'
    import { pageAll } from '@/api/business/company'
    import { allForFp } from '@/api/business/company'
    import { create } from '@/api/business/companyPermission'
    export default {
        name: 'allocationEnterprises',
@@ -47,7 +47,7 @@
                this.visible = true
                this.title = title
                this.user = target
                pageAll({ userId: target.id })
              allForFp({ userId: target.id })
                    .then(res => {
                        this.company = res.map(r => {
                            return {
@@ -73,7 +73,7 @@
                    companyIdList: this.selectedIds
                })
                    .then(() => {
                        this.$tip.apiSuccess('角色配置成功,用户重新登录后生效')
                        this.$tip.apiSuccess('企业分配成功,用户重新登录后生效')
                        this.visible = false
                        this.$emit('success')
                    })
company/src/views/business/company.vue
@@ -5,9 +5,6 @@
            <el-form-item label="企业名称" prop="name">
                <el-input v-model="searchForm.name" placeholder="请输入企业名称" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="所属商户" prop="name">
                <el-input v-model="searchForm.name" placeholder="请输入所属商户" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="所属理赔员" prop="username">
                <el-input v-model="searchForm.username" placeholder="请输入所属理赔员" @keypress.enter.native="search"></el-input>
            </el-form-item>
@@ -19,7 +16,7 @@
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['business:company:create']">
                <li><el-button type="primary" @click="$refs.operaCompanyWindow.open('新建企业')" v-permissions="['business:company:create']">新建企业</el-button></li>
                <li><el-button type="primary" @click="$refs.operaCompanyWindow.open('新建企业',null)" v-permissions="['business:company:create']">新建企业</el-button></li>
            </ul>
            <el-table
                v-loading="isWorking.search"
company/src/views/business/dispatchUnit.vue
@@ -2,7 +2,7 @@
  <TableLayout :permissions="['business:dispatchunit:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="所属业" prop="companyId">
      <el-form-item label="所属企业" prop="companyId">
        <el-select v-model="searchForm.companyId" placeholder="请选择" @change="search">
          <el-option
              v-for="item in companyList"
company/src/views/business/dispatchUnitReview.vue
@@ -2,7 +2,7 @@
    <TableLayout :permissions="['business:dispatchunit:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
          <el-form-item label="所属业" prop="companyId">
          <el-form-item label="所属企业" prop="companyId">
            <el-select v-model="searchForm.companyId" placeholder="请选择" @change="search">
              <el-option
                  v-for="item in companyList"
platform/.env.staging
ÎļþÒÑɾ³ý
platform/package-lock.json
ÎļþÌ«´ó
platform/package.json
@@ -5,6 +5,7 @@
  "scripts": {
    "serve": "vue-cli-service serve",
    "build:pro": "vue-cli-service build",
    "build:pro_v2": "vue-cli-service build --mode production_v2",
    "build:dev": "vue-cli-service build --mode staging",
    "lint": "vue-cli-service lint",
    "fix": "eslint --ext .js,.vue src --fix"
@@ -13,6 +14,7 @@
    "@riophae/vue-treeselect": "^0.4.0",
    "axios": "^0.21.1",
    "core-js": "^3.6.5",
    "echarts": "^5.4.3",
    "element-ui": "^2.3.6",
    "js-cookie": "^2.2.1",
    "js-file-download": "^0.4.12",
platform/public/favicon.ico

platform/public/index.html
@@ -4,12 +4,12 @@
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title>云易保客户服务系统</title>
    <link rel="icon" href="<%= BASE_URL %>bitbug_favicon.ico">
    <title>云易保</title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but äº‘易保客户服务系统 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
      <strong>We're sorry but äº‘易保 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
platform/public/template/goods_import_modle.xlsx
Binary files differ
platform/src/App.vue
@@ -3,10 +3,20 @@
</template>
<style lang="scss">
@import "assets/style/lib.css";
// å¼•入全局样式
@import "assets/style/style";
// å¼•入系统内置图标
@import "assets/icons/system/index";
// å¼•入自定义图标
@import "assets/icons/ext/index";
.long-title-style {
  white-space: nowrap;
  text-overflow: ellipsis;
  -webkit-text-overflow: ellipsis;
  overflow: hidden;
}
.el-tooltip__popper.is-dark {
  max-width: 400px;
}
</style>
platform/src/api/business/baseData.js
ÎļþÒÑɾ³ý
platform/src/api/business/brand.js
ÎļþÒÑɾ³ý
platform/src/api/business/category.js
ÎļþÒÑɾ³ý
platform/src/api/business/company.js
@@ -2,35 +2,53 @@
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/company/findPlatformPage', data, {
    return request.post('/business/company/page', data, {
    trim: true
  })
}
// åˆ›å»º
export function create (data) {
  return request.post('/company/create', data)
    return request.post('/business/company/create', data)
}
// ä¿®æ”¹
export function updateById (data) {
  return request.post('/company/updateById', data)
}
// ä¿®æ”¹
export function update (data) {
  return request.post('/company/update', data)
    return request.post('/business/company/updateById', data)
}
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/company/delete/${id}`)
export function pageAll (data) {
    return request.post('/business/company/list', data)
}
// æŸ¥è¯¢å…¨éƒ¨æ•°æ®(账号分配企业使用)
export function allForFp (data) {
    return request.post('/business/company/pageAll', data)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
  return request.get('/company/delete/batch', {
    params: {
      ids
// æ ¹æ®ID禁用启用
export function updateStatus (data) {
    return request.post('/business/company/updateStatus', data)
    }
export function exportComFiles (data) {
    return request.post('/business/company/exportFiles', data, {
        trim: true,
        download: true
  })
}
// æ ¹æ®ID查询
export function getById (id) {
    return request.get(`/business/company/${id}`)
}
// ä¼ä¸šæ›´æ¢æ‰‹æœºå·
export function updatePhone (data) {
    return request.post('/business/company/updatePhone', data)
}
// ä¿®æ”¹ä¿é™©æ–¹æ¡ˆ
export function updateSolutions (data) {
    return request.post('/business/company/updateSolutions', data)
}
platform/src/api/business/companyUser.js
ÎļþÒÑɾ³ý
platform/src/api/business/dispatchUnit.js
@@ -20,4 +20,24 @@
// æ ¹æ®ID查询
export function getById (id) {
  return request.get(`/business/dispatchUnit/${id}`)
}
export function check (data) {
    return request.post('/business/dispatchUnit/check', data)
}
export function checkWorktype (data) {
    return request.post('/business/dispatchUnit/checkWorktype', data)
}
// æ·»åŠ å·¥ç§
export function createSolution (data) {
    return request.post('/business/dispatchUnit/createSolution', data)
}
// ä¿®æ”¹ä¿¡æ¯
export function editDispatchUnit (data) {
    return request.post('/business/dispatchUnit/editDispatchUnit', data)
}
// æ•°æ®åˆ—表
export function findListByDTO (data) {
    return request.post('/business/dispatchUnit/findListByDTO', data)
}
platform/src/api/business/fileRecord.js
ÎļþÒÑɾ³ý
platform/src/api/business/solutions.js
@@ -0,0 +1,38 @@
import request from '../../utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
    return request.post('/business/solutions/page', data, {
        trim: true
    })
}
// åˆ›å»º
export function create (data) {
    return request.post('/business/solutions/create', data)
}
// æŸ¥è¯¢å…¨éƒ¨ä¿é™©æ–¹æ¡ˆ
export function all (data) {
    return request.post('/business/solutions/list', data)
}
// ç¦ç”¨å¯ç”¨
export function updateStatus (data) {
    return request.post('/business/solutions/updateStatus', data)
}
// ä¿®æ”¹
export function updateById (data) {
    return request.post('/business/solutions/updateById', data)
}
// æ ¹æ®ID查询
export function solutionsId (id) {
    return request.get(`/business/solutions/${id}`)
}
// æŸ¥è¯¢ä¼ä¸šå…¨éƒ¨å…³è”方案
export function listForCompany (data) {
    return request.post('/business/companySolution/listForCompany', data)
}
platform/src/api/business/worktype.js
@@ -1,5 +1,15 @@
import request from '../../utils/request'
// å¯¼å…¥æ¨¡æ¿
export function importExcel (data) {
    return request.post(`/business/worktype/importExcel`, data)
}
// æŸ¥è¯¢å…¨éƒ¨å·¥ç§
export function all (data) {
    return request.post(`/business/worktype/list`, data)
}
// æ ¹æ®æ¡ä»¶å·¥ç§åˆ—表
export function findListByDTO (data) {
  return request.post('/business/worktype/findListByDTO', data)
platform/src/api/system/common.js
@@ -36,12 +36,18 @@
export function category (data) {
  return request.post('/business/category/list', data)
}
// ç±»åˆ«åˆ—表查询
export function baseCategory (data) {
  return request.post('/business/baseCategory/findList', data)
}
// å¯¼å…¥æ¨¡æ¿
export function importExcel (data) {
  return request.post('/business/goods/importExcel', data)
}
// ä¸Šä¼ æŽ¥å£
export function upload (data) {
  return request.post('/public/upload', data)
}
// åŒºåŸŸæ ‘列表
export function findTreeList (data) {
  return request.post('/business/areas/findTreeList', data)
}
platform/src/api/system/menu.js
@@ -2,12 +2,12 @@
// æŸ¥è¯¢----平台菜单
export function fetchTree () {
  return request.post('/system/menu/treeList/0')
  return request.post(`/system/menu/treeList/0`)
}
// æŸ¥è¯¢----企业菜单
export function fetchTree1 () {
  return request.post('/system/menu/treeList/1')
  return request.post(`/system/menu/treeList/1`)
}
// æ–°å»º
@@ -40,8 +40,8 @@
}
// æŸ¥è¯¢èœå•æ ‘
export function fetchMenuTree () {
  return request.get('/system/menu/treeNodes?type=1')
export function fetchMenuTree (type) {
  return request.get('/system/menu/treeNodes?type='+type)
}
// æŽ’序
platform/src/api/system/permission.js
@@ -10,11 +10,6 @@
  return request.get('/system/permission/all')
}
// æŸ¥è¯¢æ‰€æœ‰
export function fetchAllCom () {
  return request.get('/system/permission/all')
}
// æ–°å»º
export function create (data) {
  return request.post('/system/permission/create', data, {
platform/src/api/system/user.js
@@ -5,11 +5,6 @@
  return request.post('/system/user/page', data)
}
// æŸ¥è¯¢
export function findAllList (data) {
  return request.post('/system/user/findAllList', data)
}
// æ–°å»º
export function create (data) {
  return request.post('/system/user/create', data, {
@@ -47,3 +42,8 @@
export function resetPwd (data) {
  return request.post('/system/user/resetPwd', data)
}
// é‡ç½®å¯†ç 
export function updUserStatus (params) {
  return request.get('/system/user/updUserStatus', {params})
}
platform/src/assets/images/alipay.jpeg
Binary files differ
platform/src/assets/images/man.png

platform/src/assets/images/qq.png
Binary files differ
platform/src/assets/images/woman.png

platform/src/assets/images/wxpay.jpeg
Binary files differ
platform/src/assets/logo.png

platform/src/assets/style/element-variables.scss
@@ -6,3 +6,4 @@
$--font-path: '~element-ui/lib/theme-chalk/fonts';
@import "~element-ui/packages/theme-chalk/src/index";
platform/src/assets/style/style.scss
@@ -5,13 +5,26 @@
  padding: 0;
  margin: 0;
  color: $font-color;
  // overflow: hidden;
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  scrollbar-width: none; /* firefox */
  -ms-overflow-style: none; /* IE 10+ */
  &::-webkit-scrollbar {
    display: none; /* Chrome Safari */
  }
  body {
    height: 100%;
    padding: 0;
    margin: 0;
    overflow: scroll;
    overflow: hidden;
    scrollbar-width: none; /* firefox */
    -ms-overflow-style: none; /* IE 10+ */
    &::-webkit-scrollbar {
      display: none; /* Chrome Safari */
    }
  }
  h1,h2,h3,h4,h5,h6,ul {
    margin: 0;
@@ -23,10 +36,61 @@
  #app {
    height: 100%;
    min-width: $page-min-width;
    // overflow: hidden;
  }
}
.bg {
  z-index: 9990 !important;
}
.windows {
  z-index: 9991 !important;
}
// ç©¿æ¢­æ¡†çš„æŒ‰é’®
.el-transfer__buttons {
  padding: 0 16px !important;
}
.table-header {
  background-color: #F5F6F8!important;
  th {
    background-color: #F5F6F8!important;
    color: #3F4F69 !important;
    font-size: 14px;
  }
}
.doumee-element-table {
  border-color: #DFE2E8;
  tr, th, td {
    border-color: #DFE2E8;
  }
}
::v-deep .el-table__fixed {
  height: 100% !important;
}
::v-deep .el-table__fixed-right {
  height: 100% !important;
}
::v-deep .el-table__cell {
  height: 100% !important;
}
.apply-status0, .apply-status2 , .apply-status3, .apply-status10,
.change-status0,.change-status1,.change-status2,
.settle-status0,.settle-status2,.settle-status3,
.tax-status0,
.du-status0 {
  color: #216EEE  !important;
}
  .apply-status1 , .apply-status4, .apply-status6, .apply-status7, .apply-status8,
.change-status3,.change-status4,.change-status5,.change-status8,
.settle-status1,
.tax-status2,
.du-status2 {
  color: #F95601 !important;
}
  .apply-status5,.change-status7,.settle-status7,.tax-status1,.du-status1,.settle-status4  {
  color: #00BA92  !important;
}
platform/src/assets/style/variables.scss
@@ -1,9 +1,16 @@
// ä¸»è‰²è°ƒ
$primary-color: #2E68EC;
$primary-color: #216EEE;
$primary-title-start-color: #3582ff;
$primary-title-color: #216EcE;
$primary-color-sel: #0046c6;
$primary-color-hover: #1562e2;
$icon-background-color: #0d5ada;
//菜单悬浮色:
$menu-hover-color: rgba(33, 110, 238, 0.10);
// å¤´éƒ¨é«˜åº¦
$header-height: 60px;
// èœå•宽度
$menu-width: 208px;
$menu-width: 250px;
// é¡µé¢æœ€å°å®½åº¦
$page-min-width: 1000px;
platform/src/components/base/BaseOpera.vue
@@ -14,6 +14,16 @@
      }
    }
  },
  // watch: {
  //   visible() {
  //     console.log(this.visible);
  //   }
  // },
  watch: {
    $route (to, from) {
      this.close()
    }
  },
  methods: {
    // é…ç½®
    config (extParams = {}) {
@@ -49,6 +59,9 @@
        }
      })
    },
    close () {
      this.visible = false
    },
    // ç¡®è®¤æ–°å»º/修改
    confirm () {
      if (this.form.id == null || this.form.id === '') {
@@ -60,9 +73,12 @@
    // ç¡®è®¤æ–°å»º
    __confirmCreate () {
      this.$refs.form.validate((valid) => {
        // debugger
        if (!valid) {
          return
        }
        // console.log(this.form);
        // debugger
        // è°ƒç”¨æ–°å»ºæŽ¥å£
        this.isWorking = true
        this.api.create(this.form)
platform/src/components/base/BaseTable.vue
@@ -135,9 +135,11 @@
    // åˆ é™¤
    deleteById (row, childConfirm = true) {
      this.__checkApi()
      let message = `确认删除${this.module}【${row[this.configData['field.main']]}】吗?`
      // let message = `确认删除${this.module}【${row[this.configData['field.main']]}】吗?`
      let message = `确认删除该记录吗?`
      if (childConfirm && row.children != null && row.children.length > 0) {
        message = `确认删除${this.module}【${row[this.configData['field.main']]}】及其子${this.module}吗?`
        // message = `确认删除${this.module}【${row[this.configData['field.main']]}】及其子${this.module}吗?`
        message = `确认删除该记录及其子数据吗?`
      }
      this.$dialog.deleteConfirm(message)
        .then(() => {
@@ -175,7 +177,7 @@
          }
        }
        if (containChildrenRows.length > 0) {
          message = `本次将删除${this.module}【${containChildrenRows.join('、')}】及其子${this.module}记录,确认删除吗?`
          message = '本次将删除该数据及其子数据,确认删除吗?'
        }
      }
      this.$dialog.deleteConfirm(message)
platform/src/components/business/OperaDispatchUnitWindow.vue
@@ -1,86 +1,125 @@
<template>
    <GlobalWindow
        :title="title"
        width="100%"
        width="50%"
        :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 class="box">
            <div class="box_label">派遣单位详情</div>
            <div class="box_list">
                <div class="box_list_item">
                    <div class="box_list_item_label">派遣单位:</div>
                    <div class="box_list_item_val">芜湖格力精密制造有限公司</div>
                </div>
                <div class="box_list_item">
                    <div class="box_list_item_label">派遣单位信用代码:</div>
                    <div class="box_list_item_val">913401000900000001</div>
                </div>
                <div class="box_list_item">
                    <div class="box_list_item_label">派遣单位状态:</div>
                    <div class="box_list_item_val">已通过</div>
                </div>
                <div class="box_list_item">
                    <div class="box_list_item_label">派遣单位详述:</div>
                    <div class="box_list_item_val">无</div>
                        </div>
                    </div>
                </div>
                <div class="list_item_table">
            <div class="box_x"></div>
            <div class="box_fa">保险方案:平安保险雇主责任险A版</div>
                    <el-table
                        :data="item.saveDuWorkTypeDTOList"
                :data="tableData"
                        border
                        style="width: 100%">
                        <el-table-column label="序号" width="80px">
                <el-table-column
                    label="序号"
                    align="center"
                    width="80">
                            <template slot-scope="scope">
                                <span>{{scope.$index + 1}}</span>
                            </template>
                        </el-table-column>
                        <el-table-column
                            prop="name"
                    align="center"
                            label="所属工种">
                            <template slot-scope="scope">
                                <el-select v-model="scope.row.workTypeId" @change="changeGZ($event, index, scope.$index)" placeholder="请选择">
                    <template slot-scope="{row}">
                        <el-select v-model="row.info" placeholder="请选择">
                                    <el-option
                                        v-for="item in item.typeWork"
                                        :key="item.id"
                                        :label="item.name"
                                        :value="item.id">
                                v-for="item in options"
                                :key="item.value"
                                :label="item.label"
                                :value="item.value">
                                    </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)" />
                    label="审核通过日期"
                    width="150"
                    align="center"
                    prop="time">
                </el-table-column>
            </el-table>
            <div class="box_videos">
                <div class="box_videos_item" v-for="(item,index) in 1" :key="index">
                    <video src="https://baidu.com"></video>
                    <div class="box_videos_item_info">
                        1-3ç±» è”¬èœ/园艺工/家禽家畜饲养人员
                                </div>
                </div>
            </div>
            <div class="box_fa">保险方案:平安保险雇主责任险A版</div>
            <el-table
                    :data="tableData"
                    border
                    style="width: 100%">
                <el-table-column
                        label="序号"
                        align="center"
                        width="80">
                    <template slot-scope="scope">
                        <span>{{scope.$index + 1}}</span>
                            </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>
                        align="center"
                        label="所属工种">
                    <template slot-scope="{row}">
                        <el-select v-model="row.info" placeholder="请选择">
                            <el-option
                                    v-for="item in options"
                                    :key="item.value"
                                    :label="item.label"
                                    :value="item.value">
                            </el-option>
                        </el-select>
                            </template>
                        </el-table-column>
                <el-table-column
                        label="审核通过日期"
                        width="150"
                        align="center"
                        prop="time">
                </el-table-column>
                    </el-table>
            <div class="box_videos">
                <div class="box_videos_item" v-for="(item,index) in 1" :key="index">
                    <video src="https://baidu.com"></video>
                    <div class="box_videos_item_info">
                        1-3ç±» è”¬èœ/园艺工/家禽家畜饲养人员
                </div>
            </div>
            </div>
            <div class="box_label">审核流程</div>
            <el-timeline :reverse="reverse" style="margin-top: 20px;">
                <el-timeline-item
                    v-for="(activity, index) in activities"
                    :key="index"
                    :timestamp="activity.timestamp">
                    {{activity.content}}
                </el-timeline-item>
            </el-timeline>
        </div>
    </GlobalWindow>
</template>
@@ -88,54 +127,36 @@
<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 },
        components: { GlobalWindow },
  data () {
    return {
                reverse: false,
                activities: [{
                    content: '提交派遣单位',
                    timestamp: '操作员-张伟(安徽豆米科技有限公司)\n' +
                        '\n' +
                        '2023-09-11 00:00:00'
                }, {
                    content: '派遣单位通过\n' +
                        '\n' +
                        '\n' +
                        '提交意见:-',
                    timestamp: '操作员-叶显骏(平台端)\n' +
                        '\n' +
                        '2023-09-11 00:00:00'
                }],
      // è¡¨å•数据
      form: {
        id: null,
        name: '',
        code: '',
        content: '',
        saveDuSolutionDTOList: [
          {
            id: '',
            saveDuWorkTypeDTOList: [
              {
                videoUrl: '',
                workTypeId: '',
                workTypeName: '',
                file: {
                  videourl: '',
                  videourlfull: ''
                }
              }
            ],
            typeWork: [],
            solutionId: '',
            solutionName: ''
          }
        ]
                    worktypeStatus: ''
      },
      // éªŒè¯è§„则
      rules: {
        name: [
          { required: true, message: '请输入派遣单位名称' }
        ],
        code: [
          { required: true, message: '请输入派遣单位信用代码' }
        ],
        content: [
          { required: true, message: '请输入派遣单位描述' }
        ]
      },
      insuranceScheme: []
                tableData: []
    }
  },
  created () {
@@ -143,151 +164,81 @@
      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 {
    .box {
        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 {
        .box_label {
            font-size: 20px;
            font-weight: 600;
                    margin-bottom: 10px;
                    font-size: 14px;
                    color: #606266;
                    span {
                        color: red;
                        margin-right: 4px;
                    }
                }
                .list_item_input_val {
        .box_list {
                    width: 100%;
                    display: flex;
                    align-items: center;
            flex-wrap: wrap;
                    justify-content: space-between;
            .box_list_item {
                width: 33.3%;
                display: flex;
                align-items: center;
                margin-top: 10px;
                .box_list_item_label {
                    flex-shrink: 0;
                    font-size: 14px;
                    color: black;
                }
                .box_list_item_val {
                    flex: 1;
                    font-size: 14px;
                    color: black;
                }
            }
            .list_item_table {
        }
        .box_x {
            width: 100%;
            height: 1px;
            background: #ececec;
            margin: 20px 0;
        }
        .box_fa {
            font-size: 14px;
            color: black;
            margin-bottom: 20px;
        }
        .box_videos {
            width: 100%;
            display: flex;
            flex-wrap: wrap;
            align-items: center;
            margin-top: 20px;
            .box_videos_item {
                width: 300px;
                padding: 5px;
                box-sizing: border-box;
                display: flex;
                align-items: start;
                border: 1px solid #ececec;
                margin-right: 20px;
                margin-bottom: 20px;
                &:last-child {
                    margin-right: 0 !important;
                }
                video {
                    flex-shrink: 0;
                    width: 100px;
                    height: 100px;
                }
                .box_videos_item_info {
                    flex: 1;
                    font-size: 14px;
                    color: black;
                    margin-left: 5px;
                }
            }
        }
    }
platform/src/components/business/addJobType.vue
ÎļþÒÑɾ³ý
platform/src/components/business/dispatchUnitDetails.vue
ÎļþÒÑɾ³ý
platform/src/components/common/DepartmentSelect.vue
@@ -36,7 +36,6 @@
    appendToBody: {
      default: false
    },
    // éœ€è¢«æŽ’除的部门ID
    excludeId: {}
  },
@@ -46,21 +45,16 @@
    }
  },
  watch: {
    excludeId () {
      console.log(this.type);
      this.fetchData()
    },
    type() {
      console.log(this.type);
    value () {
      this.fetchData()
    }
  },
  methods: {
    // èŽ·å–æ‰€æœ‰éƒ¨é—¨
    fetchData () {
      console.log(this.type);
      fetchTree()
        .then(records => {
          // debugger
          this.data = []
          this.__fillData(this.data, records)
        })
platform/src/components/common/GlobalAlertWindow.vue
@@ -1,7 +1,5 @@
<template>
  <el-dialog
    top="10vh"
    class="global-window"
    title="title"
    :visible="visible"
platform/src/components/common/GlobalWindow.vue
@@ -8,18 +8,20 @@
    :close-on-press-escape="false"
    :wrapper-closable="false"
    :append-to-body="true"
    :modal="false"
    @close="close"
  >
    <div slot="title" class="window__header">
      <span class="header__btn-back" @click="close"><i class="el-icon-arrow-left"></i></span>{{title}}
      <!-- {{title}} -->
    </div>
    <div class="window__body">
      <slot></slot>
    </div>
    <div v-if="withFooter" class="window__footer">
      <slot name="footer">
        <el-button @click="confirm" :loading="confirmWorking" type="primary">确定</el-button>
        <el-button @click="close">取消</el-button>
        <el-button @click="confirm" :loading="confirmWorking" type="primary">{{text}}</el-button>
        <el-button @click="close">返回</el-button>
      </slot>
    </div>
  </el-drawer>
@@ -31,12 +33,17 @@
  props: {
    width: {
      type: String,
      default: '36%'
      default: '100%'
    },
    // æ˜¯å¦åŒ…含底部操作
    withFooter: {
      type: Boolean,
      default: true
    },
    // æäº¤æŒ‰é’®æ–‡å­—
    text: {
      type: String,
      default: '确定'
    },
    // ç¡®è®¤æŒ‰é’®loading状态
    confirmWorking: {
@@ -70,11 +77,16 @@
// è¾“入框高度
$input-height: 32px;
.global-window {
  top: 80px !important;
  left: 250px !important;
  // å¤´éƒ¨æ ‡é¢˜
  /deep/ .el-drawer__header {
  ::v-deep .el-drawer__header {
    padding: 0 10px 0 0;
    line-height: 40px;
    border-bottom: 1px solid #eee;
    // text-align: center;
    font-weight: 500;
    color: #222;
    // è¿”回按钮
    .header__btn-back {
      display: inline-block;
@@ -90,7 +102,7 @@
    }
  }
  // ä¸»ä½“
  /deep/ .el-drawer__body {
  ::v-deep .el-drawer__body {
    display: flex;
    flex-direction: column;
    position: absolute;
@@ -98,12 +110,24 @@
    bottom: 0;
    width: 100%;
    overflow: hidden;
    // background-color: #f7f7f7;
    // å†…容
    .window__body {
      // width: 1100px;
      // margin: 0 auto;
      // background-color: #fff;
      width: 100%;
      height: 100%;
      overflow-y: auto;
      padding: 12px 16px;
      // æ ‡ç­¾
      // .el-form-item__label {
      //   float: none;
      // }
      // å…ƒç´ å®½åº¦ä¸º100%
      .el-form-item__content > *{
        width: 100%;
      }
    }
    // å°¾éƒ¨
    .window__footer {
platform/src/components/common/Header.vue
@@ -6,149 +6,25 @@
        <i class="el-icon-s-fold" v-else @click="switchCollapseMenu(null)"></i>
        {{title}}
      </h2>
      <div class="user">
        <el-dropdown trigger="click">
          <span class="el-dropdown-link">
            <img v-if="userInfo != null" :src="userInfo.avatar == null ? '@/assets/images/avatar/man.png' : userInfo.avatar" alt="">{{userInfo | displayName}}<i class="el-icon-arrow-down el-icon--right"></i>
          </span>
          <el-dropdown-menu slot="dropdown">
            <el-dropdown-item @click.native="changePwd">修改密码</el-dropdown-item>
            <el-dropdown-item @click.native="logout">退出登录</el-dropdown-item>
          </el-dropdown-menu>
        </el-dropdown>
      <tagsview class="tags"></tagsview>
      </div>
    </div>
    <!-- ä¿®æ”¹å¯†ç  -->
    <GlobalWindow
      title="修改密码"
      :visible.sync="visible.changePwd"
      @confirm="confirmChangePwd"
      @close="visible.changePwd = false"
    >
      <el-form :model="changePwdData.form" ref="changePwdDataForm" :rules="changePwdData.rules">
        <el-form-item label="原始密码" prop="oldPwd" required>
          <el-input v-model="changePwdData.form.oldPwd" type="password" placeholder="请输入原始密码" maxlength="30" show-password></el-input>
        </el-form-item>
        <el-form-item label="新密码" prop="newPwd" required>
          <el-input v-model="changePwdData.form.newPwd" type="password" placeholder="请输入新密码" maxlength="30" show-password></el-input>
        </el-form-item>
        <el-form-item label="确认新密码" prop="confirmPwd" required>
          <el-input v-model="changePwdData.form.confirmPwd" type="password" placeholder="请再次输入新密码" maxlength="30" show-password></el-input>
        </el-form-item>
      </el-form>
    </GlobalWindow>
  </div>
</template>
<script>
import { mapState, mapMutations } from 'vuex'
import GlobalWindow from './GlobalWindow'
import { logout, updatePwd } from '@/api/system/common'
import tagsview from "./tagsview.vue"
export default {
  name: 'Header',
  components: { GlobalWindow },
  data () {
    return {
      visible: {
        // ä¿®æ”¹å¯†ç 
        changePwd: false
      },
      isWorking: {
        // ä¿®æ”¹å¯†ç 
        changePwd: false
      },
      username: 'bob', // ç”¨æˆ·å
      // ä¿®æ”¹å¯†ç å¼¹æ¡†
      changePwdData: {
        form: {
          oldPwd: '',
          newPwd: '',
          confirmPwd: ''
        },
        rules: {
          oldPwd: [
            { required: true, message: '请输入原始密码' }
          ],
          newPwd: [
            { required: true, message: '请输入新密码' }
          ],
          confirmPwd: [
            { required: true, message: '请再次输入新密码' }
          ]
        }
      }
    }
  },
  components: { tagsview },
  computed: {
    ...mapState(['menuData', 'userInfo']),
    ...mapState(['menuData']),
    title () {
      return this.$route.meta.title
    }
  },
  filters: {
    // å±•示名称
    displayName (userInfo) {
      if (userInfo == null) {
        return ''
      }
      if (userInfo.realname != null && userInfo.realname.trim().length > 0) {
        return userInfo.realname
      }
      return userInfo.username
    }
  },
  methods: {
    ...mapMutations(['setUserInfo', 'switchCollapseMenu']),
    // ä¿®æ”¹å¯†ç 
    changePwd () {
      this.visible.changePwd = true
      this.$nextTick(() => {
        this.$refs.changePwdDataForm.resetFields()
      })
    },
    // ç¡®å®šä¿®æ”¹å¯†ç 
    confirmChangePwd () {
      if (this.isWorking.changePwd) {
        return
      }
      this.$refs.changePwdDataForm.validate((valid) => {
        if (!valid) {
          return
        }
        // éªŒè¯ä¸¤æ¬¡å¯†ç è¾“入是否一致
        if (this.changePwdData.form.newPwd !== this.changePwdData.form.confirmPwd) {
          this.$tip.warning('两次密码输入不一致')
          return
        }
        // æ‰§è¡Œä¿®æ”¹
        this.isWorking.changePwd = true
        updatePwd({
          oldPwd: this.changePwdData.form.oldPwd,
          newPwd: this.changePwdData.form.newPwd
        })
          .then(() => {
            this.$tip.apiSuccess('修改成功')
            this.visible.changePwd = false
          })
          .catch(e => {
            this.$tip.apiFailed(e)
          })
          .finally(() => {
            this.isWorking.changePwd = false
          })
      })
    },
    // é€€å‡ºç™»å½•
    logout () {
      logout()
        .then(() => {
          this.setUserInfo(null)
          this.$router.push({ name: 'login' })
        })
        .catch(e => {
          this.$tip.apiFailed(e)
        })
    }
    ...mapMutations(['switchCollapseMenu']),
  }
}
</script>
@@ -161,47 +37,23 @@
  background: #fff;
  height: 100%;
  display: flex;
  overflow: hidden;
  h2 {
    width: 50%;
    flex-shrink: 0;
    line-height: $header-height;
    line-height: 48px;
    width: 200px;
    font-size: 19px;
    font-weight: 600;
    color: #606263;
    font-weight: normal;
    display: inline;
    & > i {
      font-size: 20px;
      margin-right: 12px;
    }
  }
  .user {
    width: 50%;
    flex-shrink: 0;
    text-align: right;
    .el-dropdown-link {
      height: 100%;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    .el-dropdown {
      top: 2px;
      height: 100%;
    }
    img {
      width: 32px;
      position: relative;
      // top: 10px;
      margin-right: 10px;
    }
  }
}
// ä¸‹æ‹‰èœå•框
.el-dropdown-menu {
  width: 140px;
  .el-dropdown-menu__item:hover {
    background: #E3EDFB;
    color: $primary-color;
  }
}
// .tags {
//     padding-bottom: 16px;
//   }
</style>
platform/src/components/common/ImportButton.vue
@@ -1,7 +1,7 @@
<template>
  <div class="import-button">
    <el-button type="primary" @click="$refs.importWindow.open(text)">{{text}}</el-button>
    <ImportWindow :action="action" :template-path="templatePath" :template-name="templateName" ref="importWindow" @success="handleSuccess"/>
    <ImportWindow :action="action" :template-path="templatePath" :template-name="templateName" ref="importWindow" @download="$emit('download')" @success="handleSuccess"/>
  </div>
</template>
platform/src/components/common/ImportWindow.vue
@@ -102,7 +102,7 @@
     */
    confirm () {
      if (this.form.file == null) {
        this.$message.warning('请选择文件')
        this.$tip.warning('请选择文件')
        return
      }
      this.isWorking = true
@@ -114,12 +114,12 @@
        }
      })
        .then(() => {
          this.$message.success('导入成功')
          this.$tip.success('导入成功')
          this.visible = false
          this.$emit('success')
        })
        .catch(e => {
          this.$message.error(e)
          this.$tip.apiFailed(e)
        })
        .finally(() => {
          this.isWorking = false
@@ -137,11 +137,10 @@
    downloadTemplate () {
      const link = document.createElement('a')
      link.setAttribute('download', this.templateName) //下载的文件名
      // console.log(`window.location.origin`, window.location.origin);
      // console.log(`process.env.VUE_APP_CONTEXT_PATH`, process.env.VUE_APP_CONTEXT_PATH);
      // console.log(`this.templatePath`, this.templatePath);
      console.log(`${window.location.origin}${process.env.VUE_APP_CONTEXT_PATH}${this.templatePath}`);
      link.href = `${window.location.origin}${process.env.VUE_APP_CONTEXT_PATH}${this.templatePath}`  //文件url
      link.click()
      // this.$emit('download')
    },
    /**
     * æ–‡ä»¶ä¸Šä¼ å‰å­˜å‚¨ä¸Šä¼ çš„æ–‡ä»¶
platform/src/components/common/Light.vue
@@ -28,13 +28,16 @@
$cycle-size01: 16px;
$cycle-size02: 6px;
$normal-color: #00CC99;
$shadow-color: #00CCa9;
$warn-color: #FFCC33;
$warn-shadow-color: #FFCbe3;
$danger-color: #FF3300;
$dange-shadowr-color: #FF3310;
@mixin light-status ($cycle-bg) {
  em {
    background: $cycle-bg;
    i {
      background: $cycle-bg - 30;
      background: mix($cycle-bg,  #000030, 0.5);
    }
  }
}
@@ -79,44 +82,44 @@
}
@keyframes shine-normal {
  0% {
    box-shadow: 0 0 5px $normal-color + 10;
    box-shadow: 0 0 5px $shadow-color;
  }
  25% {
    box-shadow: 0 0 10px $normal-color + 10;
    box-shadow: 0 0 10px $shadow-color;
  }
  50% {
    box-shadow: 0 0 15px $normal-color + 10;
    box-shadow: 0 0 15px $shadow-color;
  }
  100% {
    box-shadow: 0 0 20px $normal-color + 10;
    box-shadow: 0 0 20px $shadow-color;
  }
}
@keyframes shine-warn {
  0% {
    box-shadow: 0 0 5px $warn-color - 50;
    box-shadow: 0 0 5px $warn-shadow-color;
  }
  25% {
    box-shadow: 0 0 10px $warn-color - 50;
    box-shadow: 0 0 10px $warn-shadow-color;
  }
  50% {
    box-shadow: 0 0 15px $warn-color - 50;
    box-shadow: 0 0 15px $warn-shadow-color;
  }
  100% {
    box-shadow: 0 0 20px $warn-color - 50;
    box-shadow: 0 0 20px $warn-shadow-color;
  }
}
@keyframes shine-danger {
  0% {
    box-shadow: 0 0 5px $danger-color + 10;
    box-shadow: 0 0 5px $dange-shadowr-color;
  }
  25% {
    box-shadow: 0 0 10px $danger-color + 10;
    box-shadow: 0 0 10px $dange-shadowr-color;
  }
  50% {
    box-shadow: 0 0 15px $danger-color + 10;
    box-shadow: 0 0 15px $dange-shadowr-color;
  }
  100% {
    box-shadow: 0 0 20px $danger-color + 10;
    box-shadow: 0 0 20px $dange-shadowr-color;
  }
}
</style>
platform/src/components/common/Menu.vue
@@ -1,9 +1,5 @@
<template>
  <div class="menu" :class="{collapse: menuData.collapse}">
    <div class="logo">
      <div><img src="@/assets/logo.png"></div>
      <h1 :class="{ hidden: menuData.collapse }">云易保客户服务系统</h1>
    </div>
    <scrollbar>
      <el-menu
        ref="menu"
@@ -13,6 +9,7 @@
        :collapse="menuData.collapse"
        :default-openeds="defaultOpeneds"
        :collapse-transition="false"
        unique-opened
        @select="handleSelect"
      >
        <MenuItems v-for="menu in menuData.list" :key="menu.index" :menu="menu" :is-root-menu="true"/>
@@ -39,12 +36,17 @@
      const menuConfig = this.__getMenuConfig(path, 'url', this.menuData.list)
      if (menuConfig == null) {
        return null
      } else {
        this.$store.commit("pushtags", menuConfig)
      }
      // console.log(menuConfig.index);
      return menuConfig.index
    },
    // é»˜è®¤å±•开的菜单index
    defaultOpeneds () {
      return this.menuData.list.map(menu => menu.index)
      // return this.menuData.list.map(menu => menu.index)
      return [this.menuData.list[0].index]
    }
  },
  methods: {
@@ -64,7 +66,9 @@
      if (menuConfig.url == null || menuConfig.url.trim().length === 0) {
        return
      }
      this.$router.push(menuConfig.url)
      this.$store.commit("pushtags", menuConfig)
    },
    // èŽ·å–èœå•é…ç½®
    __getMenuConfig (value, key, menus) {
@@ -91,37 +95,6 @@
  height: 100%;
  display: flex;
  flex-direction: column;
  // LOGO
  .logo {
    height: 60px;
    flex-shrink: 0;
    line-height: 60px;
    overflow: hidden;
    display: flex;
    background: $primary-color - 20;
    padding: 0 16px;
    & > div {
      width: 32px;
      flex-shrink: 0;
      margin-right: 12px;
      img {
        width: 100%;
        flex-shrink: 0;
        vertical-align: middle;
        position: relative;
        top: -2px;
      }
    }
    h1 {
      font-size: 16px;
      font-weight: 500;
      transition: opacity ease .3s;
      overflow: hidden;
      &.hidden {
        opacity: 0;
      }
    }
  }
}
</style>
<style lang="scss">
@@ -135,11 +108,11 @@
    background: $primary-color;
    // é€‰ä¸­çŠ¶æ€
    &.is-active {
      background: $primary-color - 40 !important;
      background: $primary-color-sel !important;
    }
    // æ‚¬æµ®
    &:hover {
      background-color: $primary-color - 12;
      background-color: $primary-color-hover;
    }
    &:focus {
      background: $primary-color;
@@ -152,13 +125,13 @@
    }
    &.is-active {
      .el-submenu__title{
        background-color: $primary-color - 20;
        background-color: $icon-background-color;
      }
      .el-menu .el-menu-item{
        background-color: $primary-color - 20;
        background-color: $icon-background-color;
        // æ‚¬æµ®
        &:hover {
          background-color: $primary-color - 30;
          background-color: $icon-background-color;
        }
      }
    }
platform/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: '请选择菜单'
@@ -30,10 +33,6 @@
    },
    appendToBody: {
      default: false
    },
    type: {
      type: String|Number,
      default: 0
    },
    // éœ€è¢«æŽ’除的部门ID
    excludeId: {}
@@ -51,7 +50,8 @@
  methods: {
    // èŽ·å–æ‰€æœ‰èœå•
    fetchData () {
      fetchTree({}, this.type)
      if (this.type === '1') {
        fetchTree1()
        .then(records => {
          this.data = []
          this.__fillData(this.data, records)
@@ -59,6 +59,16 @@
        .catch(e => {
          this.$tip.apiFailed(e)
        })
      } else {
        fetchTree()
          .then(records => {
            this.data = []
            this.__fillData(this.data, records)
          })
          .catch(e => {
            this.$tip.apiFailed(e)
          })
      }
    },
    // å¡«å……菜单树
    __fillData (list, pool) {
platform/src/components/common/Pagination.vue
@@ -2,7 +2,7 @@
  <div class="table-pagination">
    <el-pagination
      :current-page="pagination.pageIndex"
      :page-sizes="[10, 20, 30, 40]"
      :page-sizes="pagination.pageSizes||[10, 20, 30, 40]"
      :page-size="pagination.pageSize"
      layout="total, sizes, prev, pager, next, jumper"
      :total="pagination.total"
platform/src/components/common/PositionSelect.vue
@@ -93,7 +93,7 @@
}
.vue-treeselect {
  line-height: 30px;
  /deep/ .vue-treeselect__control {
  ::deep .vue-treeselect__control {
    height: 32px;
    .vue-treeselect__single-value {
      line-height: 30px;
platform/src/components/common/SearchFormCollapse.vue
@@ -31,7 +31,7 @@
    height: 50px;
    overflow: hidden;
    padding-right: 250px;
    /deep/ section {
    ::v-deep section {
      position: absolute;
      top: 0;
      right: 100px;
platform/src/components/common/TreeSelect.vue
@@ -57,7 +57,7 @@
  }
  .vue-treeselect {
    line-height: 30px;
    /deep/ .vue-treeselect__control {
    ::v-deep .vue-treeselect__control {
      height: 32px;
      .vue-treeselect__single-value {
        line-height: 30px;
platform/src/components/common/UploadAvatarImage.vue
@@ -1,6 +1,8 @@
<template>
  <div>
    <el-upload
      class="avatar-uploader"
      accept=".png,.jpg"
      :style="customStyle"
      :action="uploadImgUrl"
      :data="uploadData"
@@ -25,22 +27,16 @@
      type: Object,
      default: () => {}
    },
    uploadData: Object,
    tipsLabel: '',
    customStyle: {
      type: String,
      default: 'width: 90px; height: 90px;'
    }
    },
    uploadData: Object
  },
  data() {
    return {
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/upload',
      // uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/uploadPicture',
      // uploadData: {
      //   folder: 'upload',
      //   type: 'image'
      // },
      imgurlfull: ''
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/upload'
    }
  },
  
@@ -51,46 +47,55 @@
        let { data } = res
        this.file.imgurl = data.imgaddr;
        this.file.imgurlfull = data.url;
        console.log(this.file);
        this.$message.success('上传成功')
        this.$emit('uploadSuccess', { imgurl: data.imgaddr, imgurlfull: data.url })
        this.$emit('uploadSuccess', { imgurl: data.imgaddr, imgurlfull: data.url, name: data.originname })
      } else {
        this.$message.error('上传失败')
        this.$tip.apiFailed('上传失败')
      }
      this.$emit('uploadEnd')
    },
    uploadError() {
      this.$message.error('上传失败')
      this.$tip.apiFailed('上传失败')
      this.$emit('endUpload')
    },
    // // æ‹¦æˆª
    beforeAvatarUpload(file) {
      this.$emit('uploadBegin')
      return true;
    },
  },
      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;
  line-height: 90px;
  width: $image-width;
  height: $image-width;
  text-align: center;
}
.avatar {
  width: $image-width;
  height: $image-width;
  display: block;
}
.tips-style {
@@ -101,4 +106,23 @@
  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/components/common/UploadImage.vue
@@ -59,7 +59,7 @@
  },
  data() {
    return {
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/upload',
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/uploadLocal',
      
      realList: [],
      srcList: [],
@@ -70,6 +70,7 @@
  watch: {
    fileList: {
      handler(val) {
        console.log(val);
        if (val.length==0) {
          this.realList = []
          this.srcList = []
@@ -120,8 +121,8 @@
      this.showViewer = false
    },
    handleRemove(file) {
      console.log(file.url);
      let tempIndex = this.fileList.findIndex(item => item.url === file.url)
      console.log(this.fileList);
      let tempIndex = this.realList.findIndex(item => item.url === file.url)
      // debugger
      this.realList.splice(tempIndex, 1)
      this.fileList.splice(tempIndex, 1)
platform/src/components/system/menu/OperaMenuWindow.vue
@@ -9,7 +9,7 @@
    <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" v-model="form.parentId" :type="type" placeholder="请选择上级菜单" :exclude-id="excludeMenuId" clearable :inline="false"/>
        <MenuSelect v-if="visible" 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"/>
@@ -40,12 +40,6 @@
  name: 'OperaMenuWindow',
  extends: BaseOpera,
  components: { MenuSelect, GlobalWindow },
  props: {
    type: {
      type: String|Number,
      default: 0
    }
  },
  data () {
    return {
      icons,
@@ -60,8 +54,8 @@
        name: '',
        path: '',
        icon: '',
        type: '',
        remark: ''
        remark: '',
        type: ''
      },
      // éªŒè¯è§„则
      rules: {
@@ -85,8 +79,8 @@
        this.excludeMenuId = null
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form.type = this.type
          this.form.id = null
          this.form.type = parent.type
          this.form.parentId = parent == null ? null : parent.id
          this.parentName = parent == null ? null : parent.name
        })
platform/src/components/system/role/MenuConfigWindow.vue
@@ -45,8 +45,8 @@
    /**
     * @role è§’色对象
     */
    open (role, type=0) {
      fetchMenuList({}, type)
    open (role) {
      fetchMenuList({})
        .then(records => {
          this.role = role
          this.menus = records
platform/src/components/system/role/OperaRoleWindow.vue
@@ -35,8 +35,7 @@
        id: null,
        code: '',
        name: '',
        remark: '',
        type: '',
        remark: ''
      },
      // éªŒè¯è§„则
      rules: {
@@ -50,14 +49,13 @@
    }
  },
  methods: {
    open (title, target, type) {
    open (title, target) {
      this.title = title
      this.visible = true
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form.type = type
          this.form[this.configData['field.id']] = null
        })
        return
@@ -68,7 +66,6 @@
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        this.form.type = type
      })
    },
    confirm () {
platform/src/components/system/role/PermissionConfigWindow.vue
@@ -26,7 +26,7 @@
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import { createRolePermission } from '@/api/system/role'
import { fetchAll, fetchAllCom } from '@/api/system/permission'
import { fetchAll } from '@/api/system/permission'
export default {
  name: 'PermissionConfigWindow',
  components: { GlobalWindow },
@@ -46,14 +46,12 @@
    /**
     * @role è§’色对象
     */
    open (role, type=0) {
      debugger
    open (role) {
      if (this.$refs.permissionTransfer) {
        this.$refs.permissionTransfer.clearQuery('left')
        this.$refs.permissionTransfer.clearQuery('right')
      }
      let action = type==0 ? fetchAll : fetchAllCom
      action()
      fetchAll()
        .then(records => {
          this.role = role
          this.permissions = records
platform/src/components/system/user/OperaUserWindow.vue
@@ -7,44 +7,24 @@
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="用户名" prop="username" required>
        <el-input v-model="form.username" placeholder="请输入用户名" v-trim maxlength="50"/>
      <el-form-item label="账号" prop="username" required>
        <el-input v-model="form.username" placeholder="请输入" v-trim maxlength="50"/>
      </el-form-item>
      <el-form-item label="姓名" prop="realname" required>
        <el-input v-model="form.realname" placeholder="请输入姓名" v-trim maxlength="50"/>
      <el-form-item label="名称" prop="realname" required>
        <el-input v-model="form.realname" placeholder="请输入" v-trim maxlength="50"/>
      </el-form-item>
      <el-form-item label="性别" prop="sex" required>
        <el-radio-group v-model="form.sex">
          <el-radio label="1">男</el-radio>
          <el-radio label="0">女</el-radio>
        </el-radio-group>
      <el-form-item label="联系方式" prop="mobile">
        <el-input v-model="form.mobile" placeholder="请输入" v-trim maxlength="11"/>
      </el-form-item>
      <!-- <el-form-item label="头像" prop="avatar" required>
        <el-radio-group v-model="form.avatar" class="form-item-avatar">
          <el-radio label="https://dmtest.ahapp.net/preselectfile/man.png" border><img src="https://dmtest.ahapp.net/preselectfile/man.png" alt=""></el-radio>
          <el-radio label="https://dmtest.ahapp.net/preselectfile/woman.png" border><img src="https://dmtest.ahapp.net/preselectfile/woman.png" alt=""></el-radio>
        </el-radio-group>
      </el-form-item> -->
      <el-form-item v-if="form.id == null" label="初始密码" prop="password" required>
        <el-input v-model="form.password" type="password" placeholder="请输入初始密码" maxlength="30" show-password/>
      <el-form-item label="验证码" prop="captcha">
        <div style="width: 100%; display: flex; align-items: center;">
          <el-input v-model="form.captcha" maxlength="11" type="number" style="flex: 1;" placeholder="请输入" v-trim/>
          <el-button type="primary" style="flex-shrink: 0; margin-left: 15px;" @click="send" v-if="num === 0">发送验证码</el-button>
          <el-button type="primary" style="flex-shrink: 0; margin-left: 15px;" v-else>{{num}}s</el-button>
        </div>
      </el-form-item>
            <el-form-item label="所属部门" prop="departmentId" required>
        <DepartmentSelect v-model="form.departmentId" placeholder="请选择用户所属部门" :inline="false" clearable/>
      </el-form-item>
      <el-form-item label="岗位" prop="positionId">
        <PositionSelect v-model="form.positionIds" placeholder="请选择用户所在岗位" :inline="false" :multiple="true" clearable/>
      </el-form-item>
      <el-form-item label="工号" prop="empNo">
        <el-input v-model="form.empNo" placeholder="请输入工号" v-trim maxlength="50"/>
      </el-form-item>
      <el-form-item label="手机号码" prop="mobile">
        <el-input v-model="form.mobile" placeholder="请输入手机号码" v-trim maxlength="11"/>
      </el-form-item>
      <el-form-item label="邮箱" prop="email">
        <el-input v-model="form.email" placeholder="请输入邮箱" v-trim maxlength="200"/>
      </el-form-item>
      <el-form-item label="生日" prop="birthday">
        <el-date-picker v-model="form.birthday" value-format="yyyy-MM-dd" placeholder="请选择用户生日"/>
      <el-form-item label="抄送文件邮箱" prop="email">
        <el-input v-model="form.email" placeholder="请输入" v-trim />
      </el-form-item>
    </el-form>
  </GlobalWindow>
@@ -56,6 +36,7 @@
import DepartmentSelect from '@/components/common/DepartmentSelect'
import PositionSelect from '@/components/common/PositionSelect'
import { checkMobile, checkEmail } from '@/utils/form'
import { sendSms } from '@/api/business/smsEmail'
export default {
  name: 'OperaUserWindow',
@@ -68,16 +49,12 @@
        id: null,
        username: '', // ç”¨æˆ·å
        realname: '', // å§“名
        empNo: '', // å·¥å·
        departmentId: null, //  æ‰€å±žéƒ¨é—¨ID
        positionIds: [], //  æ‰€å±žå²—位ID集
        // avatar: '/avatar/man.png', // å¤´åƒ
        password: '', // å¯†ç 
        mobile: '', // æ‰‹æœºå·ç 
        email: '', // é‚®ç®±
        sex: '1', // æ€§åˆ«
        birthday: '' // ç”Ÿæ—¥
        email: '',
        captcha: ''
      },
      num: 0,
      timer: null,
      // éªŒè¯è§„则
      rules: {
        username: [
@@ -86,28 +63,36 @@
        realname: [
          { required: true, message: '请输入姓名' }
        ],
        password: [
          { required: true, message: '请输入密码' }
        ],
        departmentId: [
          { required: true, message: '请选择部门' }
        ],
        avatar: [
          { required: true, message: '请选择用户头像' }
        ],
        sex: [
          { required: true, message: '请选择用户性别' }
        ],
        mobile: [
          { required: true, validator: checkMobile }
        ],
        email: [
          { validator: checkEmail }
          { required: true, message: '请输入邮箱' }
        ]
      }
    }
  },
  methods: {
    send() {
      if (!this.form.mobile) {
        this.$message.warning('请输入手机号')
        return
      }
      sendSms({ phone: this.form.mobile })
        .then(res => {
          this.num = 60
          this.setTime()
        })
    },
    setTime() {
      this.timer = setInterval(() => {
        this.num -= 1
        if (this.num === 0) {
          clearInterval(this.timer)
          this.num = 0
        }
      }, 1000)
    },
    /**
     * @title çª—口标题
     * @target ç¼–辑的用户对象
@@ -115,6 +100,8 @@
    open (title, target) {
      this.title = title
      this.visible = true
      clearInterval(this.timer)
      this.num = 0
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
platform/src/layouts/AppLayout.vue
@@ -1,4 +1,7 @@
<template>
  <div>
    <CommonHeader />
    <div style="height:10px; background: #fff"></div>
  <el-container class="app-layout">
    <el-aside :class="{collapse:menuData.collapse}">
      <Menu/>
@@ -7,25 +10,40 @@
      <header>
        <AppHeader/>
      </header>
        <div style="height:10px;"></div>
      <main>
        <transition name="fade">
            <keep-alive>
          <router-view></router-view>
            </keep-alive>
        </transition>
      </main>
    </el-main>
  </el-container>
  </div>
</template>
<script>
import { mapState } from 'vuex'
import Header from '@/components/common/Header'
import CommonHeader from '@/components/common/CommonHeader'
import Menu from '@/components/common/Menu'
export default {
  name: 'DefaultLayout',
  components: { AppHeader: Header, Menu },
  computed: {
    ...mapState(['menuData'])
  components: { AppHeader: Header, Menu, CommonHeader },
  data() {
    return {
      isFinishData: false
  }
  },
  computed: {
    ...mapState(['menuData', 'userInfo'])
  },
  methods: {
  },
}
</script>
@@ -34,17 +52,27 @@
.el-container {
  background: #F7F8F9;
  height: 100%;
  display: flex;
  overflow: hidden;
  // overflow: hidden;
  overflow: scroll;
  // å·¦è¾¹èœå•
  .el-aside {
    width: $menu-width !important;
    flex-shrink: 0;
    height: 100%;
    overflow-y: auto;
    // height: 100%;
    // height: 900px;
    height: calc(100vh - 80px);
    overflow-y: scroll;
    overflow-x: hidden;
    background: $primary-color;
    color: #fff;
    transition: width ease .3s;
    scrollbar-width: none; /* firefox */
    -ms-overflow-style: none; /* IE 10+ */
    &::-webkit-scrollbar {
      display: none; /* Chrome Safari */
    }
    &.collapse {
      width: 64px !important;
    }
@@ -52,14 +80,21 @@
  // å³è¾¹å†…容
  .el-main {
    width: 100%;
    height: 100%;
    // height: 100%;
    height: calc(100vh - 90px);
    padding: 0;
    position: relative;
    display: flex;
    flex-direction: column;
    overflow: hidden;
    overflow-y: scroll;
    overflow-x: hidden;
    scrollbar-width: none; /* firefox */
    -ms-overflow-style: none; /* IE 10+ */
    &::-webkit-scrollbar {
      display: none; /* Chrome Safari */
    }
    & > header {
      height: $header-height;
      height: 48px;
      flex-shrink: 0;
    }
    & > main {
@@ -81,4 +116,33 @@
  transition: all .5s;
  position: absolute;
}
.comfirm {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  background-color: rgba(0, 0, 0, 0.3);
  z-index: 1000;
  .container {
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
    margin: auto;
    background-color: #fff;
    width: 500px;
    height: 120px;
    padding: 30px;
    box-sizing: border-box;
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    .complete {
      display: flex;
      flex-direction: row-reverse;
    }
  }
}
</style>
platform/src/layouts/TableLayout.vue
@@ -1,11 +1,11 @@
<template>
  <div class="table-layout">
    <!-- å¤´éƒ¨ -->
    <div v-if="withBreadcrumb" class="table-header">
<!--    <div v-if="withBreadcrumb" class="table-header">
      <el-breadcrumb separator="/">
        <el-breadcrumb-item v-for="path in paths" :key="path">{{path}}</el-breadcrumb-item>
      </el-breadcrumb>
    </div>
    </div>-->
    <Profile :roles="roles" :permissions="permissions">
      <!-- æœç´¢è¡¨å•部分 -->
      <div class="table-search-form">
platform/src/main.js
@@ -60,7 +60,7 @@
      if (storeMenus.length > 0 && this.homePage == null) {
        this.setHomePage(storeMenus[0])
      }
      await fetchMenuTree({ type: 0 })
      await fetchMenuTree(this.userInfo.type)
        .then(menus => {
          // æ·»åŠ èœå•
          storeMenus.push.apply(storeMenus, menus)
platform/src/plugins/download.js
@@ -2,12 +2,11 @@
import message from './message'
export default function (response, decode = true, mime = 'application/octet-stream') {
  debugger
  // å½“下载接口没有成功返回流并且接口返回的是JSON时需要对响应流进行解析并提示错误。(处理下载接口出现未知异常的情况)
  if (response.headers['content-type'] === 'application/json') {
    const blob = new Blob([response.data])
    const fileReader = new FileReader()
    fileReader.readAsText(blob, 'UTF-8')
    fileReader.readAsText(blob, 'utf-8')
    fileReader.onload = function () {
      message.apiFailed(JSON.parse(fileReader.result))
    }
platform/src/plugins/messagebox.js
@@ -10,6 +10,13 @@
      type: 'warning'
    })
  },
  resetConfirm (message) {
    return MessageBox.confirm(message, '重置提醒', {
      confirmButtonText: '确认重置',
      cancelButtonText: '取消',
      type: 'warning'
    })
  },
  // ç¦ç”¨äºŒæ¬¡ç¡®è®¤
  disableConfirm (message) {
    return MessageBox.confirm(message, '禁用提醒', {
@@ -25,5 +32,37 @@
      cancelButtonText: '取消',
      type: 'warning'
    })
  },
  // å®Œå–„提醒
  messageApprove (message) {
    return MessageBox.confirm(message, '审核提醒', {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: 'warning'
    })
  },
    // é—®å·ç¡®å®žæé†’
  messageWaring (message, title, confirmText='确定', cancelText='取消') {
    return MessageBox.confirm(message, title, {
      confirmButtonText: confirmText,
      cancelButtonText: cancelText,
      type: 'warning'
    })
  },
    // é—®å·ç¡®å®žæé†’
  messageConfirm (message, confirmText='确定', cancelText='取消') {
    return MessageBox.confirm(message, "操作确认", {
      confirmButtonText: confirmText,
      cancelButtonText: cancelText,
      type: 'warning'
    })
  },
  // ç¡®è®¤æ˜¯å¦æœåŠ¡è¯¥ä¼ä¸š
  cancelOrder (message) {
    return MessageBox.confirm(message, '取消提示', {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: 'warning'
    })
  }
}
platform/src/router/index.js
@@ -3,6 +3,7 @@
import AppLayout from '@/layouts/AppLayout'
import { getUserInfo } from '@/api/system/common'
const Login = () => import('@/views/login')
const ErrorNoPermissions = () => import('@/views/no-permissions')
const Error404 = () => import('@/views/not-found')
@@ -18,6 +19,7 @@
      path: '/login',
      component: Login
    },
    // æ— æƒé™
    {
      name: 'no-permissions',
platform/src/store/index.js
@@ -13,7 +13,11 @@
    list: [],
    // æ˜¯å¦æ”¶èµ·
    collapse: false
  }
  },
  //tags数组
  tags:[],
  //tagsview标签显示隐藏
  isCollapse:false
}
const mutations = {
@@ -28,8 +32,12 @@
  },
  // è®¾ç½®å·²ç™»å½•的用户信息
  setUserInfo: (state, data) => {
    state.userInfo = data
    state.userInfo = {
      ...state.userInfo,
      ...data
    }
  },
  // è®¾ç½®é¦–页路由信息
  setHomePage (state, homePage) {
    state.homePage = homePage
@@ -37,6 +45,37 @@
  // é‡ç½®èœå•
  resetMenus: (state) => {
    state.menuData.list = []
  },
  //  tags
  pushtags(state,val){
    //如果等于-1说明tabs不存在那么插入,否则什么都不做
    //findindex找角标,循环判断一下,如果等于那么就代表有相同的,就不必添加,如果找不到那就是-1.就添加
    let result = state.tags.findIndex(item => item.label === val.label)
    if (result === -1) {
      state.tags.push({...val, keepAlive: false})
    } else {
      state.tags[result]= {...val, keepAlive: true}
    }
    // result === -1 ? state.tags.push(val) : (state.tags[result]==val)
  },
  //关闭标签
  closeTab(state, val) {
    //同上,找角标,然后用角标的位置对应删除一位。splice:这是数组的删除方法
    let result = state.tags.findIndex(item => item.label === val.label)
    state.tags.splice(result, 1)
  },
  //关闭所有tagsview标签
  cleartagsview(state,val){
    //清空数组
    state.tags=[]
    //跳转到首页,val接受传过来的当前路由
    if(val !== "/index"){
      router.push({path:"/index"})
    }
  },
  //改变tagsview显示隐藏
  changeisshow(state){
    state.isCollapse=!state.isCollapse
  }
}
const actions = {}
platform/src/utils/form.js
@@ -1,87 +1,14 @@
// éªŒè¯æ‰‹æœºå·ç 
export function checkMobile(rule, value, callback) {
  if (value == null || value.trim() === '') {
    if (rule.required) {
      callback(new Error('请输入手机号'))
    } else {
      callback()
    }
    callback(new Error('手机号码不能为空'))
    return
  }
  let re = /^[0-9]{11}$/;
  var result = re.test(value);
  if(!result) {
    callback(new Error('请输入正确的手机号'))
  } else {
    callback()
  }
}
export function checkPhone(rule, value, callback) {
  //手机号:13,14,15,17,18,19号段
  const phoneReg = /^1[3|4|5|7|8][0-9]{9}$/
  //固话:区号(3-4位)-号码(7-9位)
  const mobReg =  /(^[0-9]{3,4}-[0-9]{7,9}$)/
  //澳门电话号码: 28开头,后面跟6位数字,区号为853
  const macaoMobReg = /^(853)?28\d{6}$/
  //澳门手机号码:6开头,后面跟7位数字,区号为853
  const macaoPhoneReg = /^(853)?6\d{7}$/
  //同时支持手机号码和电话号码
  const macaoReg = /^(853)?(?:28\d{6}|6\d{7})$/
  if (!value) {
      callback(new Error('电话号码不能为空'))
  } else if (phoneReg.test(value)||mobReg.test(value)||macaoReg.test(value)) {
      callback()
  } else {
      callback(new Error('请输入正确电话号码'))
  }
}
export function loginNameRule (rule, value, callback) {
  if (value == null || value.trim() === '') {
    if (rule.required) {
      callback(new Error('请输入账号'))
    } else {
      callback()
    }
    return
  }
  let re =/^[\u4e00-\u9fa5a-zA-Z0-9]+$/
  var result = re.test(value)
  if(!result) {
    callback(new Error('请输入正确的账号'))
  } else {
    callback()
  }
}
export function nameRule (rule, value, callback) {
  if (value == null || value.trim() === '') {
    if (rule.required) {
      callback(new Error('请输入名字'))
    } else {
      callback()
    }
  if (!/^1\d{10}$/.test(value)) {
    callback(new Error('手机号码格式不正确'))
    return
  }
  callback()
}
export function creditCode (rule, value, callback) {
  if (value == null || value.trim() === '') {
    if (rule.required) {
      callback(new Error('请输入社会信用代码'))
    } else {
      callback()
    }
    return
  }
  let re = /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/
  var result = re.test(value)
  if(!result) {
    callback(new Error('请输入正确的社会信用代码'))
  } else {
    callback()
  }
}
// éªŒè¯é‚®ç®±
platform/src/utils/request.js
@@ -3,11 +3,11 @@
import pkg from '../../package'
import { trim } from './util'
import cache from '../plugins/cache'
import { Message, Loading } from 'element-ui'
axios.defaults.headers.common['Content-Type'] = 'application/json;charset=UTF-8'
const axiosInstance = axios.create({
  baseURL: process.env.VUE_APP_API_PREFIX,
  // baseURL: process.env.VUE_APP_API,
  // è¯·æ±‚è¶…æ—¶æ—¶é—´
  timeout: 60000
})
@@ -30,9 +30,9 @@
  // è®¾ç½®æ“ä½œå¹³å°
  config.headers['eva-platform'] = `pc-${pkg.version}`
  // è®¾ç½®è®¤è¯å¤´
  const authToken = Cookies.get('doumee-auth-token')
  const authToken = Cookies.get('eva-auth-token')
  if (authToken != null) {
    config.headers['doumee-auth-token'] = authToken
    config.headers['eva-auth-token'] = authToken
  }
  return config
}, function (error) {
@@ -41,6 +41,8 @@
// æ–°å»ºå“åº”拦截器
axiosInstance.interceptors.response.use((response) => {
  // console.log(response.status)
  // debugger
  // è¯·æ±‚失败
  if (response.status !== 200) {
    return Promise.reject(new Error('服务器繁忙,请稍后再试'))
@@ -52,7 +54,8 @@
  // æœªç™»å½•
  if (response.data.code === 401) {
    if (response.config.autoLogin !== false) {
      window.location.href = process.env.VUE_APP_ROUTER_MODE === 'history' ? '/#/login' : '/login'
      location.reload()
      // window.location.href = process.env.VUE_APP_ROUTER_MODE === 'history' ? '/login' : '/#/login'
    }
    return Promise.reject(response.data)
  }
platform/src/utils/util.js
@@ -18,3 +18,52 @@
  }
  return data
}
// æ ¹æ®èº«ä»½è¯èŽ·å–å¹´é¾„
export function GetAge (identityCard) {
  let len = (identityCard + "").length;
  let strBirthday = "";
  if (len === 18) {
    //处理18位的身份证号码从号码中得到生日和性别代码
    strBirthday =
        identityCard.substr(6, 4) +
        "/" +
        identityCard.substr(10, 2) +
        "/" +
        identityCard.substr(12, 2);
  }
  if (len === 15) {
    let birthdayValue = "";
    birthdayValue = identityCard.charAt(6) + identityCard.charAt(7);
    if (parseInt(birthdayValue) < 10) {
      strBirthday =
          "20" +
          identityCard.substr(6, 2) +
          "/" +
          identityCard.substr(8, 2) +
          "/" +
          identityCard.substr(10, 2);
    } else {
      strBirthday =
          "19" +
          identityCard.substr(6, 2) +
          "/" +
          identityCard.substr(8, 2) +
          "/" +
          identityCard.substr(10, 2);
    }
  }
  let birthDate = new Date(strBirthday);
  let nowDateTime = new Date();
  let age = nowDateTime.getFullYear() - birthDate.getFullYear();
  //再考虑月、天的因素;.getMonth()获取的是从0开始的,这里进行比较,不需要加1
  if (
      nowDateTime.getMonth() < birthDate.getMonth() ||
      (nowDateTime.getMonth() == birthDate.getMonth() &&
          nowDateTime.getDate() < birthDate.getDate())
  ) {
    age--;
  }
  return age;
}
platform/src/views/business/dispatchUnit.vue
@@ -2,8 +2,18 @@
    <TableLayout :permissions="['business:dispatchunit:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="所属企业" prop="companyId">
        <el-select v-model="searchForm.companyId" placeholder="请选择" @change="search">
          <el-option
              v-for="item in companyList"
              :key="item.id"
              :label="item.name"
              :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
            <el-form-item label="派遣单位" prop="name">
                <el-input v-model="searchForm.name" placeholder="请输入用工单位名称" @keypress.enter.native="search"></el-input>
        <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>
@@ -12,9 +22,6 @@
        </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"
@@ -25,27 +32,20 @@
                        <span>{{scope.$index + 1}}</span>
                    </template>
                </el-table-column>
                <el-table-column prop="name" label="派遣单位"></el-table-column>
                <el-table-column label="企业状态">
        <el-table-column prop="companyName" label="所属企业" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="派遣单位" min-width="100px"></el-table-column>
        <el-table-column label="派遣单位状态" min-width="100px">
                    <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>
            <span :class="'du-status'+row.unitStatus" v-if="row.unitStatus === 0">待审核</span>
            <span v-if="row.unitStatus === 1">
                            <span :class="'du-status'+row.worktypeStatus"   v-if="row.worktypeStatus ==null || row.worktypeStatus === 0">工种待审</span>
                            <span :class="'du-status'+row.worktypeStatus"  v-else-if="row.worktypeStatus === 1">审核通过</span>
                            <span :class="'du-status'+row.worktypeStatus"   v-else-if="row.worktypeStatus === 2">工种审核不通过</span>
                        </span>
            <span :class="'du-status'+row.unitStatus"  v-if="row.unitStatus === 2">审核不通过</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 prop="createDate" label="提交日期" min-width="100px"></el-table-column>
                <el-table-column
                    v-if="containPermissions(['business:dispatchunit:update', 'business:dispatchunit:delete'])"
                    label="操作"
@@ -53,7 +53,7 @@
                    fixed="right"
                >
                    <template slot-scope="{row}">
                        <el-button type="text" @click="$refs.dispatchUnitDetails.open('派遣单位详情', row)" v-permissions="['business:dispatchunit:update']">查看详情</el-button>
            <el-button type="text" @click="$refs.dispatchUnitDetailsPlat.open('派遣单位详情', row)" icon="el-icon-edit" v-permissions="['business:dispatchunit:update']">查看详情</el-button>
                    </template>
                </el-table-column>
            </el-table>
@@ -65,9 +65,7 @@
            </pagination>
        </template>
        <!-- æ–°å»º/修改 -->
        <OperaDispatchUnitWindow ref="operaDispatchUnitWindow" @success="handlePageChange"/>
        <!-- è¯¦æƒ… -->
        <dispatchUnitDetails ref="dispatchUnitDetails" @success="handlePageChange"/>
    <dispatchUnitDetailsPlat ref="dispatchUnitDetailsPlat" @success="handlePageChange"/>
    </TableLayout>
</template>
@@ -75,20 +73,20 @@
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'
import dispatchUnitDetailsPlat from '@/components/business/dispatchUnitDetailsPlat'
import {pageAll as companyAll} from '@/api/business/company'
export default {
  name: 'DispatchUnit',
  name: 'dispatchUnitReview',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaDispatchUnitWindow, dispatchUnitDetails },
  components: { TableLayout, Pagination, dispatchUnitDetailsPlat },
  data () {
    return {
      // æœç´¢
      searchForm: {
        name: '',
        dataType: 0
      }
        companyId: ''
      },
      companyList:[]
    }
  },
  created () {
@@ -99,18 +97,19 @@
      'field.main': 'id'
    })
    this.search()
    this.loadSelectList()
  },
  methods: {
    // ä¿®æ”¹çŠ¶æ€
    changeStatus(status, row) {
      updateById({ status, id: row.id })
        .then(res => {
          this.search()
        })
        .catch(err => {
          row.status = row.status === 0 ? 1 : 0
    // handlePageChange() {
    //   this.search()
    // },
    loadSelectList() {
      companyAll({}).then(res => {
        this.companyList = res
      }).catch(err => {
        })
    }
  }
}
</script>
platform/src/views/index.vue
@@ -1,33 +1,454 @@
<template>
  <div class="home">
    <!-- <div class="wrap">
      <h2>欢迎使用伊娃极速开发框架</h2>
      <p>您使用的此套开源框架没有任何版权问题,可学习可商用,请放心使用!</p>
      <p>伊娃致力于打造简洁、合理、高效的开发体验,为此我们将不断升级,感谢您的支持!</p>
      <p style="margin-top: 12px;">
        <a href="https://gitee.com/coderd-repos/eva" target="_blank">GITEE</a>
        <a href="https://github.com/coderd-repos/eva" target="_blank">GITHUB</a>
      </p>
      <div class="guide">
        <a href="http://eva.adjustrd.com" target="_blank">前往官网</a>
        <a href="http://coderd.adjustrd.com/template/308/default" target="_blank">前往CodeRd</a>
    <div class="home_inlet">
      <div class="home_inlet_label">快捷入口</div>
      <div class="home_inlet_list" v-if="userInfo.type==1" >
        <div class="home_inlet_item" v-for="(item, index) in cate" :key="index" @click="jump(item.url)">
          <img :src="item.icon" />
          <span>{{item.name}}</span>
      </div>
      <img src="@/assets/images/qq.png">
      <p>你可以扫码加入群聊以获得技术支持</p>
      <div class="award">
        <h4>激励作者做得更好</h4>
        <img src="@/assets/images/alipay.jpeg">
        <img src="@/assets/images/wxpay.jpeg">
      </div>
    </div> -->
      <div class="home_inlet_list" v-else >
        <div class="home_inlet_item" v-for="(item, index) in catePlat" :key="index" @click="jump(item.url)">
          <img :src="item.icon" />
          <span>{{item.name}}</span>
        </div>
      </div>
    </div>
    <div class="home_content">
      <div class="home_content_left">
        <div class="home_content_left_item" ref="picture1"></div>
        <div class="home_content_left_item" ref="picture2"></div>
        <div class="home_content_left_item" ref="picture3"></div>
      </div>
      <div class="home_content_right">
        <div class="home_content_right_label" v-if="tabs && tabs.length>0" >代办事项</div>
        <el-tabs v-model="activeName" @tab-click="handleClick" >
          <el-tab-pane v-for="a in tabs" :key="a.path" :name="a.name" >
             <span slot="label" title="点击刷新"> {{a.label }}
                        <el-badge v-if="(a.name==0?totalPage0:(a.name==1?totalPage1:totalPage2))  >0" :value="(a.name==0?totalPage0:(a.name==1?totalPage1:totalPage2)) " class="item"></el-badge>
                    </span>
          </el-tab-pane>
        </el-tabs>
        <div v-if="activeName === '0'"  v-permissions="['business:notice:insurance']" >
          <div class="home_content_right_list">
            <div class="list_item" v-for="(item, index) in tableData0" :key="index">
              <div class="list_item_left">
                <span>{{item.title}}({{ item.typeDetail }})</span>
                <span>{{item.info}}({{item.content}})</span>
              </div>
              <div class="list_item_center">
                <span>{{item.companyName}}</span>
                <span>提交时间  {{item.createDate}}</span>
              </div>
              <div class="list_item_right">
                <span @click="detail(item)">查看</span>
              </div>
            </div>
          </div>
          <div class="home_content_right_page">
            <el-pagination
                @current-change="handleCurrentChange0"
                :current-page="page0"
                :page-size="5"
                layout="total, prev, pager, next, jumper"
                :total="totalPage0">
            </el-pagination>
          </div>
        </div>
        <div v-if="activeName === '1'"  v-permissions="['business:notice:tax']">
          <div class="home_content_right_list">
            <div class="list_item" v-for="(item, index) in tableData1" :key="index">
              <div class="list_item_left">
                <span>{{item.title}}({{ item.typeDetail }})</span>
                <span>{{item.info}}({{item.content}})</span>
              </div>
              <div class="list_item_center">
                <span>{{item.companyName}}</span>
                <span>提交时间  {{item.createDate}}</span>
              </div>
              <div class="list_item_right">
                <span  @click="detail(item)">查看</span>
              </div>
            </div>
          </div>
          <div class="home_content_right_page">
            <el-pagination
                @current-change="handleCurrentChange1"
                :current-page="page1"
                :page-size="5"
                layout="total, prev, pager, next, jumper"
                :total="totalPage1">
            </el-pagination>
          </div>
        </div>
        <div v-if="activeName === '2'"  v-permissions="['business:notice:settle']">
          <div class="home_content_right_list">
            <div class="list_item" v-for="(item, index) in tableData2" :key="index">
              <div class="list_item_left">
                <span>{{item.title}}({{ item.typeDetail }})</span>
                <span>{{item.info}}({{item.content}})</span>
              </div>
              <div class="list_item_center">
                <span>{{item.companyName}}</span>
                <span>提交时间  {{item.createDate}}</span>
              </div>
              <div class="list_item_right">
                <span  @click="detail(item)">查看</span>
              </div>
            </div>
          </div>
          <div class="home_content_right_page">
            <el-pagination
                @current-change="handleCurrentChange2"
                :current-page="page2"
                :page-size="5"
                layout="total, prev, pager, next, jumper"
                :total="totalPage2">
            </el-pagination>
          </div>
        </div>
      </div>
    </div>
    <OperaInsuranceApplyWindow ref="operaInsuranceApplyWindow" @success="handleCurrentChange0()"/>
    <dispatchUnitDetailsPlat ref="dispatchUnitDetailsPlat" @success="handleCurrentChange0()"/>
    <OperaSettleClaimsWindow ref="operaSettleClaimsWindow" @success="handleCurrentChange2()"/>
    <OperaApplyChangeUnitDetailWindow ref="operaApplyChangeUnitDetailWindow" @success="handleCurrentChange0()"/>
    <OperaApplyChangeDetailWindow ref="operaApplyChangeDetailWindow" @success="handleCurrentChange0()"/>
    <OperaTaxesWindow ref="OperaTaxesWindow" @success="handleCurrentChange1()"/>
  </div>
</template>
<script>
import * as echarts from 'echarts'
import { mapState } from 'vuex'
import OperaInsuranceApplyWindow from '@/components/business/OperaInsuranceApplyWindow'
import dispatchUnitDetailsPlat from '@/components/business/dispatchUnitDetailsPlat'
import OperaApplyChangeUnitDetailWindow from '@/components/business/OperaApplyChangeUnitDetailWindow'
import OperaSettleClaimsWindow from '@/components/business/OperaSettleClaimsWindow'
import OperaApplyChangeDetailWindow from '@/components/business/OperaApplyChangeDetailWindow'
import OperaTaxesWindow from '@/components/business/OperaTaxesWindow'
import { fetchList as noticeList } from '@/api/business/notices'
export default {
  components: {
    OperaInsuranceApplyWindow,
    dispatchUnitDetailsPlat,
    OperaTaxesWindow,
    OperaSettleClaimsWindow,
    OperaApplyChangeDetailWindow,
    OperaApplyChangeUnitDetailWindow
  },
  name: 'Index',
  data () {
    return {}
    return {
      activeName: '0',
      tabs: [],
      page0: 1,
      page1: 1,
      page2: 1,
      totalPage2: 0,
      totalPage1: 0,
      totalPage0: 0,
      tableData0: [],
      tableData1: [],
      tableData2: [],
      cate: [
        {
          name: '投保申请',
          url: '/enterprise/insuranceApply',
          icon: require('../assets/icons/company/apply.png')
        },
        {
          name: '提交报案',
          url: '/business/settleClaims',
          icon: require('../assets/icons/company/settle.png')
        },
        {
          name: '添加派遣单位',
          url: '/enterprise/dispatchUnit',
          icon: require('../assets/icons/company/dipatch_unit.png')
        },
        {
          name: '直保开票',
          url: '/enterprise/directInvoicing',
          icon: require('../assets/icons/company/tax.png')
        },
        {
          name: '委托保开票',
          url: '/enterprise/entrustedInvoicing',
          icon: require('../assets/icons/company/tax.png')
        }
      ],
      catePlat: [
        {
          name: '投保审核',
          url: '/business/insuranceApply',
          icon: require('../assets/icons/plat/apply_check.png')
        },
        {
          name: '加/减保审核',
          url: '/business/applyChange',
          icon: require('../assets/icons/plat/change_apply_check.png')
        },
        {
          name: '理赔服务',
          url: '/business/settleClaims',
          icon: require('../assets/icons/plat/settle_check.png')
        },
        {
          name: '发票管理',
          url: '/business/taxes',
          icon: require('../assets/icons/plat/tax_check.png')
        },
        {
          name: '新增企业',
          url: '/business/company',
          icon: require('../assets/icons/plat/company_add.png')
        }
      ]
    }
  },
  computed: {
    ...mapState(['userInfo'])
  },
  mounted () {
    this.setPicture1()
    this.setPicture2()
    this.setPicture3()
    this.initPanel()
    this.setLoadTimer()
  },
  methods: {
    detail (obj) {
      if (obj.objType === 0) {
        this.$refs.operaInsuranceApplyWindow.open('投保申请详情', { id: obj.objId })
      } else if (obj.objType === 1) {
        this.$refs.operaApplyChangeDetailWindow.open('加减保详情', { id: obj.objId, applyId: obj.param1 })
      } else if (obj.objType === 2) {
        this.$refs.operaApplyChangeUnitDetailWindow.open('换厂申请详情', { id: obj.objId, applyId: obj.param1 })
      } else if (obj.objType === 3) {
        this.$refs.dispatchUnitDetailsPlat.open('派遣单详情', { id: obj.objId })
      } else if (obj.objType === 4) {
        this.$refs.OperaTaxesWindow.open('开票申请详情', { id: obj.objId })
      } else if (obj.objType === 5) {
        this.$refs.operaSettleClaimsWindow.open('理赔详情', { id: obj.objId })
      }
    },
    setLoadTimer () {
      var that = this
      this.initLoadData()
      if (window.timer) {
        clearInterval(window.timer)
      }
      window.timer = setInterval(() => {
          that.initLoadData()
      }, 60000)
    },
    initLoadData(){
      var pemissons = this.userInfo.permissions
      if (pemissons.includes('business:notice:insurance')) {
        this.handleCurrentChange0(0)
      }
      if (pemissons.includes('business:notice:tax')) {
        this.handleCurrentChange1(0)
      }
      if (pemissons.includes('business:notice:settle')) {
        this.handleCurrentChange2(0)
      }
    },
    getNoticeList (type, page) {
      noticeList({
        page: page,
        capacity: 5,
        model: { queryType: type },
        sorts: []
      })
        .then(response => {
          if (type === 0) {
            this.tableData0 = response.records
            this.totalPage0 = response.total
          }
          if (type === 1) {
            this.tableData1 = response.records
            this.totalPage1 = response.total
          } if (type === 2) {
            this.tableData2 = response.records
            this.totalPage2 = response.total
          }
        })
        .catch(e => {
          this.$tip.apiFailed(e)
        })
    },
    initPanel () {
      var pemissons = this.userInfo.permissions
      if (pemissons.includes('business:notice:insurance')) {
        this.tabs.push({ name: '0', label: '投保代办' })
        // this.handleCurrentChange0(0);
      }
      if (pemissons.includes('business:notice:tax')) {
        this.tabs.push({ name: '1', label: '发票代办' })
        // this.handleCurrentChange1(0);
      }
      if (pemissons.includes('business:notice:settle')) {
        this.tabs.push({ name: '2', label: '理赔代办' })
        // this.handleCurrentChange2(0);
      }
      /* if (pemissons.includes('business:notice:insurance')) {
        this.getNoticeList(0, this.page0)
      }
      if (pemissons.includes('business:notice:tax')) {
        this.getNoticeList(1, this.page1)
      }
      if (pemissons.includes('business:notice:settle')) {
        this.getNoticeList(2, this.page2)
      } */
    },
    handleClick (e) {
      this.activeName = e.name
      if (this.activeName === '0') {
        this.handleCurrentChange0(0)
      } else if (this.activeName === '1') {
        this.handleCurrentChange1(0)
      } else if (this.activeName === '2') {
        this.handleCurrentChange2(0)
      }
    },
    handleCurrentChange0 (page) {
      this.page0 = page
      this.getNoticeList(0, this.page0)
    },
    handleCurrentChange1 (page) {
      this.page1 = page
      this.getNoticeList(1, this.page1)
    },
    handleCurrentChange2 (page) {
      this.page2 = page
      this.getNoticeList(2, this.page2)
    },
    jump (url) {
      if (!url) return
      this.$router.push({ path: url })
    },
    setPicture1 () {
      const chartDom = this.$refs.picture1
      const myChart = echarts.init(chartDom)
      let option
      option = {
        title: {
          text: '当月保险金额',
          left: '5%',
          top: '5%'
        },
        tooltip: {
          trigger: 'item'
        },
        series: [
          {
            type: 'pie',
            radius: '50%',
            data: [
              { value: 1048, name: '保障中' },
              { value: 735, name: '不在保' }
            ],
            emphasis: {
              itemStyle: {
                shadowBlur: 10,
                shadowOffsetX: 0,
                shadowColor: 'rgba(0, 0, 0, 0.5)'
              }
            }
          }
        ]
      }
      option && myChart.setOption(option)
    },
    setPicture2 () {
      const chartDom = this.$refs.picture2
      const myChart = echarts.init(chartDom)
      let option
      option = {
        title: {
          text: '当月在保人数',
          left: '5%',
          top: '5%'
        },
        grid: {
          left: '3%',
          right: '4%',
          bottom: '13%',
          containLabel: true
        },
        tooltip: {
          trigger: 'axis'
        },
        xAxis: {
          type: 'category',
          data: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月']
        },
        yAxis: {
          type: 'value'
        },
        series: [
          {
            data: [10, 30, 25, 16, 21, 18, 5, 30, 30, 30, 30, 30],
            type: 'line'
          }
        ]
      }
      option && myChart.setOption(option)
    },
    setPicture3 () {
      const chartDom = this.$refs.picture3
      const myChart = echarts.init(chartDom)
      let option
      option = {
        title: {
          text: '总赔付率 78%',
          left: '5%',
          top: '5%'
        },
        tooltip: {
          trigger: 'axis',
          axisPointer: {
            type: 'shadow'
          }
        },
        grid: {
          left: '3%',
          right: '4%',
          bottom: '25%',
          containLabel: true
        },
        xAxis: {
          type: 'value'
          // boundaryGap: [0, 0.01]
        },
        yAxis: {
          type: 'category',
          data: ['保险A赔付率', '保险B赔付率', '总赔付率']
        },
        series: [
          {
            type: 'bar',
            stack: 'total',
            barWidth: '60%',
            data: [10, 20, 30]
          },
          {
            type: 'bar',
            stack: 'total',
            barWidth: '60%',
            data: [15, 16, 24]
          }
        ]
      }
      option && myChart.setOption(option)
    }
  }
}
</script>
@@ -35,63 +456,143 @@
<style scoped lang="scss">
@import "@/assets/style/variables.scss";
.home {
  text-align: center;
  color: #777;
  .wrap {
    margin-top: 80px;
    img {
      width: 240px;
    }
  }
  h2 {
    font-size: 32px;
    color: #555;
    margin-bottom: 20px;
  }
  p {
    line-height: 24px;
    margin: 0;
  }
  .start-up {
    margin-top: 8px;
  }
  .guide {
    margin: 30px 0 40px 0;
    display: flex;
    justify-content: center;
    a {
      margin-right: 12px;
      padding: 12px 40px;
      border-radius: 30px;
      background: $primary-color;
      color: #fff;
      text-decoration: none;
    }
  }
  em,a {
    font-style: normal;
    font-weight: bold;
    margin: 0 3px;
    color: $primary-color;
  }
  .award {
    position: absolute;
    right: 20px;
    bottom: 60px;
  width: 100%;
  height: 100%;
  .home_inlet {
    width: 100%;
    height: 160px;
    display: flex;
    flex-direction: column;
    text-align: left;
    padding: 12px;
    border: 1px solid #eee;
    box-shadow: -1px 1px 10px #ccc;
    h4 {
    padding: 20px;
    box-sizing: border-box;
    background: #ffffff;
    .home_inlet_label {
      width: 100%;
      font-size: 18px;
      font-weight: bold;
      margin-bottom: 8px;
    }
    img {
      width: 160px;
      color: black;
      margin-bottom: 20px;
      transition: opacity ease .3s;
    }
    .home_inlet_list {
      width: 100%;
      display: flex;
      align-items: center;
      .home_inlet_item {
        flex: 1;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        cursor: pointer;
        img {
          width: 40px;
          height: 40px;
        }
        span {
          font-size: 14px;
          color: black;
          margin-top: 5px;
        }
      }
    }
  }
  .home_content {
    width: 100%;
    height: calc(100% - 170px);
    margin-top: 10px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    .home_content_left {
      width: 350px;
      height: 100%;
      flex-shrink: 0;
      display: flex;
      flex-direction: column;
      justify-content: space-between;
      .home_content_left_item {
        width: 100%;
        height: 32%;
        background: #ffffff;
      }
    }
    .home_content_right {
      flex: 1;
      height: 100%;
      background: #ffffff;
      margin-left: 10px;
      padding: 20px;
      box-sizing: border-box;
      position: relative;
      .home_content_right_label {
        font-size: 18px;
        color: black;
        font-weight: bold;
      }
      .home_content_right_list {
        width: 100%;
        display: flex;
        flex-direction: column;
        .list_item {
          padding: 10px;
          box-sizing: border-box;
          width: 100%;
          display: flex;
          justify-content: space-between;
          border: 1px solid #ececec;
          margin-bottom: 15px;
          &:last-child {
            margin-bottom: 0 !important;
          }
          .list_item_left {
            display: flex;
            width: 60%;
            flex-direction: column;
            span {
              &:nth-child(1) {
                font-size: 14px;
                color: black;
                font-weight: bold;
              }
              &:nth-child(2) {
                font-size: 14px;
                color: black;
                margin-top: 5px;
              }
            }
          }
          .list_item_center {
            display: flex;
            flex-direction: column;
            span {
              font-size: 14px;
              color: black;
              &:nth-child(2) {
                margin-top: 5px;
              }
            }
          }
          .list_item_right {
            height: 100%;
            display: flex;
            align-items: center;
            justify-content: center;
            span {
              font-size: 14px;
              color: #1890FF;
              margin-top: 10px;
              cursor: pointer;
            }
          }
        }
      }
      .home_content_right_page {
        margin-top: 20px;
        position: relative;
        bottom: 20px;
        left: 20px;
        box-sizing: border-box;
      }
    }
  }
}
platform/src/views/login.vue
@@ -1,7 +1,7 @@
<template>
  <div class="wrap">
    <div class="introduce">
      <h2>云易保客户服务系统</h2>
      <h2>预选清单查询系统</h2>
    </div>
    <div class="login">
      <h1>系统登录&nbsp;/&nbsp;LOGIN IN</h1>
platform/src/views/system/menu.vue
@@ -1,9 +1,10 @@
<script src="../../api/system/dictData.js"></script>
<template>
  <TableLayout class="menu-layout" :permissions="['system:menu:query']">
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <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.operaMenuWindow.open('新建一级菜单', { type: '0' })" 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>
@@ -15,7 +16,7 @@
        :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
        row-key="id"
        stripe
        default-expand-all
        :default-expand-all="false"
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55" fixed="left"></el-table-column>
@@ -48,8 +49,8 @@
          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.operaMenuWindow.open('编辑菜单', { ...row, type: 0 })" v-permissions="['system:menu:update']">编辑</el-button>
            <el-button type="text" icon="el-icon-plus" @click="$refs.operaMenuWindow.open('新建子菜单', null, {...row, type: 0})" 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>
@@ -81,7 +82,7 @@
    // æŸ¥è¯¢æ•°æ®
    handlePageChange () {
      this.isWorking.search = true
      fetchTree({}, 0)
      fetchTree()
        .then(records => {
          this.tableData.list = records
        })
platform/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>
@@ -15,7 +15,7 @@
        :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
        row-key="id"
        stripe
        default-expand-all
                :default-expand-all="false"
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55" fixed="left"></el-table-column>
@@ -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" type="1" @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/src/views/system/role.vue
@@ -16,7 +16,7 @@
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['system:role:create', 'system:role:delete']">
        <li v-permissions="['system:role:create']"><el-button type="primary" @click="$refs.operaRoleWindow.open('新建角色', null, 0)" icon="el-icon-plus">新建</el-button></li>
        <li v-permissions="['system:role:create']"><el-button type="primary" @click="$refs.operaRoleWindow.open('新建角色')" icon="el-icon-plus">新建</el-button></li>
        <li v-permissions="['system:role:delete']"><el-button @click="deleteByIdInBatch" icon="el-icon-delete">删除</el-button></li>
      </ul>
      <el-table
@@ -24,33 +24,31 @@
        :data="tableData.list"
        :default-sort = "{prop: 'createTime', order: 'descending'}"
        stripe
        border
        @selection-change="handleSelectionChange"
        @sort-change="handleSortChange"
      >
        <el-table-column type="selection" fixed="left" width="55"></el-table-column>
        <el-table-column prop="code" label="角色编码" fixed="left" min-width="100px"  align="center"></el-table-column>
        <el-table-column prop="name" label="角色名称" fixed="left" min-width="100px"  align="center"></el-table-column>
        <el-table-column prop="remark" label="角色备注" min-width="120px"  align="center"></el-table-column>
        <el-table-column prop="createUser" label="创建人" min-width="100px"  align="center">
        <el-table-column prop="code" label="角色编码" fixed="left" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="角色名称" fixed="left" min-width="100px"></el-table-column>
        <el-table-column prop="remark" label="角色备注" min-width="120px"></el-table-column>
        <el-table-column prop="createUser" label="创建人" min-width="100px">
          <template slot-scope="{row}">{{row.createUserInfo == null ? '' : row.createUserInfo.username}}</template>
        </el-table-column>
        <el-table-column prop="createTime" label="创建时间" min-width="140px"  align="center"></el-table-column>
        <el-table-column prop="updateUser" label="更新人" min-width="100px"  align="center">
        <el-table-column prop="createTime" label="创建时间" min-width="140px" sortable="custom" sort-by="role.CREATE_TIME"></el-table-column>
        <el-table-column prop="updateUser" label="更新人" min-width="100px">
          <template slot-scope="{row}">{{row.updateUserInfo == null ? '' : row.updateUserInfo.username}}</template>
        </el-table-column>
        <el-table-column prop="updateTime" label="更新时间" min-width="140px"  align="center"></el-table-column>
        <el-table-column prop="updateTime" label="更新时间" min-width="140px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['system:role:update', 'system:role:createRolePermission', 'system:role:createRoleMenu', 'system:role:delete'])"
          label="操作"
          min-width="270"
          align="center"
          fixed="right"
        >
          <template v-if="isAdmin || (row.code !== adminCode && userInfo.roles.findIndex(code => code === row.code) === -1)" slot-scope="{row}">
            <el-button type="text" @click="$refs.operaRoleWindow.open('编辑角色', row, 0)" icon="el-icon-edit" v-permissions="['system:role:update']">编辑</el-button>
            <el-button type="text" @click="$refs.permissionConfigWindow.open(row, 0)" v-permissions="['system:role:createRolePermission']">配置权限</el-button>
            <el-button type="text" @click="$refs.menuConfigWindow.open(row, 0)" icon="el-icon-menu" v-permissions="['system:role:createRoleMenu']">授权菜单</el-button>
            <el-button type="text" @click="$refs.operaRoleWindow.open('编辑角色', row)" icon="el-icon-edit" v-permissions="['system:role:update']">编辑</el-button>
            <el-button type="text" @click="$refs.permissionConfigWindow.open(row)" v-permissions="['system:role:createRolePermission']">配置权限</el-button>
            <el-button type="text" @click="$refs.menuConfigWindow.open(row)" icon="el-icon-menu" v-permissions="['system:role:createRoleMenu']">授权菜单</el-button>
            <el-button v-if="!row.fixed" type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['system:role:delete']">删除</el-button>
          </template>
        </el-table-column>
@@ -87,8 +85,7 @@
      searchForm: {
        code: '',
        name: '',
        remark: '',
        type: 0
        remark: ''
      }
    }
  },
platform/src/views/system/user.vue
@@ -2,21 +2,21 @@
  <TableLayout :permissions="['system:user:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="80px" inline>
      <el-form-item label="用户名" prop="username">
        <el-input v-model="searchForm.username" v-trim placeholder="请输入用户名" @keypress.enter.native="search"/>
      </el-form-item>
<!--      <el-form-item label="用户名" prop="username">-->
<!--        <el-input v-model="searchForm.username" v-trim placeholder="请输入用户名" @keypress.enter.native="search"/>-->
<!--      </el-form-item>-->
      <el-form-item label="姓名" prop="realname">
        <el-input v-model="searchForm.realname" v-trim placeholder="请输入姓名" @keypress.enter.native="search"/>
        <el-input v-model="searchForm.realname" v-trim placeholder="请输入" @keypress.enter.native="search"/>
      </el-form-item>
      <el-form-item label="手机号码" prop="mobile">
        <el-input v-model="searchForm.mobile" v-trim placeholder="请输入手机号码" @keypress.enter.native="search"/>
      </el-form-item>
            <el-form-item label="所属部门" prop="rootDeptId">
        <DepartmentSelect v-model="searchForm.rootDeptId" placeholder="请选择所属部门" clearable/>
      </el-form-item>
      <el-form-item label="岗位" prop="positionId">
        <PositionSelect v-model="searchForm.positionId" placeholder="请选择岗位" clearable/>
      </el-form-item>
<!--      <el-form-item label="手机号码" prop="mobile">-->
<!--        <el-input v-model="searchForm.mobile" v-trim placeholder="请输入手机号码" @keypress.enter.native="search"/>-->
<!--      </el-form-item>-->
<!--            <el-form-item label="所属部门" prop="rootDeptId">-->
<!--        <DepartmentSelect v-model="searchForm.rootDeptId" placeholder="请选择所属部门" clearable/>-->
<!--      </el-form-item>-->
<!--      <el-form-item label="岗位" prop="positionId">-->
<!--        <PositionSelect v-model="searchForm.positionId" placeholder="请选择岗位" clearable/>-->
<!--      </el-form-item>-->
      <section>
        <el-button type="primary" icon="el-icon-search" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
@@ -25,45 +25,25 @@
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['system:user:create', 'system:user:delete']">
        <li v-permissions="['system:user:create']"><el-button icon="el-icon-plus" type="primary" @click="$refs.operaUserWindow.open('新建用户')">新建</el-button></li>
        <li v-permissions="['system:user:delete']"><el-button icon="el-icon-delete" @click="deleteByIdInBatch">删除</el-button></li>
        <li v-permissions="['system:user:create']"><el-button type="primary" @click="$refs.operaUserWindow.open('新增账号')">新增账号</el-button></li>
<!--        <li v-permissions="['system:user:delete']"><el-button icon="el-icon-delete" @click="deleteByIdInBatch">删除</el-button></li>-->
      </ul>
<!--      @selection-change="handleSelectionChange"-->
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        :default-sort = "{prop: 'createTime', order: 'descending'}"
        stripe
        border
        @selection-change="handleSelectionChange"
        @sort-change="handleSortChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <!-- <el-table-column prop="avatar" label="头像" width="80px" class-name="table-column-avatar" fixed="left">
          <template slot-scope="{row}">
            <img :src="row.avatar == null ? '/static/avatar/man.png' : row.avatar">
          </template>
        </el-table-column> -->
        <el-table-column prop="realname" label="姓名" min-width="100px" fixed="left"></el-table-column>
        <el-table-column prop="username" label="用户名" min-width="120px"></el-table-column>
        <el-table-column prop="empNo" label="工号" sortable="custom" sort-by="EMP_NO" min-width="80px"></el-table-column>
        <el-table-column prop="department" label="部门" min-width="120px">
          <template slot-scope="{row}">{{row.department == null ? '' : row.department.name}}</template>
        </el-table-column>
        <el-table-column prop="position" label="岗位" min-width="160px" class-name="table-column-strings">
          <template slot-scope="{row}">
            <ul>
              <li v-for="position in row.positions" :key="position.id">{{position.name}}</li>
            </ul>
        <el-table-column label="序号" width="80px">
          <template slot-scope="scope">
            <span>{{scope.$index + 1}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="sex" label="性别" sortable="custom" sort-by="SEX" min-width="80px">
          <template slot-scope="{row}">
            {{row.sex | sex}}
          </template>
        </el-table-column>
        <el-table-column prop="mobile" label="手机号码" min-width="100px"></el-table-column>
        <el-table-column prop="email" label="邮箱" min-width="180px"></el-table-column>
        <el-table-column prop="birthday" label="生日" sortable="custom" sort-by="BIRTHDAY" min-width="100px"></el-table-column>
        <el-table-column prop="username" label="账号" min-width="120px"></el-table-column>
        <el-table-column prop="realname" label="姓名" min-width="100px"></el-table-column>
        <el-table-column prop="mobile" label="联系方式" min-width="100px"></el-table-column>
        <el-table-column prop="roles" label="角色" min-width="160px" class-name="table-column-strings">
          <template slot-scope="{row}">
          <ul>
@@ -71,14 +51,18 @@
          </ul>
        </template>
        </el-table-column>
        <el-table-column prop="createUser" label="创建人" min-width="100px">
          <template slot-scope="{row}">{{row.createUserInfo == null ? '' : row.createUserInfo.username}}</template>
        <el-table-column label="启用状态" min-width="100px">
          <template slot-scope="{row}">
            <el-switch
              @change="changeStatus($event, row)"
              v-model="row.status"
              active-color="#13ce66"
              inactive-color="#ff4949"
              :active-value="0"
              :inactive-value="1">
            </el-switch>
          </template>
        </el-table-column>
        <el-table-column prop="createTime" label="创建时间" sortable="custom" sort-by="CREATE_TIME" min-width="140px"></el-table-column>
        <el-table-column prop="updateUser" label="更新人" min-width="100px">
          <template slot-scope="{row}">{{row.updateUserInfo == null ? '' : row.updateUserInfo.username}}</template>
        </el-table-column>
        <el-table-column prop="updateTime" label="更新时间" sortable="custom" sort-by="UPDATE_TIME" min-width="140px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['system:user:update', 'system:user:createUserRole', 'system:user:resetPwd', 'system:user:delete'])"
          label="操作"
@@ -87,9 +71,10 @@
        >
          <template v-if="isAdmin || (row.id !== userInfo.id && row.roles.findIndex(r => r.code === adminCode) === -1)" slot-scope="{row}">
            <el-button type="text" icon="el-icon-edit" @click="$refs.operaUserWindow.open('编辑用户', row)" v-permissions="['system:user:update']">编辑</el-button>
            <el-button type="text" @click="$refs.allocationEnterprises.open('分配企业', row)">分配企业</el-button>
            <el-button type="text" icon="el-icon-s-custom" @click="$refs.roleConfigWindow.open(row)" v-permissions="['system:user:createUserRole']">配置角色</el-button>
            <el-button type="text" @click="$refs.resetPwdWindow.open(row)" v-permissions="['system:user:resetPwd']">重置密码</el-button>
            <el-button v-if="!row.fixed" type="text" icon="el-icon-delete" @click="deleteById(row)" v-permissions="['system:user:delete']">删除</el-button>
<!--            <el-button v-if="!row.fixed" type="text" icon="el-icon-delete" @click="deleteById(row)" v-permissions="['system:user:delete']">删除</el-button>-->
          </template>
        </el-table-column>
      </el-table>
@@ -105,6 +90,8 @@
    <RoleConfigWindow ref="roleConfigWindow" @success="handlePageChange(tableData.pagination.pageIndex)"/>
    <!-- é‡ç½®å¯†ç  -->
    <ResetPwdWindow ref="resetPwdWindow"/>
    <!--  åˆ†é…ä¼ä¸š  -->
    <allocationEnterprises ref="allocationEnterprises" @success="handlePageChange(tableData.pagination.pageIndex)"/>
  </TableLayout>
</template>
@@ -113,20 +100,21 @@
import TableLayout from '@/layouts/TableLayout'
import BaseTable from '@/components/base/BaseTable'
import OperaUserWindow from '@/components/system/user/OperaUserWindow'
import allocationEnterprises from '@/components/system/user/allocationEnterprises'
import RoleConfigWindow from '@/components/system/user/RoleConfigWindow'
import ResetPwdWindow from '@/components/system/user/ResetPwdWindow'
import DepartmentSelect from '@/components/common/DepartmentSelect'
import PositionSelect from '@/components/common/PositionSelect'
import { updUserStatus } from '@/api/system/user'
export default {
  name: 'SystemUser',
  extends: BaseTable,
  components: { PositionSelect, DepartmentSelect, ResetPwdWindow, RoleConfigWindow, OperaUserWindow, TableLayout, Pagination },
  components: { allocationEnterprises, PositionSelect, DepartmentSelect, ResetPwdWindow, RoleConfigWindow, OperaUserWindow, TableLayout, Pagination },
  data () {
    return {
      // æœç´¢
      searchForm: {
        type:0,
        username: '', // åå­—
        realname: '', // å§“名
        rootDeptId: null, // éƒ¨é—¨ID
@@ -146,6 +134,18 @@
      }]
    })
    this.search()
  },
  methods: {
    changeStatus(status, row) {
      updUserStatus({
        id: row.id,
        status
      }).then(res => {
        this.search()
      }).catch(err => {
        row.status = row.status === 0 ? 1 : 0
      })
    }
  }
}
</script>
platform/vue.config.js
@@ -1,6 +1,9 @@
// è¯¦ç»†é…ç½®è¯·å‚考https://cli.vuejs.org/zh/config/#vue-config-js
// const outputDir = process.env.VUE_APP_CONTEXT_PATH.substring(1, process.env.VUE_APP_CONTEXT_PATH.length - 1)
// const outputDir = process.env.VUE_APP_CONTEXT_PATH.substring(1, process.env.VUE_APP_CONTEXT_PATH.length)
module.exports = {
  publicPath: './',
  outputDir: 'web',
  outputDir: 'dest',
  assetsDir: 'static',
  lintOnSave: false,
  devServer: {
server/company/src/main/java/com/doumee/api/business/CompanyController.java
@@ -37,7 +37,6 @@
    @RequiresPermissions("business:company:create")
    public ApiResponse create(@RequestBody Company company) {
        companyService.create(company);
        companyService.startSignAuth(company.getId());
        return ApiResponse.success(null);
    }
server/platform/src/main/java/com/doumee/api/business/CompanyController.java
@@ -116,6 +116,13 @@
        pageWrap.setQueryFlag(Constants.ONE);//查询全部
        return ApiResponse.success(companyService.findList(pageWrap));
    }
    @ApiOperation("查询全部数据")
    @PostMapping("/list")
    @RequiresPermissions("business:company:query")
    public ApiResponse<List<Company>> findList (@RequestBody  Company pageWrap) {
        pageWrap.setQueryFlag(Constants.ZERO);//查询全部权限范围内
        return ApiResponse.success(companyService.findList(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
server/service/src/main/java/com/doumee/dao/business/model/CompanySolution.java
@@ -86,6 +86,9 @@
    @ApiModelProperty(value = "方案主键(关联solutions)", example = "1")
    @ExcelColumn(name="方案主键(关联solutions)")
    private Integer solutionId;
    @ApiModelProperty(value = "方案对象", example = "1")
    @TableField(exist = false)
    private Solutions solution;
}
server/service/src/main/java/com/doumee/dao/business/model/Solutions.java
@@ -132,9 +132,6 @@
    @ExcelColumn(name="签章关键字,多个用英文逗号隔开")
    private String signKeyword;
    @ApiModelProperty(value = "所属方案基表编码(solution_base_id)", example = "1")
    @ExcelColumn(name="所属方案基表编码(solution_base_id)")
    private Integer solutionBaseId;
    @ApiModelProperty(value = "版本号")
    @ExcelColumn(name="版本号")
server/service/src/main/java/com/doumee/service/business/impl/ApplyChangeServiceImpl.java
@@ -283,7 +283,6 @@
                  .leftJoin(ApplyChange.class, ApplyChange::getId, ApplyChagneDetail::getApplyChangeId)
                  .leftJoin(InsuranceApply.class, InsuranceApply::getId, ApplyChange::getApplyId)
                  .leftJoin(Solutions.class, Solutions::getId, InsuranceApply::getSolutionId)
                  .leftJoin(Solutions.class, Solutions::getId, ApplyChange::getSolutionsId)
                    .leftJoin(Worktype.class,Worktype::getId,ApplyChagneDetail::getWorktypeId)
                    .leftJoin(DispatchUnit.class,DispatchUnit::getId,ApplyChagneDetail::getDuId)
                  .eq(ApplyChagneDetail::getApplyChangeId,update.getId())
server/service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
@@ -225,10 +225,10 @@
        List<CompanySolution> list = new ArrayList<>();
        int num =0;
        for(CompanySolution s :company.getSolutionList()){
            if(s.getSolutionBaseId() == null){
            if(s.getSolution() == null || s.getSolution().getBaseId() == null ||s.getSolution().getId()==null){
                continue;
            }
            sIds.add(s.getSolutionBaseId());
            sIds.add(s.getSolution().getId() );
            s.setCompanyId(company.getId());
            s.setIsdeleted(Constants.ZERO);
            s.setCanAdd(Constants.formatIntegerNum(s.getCanAdd()));
@@ -236,6 +236,8 @@
            s.setCreateDate(company.getCreateDate());
            s.setCreator(company.getCreator());
            s.setSortnum(num++);
            s.setSolutionBaseId( s.getSolution().getId() );
            s.setSolutionId( s.getSolution().getBaseId() );
            s.setStatus(Constants.ZERO);
            list.add(s);
        }
@@ -628,6 +630,9 @@
            for(Company company :companyList){
                //查询企业签约状态 å®¡æ ¸çŠ¶æ€,0正在申请1通过2驳回
                int status = signService.organizationAuditStatus(company.getEmail());
                if(status == 0){
                    continue;
                }
                if(status == 1){
                    Company update = new Company();
                    update.setId(company.getId());
@@ -681,12 +686,9 @@
                        //更新认证状态
                        companyMapper.updateById(update);
                    }
                }
            }
        }
        }
    }
//    @Override
server/service/src/main/java/com/doumee/service/business/impl/InsuranceApplyServiceImpl.java
@@ -186,6 +186,16 @@
        update.setStartTime(insuranceApply.getStartTime());
        insuranceApplyMapper.updateById(update);
        multifileMapper.update(null,new UpdateWrapper<Multifile>().lambda()
                .eq(Multifile::getIsdeleted,Constants.ZERO)
                .eq(Multifile::getObjType,Constants.MultiFile.BD_DONE_PDF.getKey())
                .eq(Multifile::getObjId,update.getId())
                .set(Multifile::getIsdeleted,Constants.ONE)
                .set(Multifile::getEditDate,update.getEditDate())
                .set(Multifile::getEditor,update.getEditor())
        );
        insuranceApply.getBaoxiandanFile().setIsdeleted(Constants.ZERO);
        insuranceApply.getBaoxiandanFile().setCreator(user.getId());
        insuranceApply.getBaoxiandanFile().setObjId(update.getId());
@@ -680,6 +690,14 @@
        update.setId(model.getId());
        insuranceApplyMapper.updateById(update);
        multifileMapper.update(null,new UpdateWrapper<Multifile>().lambda()
                .eq(Multifile::getIsdeleted,Constants.ZERO)
                .eq(Multifile::getObjType,Constants.MultiFile.BD_APPLY_PDF.getKey())
                .eq(Multifile::getObjId,update.getId())
                .set(Multifile::getIsdeleted,Constants.ONE)
                .set(Multifile::getEditDate,update.getEditDate())
                .set(Multifile::getEditor,update.getEditor())
        );
        insuranceApply.getToubaodanFile().setIsdeleted(Constants.ZERO);
        insuranceApply.getToubaodanFile().setCreator(user.getId());
        insuranceApply.getToubaodanFile().setObjId(update.getId());
server/service/src/main/java/com/doumee/service/business/impl/SolutionsServiceImpl.java
@@ -359,9 +359,7 @@
        if (pageWrap.getModel().getOrtherInfo() != null) {
            queryWrapper.eq(Solutions::getOrtherInfo, pageWrap.getModel().getOrtherInfo());
        }
        if (pageWrap.getModel().getSolutionBaseId() != null) {
            queryWrapper.eq(Solutions::getSolutionBaseId, pageWrap.getModel().getSolutionBaseId());
        }
        if (pageWrap.getModel().getVersion() != null) {
            queryWrapper.eq(Solutions::getVersion, pageWrap.getModel().getVersion());
        }