Ver Fonte

Merge branch 'dev' of http://39.101.143.165:8090/dong_k/tenant-Platform into dev

祁鹏飞 há 1 mês atrás
pai
commit
e018fb213c

+ 6 - 0
src/api/modules/consoleManage.ts

@@ -135,6 +135,12 @@ const manageApi = (axiosInstance: ApiInstance) => ({
     personCheckDataToTask: (params: any) => axiosInstance.post('/console/financeDataManage/personCheckDataToTask',params),//列表导出接口
     personCheckDataDetailPageList: (params: any) => axiosInstance.post('/console/financeDataManage/personCheckDataDetailPageList',params),//明细接口
     personCheckDataDetailToTa: (params: any) => axiosInstance.post('/console/financeDataManage/personCheckDataDetailToTa',params),//明细出接口
+
+    // 订单审核
+    feeAuditSummaryPageList: (params: any) => axiosInstance.post('/console/financeDataManage/feeAuditSummaryPageList',params),//列表接口
+    feeAuditSummaryToTask: (params: any) => axiosInstance.post('/console/financeDataManage/feeAuditSummaryToTask',params),//列表导出接口
+    feeAuditDetailPageList: (params: any) => axiosInstance.post('/console/financeDataManage/feeAuditDetailPageList',params),//明细接口
+    feeAuditDetailToTask: (params: any) => axiosInstance.post('/console/financeDataManage/feeAuditDetailToTask',params),//明细出接口
   })
 
 export default manageApi

+ 292 - 0
src/views/consoleManage/financeDataManage/orderReviewData/index.vue

