project.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. <template>
  2. <PageMain class="vh100">
  3. <div class="flex h-full">
  4. <div class="w-282px h-full relative flex-shrink-0 member-tree box-border">
  5. <el-input class="w-250px m-l-8px" placeholder="请输入保险公司名称" v-model="company" @keyup.enter="searchCompany">
  6. <template #append>
  7. <el-button icon="Search" link @click="searchCompany" />
  8. </template>
  9. </el-input>
  10. <div style="height: calc(100% - 80px); overflow: auto;" class="m-t-14px">
  11. <div v-for="item, index in filterList" :key="item.id" :class="companyIndex == index ? 'on' : 'role-item'"
  12. @click="companyChose(item, index)"
  13. class="h-64px w-266px p-[0_8px] flex flex-col items-start justify-center">
  14. <div class="text-16px color-[#333]">{{ item.nameSimple }}</div>
  15. </div>
  16. </div>
  17. </div>
  18. <div class="w-[calc(100%-282px)]">
  19. <div
  20. class="flex m-r--16px m-t-4px h-52px justify-between items-center p-b-20px p-l-24px p-r-24px b-b-(1px solid #EEEEEE)">
  21. <div class="">
  22. <div class="text-20px color-[#333] font-500">险种方案配置</div>
  23. <div class="text-14px color-[#999]">配置各家保险公司险种方案套餐,报价时根据规则信息匹配符合报价车辆的保司与保司内的方案</div>
  24. </div>
  25. <div>
  26. <ElButton type="primary" @click="addProject">添加新方案</ElButton>
  27. </div>
  28. </div>
  29. <el-form class="p-[20px_8px_0_24px]" :model="projectForm" ref="projectRefs">
  30. <el-row :gutter="20">
  31. <el-col :span="8">
  32. <el-form-item label="方案类型">
  33. <el-select clearable v-model="projectForm.schemeType" placeholder="请选择" @change="search">
  34. <el-option key="1" value="1" label="基础方案"></el-option>
  35. <el-option key="2" value="2" label="自选方案"></el-option>
  36. </el-select>
  37. </el-form-item>
  38. </el-col>
  39. <el-col :span="8">
  40. <el-form-item label="险种">
  41. <el-select clearable v-model="projectForm.productId" placeholder="请选择" @change="search">
  42. <el-option v-for="item in insuranceType" :key="item.value" :value="item.value"
  43. :label="item.label"></el-option>
  44. </el-select>
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="8">
  48. <el-form-item>
  49. <el-input clearable prefix-icon="search" placeholder="输入规则描述查找" @keyup.enter="search"
  50. v-model="projectForm.ruleDesc"></el-input>
  51. </el-form-item>
  52. </el-col>
  53. </el-row>
  54. </el-form>
  55. <el-table class="p-l-24px" :data="tableData" height="calc(100% - 182px)">
  56. <el-table-column label="方案名称" prop="schemeName"></el-table-column>
  57. <el-table-column label="方案描述" prop="description"></el-table-column>
  58. <el-table-column label="方案类型" prop="schemeType">
  59. <template #default="scope">
  60. {{ scope.row.schemeType == '1' ? '基础方案' : scope.row.schemeType == '2' ? '自选方案' : '' }}
  61. </template>
  62. </el-table-column>
  63. <el-table-column label="险种" prop="productName"></el-table-column>
  64. <el-table-column label="驾意险" prop="drivingIntentionNum"></el-table-column>
  65. <el-table-column label="规则描述" prop="ruleDesc"></el-table-column>
  66. <el-table-column label="操作">
  67. <template #default="scope">
  68. <el-button link type="primary" @click="handleEdit(scope.row)">编辑</el-button>
  69. <el-button link type="primary" @click="handleCopy(scope.row)">复制</el-button>
  70. <el-button link type="primary" @click="handleDel(scope.row)">删除</el-button>
  71. </template>
  72. </el-table-column>
  73. </el-table>
  74. <div class="paginationBox p-r-8px">
  75. <el-pagination v-model:current-page="currentPage" v-model:page-size="pageSize" :page-sizes="[10, 20, 30, 40]"
  76. layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handleSizeChange"
  77. @current-change="handleCurrentChange"></el-pagination>
  78. </div>
  79. </div>
  80. </div>
  81. <!-- <el-row :gutter="20" style="height: 100%; padding: 10px">
  82. <el-col :span="4">
  83. <el-input placeholder="请输入保险公司名称" v-model="company" prefix-icon="search"
  84. @keyup.enter="searchCompany"></el-input>
  85. <div class="companyList">
  86. <div class="companyItem" :class="{ 'active': companyIndex === index }" v-for="(item, index) in filterList"
  87. @click="companyChose(item, index)">{{ item.nameSimple }}</div>
  88. </div>
  89. </el-col>
  90. <el-col :span="20">
  91. <el-row :gutter="20" align="middle">
  92. <el-col :span="20">
  93. <h4>险种方案配置</h4>
  94. <p>配置各家保险公司险种方案套餐,报价时根据规则信息匹配符合报价车辆的保司与保司内的方案</p>
  95. </el-col>
  96. <el-col :span="4">
  97. <el-button icon="plus" type="primary" @click="addProject">添加新方案</el-button>
  98. </el-col>
  99. </el-row>
  100. <el-divider></el-divider>
  101. <el-form :model="projectForm" ref="projectRefs">
  102. <el-row :gutter="20">
  103. <el-col :span="4">
  104. <el-form-item label="方案类型">
  105. <el-select clearable v-model="projectForm.schemeType" placeholder="请选择" @change="search">
  106. <el-option key="1" value="1" label="基础方案"></el-option>
  107. <el-option key="2" value="2" label="自选方案"></el-option>
  108. </el-select>
  109. </el-form-item>
  110. </el-col>
  111. <el-col :span="4">
  112. <el-form-item label="险种">
  113. <el-select clearable v-model="projectForm.productId" placeholder="请选择" @change="search">
  114. <el-option v-for="item in insuranceType" :key="item.value" :value="item.value"
  115. :label="item.label"></el-option>
  116. </el-select>
  117. </el-form-item>
  118. </el-col>
  119. <el-col :span="4">
  120. <el-form-item>
  121. <el-input clearable prefix-icon="search" placeholder="输入规则描述查找" @keyup.enter="search"
  122. v-model="projectForm.ruleDesc"></el-input>
  123. </el-form-item>
  124. </el-col>
  125. </el-row>
  126. </el-form>
  127. <el-table :data="tableData" height="600">
  128. <el-table-column label="方案名称" prop="schemeName"></el-table-column>
  129. <el-table-column label="方案描述" prop="description"></el-table-column>
  130. <el-table-column label="方案类型" prop="schemeType">
  131. <template #default="scope">
  132. {{ scope.row.schemeType == '1' ? '基础方案' : scope.row.schemeType == '2' ? '自选方案' : '' }}
  133. </template>
  134. </el-table-column>
  135. <el-table-column label="险种" prop="productName"></el-table-column>
  136. <el-table-column label="驾意险" prop="drivingIntentionNum"></el-table-column>
  137. <el-table-column label="规则描述" prop="ruleDesc"></el-table-column>
  138. <el-table-column label="操作">
  139. <template #default="scope">
  140. <el-button link type="primary" @click="handleEdit(scope.row)">编辑</el-button>
  141. <el-button link type="primary" @click="handleDel(scope.row)">删除</el-button>
  142. </template>
  143. </el-table-column>
  144. </el-table>
  145. <div class="paginationBox">
  146. <el-pagination v-model:current-page="currentPage" v-model:page-size="pageSize" :page-sizes="[10, 20, 30, 40]"
  147. layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handleSizeChange"
  148. @current-change="handleCurrentChange"></el-pagination>
  149. </div>
  150. </el-col>
  151. </el-row> -->
  152. </PageMain>
  153. <el-dialog :close-on-click-modal="false" v-model="copyDialog" title="复制" width="600">
  154. <el-form>
  155. <el-form-item label="险种类型">
  156. <el-select v-model="insuranceTypeValue" placeholder="请选择险种类型">
  157. <el-option v-for="item in insuranceType" :key="item.value" :value="item.value"
  158. :label="item.label"></el-option>
  159. </el-select>
  160. </el-form-item>
  161. </el-form>
  162. <template #footer>
  163. <el-button size="small" type="primary" @click="submitCopy">确定</el-button>
  164. </template>
  165. </el-dialog>
  166. </template>
  167. <script setup lang="ts">
  168. import api from '@/api'
  169. import { ElMessage, ElMessageBox } from "element-plus";
  170. import { useRouter, useRoute } from 'vue-router'
  171. const myRouter = useRouter()
  172. const muRoute = useRoute()
  173. const searchCompany = () => {
  174. currentPage.value = 1
  175. pageSize.value = 10
  176. initData()
  177. }
  178. let company = ref('')
  179. const filterList = computed(() => {
  180. return companyOption.value.filter(a => a.nameSimple.includes(company.value))
  181. })
  182. const search = () => {
  183. initData()
  184. }
  185. // 保险公司
  186. let companyOption = ref([])
  187. let companyIndex = ref(0)
  188. let companyId = ref('')
  189. const initCompany = () => {
  190. api.projectApi.getCompanyList().then(res => {
  191. if (res.code == 200) {
  192. companyOption.value = res.data
  193. if (muRoute.query.id) {
  194. companyIndex.value = companyOption.value.findIndex(a => a.id == muRoute.query.id)
  195. } else {
  196. companyIndex.value = 0
  197. }
  198. companyId.value = muRoute.query.id || companyOption.value[companyIndex.value].id
  199. initData()
  200. } else {
  201. ElMessage({
  202. message: res.msg,
  203. type: 'warning'
  204. })
  205. }
  206. })
  207. }
  208. const companyChose = (item, index) => {
  209. companyIndex.value = index
  210. companyId.value = item.id
  211. initData()
  212. }
  213. const addProject = () => {
  214. myRouter.push({
  215. path: '/quoteConfig/agreement/project/projectAdd',
  216. query: {
  217. companyId: companyId.value
  218. }
  219. })
  220. }
  221. let projectForm = ref({})
  222. let tableData = ref([])
  223. // 分页数据
  224. let currentPage = ref(0)
  225. let pageSize = ref(10)
  226. let total = ref(0)
  227. const initData = () => {
  228. api.projectApi.getSchemeList({
  229. pages: currentPage.value,
  230. size: pageSize.value,
  231. companyId: companyId.value,
  232. productId: projectForm.value.productId,
  233. schemeType: projectForm.value.schemeType,
  234. ruleDesc: projectForm.value.ruleDesc
  235. }).then(res => {
  236. if (res.code == 200) {
  237. tableData.value = res.data.records
  238. total.value = res.data.total
  239. } else {
  240. ElMessage({
  241. message: res.msg,
  242. type: 'warning'
  243. })
  244. }
  245. })
  246. }
  247. // 险种类型
  248. let insuranceType = ref([])
  249. const initType = () => {
  250. api.commonApi.personInfo('insurance_type').then(res => {
  251. if (res.code == 200) {
  252. insuranceType.value = res.data
  253. } else {
  254. ElMessage({
  255. message: res.msg,
  256. type: 'warning'
  257. })
  258. }
  259. })
  260. }
  261. const handleSizeChange = (size) => {
  262. pageSize.value = size
  263. initData()
  264. }
  265. const handleCurrentChange = (page) => {
  266. currentPage.value = page
  267. initData()
  268. }
  269. // 编辑
  270. const handleEdit = (row) => {
  271. myRouter.push({
  272. path: '/quoteConfig/agreement/project/projectAdd',
  273. query: {
  274. id: row.id,
  275. companyId: companyId.value,
  276. productId: row.productId
  277. }
  278. })
  279. }
  280. // 删除
  281. const handleDel = (row) => {
  282. ElMessageBox({
  283. title: '删除方案',
  284. message: '确定要删除该方案吗?',
  285. type: 'warning',
  286. showCancelButton: true,
  287. confirmButtonText: '确定',
  288. cancelButtonText: '取消',
  289. }).then((action) => {
  290. if (action === 'confirm') {
  291. api.projectApi.deleteScheme({
  292. id: row.id
  293. }).then(res => {
  294. if (res.code == 200) {
  295. ElMessage({
  296. message: res.msg,
  297. type: 'success'
  298. })
  299. initData()
  300. } else {
  301. ElMessage({
  302. message: res.msg,
  303. type: 'warning'
  304. })
  305. }
  306. })
  307. }
  308. }).catch((action) => {
  309. })
  310. }
  311. const copyDialog = ref(false)
  312. const copyId = ref('')
  313. const insuranceTypeValue = ref('')
  314. /** 复制操作处理:记录当前行的ID并打开复制确认对话框 */
  315. const handleCopy = (row) => {
  316. copyId.value = row.id
  317. copyDialog.value = true
  318. }
  319. /** 提交复制操作,校验险种选择后触发保险公司查询 */
  320. const submitCopy = () => {
  321. if (insuranceTypeValue.value.length == 0) {
  322. ElMessage({
  323. message: '请选择险种',
  324. type: 'warning'
  325. })
  326. return
  327. }
  328. const params = {
  329. schemeId: copyId.value,
  330. productCode: insuranceTypeValue.value
  331. }
  332. api.projectApi.copyScheme(params).then(res => {
  333. if (res.code == 200) {
  334. ElMessage({
  335. message: res.msg,
  336. type: 'success'
  337. })
  338. copyDialog.value = false
  339. searchCompany()
  340. }
  341. })
  342. }
  343. onMounted(() => {
  344. // initData()
  345. initCompany()
  346. initType()
  347. })
  348. </script>
  349. <style scoped lang="scss">
  350. :deep(.main-container) {
  351. padding: 16px;
  352. }
  353. :deep(.el-input-group__append) {
  354. color: #fff;
  355. background: linear-gradient(91deg, #4FCAFF 0%, #2B62FF 100%);
  356. }
  357. .member-tree {
  358. &::after {
  359. content: '';
  360. position: absolute;
  361. height: calc(100% + 32px);
  362. width: 1px;
  363. background-color: #EEEEEE;
  364. top: -16px;
  365. right: 0;
  366. bottom: -16px;
  367. }
  368. }
  369. .role-item {
  370. cursor: pointer;
  371. }
  372. .on {
  373. cursor: pointer;
  374. background: #F4FAFF;
  375. border-right: 1px solid #0083FF;
  376. }
  377. .paginationBox {
  378. display: flex;
  379. justify-content: end;
  380. margin-top: 10px;
  381. }
  382. </style>