Bläddra i källkod

Merge branch 'test' of http://39.101.143.165:8090/dong_k/operation-Backend into DK-dev

@dongkboy 1 år sedan
förälder
incheckning
7156aa964e

+ 0 - 1
.env.development

@@ -11,7 +11,6 @@ VITE_APP_API_BASEURL = http://192.168.0.253:8001  #田智
 VITE_APP_DEBUG_TOOL =
 # 是否禁用开发者工具,可防止被调试
 VITE_APP_DISABLE_DEVTOOL = false
-
 # 是否开启代理
 VITE_OPEN_PROXY = false
 # 是否开启开发者工具

+ 17 - 5
src/api/modules/product.ts

@@ -2,17 +2,29 @@ import { ApiInstance } from '../type'
 import * as Types from '../types/productTypes';
 const product = (axiosInstance: ApiInstance) => ({
   //保存驾意险配置
-  jyxConfigAdd: (data: Types.jyxConfigRequest) => axiosInstance.post('/jyxConfig/saveAll', data),
+  jyxConfigAdd: (data: Types.jyxConfigRequest) => axiosInstance.post('jyxConfig/saveAll', data),
   //查询主险
-  selectMainInsurance: (company:string ) => axiosInstance.get(`/jyxConfig/selectMainInsurance?company=${company}`),
+  selectMainInsurance: (company:string ) => axiosInstance.get(`jyxConfig/selectMainInsurance?company=${company}`),
   //查询驾意险列表
-  jyxList: (data: Types.jyxListRequest) => axiosInstance.post('/jyxConfig/jyxList', data),
+  jyxList: (data: Types.jyxListRequest) => axiosInstance.post('jyxConfig/jyxList', data),
   //详情
-  jygetById: (id:string ) => axiosInstance.get(`/jyxConfig/getById?id=${id}`),
+  jygetById: (id:string ) => axiosInstance.get(`jyxConfig/getById?id=${id}`),
   //驾意险修改
   jyxupdateById: (data: Types.jyxConfigRequest) => axiosInstance.post('/jyxConfig/updateById', data),
   //删除
-  deleteById: (id:string ) => axiosInstance.get(`/jyxConfig/deleteById?id=${id}`),
+  deleteById: (id:string ) => axiosInstance.get(`jyxConfig/deleteById?id=${id}`),
+  //添加特别约定
+  addClause: (data: Types.addClauseRequest) => axiosInstance.post('manager/clause/addClause', data),
+  //修改特别约定
+  updateClause: (data: Types.addClauseRequest) => axiosInstance.post('manager/clause/updateClause', data),
+  //特别约定列表查询
+  getClausePage: (data: Types.pageRequest) => axiosInstance.post('manager/clause/getClausePage', data),
+  //特别约定查询
+  getClause: (data: Types.pageRequest) => axiosInstance.post('manager/clause/getClause', data),
+
+  //特约删除
+  deleteClause: (data:string[]) => axiosInstance.post('manager/clause/deleteClause', data),
+
 })
 
 export default product

+ 128 - 0
src/api/types/productTypes.ts

@@ -168,3 +168,131 @@ export type jyxListRequest = {
   size?: number;
   [property: string]: any;
 }
+
+/**
+ * InsCompanyClause,特约条款
+ */
+export type addClauseRequest = {
+  /**
+   * 条款code
+   */
+  clauseCode?: string;
+  /**
+   * 条款内容
+   */
+  clauseContent?: string;
+  /**
+   * 条款名称
+   */
+  clauseName?: string;
+  /**
+   * 客户端状态
+   */
+  clientStatus?: string;
+  /**
+   * 保险公司id
+   */
+  companyId?: string;
+  /**
+   * 创建人
+   */
+  createBy?: string;
+  /**
+   * 创建时间
+   */
+  createTime?: Date;
+  /**
+   * 主键
+   */
+  id?: string;
+  /**
+   * 是否删除
+   */
+  isDelete?: number;
+  /**
+   * 是否编辑
+   */
+  isEdit?: string;
+  /**
+   * 险种code
+   */
+  riskCode?: string;
+  /**
+   * 修改人
+   */
+  updateBy?: string;
+  /**
+   * 修改时间
+   */
+  updateTime?: Date;
+  [property: string]: any;
+}
+
+/**
+ * CompanyClauseVo
+ */
+export type pageRequest = {
+  /**
+   * 条款内容
+   */
+  clauseContent?: string;
+  /**
+   * 条款名称
+   */
+  clauseName?: string;
+  /**
+   * 保险公司id
+   */
+  companyId?: string;
+  page?: Page;
+  pages?: number;
+  /**
+   * 险种信息
+   */
+  riskCode?: string;
+  size?: number;
+  [property: string]: any;
+}
+/**
+ * Page
+ */
+export type Page = {
+  countId?: string;
+  current?: number;
+  maxLimit?: number;
+  optimizeCountSql?: PageObject;
+  optimizeJoinOfCountSql?: boolean;
+  orders?: OrderItem[];
+  pages?: number;
+  records?: { [key: string]: any }[];
+  searchCount?: PageObject;
+  size?: number;
+  total?: number;
+  [property: string]: any;
+}
+/**
+ * PageObject
+ */
+export type PageObject = {
+  countId?: string;
+  current?: number;
+  maxLimit?: number;
+  optimizeCountSql?: PageObject;
+  optimizeJoinOfCountSql?: boolean;
+  orders?: OrderItem[];
+  pages?: number;
+  records?: { [key: string]: any }[];
+  searchCount?: PageObject;
+  size?: number;
+  total?: number;
+  [property: string]: any;
+}
+
+/**
+* OrderItem
+*/
+export type OrderItem = {
+  asc?: boolean;
+  column?: string;
+  [property: string]: any;
+}

+ 39 - 4
src/assets/styles/globals.css