@@ -0,0 +1,292 @@
+<template>
+  <div class="log">
+    <PageMain class="vh100">
+    <div class='btn-box'>
+      <el-button type="primary" plain class='query-btn'
+        @click='dialogShow'>{{selectedKeys.length?`已选${selectedKeys.length}项`:'筛选条件'}}</el-button>
+      <div class='query-btn'>
+        <DowButton @endAnim='downloadFile'></DowButton>
+      </div>
+    </div>
+    <QueryForm :option="listOption" @query='query' @delSelect='delSelect' ref='queryFormRef'></QueryForm>
+
+    <!-- 表格 -->
+    <ComplexTable :tableData="tableData" :showSelect='false' :columns="listOption.columns" :showIndex="false"
+      :columnwidth="120" :pageInfo="pageInfo" @getList="getList">
+      <template v-slot:operation="scope">
+        <el-button type="primary" link @click='agreementEdit(scope.operationData.companyId)'>明细</el-button>
+      </template>
+
+      <template v-slot:search="scope">
+        <Sort :scope="scope.slotData" :globalSortKey="globalSortKey" :globalSortOrder="globalSortOrder"
+          @update:sort="handleSortUpdate"></Sort>
+      </template>
+
+      <template #customSlot="{  bodyCell: { scope, column } }">
+        <template v-if="column.prop == 'checkOrderNum'">
+          {{ scope.row.checkOrderNum }} 笔
+        </template>
+        <template v-if="column.prop == 'pendingReviewOrderNum'">
+          {{ scope.row.pendingReviewOrderNum }} 笔
+        </template>
+        <template v-if="column.prop == 'avgReviewDuration'">
+          {{ scope.row.avgReviewDuration }} s
+        </template>
+        <template v-if="column.prop == 'rejectOrderNum'">
+          {{ scope.row.rejectOrderNum }} 笔
+        </template>
+        <template v-if="column.prop == 'updateOrderNum'">
+          {{ scope.row.updateOrderNum }} 笔
+        </template>
+      </template>
+    </ComplexTable>
+
+    <FilterDialog :show='isShow' @close='isShow=false' @sure='filterSure' ref='filterDialogRef' @selectedKeys='selected'
+      routerKey='routerKey'>
+    </FilterDialog>
+    </PageMain>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { useRouter } from "vue-router";
+import api from "@/api";
+import QueryForm from "../../components/queryForm.vue";
+import FilterDialog from "../../components/filterDialog.vue";
+import DowButton from "../../components/button.vue";
+import Sort from "../../components/sort.vue";
+import useUserStore from "@/store/modules/message";
+import PageInfo from "@/api/types/agreementTypes";
+import { ElMessage } from "element-plus";
+
+const router = useRouter();
+const userStore = useUserStore();
+const isShow = ref(false);
+
+const isSort = ref();
+const pageInfo = ref({
+  pageNum: 1,
+  pageSize: 10,
+  sizes: [10, 20, 30, 40, 50],
+  total: 0,
+});
+const listOption = reactive({
+  rowKey: "orderReviewData",
+  //查询
+  queryFormFields: [],
+  // 表格列
+  columns: [
+    {
+      prop: "companyId",
+      label: "保险公司ID",
+      width: "",
+    },
+    {
+      prop: "companyName",
+      label: "保险公司名称",
+      width: "",
+    },
+    {
+      prop: "pendingReviewNum",
+      label: "待审核条数",
+      width: "180",
+    },
+    {
+      prop: "approvedNum",
+      label: "已审核条数",
+      width: "180",
+      align: "right",
+      sortable: true,
+    },
+    {
+      prop: "rejectedNum",
+      label: "审核不通过条数",
+      width: "180",
+      align: "right",
+      sortable: true,
+    },
+    {
+      prop: "problemOrderNum",
+      label: "疑问订单条数",
+      width: "180",
+      align: "right",
+      sortable: true,
+    },
+    {
+      prop: "avgAuditDuration",
+      label: "平均审核时长(秒)",
+      width: "180",
+      align: "right",
+      sortable: true,
+    },
+  ],
+});
+
+const selectedKeys = ref([]);
+const selected = function (val) {
+  selectedKeys.value = val;
+};
+
+//查询数据
+const phone = JSON.parse(localStorage.getItem("userInfo")).username;
+
+//获取默认选择数据
+const queryFormRes = ref();
+const routerKey = ref("orderReviewData");
+const defaultList = ref();
+const pageHiddenList = ref([]); //页面不显示的数据
+const initDefaultList = async () => {
+  const { data } = await api.manageApi.getSearchDefaultList({
+    routerKey: routerKey.value,
+    userId: phone,
+  });
+  listOption.queryFormFields = data.filter((e) => e.showFlag);
+  console.log(listOption.queryFormFields);
+  // listOption.queryFormFields[0].defaultValue = ["2026-02-02", "2026-02-03"];
+  pageHiddenList.value = data.filter((e) => !e.showFlag);
+  defaultList.value = data.map((e) => e.id);
+  selectedKeys.value = defaultList.value;
+  queryFormRes.value = queryFormRef.value?.initDefaultSaveForm();
+  queryList();
+};
+
+//删除
+const filterDialogRef = ref();
+const delSelect = (id) => {
+  listOption.queryFormFields = listOption.queryFormFields.filter(
+    (item) => item.id != id
+  );
+  filterDialogRef.value.initList(
+    [...listOption.queryFormFields, ...pageHiddenList.value],
+    defaultList.value
+  );
+};
+
+//打开dialogShow
+const dialogShow = function () {
+  isShow.value = true;
+  filterDialogRef.value.initList(
+    [...listOption.queryFormFields, ...pageHiddenList.value],
+    defaultList.value
+  );
+};
+
+//确定
+const queryFormRef = ref();
+const filterSure = (item, index) => {
+  isShow.value = false;
+  const secondGroupIds = item.list.map((item) => item.id);
+  const oldList = listOption.queryFormFields.filter((item) =>
+    secondGroupIds.includes(item.id)
+  );
+  const firstGroupIds = listOption.queryFormFields.map((item) => item.id);
+  let newList = item.list.filter((item) => !firstGroupIds.includes(item.id));
+
+  //过滤掉默认不显示的数据
+  const hiddenList = new Set(pageHiddenList.value.map((item) => item.id));
+  const filterList = newList.filter((item) => !hiddenList.has(item.id));
+
+  listOption.queryFormFields = [...oldList, ...filterList];
+  queryFormRef.value?.initDefaultSaveForm();
+  selectedKeys.value = item.list.filter((item) => item.id);
+};
+
+const globalSortKey = ref("");
+const globalSortOrder = ref<"asc" | "desc">("asc");
+//  处理子组件传递的排序更新
+const handleSortUpdate = (sortInfo: {
+  key: string;
+  order: string;
+  name: string;
+}) => {
+  globalSortKey.value = sortInfo.key;
+  globalSortOrder.value = sortInfo.order;
+  queryList();
+};
+
+//查询
+const query = (item) => {
+  console.log(item);
+  queryFormRes.value = item;
+  queryList();
+};
+
+//数据查询
+const tableData = ref([]);
+const queryList = async () => {
+  let query = { ...queryFormRes.value };
+  const { data } = await api.manageApi.feeAuditSummaryPageList({
+    pageNo: pageInfo.value.pageNum,
+    pageSize: pageInfo.value.pageSize,
+    routerKey: routerKey.value,
+    userId: phone,
+    orderType: globalSortKey.value
+      ? globalSortKey.value + " " + globalSortOrder.value
+      : "",
+    ...query,
+  });
+  tableData.value = data.records;
+  pageInfo.value.pageNum = data.current;
+  pageInfo.value.pageSize = data.size;
+  pageInfo.value.total = data.total;
+};
+
+//分页事件
+function getList(item: PageInfo) {
+  pageInfo.value.pageNum = item.pageNum;
+  pageInfo.value.pageSize = item.pageSize;
+  queryList();
+}
+
+//导出
+const downloadFile = async () => {
+  let query = { ...queryFormRes.value };
+  const { data, msg } = await api.manageApi.personCheckDataToTask({
+    pageNo: pageInfo.value.pageNum,
+    pageSize: pageInfo.value.pageSize,
+    routerKey: routerKey.value,
+    userId: phone,
+    orderType: globalSortKey.value
+      ? globalSortKey.value + " " + globalSortOrder.value
+      : "",
+    ...query,
+  });
+  ElMessage({
+    message: msg,
+    type: "success",
+  });
+  userStore.count++;
+};
+
+const agreementEdit = (id) => {
+  console.log(id);
+  router.push({
+    name: "OrderreviewdataOrderreviewdatadetail",
+    query: {
+      companyId: id,
+    },
+  });
+};
+
+onMounted(() => {
+  initDefaultList();
+});
+</script>
+
+<style scoped lang="scss">
+.log {
+  .query-btn {
+    margin-left: 20px;
+  }
+  .btn-box {
+    padding-bottom: 15px;
+    margin-bottom: 24px;
+    border-bottom: 1px solid #eeeeee;
+    display: flex;
+    justify-content: flex-end;
+  }
+}
+:deep(.caret-wrapper) {
+  display: none !important;
+}
+</style>

