drivingInsuranceAdd.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. <template>
  2. <div>
  3. <PageMain style="padding: 20px;margin-bottom: 100px;">
  4. <ElRow :gutter="60">
  5. <ElCol :md="24" :lg="24" style="padding-bottom: 10px;font-size: 14px;">
  6. <span class="strong">基本信息</span>
  7. </ElCol>
  8. <el-form :model="productform" label-width="120px" :rules="productformRules" label-position="top"
  9. ref="productFormRef" style="max-width: 1000px;" class="flex a-c f-wrap" :size="fromSize">
  10. <ElCol :md="24" :lg="12">
  11. <el-form-item label="产品类型" prop="productType">
  12. <el-select v-model="productform.productType" :disabled="productType == '2' || type == 'edit'"
  13. @change="productTypeChange" placeholder="请选择产品类型" clearable filterable>
  14. <el-option label="主险" value="1" />
  15. <el-option label="附加险" value="2" />
  16. </el-select>
  17. </el-form-item>
  18. </ElCol>
  19. <ElCol :md="24" :lg="12" v-if="productform.productType != '1'">
  20. <el-form-item label="上级产品" prop="parentId">
  21. <el-select v-model="productform.parentId" :disabled="productType == '2' || type == 'edit'"
  22. placeholder="请选择产品" clearable>
  23. <el-option v-for="(item, index) in parentList" :key="index" :label="item.productName"
  24. :value="item.id" />
  25. </el-select>
  26. </el-form-item>
  27. </ElCol>
  28. <ElCol :md="24" :lg="12">
  29. <el-form-item label="产品名称" prop="productName">
  30. <el-input v-model="productform.productName" placeholder="输入产品名称" />
  31. </el-form-item>
  32. </ElCol>
  33. <ElCol :md="24" :lg="12">
  34. <el-form-item label="别名">
  35. <el-input v-model="productform.alias" placeholder="输入产品别名" />
  36. </el-form-item>
  37. </ElCol>
  38. <ElCol :md="24" :lg="12">
  39. <el-form-item label="保险公司" prop="company">
  40. <el-input v-model="productform.companyName" placeholder="保险公司" disabled />
  41. </el-form-item>
  42. </ElCol>
  43. <ElCol :md="24" :lg="12">
  44. <el-form-item label="产品编码" prop="productCode">
  45. <el-input v-model="productform.productCode" placeholder="点击查询,获取产品编码" />
  46. </el-form-item>
  47. </ElCol>
  48. <ElCol :md="24" :lg="12">
  49. <el-form-item label="对接方式" prop="connectionMethod">
  50. <el-select v-model="productform.connectionMethod" placeholder="请选择产品" clearable filterable>
  51. <el-option label="API对接" value="1" />
  52. <el-option label="Python对接" value="2" />
  53. </el-select>
  54. </el-form-item>
  55. </ElCol>
  56. <ElCol :md="24" :lg="12">
  57. <el-form-item label="保费设置" prop="premiumSetting">
  58. <el-select v-model="productform.premiumSetting" placeholder="请选择" clearable filterable>
  59. <el-option label="产品统一价格" value="1" />
  60. <el-option label="按座位数设置价格" value="2" />
  61. </el-select>
  62. </el-form-item>
  63. </ElCol>
  64. <ElCol :md="24" :lg="12" v-if="productform.premiumSetting == '1'">
  65. <el-form-item label="总保额" prop="coverage">
  66. <el-input v-model="productform.coverage" placeholder="请输入总保额">
  67. <template #append>元</template>
  68. </el-input>
  69. </el-form-item>
  70. </ElCol>
  71. <ElCol :md="24" :lg="12" v-if="productform.premiumSetting == '1'">
  72. <el-form-item label="总保费" prop="premium">
  73. <el-input v-model="productform.premium" placeholder="请输入总保费">
  74. <template #append>元</template>
  75. </el-input>
  76. </el-form-item>
  77. </ElCol>
  78. </el-form>
  79. <ElCol :md="24" :lg="24" v-if="productform.premiumSetting == '2'">
  80. <ElDivider style="margin: 10px 0;"></ElDivider>
  81. <ElCol :md="24" :lg="24" style="padding-bottom: 10px;font-size: 14px;">
  82. <span class="strong">保费设置</span>
  83. </ElCol>
  84. <ElCol :md="24" :lg="12">
  85. <el-table :data="productform.settingList" style="width: 100%;">
  86. <el-table-column prop="seats" label="座位数" width="180">
  87. <template #default="scope">
  88. <el-input-number v-model="scope.row.seats" controls-position="right" style="width: 100%;" :min="5"
  89. :max="10">
  90. <template #suffix>
  91. <span>座</span>
  92. </template>
  93. </el-input-number>
  94. </template>
  95. </el-table-column>
  96. <el-table-column prop="coverage" label="保额" width="180">
  97. <template #default="scope">
  98. <el-input-number v-model="scope.row.coverage" :precision="2" controls-position="right"
  99. style="width: 100%;" :min="1" :max="9000000">
  100. <template #suffix>
  101. <span>元</span>
  102. </template>
  103. </el-input-number>
  104. </template>
  105. </el-table-column>
  106. <el-table-column prop="premium" label="保费">
  107. <template #default="scope">
  108. <el-input-number v-model="scope.row.premium" :precision="2" controls-position="right"
  109. style="width: 100%;" :min="1" :max="9000000">
  110. <template #suffix>
  111. <span>元</span>
  112. </template>
  113. </el-input-number>
  114. </template>
  115. </el-table-column>
  116. <el-table-column label="操作">
  117. <template #default="scope">
  118. <el-button type="primary" link @click="settingDel(scope.$index)">删除</el-button>
  119. </template>
  120. </el-table-column>
  121. </el-table>
  122. <ElButton type="primary" style="margin-top: 10px;" @click="settingListAdd">
  123. <template #icon>
  124. <el-icon>
  125. <Plus />
  126. </el-icon>
  127. </template>
  128. 添加一条
  129. </ElButton>
  130. </ElCol>
  131. </ElCol>
  132. <ElCol :md="24" :lg="24">
  133. <ElDivider style="margin: 10px 0;"></ElDivider>
  134. <ElCol :md="24" :lg="24" style="padding-bottom: 10px;font-size: 14px;">
  135. <span class="strong">保险责任</span>
  136. </ElCol>
  137. <el-table :data="productform.blameList" style="width: 100%;">
  138. <el-table-column prop="blame" label="保险责任"></el-table-column>
  139. <el-table-column prop="blameCode" label="保险责任编码" width="180" align="center"></el-table-column>
  140. <el-table-column prop="blameCoverage" label="保险责任保额" width="180" align="center"></el-table-column>
  141. <el-table-column prop="blamePremium" label="保险责任保费" width="180" align="center"></el-table-column>
  142. <el-table-column label="操作" width="280" align="center">
  143. <template #default="scope">
  144. <el-button type="primary" link @click="blameDel(scope.$index)">删除</el-button>
  145. </template>
  146. </el-table-column>
  147. </el-table>
  148. <ElButton type="primary" style="margin-top: 10px;" @click="blameListAdd">
  149. <template #icon>
  150. <el-icon>
  151. <Plus />
  152. </el-icon>
  153. </template>
  154. 添加一条
  155. </ElButton>
  156. </ElCol>
  157. </ElRow>
  158. </PageMain>
  159. <FixedActionBar>
  160. <ElButton @click='router.back()'>
  161. 取消
  162. </ElButton>
  163. <ElButton type="primary" @click="submitForm(productFormRef)">
  164. 保存
  165. </ElButton>
  166. <ElButton type="primary" @click="submitForm1(productFormRef)">
  167. 保存并继续添加
  168. </ElButton>
  169. </FixedActionBar>
  170. <el-dialog v-model="blamedialogVisible" title="添加驾意险责任" width="50%">
  171. <ElRow :gutter="20">
  172. <el-form :model="blameFrom" :inline="true" label-width="120px" :rules="blameFromrules" label-position="top"
  173. ref="blameFormRef" style="width: 100%;" :size="fromSize">
  174. <ElCol :md="24" :lg="12">
  175. <el-form-item label="保险责任" prop="blame">
  176. <el-input v-model="blameFrom.blame" placeholder="请输入保险责任" show-word-limit maxlength="50" />
  177. </el-form-item>
  178. </ElCol>
  179. <ElCol :md="24" :lg="12">
  180. <el-form-item label="责任编码" prop="blameCode">
  181. <el-input v-model="blameFrom.blameCode" placeholder="请输入责任编码" />
  182. </el-form-item>
  183. </ElCol>
  184. <ElCol :md="24" :lg="12">
  185. <el-form-item label="总保额" prop="blameCoverage">
  186. <el-input-number v-model="blameFrom.blameCoverage" :precision="2" controls-position="right"
  187. style="width: 100%;" :min="1" :max="9000000">
  188. <template #suffix>
  189. <span>元</span>
  190. </template>
  191. </el-input-number>
  192. </el-form-item>
  193. </ElCol>
  194. <ElCol :md="24" :lg="12">
  195. <el-form-item label="总保费" prop="blamePremium">
  196. <el-input-number v-model="blameFrom.blamePremium" :precision="2" controls-position="right"
  197. style="width: 100%;" :min="1" :max="9000000">
  198. <template #suffix>
  199. <span>元</span>
  200. </template>
  201. </el-input-number>
  202. </el-form-item>
  203. </ElCol>
  204. </el-form>
  205. </ElRow>
  206. <template #footer>
  207. <div class="dialog-footer">
  208. <el-button @click="blamedialogVisible = false">取消</el-button>
  209. <el-button type="primary" @click="blamesbimit(blameFormRef)">
  210. 保存
  211. </el-button>
  212. </div>
  213. </template>
  214. </el-dialog>
  215. </div>
  216. </template>
  217. <script lang="ts" setup>
  218. import { ref } from 'vue'
  219. import { FormRules, FormInstance, ComponentSize, ElMessage } from 'element-plus';
  220. import { useRoute } from 'vue-router';
  221. import api from '@/api';
  222. import router from '@/router';
  223. import * as Types from '@/api/types/productTypes';
  224. const route = useRoute();
  225. const companyId = ref(route.query.companyID as string)//保险公司ID
  226. const companyName = ref(route.query.companyName as string)//保险公司名称
  227. const id = ref(route.query.id as string)//id标识
  228. const type = ref(route.query.type as string)//id标识
  229. const productType = ref(route.query.productType as string)
  230. // const dictLists = ref<{ [key: string]: any[] }>({});
  231. const parentList = ref<parentList>();
  232. const productFormRef = ref<FormInstance>()
  233. const blameFormRef = ref<FormInstance>()
  234. const fromSize = ref<ComponentSize>('default')
  235. const blamedialogVisible = ref(false);
  236. const productform = reactive<Types.jyxConfigRequest>({
  237. id: "",
  238. productType: "",//产品类型
  239. parentId: "",//上级产品
  240. productName: "",//产品名称
  241. alias: '',//别名
  242. company: "",//保险公司
  243. companyName: "",
  244. productCode: "",//产品编码
  245. connectionMethod: "",//对接方式
  246. premiumSetting: "",//保费设置
  247. coverage: "",//总保额
  248. premium: "",//总保费
  249. settingList: [],
  250. blameList: [],
  251. })
  252. const blameFrom = reactive({//保险责任表单弹窗
  253. blame: "",
  254. blameCode: '',
  255. blameCoverage: 0,
  256. blamePremium: 0,
  257. })
  258. interface parentList {
  259. productName: string,
  260. id: string,
  261. [property: string]: any
  262. }
  263. const blameFromrules = ref<FormRules>({
  264. blame: [
  265. { required: true, trigger: 'blur', message: '请输入保险责任名称' },
  266. { max: 50, message: '限制50个字符', trigger: 'blur' },
  267. ],
  268. blameCode: [
  269. { required: true, trigger: 'blur', message: '请输入产品编码' },
  270. ],
  271. blameCoverage: [
  272. { required: true, trigger: 'blur', message: '请输入总保额' },
  273. ],
  274. blamePremium: [
  275. { required: true, trigger: 'blur', message: '请输入总保费' },
  276. ],
  277. });
  278. const productformRules = ref<FormRules>({
  279. productType: [
  280. { required: true, trigger: 'change', message: '请选择产品类型' },
  281. ],
  282. parentId: [
  283. { required: true, trigger: 'change', message: '请选择上级产品' },
  284. ],
  285. productName: [
  286. { required: true, trigger: 'blur', message: '请输入产品名称' },
  287. ],
  288. company: [
  289. { required: true, trigger: 'change', message: '请选择保险公司' },
  290. ],
  291. productCode: [
  292. { required: true, trigger: 'blur', message: '请输入产品编码' },
  293. ],
  294. connectionMethod: [
  295. { required: true, trigger: 'change', message: '请选择对接方式' },
  296. ],
  297. premiumSetting: [
  298. { required: true, trigger: 'change', message: '请选择保费设置' },
  299. ],
  300. coverage: [
  301. { required: true, trigger: 'blur', message: '请输入总保额' },
  302. ],
  303. premium: [
  304. { required: true, trigger: 'blur', message: '请输入总保费' },
  305. ],
  306. });
  307. onBeforeMount(() => {
  308. if (companyId.value) {
  309. productform.company = companyId.value;
  310. productform.companyName = companyName.value;
  311. }
  312. if (productType.value) {
  313. productform.productType = productType.value;
  314. productform.parentId = id.value;
  315. selectMainIns();
  316. }
  317. if (id.value && type.value == 'edit') {
  318. detalis(id.value);
  319. }
  320. });
  321. const settingListAdd = () => {
  322. productform.settingList.push({
  323. seats: 0,
  324. coverage: 0,
  325. premium: 0,
  326. })
  327. }
  328. const settingDel = (index: any) => {
  329. productform.settingList.splice(index, 1);
  330. }
  331. const blameListAdd = () => {
  332. blamedialogVisible.value = true;
  333. }
  334. const blameDel = (index: any) => {
  335. productform.blameList.splice(index, 1);
  336. }
  337. //类型事件
  338. const productTypeChange = (value: any) => {
  339. if (value == 2) {
  340. selectMainIns();
  341. }
  342. }
  343. //查询主险
  344. const selectMainIns = () => {
  345. api.product.selectMainInsurance(companyId.value).then((res: any) => {
  346. if (res.code == '200') {
  347. parentList.value = res.data;
  348. } else {
  349. }
  350. });
  351. }
  352. const detalis = (id: string) => {
  353. api.product.jygetById(id).then((res: any) => {
  354. if (res.code == '200') {
  355. selectMainIns();
  356. Object.keys(productform).forEach((key) => {
  357. if (res.data.hasOwnProperty(key)) {
  358. productform[key as keyof typeof productform] = res.data[key as keyof typeof productform];
  359. }
  360. });
  361. if (Array.isArray(res.data.settingList)) {
  362. productform.settingList = res.data.settingList.map((item: any) => ({
  363. seats: item.seats,
  364. coverage: item.coverage,
  365. premium: item.premium,
  366. }));
  367. }
  368. if (Array.isArray(res.data.blameList)) {
  369. productform.blameList = res.data.blameList.map((item: any) => ({
  370. blame: item.blame,
  371. blameCode: item.blameCode,
  372. blameCoverage: item.blameCoverage,
  373. blamePremium: item.blamePremium,
  374. }));
  375. }
  376. } else {
  377. }
  378. });
  379. }
  380. //字典信息处理
  381. // const dictType = (type: string) => {
  382. // api.toolApi.dictType({ dictCode: type }).then((res: any) => {
  383. // if (res.code == '200') {
  384. // dictLists.value[type + 'List'] = res.data.map((item: any) => {
  385. // return {
  386. // value: item.value,
  387. // label: item.label
  388. // };
  389. // });
  390. // }
  391. // });
  392. // }
  393. const submitForm = async (formEl: FormInstance | undefined) => {
  394. if (!formEl) return
  395. await formEl.validate((valid) => {
  396. if (valid) {
  397. if (id.value && type.value == 'edit') {
  398. api.product.jyxupdateById(productform).then((res: any) => {
  399. if (res.code == 200) {
  400. ElMessage({
  401. type: 'success',
  402. message: res.msg,
  403. plain: true,
  404. })
  405. router.back()
  406. }
  407. })
  408. } else {
  409. api.product.jyxConfigAdd(productform).then((res: any) => {
  410. if (res.code == 200) {
  411. ElMessage({
  412. type: 'success',
  413. message: res.msg,
  414. plain: true,
  415. })
  416. router.back()
  417. }
  418. })
  419. }
  420. } else {
  421. ElMessage({
  422. type: 'error',
  423. message: '信息不完整',
  424. plain: true,
  425. })
  426. }
  427. })
  428. }
  429. const submitForm1 = async (formEl: FormInstance | undefined) => {
  430. if (!formEl) return
  431. await formEl.validate((valid) => {
  432. if (valid) {
  433. if (id.value && type.value == 'edit') {
  434. api.product.jyxupdateById(productform).then((res: any) => {
  435. if (res.code == 200) {
  436. ElMessage({
  437. type: 'success',
  438. message: res.msg,
  439. plain: true,
  440. })
  441. router.push({
  442. name: 'reload',
  443. })
  444. }
  445. })
  446. } else {
  447. api.product.jyxConfigAdd(productform).then((res: any) => {
  448. if (res.code == 200) {
  449. ElMessage({
  450. type: 'success',
  451. message: res.msg,
  452. plain: true,
  453. })
  454. router.push({
  455. name: 'reload',
  456. })
  457. }
  458. })
  459. }
  460. } else {
  461. ElMessage({
  462. type: 'error',
  463. message: '信息不完整',
  464. plain: true,
  465. })
  466. }
  467. })
  468. }
  469. const blamesbimit = async (formEl: FormInstance | undefined) => {
  470. if (!formEl) return
  471. await formEl.validate((valid) => {
  472. if (valid) {
  473. productform.blameList.push({ ...blameFrom })
  474. blamedialogVisible.value = false;
  475. } else {
  476. ElMessage({
  477. type: 'error',
  478. message: '信息不完整',
  479. plain: true,
  480. })
  481. }
  482. })
  483. }
  484. </script>