@@ -154,15 +154,21 @@ textarea {
 
 /* 全局样式覆盖 */
 .bg-\[var\(--g-sub-sidebar-menu-active-bg\)\]\! {
-  background: var(--g-sub-sidebar-menu-active-bg) /* var(--g-sub-sidebar-menu-active-bg) */ !important;
+  background:
+    var(--g-sub-sidebar-menu-active-bg)
+    /* var(--g-sub-sidebar-menu-active-bg) */ !important;
 }
 
 .bg-\[var\(--g-header-menu-active-bg\)\]\! {
-  background-color: #ffffff1a /* var(--g-header-menu-active-bg) */ !important;
+  background-color:
+    #ffffff1a
+    /* var(--g-header-menu-active-bg) */ !important;
 }
 
 .text-\[var\(--g-header-menu-active-color\)\]\! {
-  color: #fff /* var(--g-header-menu-active-color) */ !important;
+  color:
+    #fff
+    /* var(--g-header-menu-active-color) */ !important;
 }
 
 .sub-menu {
@@ -204,6 +210,33 @@ textarea {
 
 /* 消息提示弹窗 */
 
+/* dialog对话框样式 */
+.el-dialog {
+  padding: 0;
+}
+
+.el-dialog__header {
+  padding: 13px;
+  text-align: center;
+  border-bottom: 1px solid #eee;
+}
+
+.el-dialog__header .el-dialog__title {
+  font-weight: bold;
+  color: #333;
+}
+
+.el-dialog__body {
+  padding: 24px;
+}
+
+.el-dialog__footer {
+  padding: 13px 24px;
+  border-top: 1px solid #eee;
+}
+
+/* dialog对话框样式 */
+
 /* 全局样式覆盖 */
 
 /* 自定义全局样式 */
@@ -294,7 +327,9 @@ textarea {
 }
 
 .elementSpacing > * {
-  margin-bottom: 5px; /* 下边距 */
+  margin-bottom: 5px;
+
+  /* 下边距 */
 }
 
 .size14 {

+ 11 - 3
src/components/Table/index.vue

@@ -67,9 +67,15 @@
             </el-tag>
             <ImagePreview v-else-if="column.component === 'Image'" :src="getImgTo(scope.row, column)" width="50px"
               height="50px"></ImagePreview>
-            <span v-else>
-              {{ getDisplayText(scope.row, column) }}
-            </span>
+            <div v-else>
+              <div v-if="getDisplayText(scope.row, column).includes('\n')" class="flex f-c ">
+                  <span v-for="(line, index) in getDisplayText(scope.row, column).split('\n')" :key="index">{{ line
+                  }}</span>
+              </div>
+              <span v-else>
+                {{ getDisplayText(scope.row, column) }}
+              </span>
+            </div>
           </template>
         </el-table-column>
         <el-table-column label="操作" fixed="right" :width="props.columnwidth" align="center">
@@ -171,6 +177,7 @@ const handleSizeChange = (val: number) => {
 //多选
 
 const selectAllChange = (value: any[]) => {
+  newSelectionList.value = [];
   if (value.length > 0) {
     value.map(val => {
       newSelectionList.value.push(val.id)
@@ -182,6 +189,7 @@ const selectAllChange = (value: any[]) => {
 
 }
 const selectionChange = (value: any[]) => {
+  newSelectionList.value = [];
   if (value.length > 0) {
     value.map(val => {
       newSelectionList.value.push(val.id)

+ 2 - 0
src/router/modules/insuranceCompany.ts

@@ -26,6 +26,7 @@ const routes: RouteRecordRaw = {
       component: () => import('@/views/insuranceCompanyConfiguration/paymentCodeConfig.vue'),
       meta: {
         title: '支付码配置',
+        auth: ['paymentCodeConfig.add', 'paymentCodeConfig.view', 'paymentCodeConfig.delete', 'paymentCodeConfig.edit']
       },
     },
     {
@@ -34,6 +35,7 @@ const routes: RouteRecordRaw = {
       component: () => import('@/views/insuranceCompanyConfiguration/accountOwnershipConfig.vue'),
       meta: {
         title: '账号归属配置',
+        auth: ['accountOwnershipConfig.add', 'accountOwnershipConfig.view', 'accountOwnershipConfig.delete', 'accountOwnershipConfig.edit']
       },
     },
   ],

+ 27 - 4
src/router/modules/product.ts

@@ -12,7 +12,7 @@ const routes: RouteRecordRaw = {
   },
   children: [
     {
-      path: 'index',
+      path: 'drivingInsuranceindex',
       name: 'DrivingInsuranceIndex',
       redirect: '/productConfiguration/drivingInsurance/index',
       meta: {
@@ -22,7 +22,7 @@ const routes: RouteRecordRaw = {
       children: [
         {
           path: '',
-          component: () => import('@/views/productConfiguration/drivingInsurance/index.vue'),
+          component: () => import('@/views/productConfiguration/drivingInsurance/drivingInsuranceindex.vue'),
           meta: {
             title: '驾意险配置',
             menu: false,
@@ -42,13 +42,36 @@ const routes: RouteRecordRaw = {
       ],
     },
 
+
     {
-      path: '/productConfiguration/specialClause/index',
+      path: 'specialClauseindex',
       name: 'SpecialClauseIndex',
-      component: () => import('@/views/productConfiguration/specialClause/index.vue'),
+      redirect: '/productConfiguration/specialClause/specialClauseindex',
       meta: {
         title: '特约管理',
+        auth: ['specialClause.add', 'specialClause.view', 'specialClause.delete', 'specialClause.edit']
       },
+      children: [
+        {
+          path: '',
+          component: () => import('@/views/productConfiguration/specialClause/specialClauseindex.vue'),
+          meta: {
+            title: '特约管理',
+            menu: false,
+            breadcrumb: false,
+          },
+        },
+        {
+          path: 'specialClauseAdd',
+          name: 'SpecialClauseAdd',
+          component: () => import('@/views/productConfiguration/specialClause/specialClauseAdd.vue'),
+          meta: {
+            title: '特约添加',
+            menu: false,
+            activeMenu: '/productConfiguration/specialClause/specialClauseindex',
+          },
+        },
+      ]
     },
   ],
 }

+ 8 - 9
src/views/insuranceCompanyConfiguration/accountOwnershipConfig.vue

@@ -4,11 +4,11 @@
       <ElRow :gutter="20" style="height: 100%;">
         <ElCol :md="4">
           <div class="flex f-c " style="height: 100%;">
-            <ElFormItem>
+            <ElFormItem >
               <ElInput v-model="companyName" placeholder="输入保险公司名称查找" type="text" tabindex="1" clearable
                 style="width: 100%;" @clear="companyQuery">
-                <template #append>
-                  <el-button :icon="Search" @click="companyQuery" v-auth="'drivingInsurance.add'" />
+                <template #append >
+                  <el-button :icon="Search" @click="companyQuery" v-auth="'accountOwnershipConfig.view'"  />
                 </template>
               </ElInput>
             </ElFormItem>
@@ -25,7 +25,7 @@
         </ElCol>
         <ElCol :md="19">
           <ElCol :md="24" :lg="24" :offset="23" v-if="companyactiveID">
-            <el-button type="primary" @click="parametervalidate(productFormRef)">保存</el-button>
+            <el-button type="primary" v-auth="'accountOwnershipConfig.add'" @click="parametervalidate(productFormRef)">保存</el-button>
           </ElCol>
           <ElCol :md="24" :lg="24">
             <el-tabs v-model="editableTabsValue" type="card" editable class="demo-tabs" @edit="handleTabsEdit"
@@ -94,7 +94,7 @@
                 <ElDivider style="margin: 0;"></ElDivider>
                 <ElCol :md="24" :lg="24" style="margin: 10px 0;font-size: 14px;">
                   <span class="strong" style="margin-right: 10px;">基本信息</span>
-                  <el-button type="primary" @click="addParameter(index)">
+                  <el-button type="primary" @click="addParameter(index)" v-auth="'accountOwnershipConfig.add'">
                     <template #icon>
                       <ElIcon>
                         <plus />
@@ -121,18 +121,17 @@
                   <el-table-column prop="value" label="默认数据" width="180" align="center"></el-table-column>
                   <el-table-column label="操作" width="280" align="center">
                     <template #default="scope">
-                      <el-button type="primary" link @click="fieldsDel(scope.$index, index)">删除</el-button>
+                      <Auth :value="'accountOwnershipConfig.delete'">
+                        <el-button type="primary" link @click="fieldsDel(scope.$index, index)">删除</el-button>
+                      </Auth>
                     </template>
                   </el-table-column>
                 </el-table>
               </el-tab-pane>
             </el-tabs>
           </ElCol>
-
-
         </ElCol>
       </ElRow>
-
     </PageMain>
     <el-drawer v-model="fieldsAddDrawer" :direction="direction" @open="DrawerOpen">
       <template #header>

+ 137 - 26
src/views/insuranceCompanyConfiguration/insuranceCompanyConfig.vue

@@ -7,7 +7,11 @@
           <el-input v-model="formInline.name" placeholder="输入保险公司查找" clearable />
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" @click="companyQuery" v-auth="'insuranceCompanyConfig.view'">查询</el-button>
+          <el-button type="primary" @click="companyQuery" v-auth="'insuranceCompanyConfig.view'">
+            <template #icon>
+              <SvgIcon name="i-ep:search" />
+            </template>
+            查询</el-button>
         </el-form-item>
       </el-form>
       <div>
@@ -25,7 +29,8 @@
                 ref="multipleTableRef" :expand-column-key="expandColumnKey" header-class="header-class">
                 <template #cell="scope">
                   <div v-if="scope.column.key == 'option'" class="flex j-s a-c">
-                    <el-button type="primary" link @click="addSubsidiary(scope.rowData)" v-auth="'insuranceCompanyConfig.add'"> 添加子公司
+                    <el-button type="primary" link @click="addSubsidiary(scope.rowData)"
+                      v-auth="'insuranceCompanyConfig.add'"> 添加子公司
                     </el-button>
                     <el-dropdown placement="bottom-start">
                       <span class="el-dropdown-link">
@@ -97,13 +102,38 @@
           </ElCol>
           <ElCol :md="24" :lg="12" v-if="dialogType == 'add' || dialogType == 'edit'">
             <el-form-item label="logo">
-              <el-upload action="#" list-type="picture-card" :auto-upload="false" :on-change="sysIconupload"
-                ref="upload1" :limit="1" :class="{ disabled: uploadDisabled }" :on-remove="handleRemove">
-                <img v-if="sysIconList.url" :src="sysIconList.url" class="avatar" style="width: 100%;height: 100%;" />
-                <el-icon v-else class="avatar-uploader-icon">
-                  <Plus />
-                </el-icon>
-              </el-upload>
+              <div class="flex f-c a-start">
+                <el-upload action="" v-if="!companyImgUrl" :auto-upload="false" :show-file-list="false"
+                  accept=".png, .jpg, .jpeg" @change="uploadImage($event)">
+                  <el-button type="primary" size="default">
+                    <template #icon>
+                      <el-icon>
+                        <Upload />
+                      </el-icon>
+                    </template>
+                    上传</el-button>
+                </el-upload>
+                <div class="fileInfo" v-else>
+                  <div class="fileName">{{ companyImgName }}</div>
+                  <div class="fileBtn">
+                    <el-upload :show-file-list="false" :auto-upload="false" accept=".png, .jpg, .jpeg"
+                      @change="uploadImage($event)" style="display: flex; align-items: center;">
+                      <el-icon class="btn-icon">
+                        <Upload />
+                      </el-icon>
+                    </el-upload>
+                    <el-icon class="btn-icon" @click="imageView">
+                      <View />
+                    </el-icon>
+                    <el-icon class="btn-icon" @click="download(companyImgUrl,companyImgName)">
+                      <Download />
+                    </el-icon>
+                    <el-icon class="btn-icon" @click="deleteImage">
+                      <Delete />
+                    </el-icon>
+                  </div>
+                </div>
+              </div>
             </el-form-item>
           </ElCol>
         </el-form>
@@ -117,6 +147,9 @@
         </div>
       </template>
     </el-dialog>
+    <div class="image-view" v-if="imageShow" @click="imageShow = false">
+      <img :src="companyImgUrl" />
+    </div>
   </div>
 </template>
 
@@ -190,9 +223,7 @@ const cpmpanyformRules = ref<FormRules>({
     { required: true, trigger: 'change', message: '请上传图片' },
   ],
 });
-const sysIconList = reactive({
-  url: "",
-})
+
 const props = {
   expandTrigger: 'hover' as const,
   value: 'areaCode',
@@ -201,6 +232,9 @@ const props = {
   checkStrictly: true,
 
 }
+const imageShow=ref(false);//图片预览开关
+const companyImgName = ref();
+const companyImgUrl = ref();
 const FormRef = ref<FormInstance>()
 const provinceoptions = ref()//省市区回显数据
 const areaOptions = ref()//省市区数据
@@ -208,7 +242,6 @@ const dialogTitle = ref('添加保险公司')//弹窗title
 const dialogType = ref('add')//弹窗title  add | edit | subsidiaryadd | subsidiaryedit
 const fromSize = ref<ComponentSize>('large')//表单大小
 const loading = ref(false)
-const uploadDisabled = ref(false)//图片回显去掉上传按键
 const tableHeight = ref(''); // 初始化表格高度
 const multipleTableRef = ref();
 const tabledata = ref([]);//树形数据
@@ -236,8 +269,7 @@ const columns: Column[] = [
       } else if (type == 0) {
         return <ElTag>渠道</ElTag>;
       } else {
-        return <ElTag>{type}</ElTag>;
-
+        return <ElTag>寿险</ElTag>;
       }
     }
   },
@@ -341,8 +373,9 @@ const companyEdit = (column: any) => {
     cpmpanyform.nameSimple = column.nameSimple;
     cpmpanyform.remark = column.remark;
     cpmpanyform.type = column.type;
-    cpmpanyform.logo = column.logo;
-    sysIconList.url = column.downloadUrl;
+    cpmpanyform.logo = column.logoFile.id;
+    companyImgUrl.value=column.downloadUrl
+    companyImgName.value=column.logoFile.fileName;
   } else {
     dialogType.value = 'subsidiaryedit';
     dialogTitle.value = '编辑';
@@ -355,7 +388,6 @@ const companyEdit = (column: any) => {
     cpmpanyform.parentId = column.parentId;
     cpmpanyform.parentName = column.parentName;
     cpmpanyform.remark = column.remark;
-    sysIconList.url = column.downloadUrl;
   }
 
   // (Object.keys(cpmpanyform) as (keyof typeof cpmpanyform)[]).forEach((key) => {
@@ -434,21 +466,47 @@ const saveInfo = async (formEl: FormInstance | undefined) => {
     }
   })
 }
-const sysIconupload = (file: any) => {
-  let files = file.raw;
+
+const uploadImage = async (file: any) => {
+  let files = file.raw
   const params = new FormData(); // 声明formData数据类型
   params.append("file", files);
   api.toolApi.fileupload(params).then((res: any) => {
     if (res.code == 200) {
       cpmpanyform.logo = res.data.id;
-      uploadDisabled.value = true;
+      companyImgName.value = res.data.fileName;
+      companyImgUrl.value = res.data.downloadUrl;
     }
   })
 }
-const handleRemove = () => {
-  sysIconList.url = '';
-  uploadDisabled.value = false;
-
+// 图片预览
+const imageView = () => {
+  imageShow.value=true;
+}
+// 图片下载
+const download = (url:string, name:string) => {
+  let image = new Image();
+  // 解决跨域 Canvas 污染问题
+  image.setAttribute("crossOrigin", "anonymous");
+  image.onload = function () {
+    let canvas = document.createElement("canvas");
+    canvas.width = image.width;
+    canvas.height = image.height;
+    let context: any = canvas.getContext("2d");
+    context.drawImage(image, 0, 0, image.width, image.height);
+    let url = canvas.toDataURL("image/png"); //得到图片的base64编码数据
+    let a = document.createElement("a"); // 生成一个a元素
+    let event = new MouseEvent("click"); // 创建一个单击事件
+    a.download = name; // 设置图片名称
+    a.href = url; // 将生成的URL设置为a.href属性
+    a.dispatchEvent(event); // 触发a的单击事件
+  }
+  image.src = url
+}
+// 图片删除
+const deleteImage = () => {
+  companyImgName.value = ''
+  companyImgUrl.value = ''
 }
 const close = () => {
   cpmpanyform.code = '';
@@ -460,7 +518,6 @@ const close = () => {
   cpmpanyform.type = '';
   cpmpanyform.logo = '';
   provinceoptions.value = [];
-  sysIconList.url = '';
 }
 </script>
 <style scoped lang="scss">
@@ -500,5 +557,59 @@ const close = () => {
 .disabled :deep(.el-upload--picture-card) {
   opacity: 0;
 }
+
+.fileInfo {
+  display: flex;
+  align-items: center;
+  justify-content: flex-start;
+  padding: 2px 20px;
+  margin: 0 10px;
+  border-radius: 5px;
+
+  &:hover {
+    background: #ccc;
+  }
+
+  .fileName {
+    width: 200px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+
+  .fileBtn {
+    display: flex;
+    align-items: center;
+
+    .btn-icon {
+      margin: 0 10px;
+      font-size: 16px;
+      cursor: pointer;
+
+      &:hover {
+        color: #00a0f4;
+      }
+    }
+  }
+}
+
+.image-view {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 9999;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 100%;
+  height: 100%;
+  background: rgb(0 0 0 / 60%);
+
+  img {
+    width: 800px;
+    height: 800px;
+    border-radius: 5px;
+  }
+}
 </style>
 <!-- 样式区域 -->

+ 15 - 8
src/views/insuranceCompanyConfiguration/paymentCodeConfig.vue

@@ -9,7 +9,11 @@
             </ElFormItem>
           </ElCol>
           <ElCol :md="4">
-            <el-button type="primary" @click="findpage">查询</el-button>
+            <el-button type="primary" v-auth="'paymentCodeConfig.view'" @click="findpage">
+              <template #icon>
+                <SvgIcon name="i-ep:search" />
+              </template>
+              查询</el-button>
           </ElCol>
         </ElRow>
       </ElForm>
@@ -17,7 +21,7 @@
       <Table :tableData="tableData" :columns="columns" :showIndex="false" :columnwidth="200" :showSelect="false"
         :pageInfo="pageInfo" @getList="getList">
         <template v-slot:table-title-btn>
-          <el-button type="primary" @click="companyAdd">
+          <el-button type="primary" @click="companyAdd" v-auth="'paymentCodeConfig.add'">
             添加保险公司
             <template #icon>
               <el-icon>
@@ -27,17 +31,20 @@
           </el-button>
         </template>
         <template v-slot:operation="scope">
-          <el-button type="primary" link @click="paymentEdit(scope.operationData.id)"> 编辑
-          </el-button>
-          <el-button type="primary" link @click="paymentDel(scope.operationData.id)"> 删除
-          </el-button>
+          <Auth :value="'paymentCodeConfig.edit'">
+            <el-button type="primary" link @click="paymentEdit(scope.operationData.id)"> 编辑
+            </el-button>
+          </Auth>
+          <Auth :value="'paymentCodeConfig.delete'">
+            <el-button type="primary" link @click="paymentDel(scope.operationData.id)"> 删除
+            </el-button>
+          </Auth>
         </template>
         <template v-slot:search="scope">
           {{ scope.slotData.label }}
         </template>
       </Table>
     </PageMain>
-
     <el-dialog v-model="paynemtAdddialogVisible" :title="dialogTitle" width="40%" @close="close">
       <ElRow :gutter="20">
         <el-form :model="paymentform" :inline="true" label-width="120px" :rules="memberformRules" label-position="top"
@@ -52,7 +59,7 @@
           </ElCol>
           <ElCol :md="24" :lg="12">
             <el-form-item label="简称" prop="companyName">
-              <el-input v-model="paymentform.companyName" placeholder="请输入姓名" disabled />
+              <el-input v-model="paymentform.companyName" placeholder="" disabled />
             </el-form-item>
           </ElCol>
           <ElCol :md="24" :lg="12">

+ 6 - 5
src/views/organizationManagement/organization/organizationAdd.vue

@@ -9,7 +9,7 @@
           style="max-width: 1000px;" class="flex a-c f-wrap" :size="fromSize">
           <ElCol :md="24" :lg="12">
             <el-form-item label="编码" prop="sysCode">
-              <el-input v-model="sysform.sysCode" placeholder="请输入编码(唯一标识)" />
+              <el-input v-model="sysform.sysCode" placeholder="请输入编码(唯一标识)" :disabled="id?true:false" ></el-input>
               <span style="font-size: 0.7rem;color: #999;">可填写有字母数字组成的编码,用于用户登录</span>
             </el-form-item>
           </ElCol>
@@ -54,7 +54,7 @@
           </ElCol>
           <ElCol :md="24" :lg="12">
             <el-form-item label="详细地址" prop="address">
-              <el-input v-model="sysform.address" placeholder="请输入详细地址" />
+              <el-input v-model="sysform.address" type="textarea" placeholder="请输入详细地址" maxlength="50" show-word-limit />
             </el-form-item>
           </ElCol>
           <ElCol :md="24" :lg="12">
@@ -129,10 +129,10 @@
 
     </PageMain>
     <FixedActionBar>
-      <ElButton type="primary" size="large" @click="submitForm(ruleFormRef)">
+      <ElButton type="primary"  @click="submitForm(ruleFormRef)">
         保存
       </ElButton>
-      <ElButton size="large" @click="router.back()">
+      <ElButton  @click="router.back()">
         取消
       </ElButton>
     </FixedActionBar>
@@ -150,7 +150,7 @@ import { useRoute } from 'vue-router';
 import api from '@/api';
 import router from '@/router';
 const route = useRoute();
-const id = ref(route.query.id);//id参数
+const id = ref(route.query.id as string);//id参数
 const provinceoptions = ref()//省市区回显数据
 const areaOptions = ref()//省市区数据
 const uploadDisabled = ref(false)
@@ -283,6 +283,7 @@ const userAccountblur = (event: any) => {
       sysform.value.userName = res.data[0].username;
       userNameShow.value = true;
     } else {
+      userNameShow.value = false;
     }
   });
 

+ 16 - 19
src/views/organizationManagement/organization/organizationDetail.vue

@@ -75,7 +75,7 @@
                 {{ tenantInfo.contactJob }}
               </el-descriptions-item>
               <el-descriptions-item label="企业规模:">{{ tenantInfo.businessSize }}人</el-descriptions-item>
-              <el-descriptions-item label="法人代表">{{ tenantInfo.legalName }}</el-descriptions-item>
+              <el-descriptions-item label="法人代表">{{ tenantInfo.legalName }}</el-descriptions-item>
 
             </el-descriptions>
           </el-tab-pane>
@@ -136,6 +136,8 @@ import { ref, nextTick } from 'vue'
 import { useRoute, useRouter } from 'vue-router';
 import { ElMessage, ElMessageBox } from 'element-plus'
 import ImagePreview from '@/components/ImagePreview/index.vue';
+import { loadDicts, getDict } from '@/utils/composables/dictService';
+
 
 import api from '@/api';
 const route = useRoute();
@@ -149,6 +151,8 @@ const mainElement = ref<HTMLElement | null>(null);
 const containerLeftHeight = ref('0px');
 const dialogVisible = ref(false)
 onMounted(() => {
+  loadDicts(['exhibition_scope']);//获取多个字典
+
   activeName.value = typeName.value;
   nextTick(() => {
     if (mainElement.value) {
@@ -164,6 +168,10 @@ const columns = [
     prop: "exhibitionScope", label: "营业范围", width: '200', formatter: (row: any) => {
       let exhibitionScope = row.exhibitionScope;
       if (exhibitionScope) {
+        exhibitionScope=exhibitionScope.map((ele: any) => {
+          ele = getDict('exhibition_scope').find(val => val.value == ele).label;
+          return ele;
+        })
         let sysType = exhibitionScope.join(',');
         return sysType;
       }
@@ -236,24 +244,13 @@ const deptUpdate = (id: string) => {
 }
 // 添加子机构
 const addSubOrganization = (id: string) => {
-  api.dept.deptGet(id).then((res: any) => {
-    if (res.code == '200') {
-      router.push({
-        name: 'OrganizationDeptAdd',
-        query: {
-          parentId: res.data.parentId,
-          code: code.value,
-        }
-      })
-    } else {
-      ElMessage({
-        type: 'success',
-        message: res.msg,
-        plain: true,
-      })
+  router.push({
+    name: 'OrganizationDeptAdd',
+    query: {
+      parentId: id,
+      code: code.value,
     }
-  });
-
+  })
 }
 //删除租户
 const del = () => {
@@ -350,7 +347,7 @@ const detailQuery = () => {
 const getDeptTree = () => {
   api.dept.getDeptTree({ sysCode: code.value }).then((res: any) => {
     if (res.code == '200') {
-      tableData.value = res.data[0].children;
+      tableData.value = res.data;
     } else {
       ElMessage({
         type: 'success',

+ 16 - 12
src/views/organizationManagement/organization/organizationlist.vue

@@ -30,16 +30,19 @@
           <ElCol :md="6" :offset="10">
             <ElFormItem>
               <div class="flex j-end" style="width: 100%;">
-                <el-button type="primary" v-auth="'organizationlist.view'" @click="roleQuery">查询</el-button>
-                <el-button type="primary" v-auth="'organizationlist.view'" @click="resetForm">重置</el-button>
+                <el-button type="primary" v-auth="'organizationlist.view'" @click="roleQuery">
+                  <template #icon>
+                    <SvgIcon name="i-ep:search" />
+                  </template>
+                  查询</el-button>
+                <el-button type="default" v-auth="'organizationlist.view'" @click="resetForm">重置</el-button>
               </div>
             </ElFormItem>
           </ElCol>
         </ElRow>
       </ElForm>
       <Table :tableData="tableData" :columns="columns" :showIndex="false" :columnwidth="200" :showSelect="true"
-        :pageInfo="pageInfo" @getList="getList" @selectAllChange="handleSelectionChange"
-        @selectionChange="selectionChange">
+        :pageInfo="pageInfo" @getList="getList" @selectionChange="selectionChange">
         <template v-slot:table-title-btn>
           <RouterLink :to="{ name: 'OrganizationAdd' }">
             <el-button type="primary" v-auth="'organizationlist.add'">
@@ -190,7 +193,7 @@ function findpage() {
   api.tenantApi.sysList({ pages: pageInfo.value.pageNum, size: pageInfo.value.pageSize, ...formInline }).then((res: any) => {
     if (res.code == 200) {
       tableData.value = res.data.records;
-      pageInfo.value.pageNum = res.data.pages;
+      pageInfo.value.pageNum = res.data.current;
       pageInfo.value.pageSize = res.data.size;
       pageInfo.value.total = res.data.total;
     }
@@ -214,9 +217,9 @@ const columns = [
       return sysType
     }
   },
-  { prop: "division", label: "所在地区", },
+  { prop: "division", label: "所在地区", width: '200', },
   {
-    prop: "deptCount", label: "下级机构",
+    prop: "deptCount", label: "下级机构", width: '100',
     component: "RouterLink",
     formatter: (row: any) => ({ name: 'OrganizationDetail', query: { id: row.id, code: row.sysCode, typeName: 'organization' } })
   },
@@ -230,8 +233,11 @@ const columns = [
       }
     }
   },
-  { prop: "createTime", label: "创建时间", width: '180', },
+  { prop: "createTime", label: "创建时间", width: '180',
+  },
   { prop: "createBy", label: "创建人", width: '120', },
+  { prop: "contact", label: "联系人", width: '120', },
+  { prop: "telephone", label: "联系电话", width: '200' },
 ];
 
 function getList(item: PageInfo) {
@@ -248,9 +254,7 @@ function tenantUpdate(item: any) {
     }
   })
 }
-const handleSelectionChange = (val: any) => {
-  sysUpAndDownList.value = val;
-}
+
 const selectionChange = (val: any) => {
   sysUpAndDownList.value = val;
 }
@@ -392,7 +396,7 @@ const resetForm = () => {
   formInline.cityId = '';
   formInline.districtId = '';
   formInline.sysType = '';
-  provinceoptions.value=[];
+  provinceoptions.value = [];
   findpage();
 }
 

+ 2 - 2
src/views/organizationManagement/organization/subOrganizatioAdd.vue

@@ -36,7 +36,7 @@
             <el-form-item label="展业范围" prop="exhibitionScope">
               <el-select v-model="deptform.exhibitionScope" multiple placeholder="请选择展业范围" clearable>
                 <el-option :label="item.label" v-for="(item, index) in dictLists.exhibition_scopeList" :key="index"
-                  :value="item.label" />
+                  :value="item.value" />
               </el-select>
             </el-form-item>
           </ElCol>
@@ -160,8 +160,8 @@ onBeforeMount(() => {
 
   if (parentId.value) {
     parentIdareaOptionsValue.value = parentId.value;
+    deptform.value.parentId=parentIdareaOptionsValue.value;
     //子机构向下添加,上级机构无法修改
-
     parentIdShow.value = true;
   }
 });

+ 56 - 42
src/views/personnel/memberManagement.vue

@@ -20,8 +20,11 @@
           <ElCol :md="8">
             <ElFormItem>
               <div class="flex j-end" style="width: 100%;">
-                <el-button type="primary" @click="memberQuery" v-auth="'member.view'"
-                  @keydown.enter="handleEnter">查询</el-button>
+                <el-button type="primary" @click="memberQuery" v-auth="'member.view'" @keydown.enter="handleEnter">
+                  <template #icon>
+                    <SvgIcon name="i-ep:search" />
+                  </template>
+                  查询</el-button>
                 <el-button type="default" @click="resetForm" v-auth="'member.view'">重置</el-button>
               </div>
             </ElFormItem>
@@ -105,7 +108,7 @@
       <template #footer>
         <div class="dialog-footer">
           <el-button @click="UpdatedialogVisible = false">取消</el-button>
-          <el-button type="primary" @click="memberAdd">
+          <el-button type="primary" @click="memberAdd(memberFormRef)">
             保存
           </el-button>
         </div>
@@ -203,48 +206,58 @@ const roleListfun = () => {
   });
 }
 //添加
-const memberAdd = () => {
-  if (dialogType.value == 'add') {
-    api.member.userAdd(memberform).then((res: any) => {
-      if (res.code == '200') {
-        ElMessage({
-          type: 'success',
-          message: res.msg,
-          plain: true,
-        })
-        findpage();
-        UpdatedialogVisible.value = false;
+const memberAdd = async (formEl: FormInstance | undefined) => {
+  if (!formEl) return
+  await formEl.validate((valid) => {
+    if (valid) {
+      if (dialogType.value == 'add') {
+        api.member.userAdd(memberform).then((res: any) => {
+          if (res.code == '200') {
+            ElMessage({
+              type: 'success',
+              message: res.msg,
+              plain: true,
+            })
+            findpage();
+            UpdatedialogVisible.value = false;
+          } else {
+            ElMessage({
+              type: 'error',
+              message: res.msg,
+              plain: true,
+            })
+          }
+        });
       } else {
-        ElMessage({
-          type: 'error',
-          message: res.msg,
-          plain: true,
-        })
+        console.log(memberform)
+        api.member.userEdit(memberform).then((res: any) => {
+          if (res.code == '200') {
+            ElMessage({
+              type: 'success',
+              message: res.msg,
+              plain: true,
+            })
+            findpage();
+            UpdatedialogVisible.value = false;
+          } else {
+            ElMessage({
+              type: 'success',
+              message: res.msg,
+              plain: true,
+            })
+          }
+        });
       }
-    });
-  } else {
-    console.log(memberform)
-    api.member.userEdit(memberform).then((res: any) => {
-      if (res.code == '200') {
-        ElMessage({
-          type: 'success',
-          message: res.msg,
-          plain: true,
-        })
-        findpage();
-        UpdatedialogVisible.value = false;
-      } else {
-        ElMessage({
-          type: 'success',
-          message: res.msg,
-          plain: true,
-        })
-      }
-    });
-  }
-
-
+    } else {
+      ElMessage({
+        type: 'error',
+        message: '信息不完整',
+        plain: true,
+      })
+    }
+  })
 }
+
 //交互事件===========================
 function handleEnter(e: any) {
   if (e.keyCode == 13 || e.keyCode == 108) {
@@ -509,4 +522,5 @@ const close = () => {
 .el-inputs {
   width: 100% !important;
 }
+
 </style>

+ 46 - 4
src/views/personnel/roleManagement.vue

@@ -58,10 +58,14 @@
             </ElForm>
             <ElDivider></ElDivider>
             <div>
-              <h5>角色权限</h5>
+              <div class="flex a-c ">
+                <h5>角色权限</h5>
+                <el-checkbox v-model="TreeAllChecked" label="全选" size="large" @change="TreeselectAll"
+                  style="margin-left: 20px;" />
+              </div>
               <ElTree style="max-height: 350px;overflow-y: auto;" ref="treeRef" :data="treeData" :props="defaultProps"
                 show-checkbox node-key="id" :default-expand-all="true" :default-checked-keys="checkedKeys"
-                @check="handleCheckChange" />
+                @check="handleCheck" />
             </div>
           </div>
           <div class="flex f-c a-c " v-else>
@@ -100,7 +104,6 @@ onBeforeMount(() => {
   // 对 asyncRoutes 进行预处理并转换为树形结构
   const processedRoutes = preprocessRoutes(asyncRoutes);
   treeData.value = convertToTreeData(0, processedRoutes);
-
 });
 interface roleList {
   id: string,
@@ -111,6 +114,7 @@ interface roleList {
 interface Perm {
   id: string; // 根据实际情况,id 可能是数字或字符串
 }
+const TreeAllChecked = ref(false);
 const treeRef = ref<InstanceType<typeof ElTree>>();
 const roleName = ref<string>("");
 const roleId = ref<string>("");
@@ -143,7 +147,7 @@ const defaultProps = {
   children: 'children',
   label: 'title',
 };
-const handleCheckChange = (
+const handleCheck = (
   _checkedNodes: TreeNode[],
   checkedInfo: {
     checkedKeys: number[];
@@ -159,6 +163,14 @@ const handleCheckChange = (
 };
 
 async function roleSubmit() {
+  if (!roleInfo.permsId.length) {
+    ElMessage({
+      type: 'error',
+      message: '角色权限不能为空',
+      plain: true,
+    })
+    return;
+  }
   if (roleInfo.id) {
     await api.roleApi.roleUpdate(roleInfo).then((res: any) => {
       if (res.code == 200) {
@@ -186,6 +198,35 @@ async function roleSubmit() {
   }
 
 }
+//全选
+const TreeselectAll = (value: string | number | boolean) => {
+  roleInfo.perms = [];//全选操作是清空历史数据
+  const allKeys = getAllKeys(treeData.value, 'id');//递归id集合
+  const allperms = getAllKeys(treeData.value, 'perms');//递归权限集合
+  if (value) {
+    checkedKeys.value = allKeys;
+    roleInfo.permsId = allKeys;
+    roleInfo.perms = allperms;
+  } else {
+    treeRef.value?.setCheckedKeys([]);
+    roleInfo.permsId = [];
+
+  }
+
+
+}
+//递归
+const getAllKeys = (data: TreeNode[], type: string) => {
+  let keys: any = [];
+  data.forEach(item => {
+    keys.push(type == 'id' ? item.id : item); // 假设每个节点有 id 属性
+    if (item.children) {
+      keys = keys.concat(getAllKeys(item.children, type == 'id' ? 'id' : 'perms'));
+    }
+  });
+  return keys;
+}
+
 function roleDelClick() {
   api.roleApi.roleDeleteValid({ systemCode: roleInfo.system, id: roleId.value }).then((res: any) => {
     if (res.code == 200) {
@@ -242,6 +283,7 @@ async function rolequery() {
   })
 }
 function resetForm() {
+  TreeAllChecked.value = false;
   identifier.value = true;
   roleInfo.name = "";
   roleInfo.remark = "";

+ 16 - 9
src/views/productConfiguration/drivingInsurance/index.vue → src/views/productConfiguration/drivingInsurance/drivingInsuranceindex.vue

@@ -5,7 +5,8 @@
         <ElCol :md="4">
           <div class="flex f-c " style="height: 100%;">
             <ElFormItem>
-              <ElInput v-model="companyName" placeholder="输入保险公司名称查找" type="text" tabindex="1" clearable style="width: 100%;"  @clear="companyQuery">
+              <ElInput v-model="companyName" placeholder="输入保险公司名称查找" type="text" tabindex="1" clearable
+                style="width: 100%;" @clear="companyQuery">
                 <template #append>
                   <el-button :icon="Search" @click="companyQuery" v-auth="'drivingInsurance.add'" />
                 </template>
@@ -27,7 +28,7 @@
             <span class="strong">驾意险配置</span>
             <RouterLink
               :to="{ name: 'DrivingInsuranceAdd', query: { companyID: companyactiveID, companyName: companyactiveName } }">
-              <ElButton type="default" v-if="companyactiveID">
+              <ElButton type="default" v-if="companyactiveID" v-auth="'drivingInsurance.add'">
                 <template #icon>
                   <el-icon>
                     <Plus />
@@ -52,7 +53,11 @@
                 </el-input>
               </el-form-item>
               <el-form-item>
-                <el-button type="primary" @click="findpage" v-auth="'drivingInsurance.view'">查询</el-button>
+                <el-button type="primary" @click="findpage" v-auth="'drivingInsurance.view'">
+                  <template #icon>
+                    <SvgIcon name="i-ep:search" />
+                  </template>
+                  查询</el-button>
                 <el-button type="default" @click="reset" v-auth="'drivingInsurance.view'">重置</el-button>
               </el-form-item>
             </el-form>
@@ -64,9 +69,11 @@
               <el-button type="primary" link style="margin-right: 15px;" v-if="scope.operationData.parentId == '0'"
                 @click="add(scope.operationData)" v-auth="'drivingInsurance.add'"> 添加
               </el-button>
-              <el-button type="primary" link style="margin-right: 15px;" @click="edit(scope.operationData.id)" v-auth="'drivingInsurance.edit'"> 编辑
+              <el-button type="primary" link style="margin-right: 15px;" @click="edit(scope.operationData.id)"
+                v-auth="'drivingInsurance.edit'"> 编辑
               </el-button>
-              <el-button type="primary" link style="margin-right: 15px;" @click="del(scope.operationData)" v-auth="'drivingInsurance.delete'"> 删除
+              <el-button type="primary" link style="margin-right: 15px;" @click="del(scope.operationData)"
+                v-auth="'drivingInsurance.delete'"> 删除
               </el-button>
             </template>
           </TableTree>
@@ -111,13 +118,13 @@ const columns = [
   { prop: "alias", label: "产品别名", width: '180' },
 
 ];
-const reset=()=>{
-  formInline.params="";
-  formInline.seats="";
+const reset = () => {
+  formInline.params = "";
+  formInline.seats = "";
 }
 //获取驾意险
 const findpage = () => {
-  api.product.jyxList({ company: companyactiveID.value,...formInline }).then((res: any) => {
+  api.product.jyxList({ company: companyactiveID.value, ...formInline }).then((res: any) => {
     if (res.code == '200') {
       tableData.value = res.data;
     } else {

+ 0 - 318
src/views/productConfiguration/specialClause/index.vue

@@ -1,318 +0,0 @@
-<template>
-  <div>
-    <PageMain class="vh100">
-      <ElForm :inline="false" :model="formInline" class="demo-form-inline" label-width="100px">
-        <ElRow :gutter="20">
-          <ElCol :md="6">
-            <ElFormItem label="特约名称">
-              <el-input v-model="formInline.companyName" placeholder="输入保险公司查找" clearable class="el-inputs" />
-            </ElFormItem>
-          </ElCol>
-          <ElCol :md="6">
-            <ElFormItem label="特约内容">
-              <el-input v-model="formInline.companyName" placeholder="输入保险公司查找" clearable class="el-inputs" />
-            </ElFormItem>
-          </ElCol>
-          <ElCol :md="1">
-            <el-button type="primary" @click="findpage">查询</el-button>
-          </ElCol>
-        </ElRow>
-      </ElForm>
-      <ElDivider border-style="dashed"></ElDivider>
-      <Table :tableData="tableData" :columns="columns" :showIndex="false" :columnwidth="200" :showSelect="false"
-        :pageInfo="pageInfo" @getList="getList">
-        <template v-slot:table-title-btn>
-          <el-button type="primary" @click="companyAdd">
-            添加特约
-            <template #icon>
-              <el-icon>
-                <Plus />
-              </el-icon>
-            </template>
-          </el-button>
-        </template>
-        <template v-slot:operation="scope">
-          <el-button type="primary" link @click="paymentEdit(scope.operationData.id)"> 编辑
-          </el-button>
-          <el-button type="primary" link @click="paymentDel(scope.operationData.id)"> 删除
-          </el-button>
-        </template>
-        <template v-slot:search="scope">
-          {{ scope.slotData.label }}
-        </template>
-      </Table>
-    </PageMain>
-
-    <el-dialog v-model="paynemtAdddialogVisible" :title="dialogTitle" width="40%" @close="close">
-      <ElRow :gutter="20">
-        <el-form :model="paymentform" :inline="true" label-width="120px" :rules="memberformRules" label-position="top"
-          ref="paymentFormRef" style="width: 100%;" :size="fromSize">
-          <ElCol :md="24" :lg="12">
-            <el-form-item label="保险公司" prop="companyId">
-              <el-select v-model="paymentform.companyId" @change="companyIdChange" placeholder="请选择"
-                style="width: 100%;">
-                <el-option :label="item.name" :value="item.id" v-for="(item, index) in companyList" :key="index" />
-              </el-select>
-            </el-form-item>
-          </ElCol>
-          <ElCol :md="24" :lg="12">
-            <el-form-item label="简称" prop="companyName">
-              <el-input v-model="paymentform.companyName" placeholder="请输入姓名" disabled />
-            </el-form-item>
-          </ElCol>
-          <ElCol :md="24" :lg="12">
-            <el-form-item label="二维码类型" prop="type">
-              <el-select v-model="paymentform.type" placeholder="请选择" style="width: 100%;">
-                <el-option v-for="(item, index) in getDict('qr_barcode')" :label="item.label" :value="item.value"
-                  :key="index" />
-              </el-select>
-            </el-form-item>
-          </ElCol>
-          <ElCol :md="24" :lg="12">
-            <el-form-item label="请求类型" prop="apiType">
-              <el-select v-model="paymentform.apiType" placeholder="请选择" style="width: 100%;">
-                <el-option v-for="(item, index) in getDict('api_type')" :label="item.label" :value="item.value"
-                  :key="index" />
-              </el-select>
-            </el-form-item>
-          </ElCol>
-        </el-form>
-      </ElRow>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="paynemtAdddialogVisible = false">取消</el-button>
-          <el-button type="primary" @click="MemberAdd(paymentFormRef)">
-            保存
-          </el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
-
-</template>
-
-<script lang="ts" setup>
-import { ref, reactive } from 'vue'
-import api from '@/api';
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { FormRules, FormInstance, ComponentSize } from 'element-plus';
-import { loadDicts, getDict } from '@/utils/composables/dictService';
-interface PageInfo {
-  pageNum: number;
-  pageSize: number;
-  sizes: number[];
-  total: number;
-}
-interface paymentform {
-  id?: string,
-  companyId: string,
-  companyName: string,
-  type: string,
-  apiType: string,
-  companyCode: string,
-}
-
-const tableData = ref([]);//列表数据
-const paymentFormRef = ref<FormInstance>()
-const fromSize = ref<ComponentSize>('large')//表单大小
-const paynemtAdddialogVisible = ref(false)//弹窗
-const dictLists = ref<{ [key: string]: any[] }>({});//字典集合
-const dialogTitle = ref('支付码配置')//弹窗title
-const dialogType = ref('add')//弹窗title
-const companyList = ref();
-const paymentform = reactive<paymentform>({
-  id: "",
-  companyId: "",
-  companyName: "",
-  type: "",
-  apiType: "",
-  companyCode: "",
-})
-const memberformRules = ref<FormRules>({
-  companyId: [
-    { required: true, trigger: 'change', message: '请选择保险公司' },
-  ],
-  type: [
-    { required: true, trigger: 'change', message: '请选择二维码类型' },
-  ],
-  apiType: [
-    { required: true, trigger: 'change', message: '请选择请求类型' },
-  ],
-
-});
-//分页
-const pageInfo = ref({
-  pageNum: 1,
-  pageSize: 20,
-  sizes: [10, 20, 30, 40, 50],
-  total: 0,
-});
-//检索条件
-const formInline = reactive({
-  companyName: '',//保险公司name
-})
-onMounted(() => {
-  findpage();
-  companyQuery();//获取保险公司
-  loadDicts(['qr_barcode', 'api_type']);//获取多个字典
-});
-function findpage() {
-  api.company.QRcodePage({ pages: pageInfo.value.pageNum, size: pageInfo.value.pageSize, ...formInline }).then((res: any) => {
-    if (res.code == 200) {
-      tableData.value = res.data.records;
-      pageInfo.value.pageNum = res.data.current;
-      pageInfo.value.pageSize = res.data.size;
-      pageInfo.value.total = res.data.total;
-    }
-
-  })
-}
-const columns = [
-  { prop: "companyName", label: "特约名称", align: 'left' },
-  { prop: "companyCode", label: "编码", width: '220' },
-  {
-    prop: "type", label: "特别约定内容", width: '280', formatter: (row: any) => {
-      let type = row.type;
-      let name = getDict('qr_barcode').find(val => val.value == type).label;
-      return name;
-    }
-  },
-];
-function getList(item: PageInfo) {
-  pageInfo.value.pageNum = item.pageNum;
-  pageInfo.value.pageSize = item.pageSize;
-  findpage();
-};
-const companyIdChange = (value: string) => {
-  let Info = companyList.value.find((val: any) => val.id == value);
-  paymentform.companyName = Info.name;
-  paymentform.companyCode = Info.companyCode;
-}
-//获取保险公司列表
-const companyQuery = () => {
-  api.company.selectLevelList({ name: "" }).then((res: any) => {
-    if (res.code == '200') {
-      companyList.value = res.data;
-    }
-  });
-}
-const companyAdd = () => {
-  dialogTitle.value = '支付码配置';
-  dialogType.value = 'add';
-  paynemtAdddialogVisible.value = true
-}
-const MemberAdd = async (formEl: FormInstance | undefined) => {
-  if (!formEl) return
-  await formEl.validate((valid) => {
-    if (valid) {
-      if (dialogType.value == 'add') {
-        api.company.QRBarcodeAdd({ ...paymentform }).then((res: any) => {
-          if (res.code == '200') {
-            ElMessage({
-              type: 'success',
-              message: res.msg,
-              plain: true,
-            })
-            paynemtAdddialogVisible.value = false;
-            findpage();
-          } else {
-          }
-        });
-      } else {
-        api.company.QRBarcodeUpdate({ ...paymentform }).then((res: any) => {
-          if (res.code == '200') {
-            ElMessage({
-              type: 'success',
-              message: res.msg,
-              plain: true,
-            })
-            paynemtAdddialogVisible.value = false;
-            findpage();
-          } else {
-          }
-        });
-      }
-    } else {
-      ElMessage({
-        type: 'error',
-        message: '信息不完整',
-        plain: true,
-      })
-    }
-  })
-}
-// 编辑
-const paymentEdit = (id: string) => {
-  dialogTitle.value = '支付码编辑';
-  dialogType.value = 'edit';
-  api.company.QRcodeById(id).then((res: any) => {
-    if (res.code == '200') {
-      Object.keys(paymentform).forEach((key) => {
-        if (res.data.hasOwnProperty(key)) {
-          paymentform[key as keyof typeof paymentform] = res.data[key as keyof typeof paymentform];
-        }
-      });
-      paynemtAdddialogVisible.value = true;
-    } else {
-    }
-  });
-}
-// 删除
-const paymentDel = (id: string) => {
-  ElMessageBox.confirm(
-    '确定删除吗?',
-    '删除二维码配置',
-    {
-      confirmButtonText: '确定删除',
-      type: 'error',
-      center: true,
-      confirmButtonClass: 'el-button--danger',
-    }
-  )
-    .then(() => {
-      api.company.QRcodeDel(id).then((res: any) => {
-        if (res.code == '200') {
-          ElMessage({
-            type: 'success',
-            message: res.msg,
-            plain: true,
-          })
-          findpage();
-        } else {
-        }
-      });
-    })
-    .catch(() => {
-    })
-
-}
-//字典信息处理
-const dictType = (type: string) => {
-  api.toolApi.dictType({ dictCode: type }).then((res: any) => {
-    if (res.code == '200') {
-      dictLists.value[type + 'List'] = res.data.map((item: any) => {
-        return {
-          value: item.value,
-          label: item.label
-        };
-      });
-    }
-  });
-}
-const close = () => {
-  paymentform.companyId = "";
-  paymentform.companyName = "";
-  paymentform.type = "";
-  paymentform.apiType = "";
-}
-</script>
-<style lang="scss" scoped>
-:deep(.el-divider--horizontal) {
-  margin: 8px 0 24px;
-  color: #f2f2f2;
-}
-
-.el-inputs {
-  width: 100% !important;
-}
-</style>

+ 212 - 0
src/views/productConfiguration/specialClause/specialClauseAdd.vue

@@ -0,0 +1,212 @@
+<template>
+  <div>
+    <PageMain style="padding: 20px;margin-bottom: 100px;">
+      <ElRow :gutter="60">
+        <ElCol :md="24" :lg="24" style="padding-bottom: 10px;font-size: 14px;">
+          <span class="strong">基本信息</span>
+        </ElCol>
+        <el-form :model="specialform" label-width="120px" :rules="specialformRules" label-position="top"
+          ref="specialformRef" style="max-width: 1000px;" class="flex a-c f-wrap" :size="fromSize">
+          <ElCol :md="24" :lg="12">
+            <el-form-item label="保险公司" prop="companyId">
+              <el-select v-model="specialform.companyId" placeholder="请选择" clearable  filterable>
+                <el-option v-for="(item, index) in companyList" :key="index" :label="item.name" :value="item.id" />
+              </el-select>
+            </el-form-item>
+          </ElCol>
+          <ElCol :md="24" :lg="12">
+            <el-form-item label="特约类型" prop="riskCode">
+              <el-select v-model="specialform.riskCode" placeholder="请选择" clearable>
+                <el-option :label="item.label" v-for="(item, index) in getDict('risk_code')" :key="index"
+                  :value="item.value" />
+              </el-select>
+            </el-form-item>
+          </ElCol>
+          <ElCol :md="24" :lg="12">
+            <el-form-item label="特约名称" prop="clauseName">
+              <el-input v-model="specialform.clauseName" placeholder="请输入特约名称" maxlength="50" show-word-limit />
+            </el-form-item>
+          </ElCol>
+          <ElCol :md="24" :lg="12">
+            <el-form-item label="特约编码" prop="clauseCode">
+              <el-input v-model="specialform.clauseCode" placeholder="请输入特约编码" maxlength="50" show-word-limit />
+            </el-form-item>
+          </ElCol>
+          <ElCol :md="24" :lg="12">
+            <el-form-item label="是否可编辑" prop="isEdit">
+              <el-radio-group v-model="specialform.isEdit">
+                <el-radio :value="item.value" size="large" v-for="(item, index) in getDict('is_edit')" :key="index">{{
+                  item.label }}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </ElCol>
+          <ElCol :md="24" :lg="12">
+            <el-form-item label="客户端状态" prop="clientStatus">
+              <el-select v-model="specialform.clientStatus" placeholder="请选择" clearable>
+                <el-option :label="item.label" v-for="(item, index) in getDict('special_client_type')" :key="index"
+                  :value="item.value" />
+              </el-select>
+            </el-form-item>
+          </ElCol>
+          <ElCol :md="24" :lg="12">
+            <el-form-item label="特约内容" prop="clauseContent">
+              <el-input v-model="specialform.clauseContent" placeholder="请输入机构地址" type="textarea" maxlength="500"
+                show-word-limit />
+            </el-form-item>
+          </ElCol>
+        </el-form>
+      </ElRow>
+    </PageMain>
+    <FixedActionBar>
+      <ElButton @click='router.back()'>
+        取消
+      </ElButton>
+      <ElButton type="primary" @click="submitForm(specialformRef)">
+        保存
+      </ElButton>
+      <ElButton type="primary" v-if="!id" @click='submitForm1(specialformRef)'>
+        保存并继续添加
+      </ElButton>
+    </FixedActionBar>
+  </div>
+
+</template>
+
+<script lang="ts" setup>
+import { ref } from 'vue'
+import { FormRules, FormInstance, ComponentSize, ElMessage } from 'element-plus';
+import { loadDicts, getDict } from '@/utils/composables/dictService';//字典组件
+import { useRoute,useRouter } from 'vue-router';
+import api from '@/api';
+const route = useRoute();
+const router=useRouter();
+const id = ref(route.query.id);//id参数
+const specialformRef = ref<FormInstance>()
+const fromSize = ref<ComponentSize>('large')
+const companyList = ref()
+const specialform = reactive({
+  id: "",
+  companyId: "",//保险公司code
+  clauseName: "",//特约名称
+  riskCode: "",//特约类型
+  clauseCode: "",//特约编码
+  clauseContent: "",//特约内容
+  isEdit: "",//是否编辑
+  clientStatus: "",//客户端状态
+})
+
+const specialformRules = ref<FormRules>({
+  companyId: [
+    { required: true, trigger: 'change', message: '请选择保险公司' },
+  ],
+  riskCode: [
+    { required: true, trigger: 'change', message: '请选择特约类型' },
+  ],
+  clauseName: [
+    { required: true, trigger: 'blur', message: '请输入特约名称' },
+  ],
+  clauseCode: [
+    { required: true, trigger: 'blur', message: '请输入特约编码' },
+  ],
+  isEdit: [
+    { required: true, trigger: 'change', message: '请选择是否可编辑' },
+  ],
+  clientStatus: [
+    { required: true, trigger: 'change', message: '请选择客户端状态' },
+  ],
+  clauseContent: [
+    { required: true, trigger: 'blur', message: '请输入特约内容' },
+  ],
+
+});
+onBeforeMount(() => {
+  companyQuery();
+  loadDicts(['special_client_type', 'risk_code', 'is_edit']);//获取多个字典
+  if (id.value) {
+    details();
+  }
+});
+
+const details = () => {
+  api.product.getClause({ id: id.value }).then((res: any) => {
+    if (res.code == '200') {
+      Object.keys(specialform).forEach((key) => {
+        if (res.data.hasOwnProperty(key)) {
+          specialform[key as keyof typeof specialform] = res.data[key as keyof typeof specialform];
+        }
+      });
+    } else {
+    }
+  });
+}
+//获取保险公司列表
+const companyQuery = () => {
+  api.company.selectLevelList({ name: "" }).then((res: any) => {
+    if (res.code == '200') {
+      companyList.value = res.data;
+    }
+  });
+}
+const submitForm = async (formEl: FormInstance | undefined) => {
+  if (!formEl) return
+  await formEl.validate((valid) => {
+    if (valid) {
+      if (id.value) {
+        api.product.updateClause({ ...specialform }).then((res: any) => {
+          if (res.code == '200') {
+            ElMessage({
+              type: 'success',
+              message: res.msg,
+              plain: true,
+            })
+            router.back()
+          }
+        });
+      } else {
+        api.product.addClause({ ...specialform }).then((res: any) => {
+          if (res.code == '200') {
+            ElMessage({
+              type: 'success',
+              message: res.msg,
+              plain: true,
+            })
+            router.back()
+          }
+        });
+      }
+    } else {
+      ElMessage({
+        type: 'error',
+        message: '信息不完整',
+        plain: true,
+      })
+    }
+  })
+}
+const submitForm1 = async (formEl: FormInstance | undefined) => {
+
+  if (!formEl) return
+  await formEl.validate((valid) => {
+    if (valid) {
+      api.product.addClause({ ...specialform }).then((res: any) => {
+          if (res.code == '200') {
+            ElMessage({
+              type: 'success',
+              message: res.msg,
+              plain: true,
+            })
+            router.push({
+              name: 'reload',
+            })
+          }
+        });
+    } else {
+      ElMessage({
+        type: 'error',
+        message: '信息不完整',
+        plain: true,
+      })
+    }
+  })
+}
+</script>

+ 244 - 0
src/views/productConfiguration/specialClause/specialClauseindex.vue

@@ -0,0 +1,244 @@
+<template>
+  <div>
+    <PageMain class="vh100">
+      <ElForm :inline="false" :model="formInline" class="demo-form-inline" label-width="100px">
+        <ElRow :gutter="20">
+          <ElCol :md="8">
+            <ElFormItem label="保险公司">
+              <el-select v-model="formInline.companyId" placeholder="请选择保险公司" clearable filterable style="width: 100%;">
+                <el-option :label="item.name" :value="item.id" v-for="(item, index) in companyList" :key="index" />
+              </el-select>
+            </ElFormItem>
+          </ElCol>
+          <ElCol :md="8">
+            <ElFormItem label="特约名称">
+              <el-input v-model="formInline.clauseName" placeholder="输入特约名称查找" clearable class="el-inputs" />
+            </ElFormItem>
+          </ElCol>
+          <ElCol :md="8">
+            <ElFormItem label="特约内容">
+              <el-input v-model="formInline.clauseContent" placeholder="输入特约内容查找" clearable class="el-inputs" />
+            </ElFormItem>
+          </ElCol>
+          <ElCol :md="8">
+            <ElFormItem label="编码">
+              <el-input v-model="formInline.clauseCode" placeholder="输入特约编码查找" clearable class="el-inputs" />
+            </ElFormItem>
+          </ElCol>
+          <ElCol :md="8">
+            <ElFormItem label="特约类型">
+              <el-select v-model="formInline.riskCode" placeholder="请选择特约类型" style="width: 100%;">
+                <el-option :label="item.label" :value="item.value" v-for="(item, index) in getDict('risk_code')"
+                  :key="index" />
+                <el-option label="商业险" value="商业险" />
+              </el-select>
+            </ElFormItem>
+          </ElCol>
+          <ElCol :md="8">
+            <div class="flex a-c j-end" style="width: 100%;">
+              <el-button type="primary" @click="findpage" v-auth="'specialClause.view'">
+                <template #icon>
+                  <SvgIcon name="i-ep:search" />
+                </template>
+                查询</el-button>
+              <el-button type="default" @click="reset">重置</el-button>
+            </div>
+          </ElCol>
+        </ElRow>
+      </ElForm>
+      <ElDivider border-style="dashed"></ElDivider>
+      <Table :tableData="tableData" :columns="columns" :showIndex="false" :columnwidth="200" :showSelect="true"
+        :pageInfo="pageInfo" @getList="getList" @selectionChange="selectionChange">
+        <template v-slot:table-title-btn>
+          <RouterLink :to="{ name: 'SpecialClauseAdd' }">
+            <el-button type="primary" v-auth="'specialClause.add'">
+              添加特约
+              <template #icon>
+                <el-icon>
+                  <Plus />
+                </el-icon>
+              </template>
+            </el-button>
+          </RouterLink>
+
+          <el-button type="default" @click="batchDel" v-auth="'specialClause.delete'" :disabled="!sysUpAndDownList.length">
+            批量删除
+          </el-button>
+        </template>
+        <template v-slot:operation="scope">
+          <Auth :value="'specialClause.edit'">
+            <el-button type="primary" link @click="Edit(scope.operationData.id)"> 编辑
+            </el-button>
+          </Auth>
+          <Auth :value="'specialClause.delete'">
+            <el-button type="primary" link @click="Del(scope.operationData.id)"> 删除
+            </el-button>
+          </Auth>
+        </template>
+        <template v-slot:search="scope">
+          {{ scope.slotData.label }}
+        </template>
+      </Table>
+    </PageMain>
+  </div>
+</template>
+<script lang="ts" setup>
+import { ref, reactive } from 'vue'
+import api from '@/api';
+import { RouterLink, useRouter } from "vue-router";
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { loadDicts, getDict } from '@/utils/composables/dictService';
+interface PageInfo {
+  pageNum: number;
+  pageSize: number;
+  sizes: number[];
+  total: number;
+}
+const router = useRouter();
+const tableData = ref([]);//列表数据
+const sysUpAndDownList = ref<string[]>([])//选中id
+const companyList = ref();
+//分页
+const pageInfo = ref({
+  pageNum: 1,
+  pageSize: 20,
+  sizes: [10, 20, 30, 40, 50],
+  total: 0,
+});
+//检索条件
+const formInline = reactive({
+  companyId: "",//保险公司code
+  clauseName: "",//特约名称
+  riskCode: "",//特约类型
+  clauseCode: "",//特约编码
+  clauseContent: "",//特约内容
+})
+onMounted(() => {
+  findpage();
+  companyQuery();//获取保险公司
+  loadDicts(['qr_barcode', 'api_type', 'risk_code']);//获取多个字典
+});
+function findpage() {
+  api.product.getClausePage({ pages: pageInfo.value.pageNum, size: pageInfo.value.pageSize, ...formInline }).then((res: any) => {
+    if (res.code == 200) {
+      tableData.value = res.data.records;
+      pageInfo.value.pageNum = res.data.current;
+      pageInfo.value.pageSize = res.data.size;
+      pageInfo.value.total = res.data.total;
+    }
+  })
+}
+const columns = [
+  { prop: "companyName", label: "保险公司", align: 'left', width: '280' },
+  {
+    prop: "riskCode", label: "特约类型", width: '150', formatter: (row: any) => {
+      let riskCode = row.riskCode;
+      if(riskCode){
+        let riskCodeName = getDict('risk_code').find(val => val.value == riskCode).label;
+        return riskCodeName
+      }
+    }
+  },
+  { prop: "clauseName", label: "特约名称", align: 'left' },
+  { prop: "clauseCode", label: "编码", width: '220' },
+  { prop: "clauseContent", label: "特别约定内容", width: '480'},
+];
+function getList(item: PageInfo) {
+  pageInfo.value.pageNum = item.pageNum;
+  pageInfo.value.pageSize = item.pageSize;
+  findpage();
+};
+//获取保险公司列表
+const companyQuery = () => {
+  api.company.selectLevelList({ name: "" }).then((res: any) => {
+    if (res.code == '200') {
+      companyList.value = res.data;
+    }
+  });
+}
+const selectionChange = (val: any) => {
+  sysUpAndDownList.value = val;
+}
+const Edit = (id: string) => {
+  router.push({
+    name: 'SpecialClauseAdd',
+    query: {
+      id: id
+    }
+  })
+}
+const batchDel = () => {
+  ElMessageBox.confirm(
+    '是否删除特约?',
+    '特约删除',
+    {
+      confirmButtonText: '确定删除',
+      type: 'error',
+      center: true,
+      confirmButtonClass: 'el-button--danger',
+    }
+  )
+    .then(() => {
+      api.product.deleteClause([...sysUpAndDownList.value]).then((res: any) => {
+        if (res.code == '200') {
+          ElMessage({
+            type: 'success',
+            message: res.msg,
+            plain: true,
+          })
+          findpage();
+        } else {
+        }
+      });
+    })
+    .catch(() => {
+    })
+}
+// 删除
+const Del = (id: string) => {
+  ElMessageBox.confirm(
+    '是否删除特约?',
+    '特约删除',
+    {
+      confirmButtonText: '确定删除',
+      type: 'error',
+      center: true,
+      confirmButtonClass: 'el-button--danger',
+    }
+  )
+    .then(() => {
+      api.product.deleteClause([id]).then((res: any) => {
+        if (res.code == '200') {
+          ElMessage({
+            type: 'success',
+            message: res.msg,
+            plain: true,
+          })
+          findpage();
+        } else {
+        }
+      });
+    })
+    .catch(() => {
+    })
+
+}
+const reset = () => {
+  formInline.clauseCode='';
+  formInline.clauseContent='';
+  formInline.clauseName='';
+  formInline.companyId='';
+  formInline.riskCode='';
+  findpage();
+}
+</script>
+<style lang="scss" scoped>
+:deep(.el-divider--horizontal) {
+  margin: 8px 0 24px;
+  color: #f2f2f2;
+}
+
+.el-inputs {
+  width: 100% !important;
+}
+</style>