+ 267 - 0
src/views/consoleManage/financeDataManage/orderReviewData/orderReviewDataDetail.vue

@@ -0,0 +1,267 @@
+<template>
+  <div class="log">
+    <PageMain class="vh100">
+    <div class='btn-box'>
+      <el-button type="primary" plain class='query-btn'
+        @click='dialogShow'>{{selectedKeys.length?`已选${selectedKeys.length}项`:'筛选条件'}}</el-button>
+      <div class='query-btn'>
+        <DowButton @endAnim='downloadFile'></DowButton>
+      </div>
+    </div>
+    <QueryForm :option="listOption" @query='query' @delSelect='delSelect' ref='queryFormRef'></QueryForm>
+
+    <!-- 表格 -->
+    <ComplexTable :tableData="tableData" :showSelect='false' :columns="listOption.columns" :showIndex="false"
+      :columnwidth="120" :pageInfo="pageInfo" @getList="getList" :showOperation='false'>
+      <template v-slot:search="scope">
+        <Sort :scope="scope.slotData" :globalSortKey="globalSortKey" :globalSortOrder="globalSortOrder"
+          @update:sort="handleSortUpdate"></Sort>
+      </template>
+
+      <template #customSlot="{  bodyCell: { scope, column } }">
+        <template v-if="column.prop == 'checkDuration'">
+          {{ scope.row.checkDuration }} s
+        </template>
+      </template>
+    </ComplexTable>
+
+    <FilterDialog :show='isShow' @close='isShow=false' @sure='filterSure' ref='filterDialogRef' @selectedKeys='selected'
+      routerKey='routerKey'>
+    </FilterDialog>
+  </PageMain>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { useRouter, useRoute } from "vue-router";
+import api from "@/api";
+import QueryForm from "../../components/queryForm.vue";
+import FilterDialog from "../../components/filterDialog.vue";
+import DowButton from "../../components/button.vue";
+import Sort from "../../components/sort.vue";
+import useUserStore from "@/store/modules/message";
+import PageInfo from "@/api/types/agreementTypes";
+import { ElMessage } from "element-plus";
+
+
+const router = useRouter();
+const route = useRoute();
+
+const userStore = useUserStore();
+const isShow = ref(false);
+console.log(route.query.companyId);
+const isSort = ref();
+const pageInfo = ref({
+  pageNum: 1,
+  pageSize: 10,
+  sizes: [10, 20, 30, 40, 50],
+  total: 0,
+});
+const listOption = reactive({
+  rowKey: "orderReviewDataDetail",
+  //查询
+  queryFormFields: [],
+  // 表格列
+  columns: [
+    {
+      prop: "companyId",
+      label: "保险公司",
+      width: "",
+    },
+    {
+      prop: "licenseNo",
+      label: "审核类型",
+      width: "180",
+    },
+    {
+      prop: "orderNo",
+      label: "订单号",
+      width: "180",
+    },
+    {
+      prop: "licenseNo",
+      label: "车牌号",
+      width: "180",
+    },
+    {
+      prop: "orderType",
+      label: "订单类型",
+      width: "180",
+    },
+    {
+      prop: "checkResult",
+      label: "提交审核时间",
+      width: "180",
+    },
+    {
+      prop: "auditTime",
+      label: "审核时间",
+      width: "180",
+      align: "right",
+      sortable: true,
+    },
+    {
+      prop: "checkUserName",
+      label: "审核时长",
+      width: "180",
+    },
+  ],
+});
+
+const selectedKeys = ref([]);
+const selected = function (val) {
+  selectedKeys.value = val;
+};
+
+//查询数据
+const phone = JSON.parse(localStorage.getItem("userInfo")).username;
+
+//获取默认选择数据
+const queryFormRes = ref();
+const routerKey = ref("orderReviewDataDetail");
+const defaultList = ref();
+const pageHiddenList = ref([]); //页面不显示的数据
+const initDefaultList = async () => {
+  const { data } = await api.manageApi.getSearchDefaultList({
+    routerKey: routerKey.value,
+    userId: phone,
+  });
+  listOption.queryFormFields = data.filter((e) => e.showFlag);
+  console.log(route.query.companyId);
+  listOption.queryFormFields[0].defaultValue=route.query.companyId
+  pageHiddenList.value = data.filter((e) => !e.showFlag);
+  defaultList.value = data.map((e) => e.id);
+  selectedKeys.value = defaultList.value;
+  queryFormRes.value = queryFormRef.value?.initDefaultSaveForm();
+  queryList();
+};
+
+//删除
+const filterDialogRef = ref();
+const delSelect = (id) => {
+  listOption.queryFormFields = listOption.queryFormFields.filter(
+    (item) => item.id != id
+  );
+  filterDialogRef.value.initList(
+    [...listOption.queryFormFields, ...pageHiddenList.value],
+    defaultList.value
+  );
+};
+
+//打开dialogShow
+const dialogShow = function () {
+  isShow.value = true;
+  filterDialogRef.value.initList(
+    [...listOption.queryFormFields, ...pageHiddenList.value],
+    defaultList.value
+  );
+};
+
+//确定
+const queryFormRef = ref();
+const filterSure = (item, index) => {
+  isShow.value = false;
+  const secondGroupIds = item.list.map((item) => item.id);
+  const oldList = listOption.queryFormFields.filter((item) =>
+    secondGroupIds.includes(item.id)
+  );
+  const firstGroupIds = listOption.queryFormFields.map((item) => item.id);
+  let newList = item.list.filter((item) => !firstGroupIds.includes(item.id));
+
+  //过滤掉默认不显示的数据
+  const hiddenList = new Set(pageHiddenList.value.map((item) => item.id));
+  const filterList = newList.filter((item) => !hiddenList.has(item.id));
+
+  listOption.queryFormFields = [...oldList, ...filterList];
+  queryFormRef.value?.initDefaultSaveForm();
+  selectedKeys.value = item.list.filter((item) => item.id);
+};
+
+const globalSortKey = ref("");
+const globalSortOrder = ref<"asc" | "desc">("asc");
+//  处理子组件传递的排序更新
+const handleSortUpdate = (sortInfo: {
+  key: string;
+  order: string;
+  name: string;
+}) => {
+  globalSortKey.value = sortInfo.key;
+  globalSortOrder.value = sortInfo.order;
+  queryList();
+};
+
+//查询
+const query = (item) => {
+  queryFormRes.value = item;
+  queryList();
+};
+
+//数据查询
+const tableData = ref([]);
+const queryList = async () => {
+  let query = { ...queryFormRes.value };
+  const { data } = await api.manageApi.feeAuditDetailPageList({
+    pageNo: pageInfo.value.pageNum,
+    pageSize: pageInfo.value.pageSize,
+    routerKey: routerKey.value,
+    userId: phone,
+    orderType: globalSortKey.value
+      ? globalSortKey.value + " " + globalSortOrder.value
+      : "",
+    ...query,
+  });
+  tableData.value = data.records;
+  pageInfo.value.pageNum = data.current;
+  pageInfo.value.pageSize = data.size;
+  pageInfo.value.total = data.total;
+};
+
+//分页事件
+function getList(item: PageInfo) {
+  pageInfo.value.pageNum = item.pageNum;
+  pageInfo.value.pageSize = item.pageSize;
+  queryList();
+}
+
+//导出
+const downloadFile = async () => {
+  let query = { ...queryFormRes.value };
+  const { data, msg } = await api.manageApi.personCheckDataDetailToTa({
+    pageNo: pageInfo.value.pageNum,
+    pageSize: pageInfo.value.pageSize,
+    routerKey: routerKey.value,
+    userId: phone,
+    orderType: globalSortKey.value
+      ? globalSortKey.value + " " + globalSortOrder.value
+      : "",
+    ...query,
+  });
+  ElMessage({
+    message: msg,
+    type: "success",
+  });
+  userStore.count++;
+};
+
+onMounted(() => {
+  initDefaultList();
+});
+</script>
+
+<style scoped lang="scss">
+.log {
+  .query-btn {
+    margin-left: 20px;
+  }
+  .btn-box {
+    padding-bottom: 15px;
+    margin-bottom: 24px;
+    border-bottom: 1px solid #eeeeee;
+    display: flex;
+    justify-content: flex-end;
+  }
+}
+:deep(.caret-wrapper) {
+  display: none !important;
+}
+</style>

