作者 xiaoqiu

增加了首页统计图标

@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 <meta name="renderer" content="webkit"> 7 <meta name="renderer" content="webkit">
8 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> 8 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
9 <link rel="icon" href="/favicon.ico"> 9 <link rel="icon" href="/favicon.ico">
10 - <title>若依管理系统</title> 10 + <title>广西保险行业协会车险投保登记平台</title>
11 <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]--> 11 <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
12 <style> 12 <style>
13 html, 13 html,
@@ -20,7 +20,7 @@ @@ -20,7 +20,7 @@
20 "@vueuse/core": "9.5.0", 20 "@vueuse/core": "9.5.0",
21 "axios": "0.27.2", 21 "axios": "0.27.2",
22 "compressorjs": "^1.2.1", 22 "compressorjs": "^1.2.1",
23 - "echarts": "5.4.0", 23 + "echarts": "^5.5.1",
24 "element-plus": "2.2.21", 24 "element-plus": "2.2.21",
25 "file-saver": "2.0.5", 25 "file-saver": "2.0.5",
26 "fuse.js": "6.6.2", 26 "fuse.js": "6.6.2",
@@ -30,7 +30,8 @@ @@ -30,7 +30,8 @@
30 "pinia": "2.0.22", 30 "pinia": "2.0.22",
31 "vue": "3.2.45", 31 "vue": "3.2.45",
32 "vue-cropper": "1.0.3", 32 "vue-cropper": "1.0.3",
33 - "vue-router": "4.1.4" 33 + "vue-router": "4.1.4",
  34 + "vue3-count-to": "^1.1.2"