+ 3 - 13
src/views/finance/index.vue

@@ -614,14 +614,12 @@
         <el-table-column prop="optContent" label="变更内容"></el-table-column>
         <el-table-column prop="changeBefore" label="变更前">
           <template #default="scope">
-            <span v-if="scope.row.changeBefore">{{ scope.row.changeBefore }}</span>
-            <el-button v-else type="primary" link size="small" @click="viewDetail(scope.row)">查看明细</el-button>
+            <el-button  type="primary" link size="small" @click="viewDetail(scope.row)">查看明细</el-button>
           </template>
         </el-table-column>
         <el-table-column prop="changeAfter" label="变更后">
           <template #default="scope">
-            <span v-if="scope.row.changeAfter">{{ scope.row.changeAfter }}</span>
-            <el-button v-else type="primary" link size="small" @click="viewDetail(scope.row)">查看明细</el-button>
+            <el-button  type="primary" link size="small" @click="viewDetail(scope.row)">查看明细</el-button>
           </template>
         </el-table-column>
         <el-table-column prop="result" label="保司反馈"></el-table-column>
@@ -856,15 +854,7 @@ const handleTrack = (scope) => {
 const viewDetail = (row) => {
   myRouter.push({
     name: 'InsurancePolicyViewDetail',
-    query: {
-      module: row.module,
-      subModule: row.subModule,
-      optType: row.optType,
-      createBy: row.createBy,
-      createTime: row.createTime,
-      content: row.optContent,
-      obj: row.result
-    }
+    query: row,
   })
 }
 // 数据导出// 数据导出

+ 170 - 271
src/views/insurancePolicy/viewDetail.vue

@@ -1,191 +1,38 @@
 <template>
-    <div class="viewDetail">
-        <el-descriptions :column="2">
-            <template #title>
-                <div class="title">
-                    <div class="icon">
-                        <el-icon><List /></el-icon>
-                    </div>
-                    <p>{{ detailData?.content }}</p>
-                </div>
-            </template>
-            <el-descriptions-item label="操作功能:" label-align="right" align="left" label-width="100">{{ moduleName }}</el-descriptions-item>
-            <el-descriptions-item label="操作类型:" label-align="right" align="left" label-width="100">{{ detailData?.optType==0?'订单创建':detailData?.optType==1?'报价':detailData?.optType==2?'补传影像':detailData?.optType==3?'调整特约':detailData?.optType==4?'修改折扣系数':detailData?.optType==5?'核保':detailData?.optType==6?'获取支付码':detailData?.optType==7?'撤销支付码':detailData?.optType==8?'下载电子保单':detailData?.optType==9?'同步订单':detailData?.optType==10?'订单编辑':'--' }}</el-descriptions-item>
-            <el-descriptions-item label="操作人:" label-align="right" align="left" label-width="100">{{ detailData?.createBy }}</el-descriptions-item>
-            <el-descriptions-item label="操作时间:" label-align="right" align="left" label-width="100">{{ detailData?.createTime }}</el-descriptions-item>
-        </el-descriptions>
-        <el-row :gutter="20" class="content">
-            <el-col :span="11">
-                <p>变更前</p>
-                <el-table
-                    v-if="detailData?.content == '特别约定'"
-                    :data="detailData?.list"
-                >
-                    <el-table-column prop="a" label="特约名称"></el-table-column>
-                    <el-table-column prop="b" label="编码"></el-table-column>
-                    <el-table-column prop="c" label="特别约定内容"></el-table-column>
-                </el-table>
-                <div v-else-if="detailData?.content == '报价方案'">
-                    <div class="flex-item">
-                        <span class="label">险种</span>
-                        <span class="value"></span>
-                    </div>
-                    <div class="flex-item">
-                        <span class="label">报价方案</span>
-                        <span class="value"></span>
-                    </div>
-                    <div class="flex-item">
-                        <span class="label">方案明细</span>
-                        <span class="value">
-                            <el-table
-                                :data="detailData?.list"
-                            >
-                                <el-table-column prop="a" label="险种"></el-table-column>
-                                <el-table-column prop="b" label="保额">
-                                    <template #default="scope">
-                                        <el-select v-model="scope.row.optionId">
-                                            <el-option label="1" value="1" key="1"></el-option>
-                                        </el-select>
-                                    </template>
-                                </el-table-column>
-                                <el-table-column prop="c" label="保费"></el-table-column>
-                            </el-table>
-                        </span>
-                    </div>
-                    <div class="flex-item">
-                        <span class="label">增值服务</span>
-                        <span class="value">
-                            <el-row :gutter="10">
-                                <el-col :span="6">
-                                    <span class="serve-item">
-                                        救援<a>2</a>次
-                                    </span>
-                                </el-col>
-                                <el-col :span="6">
-                                    <span class="serve-item">
-                                        检测<a>2</a>次
-                                    </span>
-                                </el-col>
-                                <el-col :span="6">
-                                    <span class="serve-item">
-                                        代驾<a>2</a>次
-                                    </span>
-                                </el-col>
-                                <el-col :span="6">
-                                    <span class="serve-item">
-                                        送检<a>2</a>次
-                                    </span>
-                                </el-col>
-                            </el-row>
-                        </span>
-                    </div>
-                    <div class="flex-item">
-                        <span class="label">驾意险</span>
-                        <span class="value">
-                            <el-table
-                                :data="detailData?.list"
-                            >
-                                <el-table-column prop="a" label="产品名称"></el-table-column>
-                                <el-table-column prop="b" label="数量"></el-table-column>
-                                <el-table-column prop="c" label="保费"></el-table-column>
-                            </el-table>
-                        </span>
-                    </div>
-                </div>
-                <div class="list" v-else>
-                    <el-row class="list-item" :gutter="20" v-for="item in detailData?.list" :key="item">
-                        <el-col :span="6">{{ item.propertyName }}</el-col>
-                        <el-col :span="18" style="color: #606266">{{ item.oldValue }}</el-col>
-                    </el-row>
-                </div>
-            </el-col>
-            <el-divider direction="vertical" style="height: 100%"></el-divider>
-            <el-col :span="11">
-                <p>变更后</p>
-                <el-table
-                    v-if="detailData?.content == '特别约定'"
-                    :data="detailData?.list"
-                >
-                    <el-table-column prop="a" label="特约名称"></el-table-column>
-                    <el-table-column prop="b" label="编码"></el-table-column>
-                    <el-table-column prop="c" label="特别约定内容"></el-table-column>
-                </el-table>
-                <div v-else-if="detailData?.content == '报价方案'">
-                    <div class="flex-item">
-                        <span class="label">险种</span>
-                        <span class="value"></span>
-                    </div>
-                    <div class="flex-item">
-                        <span class="label">报价方案</span>
-                        <span class="value"></span>
-                    </div>
-                    <div class="flex-item">
-                        <span class="label">方案明细</span>
-                        <span class="value">
-                            <el-table
-                                :data="detailData?.list"
-                            >
-                                <el-table-column prop="a" label="险种"></el-table-column>
-                                <el-table-column prop="b" label="保额">
-                                    <template #default="scope">
-                                        <el-select v-model="scope.row.optionId">
-                                            <el-option label="1" value="1" key="1"></el-option>
-                                        </el-select>
-                                    </template>
-                                </el-table-column>
-                                <el-table-column prop="c" label="保费"></el-table-column>
-                            </el-table>
-                        </span>
-                    </div>
-                    <div class="flex-item">
-                        <span class="label">增值服务</span>
-                        <span class="value">
-                            <el-row :gutter="10">
-                                <el-col :span="6">
-                                    <span class="serve-item">
-                                        救援<a>2</a>次
-                                    </span>
-                                </el-col>
-                                <el-col :span="6">
-                                    <span class="serve-item">
-                                        检测<a>2</a>次
-                                    </span>
-                                </el-col>
-                                <el-col :span="6">
-                                    <span class="serve-item">
-                                        代驾<a>2</a>次
-                                    </span>
-                                </el-col>
-                                <el-col :span="6">
-                                    <span class="serve-item">
-                                        送检<a>2</a>次
-                                    </span>
-                                </el-col>
-                            </el-row>
-                        </span>
-                    </div>
-                    <div class="flex-item">
-                        <span class="label">驾意险</span>
-                        <span class="value">
-                            <el-table
-                                :data="detailData?.list"
-                            >
-                                <el-table-column prop="a" label="产品名称"></el-table-column>
-                                <el-table-column prop="b" label="数量"></el-table-column>
-                                <el-table-column prop="c" label="保费"></el-table-column>
-                            </el-table>
-                        </span>
-                    </div>
-                </div>
-                <div class="list" v-else>
-                    <el-row class="list-item" :gutter="20" v-for="item in detailData?.list" :key="item">
-                        <el-col :span="6">{{ item.propertyName }}</el-col>
-                        <el-col :span="18" style="color: #606266">{{ item.newValue }}</el-col>
-                    </el-row>
-                </div>
-            </el-col>
-        </el-row>
-    </div>
+  <div class="viewDetail">
+    <el-descriptions :column="2">
+      <template #title>
+        <div class="title">
+          <div class="icon">
+            <el-icon>
+              <List />
+            </el-icon>
+          </div>
+          <p>{{ detailData?.content }}</p>
+        </div>
+      </template>
+      <el-descriptions-item label="操作功能:" label-align="right" align="left" label-width="100">{{ moduleName
+      }}</el-descriptions-item>
+      <el-descriptions-item label="操作类型:" label-align="right" align="left" label-width="100">{{ optTypeMAP(detailData?.optType) }}</el-descriptions-item>
+      <el-descriptions-item label="操作人:" label-align="right" align="left" label-width="100">{{ detailData?.createBy
+      }}</el-descriptions-item>
+      <el-descriptions-item label="操作时间:" label-align="right" align="left" label-width="100">{{ detailData?.createTime
+      }}</el-descriptions-item>
+    </el-descriptions>
+    <el-row :gutter="20" class="content">
+      <el-col :span="11">
+        <p>变更前</p>
+        <div class="p-[20px]" v-html="formatLineBreaks(detailData?.changeBefore)"
+          style="white-space: pre-wrap; line-height: 2;"></div>
+      </el-col>
+      <el-divider direction="vertical" style="height: 100%"></el-divider>
+      <el-col :span="11">
+        <p>变更后</p>
+        <div class="p-[20px]" v-html="formatLineBreaks(detailData?.changeAfter)"
+          style="white-space: pre-wrap; line-height: 2;"></div>
+      </el-col>
+    </el-row>
+  </div>
 </template>
 
 <script setup lang="ts">
@@ -201,109 +48,161 @@ let detailData = ref(undefined)
 
 let moduleName = ref('')
 
-const JSONChange = (data) => {
-    try {
-        JSON.parse(data);
-        return true; // 如果没有抛出异常,说明可以解析
-    } catch (error) {
-        return false; // 如果抛出异常,说明不能解析
-    }
+// 格式化换行符,将 \r\n 和 \r 统一转换为 \n
+const formatLineBreaks = (text) => {
+  if (!text) return ''
+  return String(text).replace(/\r\n/g, '\n').replace(/\r/g, '\n')
 }
 
+const JSONChange = (data) => {
+  try {
+    JSON.parse(data);
+    return true; // 如果没有抛出异常,说明可以解析
+  } catch (error) {
+    return false; // 如果抛出异常,说明不能解析
+  }
+}
+const optTypeMAP = (optType) => {
+  switch (optType) {
+    case '0':
+      return '订单创建'
+    case '1':
+      return '报价'
+    case '2':
+      return '补传影像'
+    case '3':
+      return '调整特约'
+    case '4':
+      return '修改折扣系数'
+    case '5':
+      return '核保'
+    case '6':
+      return '获取支付码'
+    case '7':
+      return '撤销支付码'
+    case '8':
+      return '下载电子保单'
+    case '9':
+      return '同步订单'
+    case '10':
+      return '订单编辑'
+    case '11':
+      return '提交批改申请'
+    case '12':
+      return '审核批改申请'
+    case '13':
+      return '撤销批改申请'
+    case '14':
+      return '订单审核'
+    case '15':
+      return '费用调整'
+    case '16':
+      return '批量修改比例'
+    case '17':
+      return '设为疑问订单'
+    default:
+      return '--'
+  }
+}
 onBeforeMount(() => {
-    detailData.value = {
-        module: myRoute.query.module,
-        subModule: myRoute.query.subModule,
-        optType: myRoute.query.optType,
-        createTime: myRoute.query.createTime,
-        createBy: myRoute.query.createBy,
-        content: myRoute.query.content,
-        list: JSONChange(myRoute.query.obj)?JSON.parse(myRoute.query.obj):myRoute.query.obj
-    }
-    if(detailData.value.module && detailData.value.subModule) {
-        moduleName.value = `${detailData.value.module}/${detailData.value.subModule}`
-    } else if(detailData.value.module) {
-        moduleName.value = detailData.value.module
-    } else {
-        moduleName.value = ''
-    }
+  console.log(myRoute.query)
+
+  detailData.value = myRoute.query;
+  console.log(detailData.value)
+  if (detailData.value.module && detailData.value.subModule) {
+    moduleName.value = `${detailData.value.module}/${detailData.value.subModule}`
+  } else if (detailData.value.module) {
+    moduleName.value = detailData.value.module
+  } else {
+    moduleName.value = ''
+  }
 })
 
 const handleEscKey = (event: KeyboardEvent) => {
-    if (event.key === 'Escape' || event.keyCode === 27) {
-        myRouter.back()
-    }
+  if (event.key === 'Escape' || event.keyCode === 27) {
+    myRouter.back()
+  }
 }
 
 onMounted(() => {
-    window.addEventListener('keydown', handleEscKey)
+  window.addEventListener('keydown', handleEscKey)
 })
 
 onUnmounted(() => {
-    window.removeEventListener('keydown', handleEscKey)
+  window.removeEventListener('keydown', handleEscKey)
 })
 
 </script>
 
 <style scoped lang="scss">
-.viewDetail{
-    padding: 24px;
-    background: #FFFFFF;
-    width: 100%;
-    height: calc(100vh - 120px);
-    overflow: hidden;
-    .title{
-        display: flex;
-        align-items: center;
-        justify-content: flex-start;
-        .icon{
-            width: 30px;
-            height: 30px;
-            border-radius: 50%;
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            background: #1A85FA;
-            color: #FFFFFF;
-            font-size: 20px;
-            margin-right: 10px;
-        }
+.viewDetail {
+  padding: 24px;
+  background: #FFFFFF;
+  width: 100%;
+  height: calc(100vh - 120px);
+  overflow: hidden;
+
+  .title {
+    display: flex;
+    align-items: center;
+    justify-content: flex-start;
+
+    .icon {
+      width: 30px;
+      height: 30px;
+      border-radius: 50%;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      background: #1A85FA;
+      color: #FFFFFF;
+      font-size: 20px;
+      margin-right: 10px;
     }
-    .content{
-        height: calc(100% - 120px);
-        overflow-y: auto;
-        p{
-            text-align: center;
-            background: #F0F0F0;
-            margin: 0;
-            padding: 16px 0;
-        }
-        .list{
-            height: calc(100% - 80px);
-            overflow-y: auto;
-            overflow-x: hidden;
-            .list-item{
-                margin: 14px 0;
-                padding: 0 20px;
-                display: flex;
-            }
-        }
-        .flex-item{
-            display: flex;
-            align-items: center;
-            justify-content: flex-start;
-            margin: 14px 0;
-            .label{
-                width: 100px;
-                flex-shrink: 0;
-            }
-            .value{
-                width: calc(100% - 100px);
-            }
-        }
+  }
+
+  .content {
+    height: calc(100% - 120px);
+    overflow-y: auto;
+
+    p {
+      text-align: center;
+      background: #F0F0F0;
+      margin: 0;
+      padding: 16px 0;
     }
-    :deep(.el-descriptions) {
-        width: 50%;
+
+    .list {
+      height: calc(100% - 80px);
+      overflow-y: auto;
+      overflow-x: hidden;
+
+      .list-item {
+        margin: 14px 0;
+        padding: 0 20px;
+        display: flex;
+      }
     }
+
+    .flex-item {
+      display: flex;
+      align-items: center;
+      justify-content: flex-start;
+      margin: 14px 0;
+
+      .label {
+        width: 100px;
+        flex-shrink: 0;
+      }
+
+      .value {
+        width: calc(100% - 100px);
+      }
+    }
+  }
+
+  :deep(.el-descriptions) {
+    width: 50%;
+  }
 }
 </style>

+ 5 - 0
src/views/receivable/documentary/documentaryRecord.vue

@@ -7,6 +7,11 @@
             <el-input v-model="form.recordId"></el-input>
           </el-form-item>
         </el-col>
+        <el-col :span="8">
+          <el-form-item prop="invoiceNo" label="发票号">
+            <el-input v-model="form.invoiceNo"></el-input>
+          </el-form-item>
+        </el-col>
         <el-col :span="8">
           <el-form-item prop="companyId" label="保险公司">
             <el-select v-model="form.companyId" placeholder="请选择" clearable filterable>