34 }, 35 },
35 "devDependencies": { 36 "devDependencies": {
36 "@vitejs/plugin-vue": "3.1.0", 37 "@vitejs/plugin-vue": "3.1.0",
  1 +import request from '@/utils/request'
  2 +
  3 +// 获取统计信息
  4 +export function getStatistics(data) {
  5 + return request({
  6 + url: '/registration/monitor/statistics',
  7 + method: 'get',
  8 + params: data
  9 + })
  10 +}
  1 +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1729153352026" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13540" xmlns:xlink="http://www.w3.org/1999/xlink" width="256" height="256"><path d="M625.728 57.472c16.512 0 30.208 4.992 42.24 14.848l5.888 5.312 208.96 207.04c12.224 11.2 19.328 24.96 21.12 41.024l0.448 8.256v232.32a287.104 287.104 0 0 0-76.8-39.424V374.016H687.36A96 96 0 0 1 592 287.36l-0.448-9.216V134.208l-339.328 0.064c-27.84 0-48.384 18.176-51.392 43.904l-0.384 6.528v653.824c0 27.136 18.624 47.616 44.992 50.56l6.784 0.384h210.048c9.024 27.712 22.144 53.568 38.656 76.864H252.16c-68.8 0-123.392-50.816-128.192-118.08l-0.384-9.728V184.704c0-68.48 51.2-122.112 118.784-126.912L252.16 57.472h373.568z m63.04 620.736l81.472 81.408 81.408-81.408a38.4 38.4 0 0 1 54.336 54.272l-81.408 81.408 81.408 81.536a38.4 38.4 0 0 1-54.336 54.272l-81.408-81.536-81.472 81.536a38.4 38.4 0 1 1-54.336-54.272l81.472-81.536-81.472-81.408a38.4 38.4 0 1 1 54.336-54.272zM393.088 704a38.4 38.4 0 0 1 0 76.8H294.4a38.4 38.4 0 0 1 0-76.8h98.688zM665.6 512a38.4 38.4 0 0 1 0 76.8H294.4a38.4 38.4 0 0 1 0-76.8h371.2z m-192-192a38.4 38.4 0 1 1 0 76.8H294.4a38.4 38.4 0 1 1 0-76.8h179.2z m325.76-9.984L655.36 167.488v110.592a32 32 0 0 0 26.24 31.488l5.76 0.512h111.872z" p-id="13541"></path></svg>
  1 +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1729153214328" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6614" xmlns:xlink="http://www.w3.org/1999/xlink" width="256" height="256"><path d="M544.65616 960A272 272 0 0 1 799.95216 491.968V128a64 64 0 0 0-64-64H159.95216a64 64 0 0 0-64 64v768a64 64 0 0 0 64 64h384.704zM863.95216 521.216a272 272 0 0 1-128 502.336V1024H159.95216a128 128 0 0 1-128-128V128a128 128 0 0 1 128-128h576a128 128 0 0 1 128 128v393.216zM719.95216 960a208 208 0 1 0 0-416 208 208 0 0 0 0 416zM255.95216 192h384a32 32 0 0 1 0 64H255.95216a32 32 0 0 1 0-64z m0 160h192a32 32 0 0 1 0 64H255.95216a32 32 0 0 1 0-64z m352 368h224a32 32 0 0 1 0 64h-224a32 32 0 0 1 0-64z" p-id="6615"></path></svg>
  1 +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1729149317544" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7294" xmlns:xlink="http://www.w3.org/1999/xlink" width="256" height="256"><path d="M384 896 160 896c-52.9 0-96-43.1-96-96L64 160c0-52.9 43.1-96 96-96l512 0c52.9 0 96 43.1 96 96l0 192c0 17.7-14.3 32-32 32s-32-14.3-32-32L704 160c0-17.6-14.4-32-32-32L160 128c-17.6 0-32 14.4-32 32l0 640c0 17.6 14.4 32 32 32l224 0c17.7 0 32 14.3 32 32S401.7 896 384 896z" p-id="7295"></path><path d="M688 960c-72.7 0-141-28.3-192.3-79.7C444.3 829 416 760.7 416 688c0-72.7 28.3-141 79.7-192.3C547 444.3 615.3 416 688 416c72.7 0 141 28.3 192.3 79.7S960 615.4 960 688c0 72.7-28.3 141-79.7 192.3S760.7 960 688 960zM688 480c-114.7 0-208 93.3-208 208s93.3 208 208 208 208-93.3 208-208S802.7 480 688 480z" p-id="7296"></path><path d="M608 320 224 320c-17.7 0-32-14.3-32-32s14.3-32 32-32l384 0c17.7 0 32 14.3 32 32S625.7 320 608 320z" p-id="7297"></path><path d="M384 512 224 512c-17.7 0-32-14.3-32-32s14.3-32 32-32l160 0c17.7 0 32 14.3 32 32S401.7 512 384 512z" p-id="7298"></path><path d="M320 704l-96 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l96 0c17.7 0 32 14.3 32 32S337.7 704 320 704z" p-id="7299"></path><path d="M704 800c-6.3 0-12.5-1.8-17.8-5.4l-96-64c-14.7-9.8-18.7-29.7-8.9-44.4 9.8-14.7 29.7-18.7 44.4-8.9l68.1 45.4 78.7-131.2c9.1-15.2 28.8-20.1 43.9-11 15.2 9.1 20.1 28.7 11 43.9l-96 160c-4.5 7.5-11.9 12.8-20.4 14.8C708.7 799.8 706.3 800 704 800z" p-id="7300"></path></svg>
  1 +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1729153319768" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12517" xmlns:xlink="http://www.w3.org/1999/xlink" width="256" height="256"><path d="M102.4 51.2a51.2 51.2 0 0 0-51.2 51.2v819.2a51.2 51.2 0 0 0 51.2 51.2h819.2a51.2 51.2 0 0 0 51.2-51.2V102.4a51.2 51.2 0 0 0-51.2-51.2H102.4z m0-51.2h819.2a102.4 102.4 0 0 1 102.4 102.4v819.2a102.4 102.4 0 0 1-102.4 102.4H102.4a102.4 102.4 0 0 1-102.4-102.4V102.4a102.4 102.4 0 0 1 102.4-102.4zM51.2 204.8h921.6v51.2H51.2V204.8z m392.192 525.4656L712.0384 481.28a25.6 25.6 0 0 1 34.816 37.5808l-286.464 265.4208a25.6 25.6 0 0 1-35.1744-0.3072l-158.1056-151.9616a25.6 25.6 0 1 1 35.4304-36.864l140.8 135.168z" p-id="12518"></path></svg>
  1 +<template>
  2 + <el-row :gutter="40" class="panel-group">
  3 + <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col">
  4 + <div class="card-panel" @click="handleSetLineChartData('newVisitis')">
  5 + <div class="card-panel-icon-wrapper icon-people">
  6 + <svg-icon icon-class="notaccepted" class-name="card-panel-icon" />
  7 + </div>
  8 + <div class="card-panel-description">
  9 + <div class="card-panel-text">未承接</div>
  10 + <count-to
  11 + :start-val="0"
  12 + :end-val="102400"
  13 + :duration="2600"
  14 + class="card-panel-num"
  15 + />
  16 + </div>
  17 + </div>
  18 + </el-col>
  19 + <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col">
  20 + <div class="card-panel" @click="handleSetLineChartData('messages')">
  21 + <div class="card-panel-icon-wrapper icon-message">
  22 + <svg-icon icon-class="undertaken" class-name="card-panel-icon" />
  23 + </div>
  24 + <div class="card-panel-description">
  25 + <div class="card-panel-text">已承接</div>
  26 + <count-to
  27 + :start-val="0"
  28 + :end-val="81212"
  29 + :duration="3000"
  30 + class="card-panel-num"
  31 + />
  32 + </div>
  33 + </div>
  34 + </el-col>
  35 + <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col">
  36 + <div class="card-panel" @click="handleSetLineChartData('purchases')">
  37 + <div class="card-panel-icon-wrapper icon-money">
  38 + <svg-icon icon-class="incomplete" class-name="card-panel-icon" />
  39 + </div>
  40 + <div class="card-panel-description">
  41 + <div class="card-panel-text">未完成</div>
  42 + <count-to
  43 + :start-val="0"
  44 + :end-val="9280"
  45 + :duration="3200"
  46 + class="card-panel-num"
  47 + />
  48 + </div>
  49 + </div>
  50 + </el-col>
  51 + <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col">
  52 + <div class="card-panel" @click="handleSetLineChartData('shoppings')">
  53 + <div class="card-panel-icon-wrapper icon-shopping">
  54 + <svg-icon icon-class="success" class-name="card-panel-icon" />
  55 + </div>
  56 + <div class="card-panel-description">
  57 + <div class="card-panel-text">已完成</div>
  58 + <count-to
  59 + :start-val="0"
  60 + :end-val="13600"
  61 + :duration="3600"
  62 + class="card-panel-num"
  63 + />
  64 + </div>
  65 + </div>
  66 + </el-col>
  67 + </el-row>
  68 +</template>
  69 +
  70 +<script setup>
  71 +import { CountTo } from "vue3-count-to";
  72 +const $emit = defineEmits(["handleSetLineChartData"]);
  73 +const handleSetLineChartData = (type) => {
  74 + $emit("handleSetLineChartData", type);
  75 +};
  76 +</script>
  77 +
  78 +<style lang="scss" scoped>
  79 +.panel-group {
  80 + margin-top: 18px;
  81 +
  82 + .card-panel-col {
  83 + margin-bottom: 32px;
  84 + }
  85 +
  86 + .card-panel {
  87 + height: 108px;
  88 + cursor: pointer;
  89 + font-size: 12px;
  90 + position: relative;
  91 + overflow: hidden;
  92 + color: #666;
  93 + background: #fff;
  94 + box-shadow: 4px 4px 40px rgba(0, 0, 0, 0.05);
  95 + border-color: rgba(0, 0, 0, 0.05);
  96 +
  97 + &:hover {
  98 + .card-panel-icon-wrapper {
  99 + color: #fff;
  100 + }
  101 +
  102 + .icon-people {
  103 + background: #7f36fe;
  104 + }
  105 +
  106 + .icon-message {
  107 + background: #36a3f7;
  108 + }
  109 +
  110 + .icon-money {
  111 + background: #f4516c;
  112 + }
  113 +
  114 + .icon-shopping {
  115 + background: #34bfa3;
  116 + }
  117 + }
  118 +
  119 + .icon-people {
  120 + color: #7f36fe;
  121 + }
  122 +
  123 + .icon-message {
  124 + color: #36a3f7;
  125 + }
  126 +
  127 + .icon-money {
  128 + color: #f4516c;
  129 + }
  130 +
  131 + .icon-shopping {
  132 + color: #34bfa3;
  133 + }
  134 +
  135 + .card-panel-icon-wrapper {
  136 + float: left;
  137 + margin: 14px 0 0 14px;
  138 + padding: 16px;
  139 + transition: all 0.38s ease-out;
  140 + border-radius: 6px;
  141 + }
  142 +
  143 + .card-panel-icon {
  144 + float: left;
  145 + font-size: 48px;
  146 + }
  147 +
  148 + .card-panel-description {
  149 + float: right;
  150 + font-weight: bold;
  151 + margin: 26px;
  152 + margin-left: 0px;
  153 +
  154 + .card-panel-text {
  155 + line-height: 18px;
  156 + color: rgba(0, 0, 0, 0.45);
  157 + font-size: 16px;
  158 + margin-bottom: 12px;
  159 + }
  160 +
  161 + .card-panel-num {
  162 + font-size: 20px;
  163 + }
  164 + }
  165 + }
  166 +}
  167 +
  168 +@media (max-width: 550px) {
  169 + .card-panel-description {
  170 + display: none;
  171 + }
  172 +
  173 + .card-panel-icon-wrapper {
  174 + float: none !important;
  175 + width: 100%;
  176 + height: 100%;
  177 + margin: 0 !important;
  178 +
  179 + .svg-icon {
  180 + display: block;
  181 + margin: 14px auto !important;
  182 + float: none !important;
  183 + }
  184 + }
  185 +}
  186 +</style>
1 import { createApp } from 'vue' 1 import { createApp } from 'vue'
2 2
3 import Cookies from 'js-cookie' 3 import Cookies from 'js-cookie'
4 - 4 +import * as echarts from 'echarts'
5 import ElementPlus from 'element-plus' 5 import ElementPlus from 'element-plus'
6 import locale from 'element-plus/lib/locale/lang/zh-cn' // 中文语言 6 import locale from 'element-plus/lib/locale/lang/zh-cn' // 中文语言
7 7
@@ -55,6 +55,7 @@ app.config.globalProperties.handleTree = handleTree @@ -55,6 +55,7 @@ app.config.globalProperties.handleTree = handleTree
55 app.config.globalProperties.addDateRange = addDateRange 55 app.config.globalProperties.addDateRange = addDateRange
56 app.config.globalProperties.selectDictLabel = selectDictLabel 56 app.config.globalProperties.selectDictLabel = selectDictLabel
57 app.config.globalProperties.selectDictLabels = selectDictLabels 57 app.config.globalProperties.selectDictLabels = selectDictLabels
  58 +app.config.globalProperties.echarts = echarts
58 59
59 // 全局组件挂载 60 // 全局组件挂载
60 app.component('DictTag', DictTag) 61 app.component('DictTag', DictTag)
@@ -60,7 +60,15 @@ export const constantRoutes = [ @@ -60,7 +60,15 @@ export const constantRoutes = [
60 { 60 {
61 path: '', 61 path: '',
62 component: Layout, 62 component: Layout,
63 - redirect: '/policy/pending' 63 + redirect: '/index',
  64 + children: [
  65 + {
  66 + path: '/index',
  67 + component: () => import('@/views/index'),
  68 + name: 'Index',
  69 + meta: { title: '首页', icon: 'dashboard', affix: true }
  70 + }
  71 + ]
64 }, 72 },
65 { 73 {
66 path: '/user', 74 path: '/user',
1 <template> 1 <template>
2 - <div class="index-page">  
3 - <div class="card-list">  
4 - <el-card class="box-card">  
5 - <template #header>  
6 - <span>流程</span>  
7 - <el-tag style="float: right" size="small" effect="dark">月</el-tag>  
8 - </template>  
9 - <h2>3</h2>  
10 - <span>总流程数</span>  
11 - <span style="color: #1890ff; float: right">  
12 - <span>98%</span>  
13 - <span class="el-icon-top"></span>  
14 - </span>  
15 - </el-card>  
16 - <el-card class="box-card">  
17 - <template #header>  
18 - <span>运行</span>  
19 - <el-tag style="float: right" type="success" size="small" effect="dark"  
20 - >全年</el-tag 2 + <div class="app-container">
  3 + <el-row :gutter="20">
  4 + <el-col :span="6" :xs="24">
  5 + <el-card class="box-card">
  6 + <template v-slot:header>
  7 + <div class="clearfix">
  8 + <span>个人信息</span>
  9 + </div>
  10 + </template>
  11 + <div>
  12 + <div class="text-center">
  13 + <img
  14 + :src="userStore.avatar"
  15 + style="width: 120px; height: 120px; border-radius: 50%"
  16 + />
  17 + </div>
  18 + <ul class="list-group list-group-striped">
  19 + <li class="list-group-item">
  20 + <svg-icon icon-class="user" />用户昵称
  21 + <div class="pull-right">{{ state.user.nickName }}</div>
  22 + </li>
  23 + <li class="list-group-item">
  24 + <svg-icon icon-class="phone" />手机号码
  25 + <div class="pull-right">{{ state.user.phonenumber }}</div>
  26 + </li>
  27 + <li class="list-group-item">
  28 + <svg-icon icon-class="email" />用户邮箱
  29 + <div class="pull-right">{{ state.user.email }}</div>
  30 + </li>
  31 + <li class="list-group-item">
  32 + <svg-icon icon-class="tree" />所属部门
  33 + <div class="pull-right" v-if="state.user.dept">
  34 + {{ state.user.dept.deptName }} / {{ state.postGroup }}
  35 + </div>
  36 + </li>
  37 + <li class="list-group-item">
  38 + <svg-icon icon-class="peoples" />所属角色
  39 + <div class="pull-right">{{ state.roleGroup }}</div>
  40 + </li>
  41 + <li class="list-group-item">
  42 + <svg-icon icon-class="date" />创建日期
  43 + <div class="pull-right">{{ state.user.createTime }}</div>
  44 + </li>
  45 + </ul>
  46 + </div>
  47 + </el-card>
  48 + </el-col>
  49 + <el-col :span="18" :xs="24">
  50 + <PanelGroup :listData="listData" />
  51 + <!-- 统计柱状图 -->
  52 + <div class="echarts_box">
  53 + <div
  54 + v-hasRole="['admin', 'associationemployee']"
  55 + class="select_company"
21 > 56 >
22 - </template>  
23 - <h2>89</h2>  
24 - <span>流程实例数</span>  
25 - <span style="color: #13ce66; float: right">  
26 - <span>20%</span>  
27 - <span class="el-icon-top"></span>  
28 - </span>  
29 - </el-card>  
30 - <el-card class="box-card">  
31 - <template #header>  
32 - <span>执行</span>  
33 - <el-tag style="float: right" type="success" size="small" effect="dark"  
34 - >今天</el-tag  
35 - >  
36 - </template>  
37 - <h2>105</h2>  
38 - <span>执行实例数</span>  
39 - <span style="color: #13ce66; float: right">  
40 - <span>44%</span>  
41 - <span class="el-icon-top"></span>  
42 - </span>  
43 - </el-card>  
44 - <el-card class="box-card">  
45 - <template #header>  
46 - <span>待办任务数</span>  
47 - <el-tag style="float: right" type="danger" size="small" effect="dark"  
48 - >历史记录</el-tag  
49 - >  
50 - </template>  
51 - <h2>451</h2>  
52 - <span>12月</span>  
53 - <span style="color: red; float: right">  
54 - <span>38%</span>  
55 - <span class="el-icon-bottom"></span>  
56 - </span>  
57 - </el-card>  
58 - </div> 57 + <p>选择保险公司</p>
  58 + <el-select
  59 + v-model="queryParams.deptIds[0]"
  60 + placeholder="请选择保险公司"
  61 + style="width: 240px"
  62 + @change="getList"
  63 + >
  64 + <el-option
  65 + v-for="item in deptOptions"
  66 + :key="item.deptId"
  67 + :label="item.deptName"
  68 + :value="item.deptId"
  69 + />
  70 + </el-select>
  71 + </div>
  72 + <div ref="chartRef" style="width: 100%; height: 400px"></div>
  73 + </div>
  74 + </el-col>
  75 + </el-row>
59 </div> 76 </div>
60 </template> 77 </template>
61 78
62 -<script setup></script> 79 +<script setup>
  80 +import useUserStore from "@/store/modules/user";
  81 +import { getUserProfile } from "@/api/system/user";
  82 +import { getStatistics } from "@/api/index";
  83 +import PanelGroup from "@/components/PanelGroup";
  84 +import { listDept } from "@/api/system/dept";
  85 +import { onMounted } from "vue";
  86 +const { proxy } = getCurrentInstance();
  87 +const userStore = useUserStore();
  88 +const chartRef = ref(null);
  89 +const listData = ref([]);
  90 +const xList = ref([]);
  91 +const company = ref("");
  92 +const option = ref({});
  93 +const deptOptions = ref([]);
  94 +const queryParams = reactive({
  95 + deptIds: [""],
  96 + type: 1,
  97 + startTime: proxy.parseTime(
  98 + new Date().setFullYear(new Date().getFullYear() - 1)
  99 + ),
  100 + endTime: proxy.parseTime(new Date()),
  101 +});
  102 +const state = reactive({
  103 + user: {},
  104 + roleGroup: {},
  105 + postGroup: {},
  106 +});
63 107
64 -<style>  
65 -.index-page {  
66 - background-color: #f3f3f4;  
67 - height: calc(100vh - 88px);  
68 - padding: 20px; 108 +onMounted(() => {
  109 + getList();
  110 + if (proxy.$auth.hasRoleOr(["admin", "common"])) {
  111 + getDeptList();
  112 + }
  113 +});
  114 +
  115 +/** 查询部门列表 */
  116 +const getDeptList = () => {
  117 + listDept().then((response) => {
  118 + deptOptions.value = response.data.filter((item) => item.parentId === 100);
  119 + });
  120 +};
  121 +function getUser() {
  122 + getUserProfile().then((response) => {
  123 + state.user = response.data;
  124 + state.roleGroup = response.roleGroup;
  125 + state.postGroup = response.postGroup;
  126 + });
69 } 127 }
70 -.card-list {  
71 - font-size: 14px; 128 +const showText = (index) => {
  129 + let obj = {
  130 + 0: "未承接",
  131 + 1: "已承接",
  132 + 2: "未完成",
  133 + 3: "已完成",
  134 + };
  135 + return obj[index];
  136 +};
  137 +// 获取统计数据
  138 +const getList = async () => {
  139 + const { data } = await getStatistics(queryParams);
  140 + xList.value = data?.map((item) => item.month);
  141 + let newData = data?.map((data) => data.statisticsVo[0]);
  142 + let newArr = newData?.map((item) => {
  143 + return [
  144 + item.toBeUndertaken,
  145 + item.undertaken,
  146 + item.notCompleted,
  147 + item.completed,
  148 + ];
  149 + });
  150 + const arrList = [[], [], [], []];
  151 + for (let i = 0; i < 4; i++) {
  152 + for (let j = 0; j < 13; j++) {
  153 + arrList[i]?.push(newArr[j][i]);
  154 + }
  155 + }
  156 + listData.value = arrList.map((child, index) => {
  157 + return {
  158 + name: showText(index),
  159 + type: "bar",
  160 + emphasis: {
  161 + focus: "series",
  162 + },
  163 + data: child,
  164 + };
  165 + });
  166 + company.value = data[0]?.statisticsVo[0]?.deptName;
  167 + init();
  168 +};
  169 +
  170 +const init = () => {
  171 + const myChart = proxy.echarts.init(chartRef.value);
  172 + option.value = {
  173 + color: ["#7f36fe", "#36a3f7", "#f4516c", "#34bfa3"],
  174 + title: {
  175 + text: company.value + `一年内数据统计`,
  176 + x: "center",
  177 + },
  178 + tooltip: {
  179 + trigger: "axis",
  180 + axisPointer: {
  181 + type: "shadow",
  182 + },
  183 + },
  184 + legend: {
  185 + x: "right",
  186 + data: ["未承接", "已承接", "未完成", "已完成"],
  187 + },
  188 + xAxis: [
  189 + {
  190 + type: "category",
  191 + axisTick: { show: false },
  192 + data: xList.value,
  193 + },
  194 + ],
  195 + yAxis: [
  196 + {
  197 + type: "value",
  198 + },
  199 + ],
  200 + series: listData.value,
  201 + };
  202 + myChart.setOption(option.value);
  203 +};
  204 +getUser();
  205 +</script>
  206 +
  207 +<style lang="scss" scoped>
  208 +.select_company {
72 display: flex; 209 display: flex;
73 - justify-content: space-between;  
74 -}  
75 -.card-list > * {  
76 - width: 20%;  
77 -}  
78 -.chart,  
79 -.table {  
80 - margin-top: 20px;  
81 -}  
82 -.index-page table {  
83 - width: 100% !important; 210 + align-items: center;
  211 + gap: 20px;
  212 + font-size: 18px;
  213 + color: #666;
84 } 214 }
85 </style> 215 </style>
1 <template> 1 <template>
2 <div class="login"> 2 <div class="login">
3 - <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">  
4 - <h3 class="title">若依后台管理系统</h3> 3 + <el-form
  4 + ref="loginRef"
  5 + :model="loginForm"
  6 + :rules="loginRules"
  7 + class="login-form"
  8 + >
  9 + <h3 class="title">广西保险行业协会车险投保登记平台</h3>
5 <el-form-item prop="username"> 10 <el-form-item prop="username">
6 <el-input 11 <el-input
7 v-model="loginForm.username" 12 v-model="loginForm.username"
@@ -10,7 +15,9 @@ @@ -10,7 +15,9 @@
10 auto-complete="off" 15 auto-complete="off"
11 placeholder="账号" 16 placeholder="账号"
12 > 17 >
13 - <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template> 18 + <template #prefix
  19 + ><svg-icon icon-class="user" class="el-input__icon input-icon"
  20 + /></template>
14 </el-input> 21 </el-input>
15 </el-form-item> 22 </el-form-item>
16 <el-form-item prop="password"> 23 <el-form-item prop="password">
@@ -22,7 +29,9 @@ @@ -22,7 +29,9 @@
22 placeholder="密码" 29 placeholder="密码"
23 @keyup.enter="handleLogin" 30 @keyup.enter="handleLogin"
24 > 31 >
25 - <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template> 32 + <template #prefix
  33 + ><svg-icon icon-class="password" class="el-input__icon input-icon"
  34 + /></template>
26 </el-input> 35 </el-input>
27 </el-form-item> 36 </el-form-item>
28 <el-form-item prop="code" v-if="captchaEnabled"> 37 <el-form-item prop="code" v-if="captchaEnabled">
@@ -34,26 +43,34 @@ @@ -34,26 +43,34 @@
34 style="width: 63%" 43 style="width: 63%"
35 @keyup.enter="handleLogin" 44 @keyup.enter="handleLogin"
36 > 45 >
37 - <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template> 46 + <template #prefix
  47 + ><svg-icon icon-class="validCode" class="el-input__icon input-icon"
  48 + /></template>
38 </el-input> 49 </el-input>
39 <div class="login-code"> 50 <div class="login-code">
40 - <img :src="codeUrl" @click="getCode" class="login-code-img"/> 51 + <img :src="codeUrl" @click="getCode" class="login-code-img" />
41 </div> 52 </div>
42 </el-form-item> 53 </el-form-item>
43 - <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>  
44 - <el-form-item style="width:100%;"> 54 + <el-checkbox
  55 + v-model="loginForm.rememberMe"
  56 + style="margin: 0px 0px 25px 0px"
  57 + >记住密码</el-checkbox
  58 + >
  59 + <el-form-item style="width: 100%">
45 <el-button 60 <el-button
46 :loading="loading" 61 :loading="loading"
47 size="large" 62 size="large"
48 type="primary" 63 type="primary"
49 - style="width:100%;" 64 + style="width: 100%"
50 @click.prevent="handleLogin" 65 @click.prevent="handleLogin"
51 > 66 >
52 <span v-if="!loading">登 录</span> 67 <span v-if="!loading">登 录</span>
53 <span v-else>登 录 中...</span> 68 <span v-else>登 录 中...</span>
54 </el-button> 69 </el-button>
55 - <div style="float: right;" v-if="register">  
56 - <router-link class="link-type" :to="'/register'">立即注册</router-link> 70 + <div style="float: right" v-if="register">
  71 + <router-link class="link-type" :to="'/register'"
  72 + >立即注册</router-link
  73 + >
57 </div> 74 </div>
58 </el-form-item> 75 </el-form-item>
59 </el-form> 76 </el-form>
@@ -68,24 +85,24 @@ @@ -68,24 +85,24 @@
68 import { getCodeImg } from "@/api/login"; 85 import { getCodeImg } from "@/api/login";
69 import Cookies from "js-cookie"; 86 import Cookies from "js-cookie";
70 import { encrypt, decrypt } from "@/utils/jsencrypt"; 87 import { encrypt, decrypt } from "@/utils/jsencrypt";
71 -import useUserStore from '@/store/modules/user' 88 +import useUserStore from "@/store/modules/user";
72 89
73 -const userStore = useUserStore() 90 +const userStore = useUserStore();
74 const router = useRouter(); 91 const router = useRouter();
75 const { proxy } = getCurrentInstance(); 92 const { proxy } = getCurrentInstance();
76 93
77 const loginForm = ref({ 94 const loginForm = ref({
78 - username: "admin",  
79 - password: "admin123", 95 + username: "",
  96 + password: "",
80 rememberMe: false, 97 rememberMe: false,
81 code: "", 98 code: "",
82 - uuid: "" 99 + uuid: "",
83 }); 100 });
84 101
85 const loginRules = { 102 const loginRules = {
86 username: [{ required: true, trigger: "blur", message: "请输入您的账号" }], 103 username: [{ required: true, trigger: "blur", message: "请输入您的账号" }],
87 password: [{ required: true, trigger: "blur", message: "请输入您的密码" }], 104 password: [{ required: true, trigger: "blur", message: "请输入您的密码" }],
88 - code: [{ required: true, trigger: "change", message: "请输入验证码" }] 105 + code: [{ required: true, trigger: "change", message: "请输入验证码" }],
89 }; 106 };
90 107
91 const codeUrl = ref(""); 108 const codeUrl = ref("");
@@ -97,13 +114,15 @@ const register = ref(false); @@ -97,13 +114,15 @@ const register = ref(false);
97 const redirect = ref(undefined); 114 const redirect = ref(undefined);
98 115
99 function handleLogin() { 116 function handleLogin() {
100 - proxy.$refs.loginRef.validate(valid => { 117 + proxy.$refs.loginRef.validate((valid) => {
101 if (valid) { 118 if (valid) {
102 loading.value = true; 119 loading.value = true;
103 // 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码 120 // 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码
104 if (loginForm.value.rememberMe) { 121 if (loginForm.value.rememberMe) {
105 Cookies.set("username", loginForm.value.username, { expires: 30 }); 122 Cookies.set("username", loginForm.value.username, { expires: 30 });
106 - Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 }); 123 + Cookies.set("password", encrypt(loginForm.value.password), {
  124 + expires: 30,
  125 + });
107 Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 }); 126 Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 });
108 } else { 127 } else {
109 // 否则移除 128 // 否则移除
@@ -112,22 +131,26 @@ function handleLogin() { @@ -112,22 +131,26 @@ function handleLogin() {
112 Cookies.remove("rememberMe"); 131 Cookies.remove("rememberMe");
113 } 132 }
114 // 调用action的登录方法 133 // 调用action的登录方法
115 - userStore.login(loginForm.value).then(() => {  
116 - router.push({ path: redirect.value || "/" });  
117 - }).catch(() => {  
118 - loading.value = false;  
119 - // 重新获取验证码  
120 - if (captchaEnabled.value) {  
121 - getCode();  
122 - }  
123 - }); 134 + userStore
  135 + .login(loginForm.value)
  136 + .then(() => {
  137 + router.push({ path: redirect.value || "/" });
  138 + })
  139 + .catch(() => {
  140 + loading.value = false;
  141 + // 重新获取验证码
  142 + if (captchaEnabled.value) {
  143 + getCode();
  144 + }
  145 + });
124 } 146 }
125 }); 147 });
126 } 148 }
127 149
128 function getCode() { 150 function getCode() {
129 - getCodeImg().then(res => {  
130 - captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled; 151 + getCodeImg().then((res) => {
  152 + captchaEnabled.value =
  153 + res.captchaEnabled === undefined ? true : res.captchaEnabled;
131 if (captchaEnabled.value) { 154 if (captchaEnabled.value) {
132 codeUrl.value = "data:image/gif;base64," + res.img; 155 codeUrl.value = "data:image/gif;base64," + res.img;
133 loginForm.value.uuid = res.uuid; 156 loginForm.value.uuid = res.uuid;
@@ -141,8 +164,9 @@ function getCookie() { @@ -141,8 +164,9 @@ function getCookie() {
141 const rememberMe = Cookies.get("rememberMe"); 164 const rememberMe = Cookies.get("rememberMe");
142 loginForm.value = { 165 loginForm.value = {
143 username: username === undefined ? loginForm.value.username : username, 166 username: username === undefined ? loginForm.value.username : username,
144 - password: password === undefined ? loginForm.value.password : decrypt(password),  
145 - rememberMe: rememberMe === undefined ? false : Boolean(rememberMe) 167 + password:
  168 + password === undefined ? loginForm.value.password : decrypt(password),
  169 + rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
146 }; 170 };
147 } 171 }
148 172
@@ -150,7 +174,7 @@ getCode(); @@ -150,7 +174,7 @@ getCode();
150 getCookie(); 174 getCookie();
151 </script> 175 </script>
152 176
153 -<style lang='scss' scoped> 177 +<style lang="scss" scoped>
154 .login { 178 .login {
155 display: flex; 179 display: flex;
156 justify-content: center; 180 justify-content: center;
@@ -2,77 +2,37 @@ @@ -2,77 +2,37 @@
2 <div class="app-container"> 2 <div class="app-container">
3 <!-- 表格数据 --> 3 <!-- 表格数据 -->
4 <el-table v-loading="loading" :data="policyList" @row-click="handleUpdate"> 4 <el-table v-loading="loading" :data="policyList" @row-click="handleUpdate">
5 - <el-table-column type="selection" width="55" align="center" />  
6 <el-table-column label="序号" width="55" type="index" /> 5 <el-table-column label="序号" width="55" type="index" />
7 - <el-table-column  
8 - label="登记时间"  
9 - prop="createTime"  
10 - width="160"  
11 - align="center"  
12 - /> 6 + <el-table-column label="登记时间" prop="createTime" align="center" />
13 <el-table-column 7 <el-table-column
14 label="车牌号" 8 label="车牌号"
15 prop="licensePlateNumber" 9 prop="licensePlateNumber"
16 - width="150"  
17 align="center" 10 align="center"
18 /> 11 />
19 <el-table-column 12 <el-table-column
20 label="车架号" 13 label="车架号"
21 - width="180"  
22 prop="frameNumber" 14 prop="frameNumber"
23 align="center" 15 align="center"
24 :show-overflow-tooltip="true" 16 :show-overflow-tooltip="true"
25 /> 17 />
  18 + <el-table-column label="车主姓名" prop="name" align="center" />
  19 + <el-table-column label="联系电话" prop="phone" align="center" />
  20 + <el-table-column label="上年承保公司" prop="sysDeptName" align="center" />
26 <el-table-column 21 <el-table-column
27 - label="车主姓名"  
28 - prop="name"  
29 - width="100"  
30 - align="center"  
31 - />  
32 - <el-table-column  
33 - label="联系电话"  
34 - prop="phone"  
35 - width="180"  
36 - align="center"  
37 - />  
38 - <el-table-column  
39 - label="上年承保公司"  
40 - prop="sysDeptName"  
41 - width="150"  
42 - align="center"  
43 - />  
44 - <el-table-column  
45 - v-show="hasCompanyadmin"  
46 - label="分配机制"  
47 - prop="distributionMechanism"  
48 - width="150"  
49 - align="center"  
50 - />  
51 - <el-table-column  
52 - label="订单分配时间"  
53 - prop="distributionTime"  
54 - width="150"  
55 - align="center"  
56 - />  
57 - <el-table-column  
58 - label="保单进度"  
59 - prop="orderProgress"  
60 - width="150"  
61 - align="center"  
62 - />  
63 - <el-table-column  
64 - label="承接时间"  
65 - prop="companyEmployeeUndertakeTime"  
66 - width="150" 22 + label="操作"
67 align="center" 23 align="center"
68 - />  
69 - <el-table-column  
70 - v-show="hasCompanyadmin"  
71 - label="承接人"  
72 - prop="associationEmployeeUserName"  
73 - width="150"  
74 - align="center"  
75 - /> 24 + min-width="120"
  25 + fixed="right"
  26 + >
  27 + <template #default="{ row }">
  28 + <el-button
  29 + type="primary"
  30 + v-hasRole="['companyadmin']"
  31 + @click.stop="handleSharing(row.taskId)"
  32 + >分配</el-button
  33 + >
  34 + </template>
  35 + </el-table-column>
76 </el-table> 36 </el-table>
77 37
78 <pagination 38 <pagination
@@ -83,55 +43,28 @@ @@ -83,55 +43,28 @@
83 @pagination="getList" 43 @pagination="getList"
84 /> 44 />
85 45
86 - <!-- 表单作废对话框 -->  
87 - <el-dialog  
88 - v-model="deprecatedShow"  
89 - title="温馨提示:该保单作废后车牌号、车架号在本自然年度无法重新提交"  
90 - width="500"  
91 - append-to-body  
92 - >  
93 - <QuillEditor  
94 - :value="deprecatedForm.deprecatedReason"  
95 - @updateValue="getMsg"  
96 - />  
97 - <template #footer>  
98 - <div class="dialog-footer">  
99 - <el-button @click="deprecatedShow = false">取消</el-button>  
100 - <el-button type="primary" @click="sunmitDeprecated">确定</el-button>  
101 - </div>  
102 - </template>  
103 - </el-dialog>  
104 -  
105 - <!-- 分配承保公司对话框 --> 46 + <!-- 转办分配对话框 -->
106 <el-dialog 47 <el-dialog
107 - v-model="companyShow"  
108 - title="分配承保公司:" 48 + v-model="transferShow"
  49 + title="请选择人员:"
109 width="500" 50 width="500"
110 append-to-body 51 append-to-body
111 > 52 >
112 <div class="company_box"> 53 <div class="company_box">
113 - <div class="header_top">  
114 - <el-input  
115 - v-model="companyQueryParams.deptName"  
116 - style="width: 380px"  
117 - placeholder="请输入承保公司名称(支持模糊查询)"  
118 - prefix-icon="Search"  
119 - />  
120 - <el-button type="primary" @click="getDeptList">查询</el-button>  
121 - </div>  
122 - <el-radio-group v-model="companyForm.deptId" @change="handleDeptChange"> 54 + <el-radio-group v-model="transferForm.username">
123 <el-radio 55 <el-radio
124 - v-for="item in deptOptions"  
125 - :key="item.deptId"  
126 - :label="item.deptId"  
127 - >{{ item.deptName }}</el-radio 56 + v-for="item in transferOptions"
  57 + :key="item.userName"
  58 + :label="item.userName"
  59 + >{{ item.userName }}</el-radio
128 > 60 >
129 </el-radio-group> 61 </el-radio-group>
  62 + <div v-show="transferOptions.length === 0">暂无其他员工</div>
130 </div> 63 </div>
131 <template #footer> 64 <template #footer>
132 <div class="dialog-footer"> 65 <div class="dialog-footer">
133 <el-button @click="companyShow = false">取消</el-button> 66 <el-button @click="companyShow = false">取消</el-button>
134 - <el-button type="primary" @click="submitForm">确定</el-button> 67 + <el-button type="primary" @click="submitTransfer">确定</el-button>
135 </div> 68 </div>
136 </template> 69 </template>
137 </el-dialog> 70 </el-dialog>
@@ -141,18 +74,18 @@ @@ -141,18 +74,18 @@
141 <el-form :model="form" :rules="rules" ref="policyRef" label-width="100px"> 74 <el-form :model="form" :rules="rules" ref="policyRef" label-width="100px">
142 <el-row> 75 <el-row>
143 <el-col :span="12"> 76 <el-col :span="12">
144 - <el-form-item label="车牌号" prop="carNum"> 77 + <el-form-item label="车牌号" prop="licensePlateNumber">
145 <el-input 78 <el-input
146 - v-model="form.carNum" 79 + v-model="form.licensePlateNumber"
147 placeholder="请输入车牌号" 80 placeholder="请输入车牌号"
148 maxlength="30" 81 maxlength="30"
149 /> 82 />
150 </el-form-item> 83 </el-form-item>
151 </el-col> 84 </el-col>
152 <el-col :span="12"> 85 <el-col :span="12">
153 - <el-form-item label="车架号" prop="frameNum"> 86 + <el-form-item label="车架号" prop="frameNumber">
154 <el-input 87 <el-input
155 - v-model="form.frameNum" 88 + v-model="form.frameNumber"
156 placeholder="请输入车架号" 89 placeholder="请输入车架号"
157 maxlength="30" 90 maxlength="30"
158 /> 91 />
@@ -189,9 +122,9 @@ @@ -189,9 +122,9 @@
189 </el-form-item> 122 </el-form-item>
190 </el-col> 123 </el-col>
191 <el-col :span="12"> 124 <el-col :span="12">
192 - <el-form-item label="上年承保公司" prop="company"> 125 + <el-form-item label="上年承保公司" prop="sysDeptName">
193 <el-input 126 <el-input
194 - v-model="form.company" 127 + v-model="form.sysDeptName"
195 placeholder="请输入上年承保公司" 128 placeholder="请输入上年承保公司"
196 maxlength="50" 129 maxlength="50"
197 /> 130 />
@@ -199,34 +132,21 @@ @@ -199,34 +132,21 @@
199 </el-col> 132 </el-col>
200 </el-row> 133 </el-row>
201 </el-form> 134 </el-form>
202 - <template #footer>  
203 - <div class="dialog-footer">  
204 - <el-button @click="open = false">取消</el-button>  
205 - <el-button type="primary" @click="open = false">确定</el-button>  
206 - </div>  
207 - </template>  
208 </el-dialog> 135 </el-dialog>
209 </div> 136 </div>
210 </template> 137 </template>
211 138
212 <script setup> 139 <script setup>
213 -import { queryPengdingList, disposeUser } from "@/api/policy/index";  
214 -import { listDept } from "@/api/system/dept";  
215 -import { onMounted, ref } from "vue";  
216 -const { proxy } = getCurrentInstance(); 140 +import { queryPengdingList, getUserList } from "@/api/policy/index";
217 const loading = ref(false); 141 const loading = ref(false);
  142 +const { proxy } = getCurrentInstance();
218 const total = ref(0); 143 const total = ref(0);
219 const title = ref("保单信息"); 144 const title = ref("保单信息");
220 const open = ref(false); 145 const open = ref(false);
221 -const timerReason = ref(null); 146 +const transferShow = ref(false);
222 const form = ref({}); 147 const form = ref({});
223 -const hasRole = computed(() => {  
224 - return proxy.$auth.hasRole("associationemployee");  
225 -});  
226 -  
227 -const hasCompanyadmin = computed(() => {  
228 - return proxy.$auth.hasRole("companyadmin");  
229 -}); 148 +const transferForm = ref({});
  149 +const transferOptions = ref([]);
230 const rules = ref({ 150 const rules = ref({
231 carNum: [{ required: true, message: "车牌号不能为空", trigger: "blur" }], 151 carNum: [{ required: true, message: "车牌号不能为空", trigger: "blur" }],
232 frameNum: [{ required: true, message: "车架号不能为空", trigger: "blur" }], 152 frameNum: [{ required: true, message: "车架号不能为空", trigger: "blur" }],
@@ -241,21 +161,18 @@ const rules = ref({ @@ -241,21 +161,18 @@ const rules = ref({
241 ], 161 ],
242 }); 162 });
243 const companyShow = ref(false); 163 const companyShow = ref(false);
244 -const deptOptions = ref([]);  
245 -const company = ref(2);  
246 -const deprecatedShow = ref(false);  
247 -const deprecatedForm = ref({});  
248 -const companyForm = ref({});  
249 const queryParams = reactive({ 164 const queryParams = reactive({
250 pageNum: 1, 165 pageNum: 1,
251 pageSize: 10, 166 pageSize: 10,
252 }); 167 });
253 -const companyQueryParams = reactive({  
254 - deptName: undefined,  
255 - status: undefined,  
256 -});  
257 const policyList = ref([]); 168 const policyList = ref([]);
258 169
  170 +/** 重置操作表单 */
  171 +function reset() {
  172 + proxy.resetForm("policyRef");
  173 +}
  174 +
  175 +// 获取处理的列表
259 const getList = async () => { 176 const getList = async () => {
260 loading.value = true; 177 loading.value = true;
261 const { rows, total: all } = await queryPengdingList(queryParams); 178 const { rows, total: all } = await queryPengdingList(queryParams);
@@ -263,117 +180,38 @@ const getList = async () => { @@ -263,117 +180,38 @@ const getList = async () => {
263 total.value = all; 180 total.value = all;
264 loading.value = false; 181 loading.value = false;
265 }; 182 };
266 -// 通过保单  
267 -const handleSuccess = (associationapprove, taskId) => {  
268 - ElMessageBox.confirm("是否通过该保单?", {  
269 - confirmButtonText: "确认通过",  
270 - cancelButtonText: "取消",  
271 - type: "warning",  
272 - })  
273 - .then(() => {  
274 - disposeUser({ associationapprove }, taskId).then((res) => {  
275 - proxy.$modal.msgSuccess("保单已通过");  
276 - });  
277 - })  
278 - .catch(() => {  
279 - proxy.$modal.msg("取消通过");  
280 - });  
281 -};  
282 -// 退回保单  
283 -const handleFallback = (associationapprove, taskId) => {  
284 - ElMessageBox.confirm("是否退回该保单?", {  
285 - confirmButtonText: "确认退回",  
286 - cancelButtonText: "取消",  
287 - type: "warning",  
288 - })  
289 - .then(() => {  
290 - disposeUser({ associationapprove }, taskId).then((res) => {  
291 - proxy.$modal.msgSuccess("保单已退回");  
292 - });  
293 - })  
294 - .catch(() => {  
295 - proxy.$modal.msg("已取消");  
296 - });  
297 -};  
298 -// 作废保单  
299 -const handleVoid = (associationapprove, taskId) => {  
300 - deprecatedForm.value = {  
301 - associationapprove,  
302 - taskId,  
303 - };  
304 - deprecatedShow.value = true;  
305 -};  
306 183
307 -// 提交作废表单  
308 -const sunmitDeprecated = () => {  
309 - const data = {  
310 - associationapprove: deprecatedForm.value.associationapprove,  
311 - comment: deprecatedForm.value.deprecatedReason,  
312 - };  
313 - const taskId = deprecatedForm.value.taskId;  
314 - disposeUser(data, taskId).then((res) => {  
315 - proxy.$modal.msgSuccess("保单已退回");  
316 - });  
317 -};  
318 -// 分配承保公司  
319 -const handleAuthCompany = (associationapprove, taskId) => {  
320 - companyForm.value = {  
321 - associationapprove,  
322 - taskId,  
323 - };  
324 - companyShow.value = true;  
325 - getDeptList(); 184 +// 转办或分配
  185 +const handleSharing = (id) => {
  186 + transferForm.value.taskId = id;
  187 + getUser();
  188 + transferShow.value = true;
326 }; 189 };
327 190
328 -/** 查询部门列表 */  
329 -const getDeptList = () => {  
330 - loading.value = true;  
331 - listDept(companyQueryParams).then((response) => {  
332 - deptOptions.value = response.data.filter((item) => item.parentId === 100);  
333 - loading.value = false;  
334 - }); 191 +// 获取人员列表
  192 +const getUser = async () => {
  193 + const { data } = await getUserList();
  194 + transferOptions.value = data;
335 }; 195 };
336 196
337 -/** 重置操作表单 */  
338 -function reset() {  
339 - form.value = {  
340 - policyId: undefined,  
341 - createTime: undefined,  
342 - carNum: undefined,  
343 - frameNum: undefined,  
344 - name: undefined,  
345 - phone: undefined,  
346 - company: undefined,  
347 - };  
348 - proxy.resetForm("policyRef");  
349 -}  
350 -  
351 -/** 修改按钮操作 */  
352 -function handleUpdate(row) {  
353 - reset();  
354 - form.value = row;  
355 - open.value = true;  
356 -}  
357 -/** 提交通过分配承保公司 */  
358 -function submitForm() { 197 +/** 提交通过分配转办人员 */
  198 +function submitTransfer() {
359 const data = { 199 const data = {
360 - associationapprove: companyForm.value.associationapprove,  
361 - deptId: companyForm.value.deptId.toString(), 200 + username: transferForm.value.username,
362 }; 201 };
363 - const taskId = companyForm.value.taskId;  
364 - disposeUser(data, taskId).then((res) => {  
365 - companyShow.value = true; 202 + const taskId = transferForm.value.taskId;
  203 + transfer(data, taskId).then((res) => {
  204 + transferShow.value = false;
  205 + getList();
366 proxy.$modal.msgSuccess("保单已分配成功"); 206 proxy.$modal.msgSuccess("保单已分配成功");
367 }); 207 });
368 } 208 }
369 -  
370 -const getMsg = (val) => {  
371 - clearTimeout(timerReason.value);  
372 - timerReason.value = setTimeout(() => {  
373 - deprecatedForm.value.deprecatedReaso = val;  
374 - }, 1000); 209 +const handleUpdate = (row) => {
  210 + reset();
  211 + form.value = row;
  212 + // isCustom.value = data.isCustomizeBrandAndModel == "0";
  213 + open.value = true;
375 }; 214 };
376 -  
377 getList(); 215 getList();
378 </script> 216 </script>
379 217
@@ -98,27 +98,53 @@ @@ -98,27 +98,53 @@
98 <el-table-column label="序号" type="index" width="55" /> 98 <el-table-column label="序号" type="index" width="55" />
99 <el-table-column 99 <el-table-column
100 label="登记时间" 100 label="登记时间"
101 - prop="initialRegistrationTime" 101 + prop="createTime"
  102 + width="160"
  103 + align="center"
  104 + />
  105 + <el-table-column
  106 + label="车牌号"
  107 + prop="licensePlateNumber"
102 width="150" 108 width="150"
  109 + align="center"
  110 + />
  111 + <el-table-column
  112 + label="车架号"
  113 + prop="frameNumber"
  114 + width="240"
  115 + align="center"
  116 + />
  117 + <el-table-column
  118 + label="车主姓名"
  119 + prop="name"
  120 + width="100"
  121 + align="center"
  122 + />
  123 + <el-table-column
  124 + label="联系电话"
  125 + prop="phone"
  126 + width="180"
  127 + align="center"
103 /> 128 />
104 - <el-table-column label="车牌号" prop="licensePlateNumber" width="150" />  
105 - <el-table-column label="车架号" prop="frameNumber" width="240" />  
106 - <el-table-column label="车主姓名" prop="name" width="100" />  
107 - <el-table-column label="联系电话" prop="phone" width="180" />  
108 <el-table-column 129 <el-table-column
109 label="分配机制" 130 label="分配机制"
110 width="120" 131 width="120"
111 prop="distributionMechanism" 132 prop="distributionMechanism"
112 /> 133 />
113 - <el-table-column label="承保公司" prop="companyName" width="150" />  
114 - <el-table-column label="操作人员" width="150"> 134 + <el-table-column
  135 + label="承保公司"
  136 + prop="companyName"
  137 + width="180"
  138 + align="center"
  139 + />
  140 + <el-table-column label="操作人员" width="150" align="center">
115 <template #default="{ row }"> 141 <template #default="{ row }">
116 <span>{{ 142 <span>{{
117 row.associationEmployeeUserName || row.companyEmployeeUserName 143 row.associationEmployeeUserName || row.companyEmployeeUserName
118 }}</span> 144 }}</span>
119 </template> 145 </template>
120 </el-table-column> 146 </el-table-column>
121 - <el-table-column label="操作时间" width="170"> 147 + <el-table-column label="操作时间" width="160" align="center">
122 <template #default="{ row }"> 148 <template #default="{ row }">
123 <span>{{ 149 <span>{{
124 row.companyEmployeeUndertakeTime || row.distributionTime 150 row.companyEmployeeUndertakeTime || row.distributionTime
@@ -128,11 +154,16 @@ @@ -128,11 +154,16 @@
128 154
129 <el-table-column 155 <el-table-column
130 label="办理人" 156 label="办理人"
131 - prop="handler" 157 + prop="companyEmployeeUserName"
132 width="100" 158 width="100"
133 align="center" 159 align="center"
134 /> 160 />
135 - <el-table-column label="保单进度" width="100" prop="orderProgress" /> 161 + <el-table-column
  162 + label="保单进度"
  163 + width="100"
  164 + prop="orderProgress"
  165 + align="center"
  166 + />
136 </el-table> 167 </el-table>
137 168
138 <pagination 169 <pagination
@@ -168,6 +199,22 @@ @@ -168,6 +199,22 @@
168 </el-row> 199 </el-row>
169 <el-row> 200 <el-row>
170 <el-col :span="12"> 201 <el-col :span="12">
  202 + <el-form-item label="发动机号" prop="engineNumber">
  203 + <el-input v-model="form.engineNumber" placeholder="无" disabled />
  204 + </el-form-item>
  205 + </el-col>
  206 + <el-col :span="12">
  207 + <el-form-item label="排放毫升量" prop="emissions">
  208 + <el-input
  209 + v-model="form.emissions"
  210 + disabled
  211 + placeholder="请输入车架号"
  212 + />
  213 + </el-form-item>
  214 + </el-col>
  215 + </el-row>
  216 + <el-row>
  217 + <el-col :span="12">
171 <el-form-item label="车主姓名" prop="name"> 218 <el-form-item label="车主姓名" prop="name">
172 <el-input 219 <el-input
173 v-model="form.name" 220 v-model="form.name"
@@ -188,9 +235,9 @@ @@ -188,9 +235,9 @@
188 </el-row> 235 </el-row>
189 <el-row> 236 <el-row>
190 <el-col :span="12"> 237 <el-col :span="12">
191 - <el-form-item label="登记时间" prop="initialRegistrationTime"> 238 + <el-form-item label="登记时间" prop="createTime">
192 <el-input 239 <el-input
193 - v-model="form.initialRegistrationTime" 240 + v-model="form.createTime"
194 disabled 241 disabled
195 placeholder="请输入登记时间" 242 placeholder="请输入登记时间"
196 /> 243 />
@@ -208,25 +255,17 @@ @@ -208,25 +255,17 @@
208 </el-row> 255 </el-row>
209 <el-row> 256 <el-row>
210 <el-col :span="12"> 257 <el-col :span="12">
211 - <el-form-item label="操作时间" prop="authTime"> 258 + <el-form-item label="核定载质量" prop="passengerCapacity">
212 <el-input 259 <el-input
213 - v-model="form.authTime" 260 + v-model="form.passengerCapacity"
214 disabled 261 disabled
215 - :placeholder="  
216 - form.companyEmployeeUndertakeTime || form.distributionTime  
217 - " 262 + placeholder="无"
218 /> 263 />
219 </el-form-item> 264 </el-form-item>
220 </el-col> 265 </el-col>
221 <el-col :span="12"> 266 <el-col :span="12">
222 - <el-form-item label="操作人员" prop="editAuth">  
223 - <el-input  
224 - disabled  
225 - :placeholder="  
226 - form.associationEmployeeUserName ||  
227 - form.companyEmployeeUserName  
228 - "  
229 - /> 267 + <el-form-item label="核定载人数" prop="passengersNumber">
  268 + <el-input v-model="form.passengersNumber" disabled />
230 </el-form-item> 269 </el-form-item>
231 </el-col> 270 </el-col>
232 </el-row> 271 </el-row>
@@ -236,27 +275,65 @@ @@ -236,27 +275,65 @@
236 <el-input 275 <el-input
237 v-model="form.distributionMechanism" 276 v-model="form.distributionMechanism"
238 disabled 277 disabled
239 - placeholder="请输入登记时间" 278 + placeholder=""
240 /> 279 />
241 </el-form-item> 280 </el-form-item>
242 </el-col> 281 </el-col>
243 <el-col :span="12"> 282 <el-col :span="12">
244 <el-form-item label="承保公司" prop="companyName"> 283 <el-form-item label="承保公司" prop="companyName">
  284 + <el-input v-model="form.companyName" disabled placeholder="无" />
  285 + </el-form-item>
  286 + </el-col>
  287 + </el-row>
  288 + <el-row>
  289 + <el-col :span="12">
  290 + <el-form-item label="车辆品牌" prop="vehicleBrand">
245 <el-input 291 <el-input
246 - v-model="form.companyName" 292 + v-model="form.vehicleBrand"
247 disabled 293 disabled
248 - placeholder="请输入承保公司" 294 + placeholder="车辆品牌"
249 /> 295 />
250 </el-form-item> 296 </el-form-item>
251 </el-col> 297 </el-col>
  298 + <el-col :span="12">
  299 + <el-form-item label="车辆型号" prop="vehicleModel">
  300 + <el-input v-model="form.vehicleModel" disabled placeholder="无" />
  301 + </el-form-item>
  302 + </el-col>
  303 + </el-row>
  304 + <el-row>
  305 + <el-col :span="12">
  306 + <el-form-item label="保险需求" prop="requirements">
  307 + <el-input v-model="form.requirements" disabled placeholder="无" />
  308 + </el-form-item>
  309 + </el-col>
  310 + <el-col :span="12">
  311 + <el-form-item label="号牌种类" prop="lincensePlateType">
  312 + <el-input
  313 + v-model="form.lincensePlateType"
  314 + disabled
  315 + placeholder="无"
  316 + />
  317 + </el-form-item>
  318 + </el-col>
  319 + </el-row>
  320 + <el-row>
  321 + <el-col :span="12">
  322 + <el-form-item label="使用性质" prop="vehicleNature">
  323 + <el-input
  324 + v-model="form.vehicleNature"
  325 + disabled
  326 + placeholder="无"
  327 + />
  328 + </el-form-item>
  329 + </el-col>
  330 + <el-col :span="12">
  331 + <el-form-item label="车辆类型" prop="vehicleType">
  332 + <el-input v-model="form.vehicleType" disabled placeholder="无" />
  333 + </el-form-item>
  334 + </el-col>
252 </el-row> 335 </el-row>
253 </el-form> 336 </el-form>
254 - <template #footer>  
255 - <div class="dialog-footer">  
256 - <el-button @click="open = false">取消</el-button>  
257 - <el-button type="primary" @click="open = false">确定</el-button>  
258 - </div>  
259 - </template>  
260 </el-dialog> 337 </el-dialog>
261 </div> 338 </div>
262 </template> 339 </template>
@@ -150,6 +150,7 @@ @@ -150,6 +150,7 @@
150 </el-table-column> 150 </el-table-column>
151 </el-table> 151 </el-table>
152 152
  153 + <!-- 页码 -->
153 <pagination 154 <pagination
154 v-show="total > 0" 155 v-show="total > 0"
155 :total="total" 156 :total="total"
@@ -227,6 +228,7 @@ @@ -227,6 +228,7 @@
227 >{{ item.userName }}</el-radio 228 >{{ item.userName }}</el-radio
228 > 229 >
229 </el-radio-group> 230 </el-radio-group>
  231 + <div v-show="transferOptions.length === 0">暂无其他员工</div>
230 </div> 232 </div>
231 <template #footer> 233 <template #footer>
232 <div class="dialog-footer"> 234 <div class="dialog-footer">
@@ -244,7 +246,14 @@ @@ -244,7 +246,14 @@
244 append-to-body 246 append-to-body
245 > 247 >
246 <el-form :model="FeedbackForm" ref="policyRef" label-width="100px"> 248 <el-form :model="FeedbackForm" ref="policyRef" label-width="100px">
247 - <el-form-item label="保单回馈" prop="progress"> 249 + <el-form-item label="商险单号" prop="progress">
  250 + <el-input
  251 + v-model="FeedbackForm.shoppolicynumber"
  252 + placeholder="请输入保单号"
  253 + :disabled="hasRole"
  254 + />
  255 + </el-form-item>
  256 + <el-form-item label="交强险单号" prop="progress">
248 <el-input 257 <el-input
249 v-model="FeedbackForm.policynumber" 258 v-model="FeedbackForm.policynumber"
250 placeholder="请输入保单号" 259 placeholder="请输入保单号"
@@ -488,7 +497,11 @@ const form = ref({}); @@ -488,7 +497,11 @@ const form = ref({});
488 const showFeedback = ref(false); 497 const showFeedback = ref(false);
489 const transferShow = ref(false); 498 const transferShow = ref(false);
490 const transferForm = ref({}); 499 const transferForm = ref({});
491 -const FeedbackForm = ref({}); 500 +const FeedbackForm = ref({
  501 + shoppolicynumber: "",
  502 + policynumber: "",
  503 + message: "",
  504 +});
492 const getParams = reactive({ 505 const getParams = reactive({
493 pageNum: 1, 506 pageNum: 1,
494 pageSize: 100, 507 pageSize: 100,