InsuranceContractForm.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. <template>
  2. <div>
  3. <zj-form-container ref="formRef" :formData="formData" :formRules="formRules">
  4. <zj-form-module title="保险基础信息" label-width="110px" :formData="formData" :formItems="formItems" :column="3">
  5. </zj-form-module>
  6. <zj-form-module title="保单内容" label-width="100px" :formData="formData" :formItems="formItems2" :column="3">
  7. </zj-form-module>
  8. <zj-form-module title="网点信息" label-width="0px" :formData="formData" :formItems="items2"> </zj-form-module>
  9. </zj-form-container>
  10. <div v-if="type === 0 || type === 1" style="text-align: right">
  11. <el-button size="mini" @click="submit">提交</el-button>
  12. <el-button size="mini" @click="reset">重置</el-button>
  13. </div>
  14. </div>
  15. </template>
  16. <script>
  17. import { insureDetail, insureAdd, insureUpdate } from '@/api/InsuranceManagement.js'
  18. import { dateFormat } from '@/utils/util'
  19. import pagingTransfer from '@/components/paging-transfer.vue'
  20. import { EventBus } from '@/utils/eventBus'
  21. import { required } from '@/components/template/rules_verify.js'
  22. import { getWebsit } from '@/api/customerManagement.js'
  23. export default {
  24. props: {
  25. type: {
  26. type: Number,
  27. default: null
  28. },
  29. item: {
  30. type: Object,
  31. default: null
  32. }
  33. },
  34. data() {
  35. return {
  36. disabled: this.type === 2,
  37. // 表单数据
  38. formData: {
  39. policyName: '',
  40. policyNumber: '',
  41. policyPrice: '',
  42. startTime: '',
  43. endTime: '',
  44. policyStartTime: '',
  45. isBuy: 'YES',
  46. company: '',
  47. text: '',
  48. month1: '',
  49. month2: '',
  50. month3: '',
  51. month4: '',
  52. month5: '',
  53. month6: '',
  54. month7: '',
  55. month8: '',
  56. month9: '',
  57. month10: '',
  58. month11: '',
  59. month12: '',
  60. policyRanges: [{ rangeName: '', rangeText: '' }],
  61. policyWebsits: [],
  62. type: ''
  63. },
  64. formRules: {
  65. text: [{ required: true, message: '请输入', trigger: 'blur' }],
  66. policyName: [{ required: true, message: '请输入', trigger: 'blur' }],
  67. policyNumber: [{ required: true, message: '请输入', trigger: 'blur' }],
  68. policyPrice: [{ required: true, message: '请输入', trigger: 'blur' }],
  69. startTime: [{ required: true, message: '请输入', trigger: 'blur' }],
  70. endTime: [{ required: true, message: '请输入', trigger: 'blur' }],
  71. policyStartTime: [{ required: true, message: '请输入', trigger: 'blur' }],
  72. company: [{ required: true, message: '请输入', trigger: 'blur' }],
  73. month1: [
  74. { required: true, message: '全部必填', trigger: 'blur' },
  75. {
  76. required: true,
  77. validator: (rule, value, callback) => {
  78. if (value === '') {
  79. callback(new Error('请输入'))
  80. } else if (value > 100 || value < 0) {
  81. callback(new Error('百分比必须为0到100的数值'))
  82. } else {
  83. callback()
  84. }
  85. },
  86. trigger: 'blur'
  87. }
  88. ]
  89. },
  90. monthKeys: [
  91. 'month1',
  92. 'month2',
  93. 'month3',
  94. 'month4',
  95. 'month5',
  96. 'month6',
  97. 'month7',
  98. 'month8',
  99. 'month9',
  100. 'month10',
  101. 'month11',
  102. 'month12'
  103. ],
  104. formInline: {
  105. websitId: '',
  106. websitName: ''
  107. },
  108. itemsList: []
  109. }
  110. },
  111. computed: {
  112. formItems() {
  113. return [
  114. {
  115. name: 'el-input',
  116. attributes: { disabled: this.disabled },
  117. formItemAttributes: { label: '保单名称', prop: 'policyName' }
  118. },
  119. {
  120. name: 'el-input',
  121. attributes: { disabled: this.disabled },
  122. formItemAttributes: { label: '保单编号', prop: 'policyNumber' }
  123. },
  124. {
  125. name: 'el-input',
  126. attributes: { disabled: this.disabled },
  127. formItemAttributes: { label: '保单金额', prop: 'policyPrice' }
  128. },
  129. {
  130. name: 'el-date-picker',
  131. attributes: { disabled: this.disabled, type: 'date', style: { width: '100%' } },
  132. formItemAttributes: { label: '生效时间', prop: 'startTime' }
  133. },
  134. {
  135. name: 'el-date-picker',
  136. attributes: { disabled: this.disabled, type: 'date', style: { width: '100%' } },
  137. formItemAttributes: { label: '失效时间', prop: 'endTime' }
  138. },
  139. {
  140. name: 'el-date-picker',
  141. attributes: {
  142. disabled: this.disabled,
  143. type: 'date',
  144. 'value-format': 'yyyy-MM-dd HH:mm:ss',
  145. style: { width: '100%' }
  146. },
  147. formItemAttributes: { label: '开始购买时间', prop: 'policyStartTime' }
  148. },
  149. {
  150. name: 'el-radio',
  151. options: [
  152. {
  153. label: '是',
  154. value: 'YES'
  155. },
  156. {
  157. label: '否',
  158. value: 'NO'
  159. }
  160. ],
  161. attributes: {
  162. disabled: this.disabled
  163. },
  164. formItemAttributes: {
  165. label: '是否允许购买',
  166. prop: 'isBuy',
  167. rules: [{ required: true, message: '请选择', trigger: 'blur' }]
  168. }
  169. },
  170. {
  171. md: 6,
  172. name: 'el-select',
  173. options: [
  174. { value: 'AC', label: '意外险' },
  175. { value: 'DS', label: '第三者责任险' }
  176. ],
  177. attributes: { placeholder: '请选择', filterable: true, clearable: true },
  178. formItemAttributes: {
  179. label: '保单类型',
  180. prop: 'type',
  181. rules: [...required]
  182. }
  183. },
  184. {
  185. name: 'slot-component',
  186. md: 24,
  187. attributes: { disabled: this.disabled },
  188. formItemAttributes: { label: '保费率', prop: 'month1' },
  189. render: (h, { props }) => {
  190. var { formData } = props
  191. return (
  192. <div>
  193. <zj-table
  194. columns={[
  195. {
  196. columnAttributes: {
  197. label: '保险期间(个月)',
  198. width: '110px'
  199. },
  200. render: (h, { row, column, index }) => {
  201. return (
  202. <div style="box-sizing: border-box;padding: 0 6px;">
  203. {index ? '保险金额(元)' : '年费率百分比'}
  204. </div>
  205. )
  206. }
  207. },
  208. ...(keys => {
  209. var list = []
  210. for (let i = 0; i < keys.length; i++) {
  211. list.push({
  212. columnAttributes: {
  213. label: i + 1 + ''
  214. },
  215. render: (h, { row, column, index }) => {
  216. if (index) {
  217. return (
  218. <el-form-item prop={keys[i]} label-width="0px" style="margin:0">
  219. {Math.ceil((formData[keys[i]] || 0) * (formData.policyPrice || 0)) / 100}
  220. </el-form-item>
  221. )
  222. } else {
  223. return (
  224. <el-form-item
  225. prop={keys[i]}
  226. rules={this.formRules.month1}
  227. label-width="0px"
  228. style="margin:0"
  229. >
  230. <el-input
  231. disabled={this.disabled}
  232. type="number"
  233. min={0}
  234. max={100}
  235. value={formData[keys[i]]}
  236. onInput={val => {
  237. formData[keys[i]] = val
  238. this.$refs?.formRef?.validateField([keys[i]], () => {})
  239. }}
  240. >
  241. <span slot="suffix">%</span>
  242. </el-input>
  243. </el-form-item>
  244. )
  245. }
  246. }
  247. })
  248. }
  249. return list
  250. })(this.monthKeys)
  251. ]}
  252. tableData={[{}, {}]}
  253. ></zj-table>
  254. </div>
  255. )
  256. }
  257. },
  258. {
  259. name: 'slot-component',
  260. md: 24,
  261. attributes: { disabled: this.disabled },
  262. formItemAttributes: {
  263. label: '保障范围',
  264. prop: 'policyRanges'
  265. },
  266. render: (h, { props }) => {
  267. var { formData } = props
  268. return (
  269. <zj-table
  270. columns={[
  271. ...(list => {
  272. return list.map(item => {
  273. return {
  274. columnAttributes: {
  275. label: item.name,
  276. prop: item.prop,
  277. width: item.prop === 'options' ? '80px' : ''
  278. },
  279. render: (h, { row, column, index }) => {
  280. return column.columnAttributes.prop === 'options' ? (
  281. this.type == 1 || this.type == 0 ? (
  282. <div style="box-sizing: border-box;padding: 0 6px;">
  283. <el-button
  284. type="text"
  285. onClick={() => {
  286. formData.policyRanges.push({ rangeName: '', rangeText: '' })
  287. }}
  288. >
  289. 添加
  290. </el-button>
  291. {formData.policyRanges.length > 1 ? (
  292. <el-button
  293. type="text"
  294. onClick={() => {
  295. formData.policyRanges.splice(index, 1)
  296. }}
  297. >
  298. 删除
  299. </el-button>
  300. ) : null}
  301. </div>
  302. ) : null
  303. ) : (
  304. <el-form-item
  305. label-width="0px"
  306. style="margin:0"
  307. prop={`policyRanges.${index}.${item.prop}`}
  308. rules={[{ required: true, message: '请输入', trigger: 'blur' }]}
  309. >
  310. <el-input
  311. disabled={this.disabled}
  312. value={row[item.prop]}
  313. onInput={val => {
  314. row[item.prop] = val
  315. this.$refs?.formRef?.validateField([`policyRanges.${index}.${item.prop}`], () => {})
  316. }}
  317. ></el-input>
  318. </el-form-item>
  319. )
  320. }
  321. }
  322. })
  323. })([
  324. { name: '名称', prop: 'rangeName' },
  325. { name: '内容', prop: 'rangeText' },
  326. { name: '操作', prop: 'options' }
  327. ])
  328. ]}
  329. tableData={formData.policyRanges}
  330. ></zj-table>
  331. )
  332. }
  333. },
  334. {
  335. name: 'el-input',
  336. attributes: { disabled: true },
  337. formItemAttributes: { label: '创建人', prop: 'createBy' }
  338. },
  339. {
  340. name: 'el-input',
  341. attributes: { disabled: true },
  342. formItemAttributes: { label: '创建时间', prop: 'createTime' }
  343. },
  344. {
  345. name: 'el-input',
  346. attributes: { disabled: true },
  347. formItemAttributes: { label: '修改人', prop: 'updateBy' }
  348. },
  349. {
  350. name: 'el-input',
  351. attributes: { disabled: true },
  352. formItemAttributes: { label: '修改时间', prop: 'updateTime' }
  353. }
  354. ]
  355. },
  356. formItems2() {
  357. return [
  358. {
  359. name: 'el-input',
  360. md: 24,
  361. attributes: { disabled: this.disabled },
  362. formItemAttributes: { label: '承保公司', prop: 'company' }
  363. },
  364. {
  365. name: 'slot-component',
  366. md: 24,
  367. attributes: { disabled: this.disabled },
  368. formItemAttributes: { label: '保单内容', prop: 'text' },
  369. render: (h, { props }) => {
  370. var { formData } = props
  371. return (
  372. <v-quill-editor
  373. disabled={this.disabled}
  374. value={formData.text}
  375. onInput={val => {
  376. formData.text = val
  377. }}
  378. ></v-quill-editor>
  379. )
  380. }
  381. }
  382. ]
  383. },
  384. items2() {
  385. return [
  386. {
  387. name: 'slot-component',
  388. md: 24,
  389. attributes: {},
  390. formItemAttributes: { label: '', 'label-width': '0px', prop: 'policyWebsits', rules: [] },
  391. render: (h, { props, onInput }) => {
  392. var { formData } = props
  393. return (
  394. <div>
  395. <div>
  396. <el-form
  397. size="mini"
  398. inline={true}
  399. value={this.formInline}
  400. onInput={v => {
  401. this.formInline = v
  402. }}
  403. label-width="0px"
  404. >
  405. <el-form-item label="">
  406. <el-input
  407. value={this.formInline.websitId}
  408. onInput={v => {
  409. this.formInline.websitId = v
  410. }}
  411. placeholder="网点编号"
  412. ></el-input>
  413. </el-form-item>
  414. <el-form-item label="">
  415. <el-input
  416. value={this.formInline.websitName}
  417. onInput={v => {
  418. this.formInline.websitName = v
  419. }}
  420. placeholder="网点名称"
  421. ></el-input>
  422. </el-form-item>
  423. <el-form-item>
  424. <el-button
  425. type="primary"
  426. onClick={() => {
  427. EventBus.$emit('handlePaginationCallBack22')
  428. }}
  429. >
  430. 查询
  431. </el-button>
  432. <el-button
  433. onClick={() => {
  434. this.formInline.websitId = ''
  435. this.formInline.websitName = ''
  436. this.$nextTick(() => {
  437. EventBus.$emit('handlePaginationCallBack22')
  438. })
  439. }}
  440. >
  441. 重置
  442. </el-button>
  443. </el-form-item>
  444. </el-form>
  445. </div>
  446. <pagingTransfer
  447. handlePaginationCallBackKey="handlePaginationCallBack22"
  448. value={this.formData.policyWebsits}
  449. onInput={v => {
  450. this.formData.policyWebsits = v
  451. }}
  452. left-columns={[
  453. { id: 'belongCompanyCode', label: '所属公司编号', width: '160' },
  454. { id: 'websitId', label: '网点编号', width: '120' },
  455. { id: 'websitName', label: '网点名称', width: '' }
  456. ]}
  457. right-columns={[
  458. { id: 'belongCompanyCode', label: '所属公司编号', width: '160' },
  459. { id: 'websitId', label: '网点编号', width: '120' },
  460. { id: 'websitName', label: '网点名称', width: '' }
  461. ]}
  462. show-pagination={false}
  463. pagination-call-back={this.paginationCallback}
  464. title-texts={['待选项', '已选项']}
  465. min-height="300px"
  466. table-row-key={row => row.websitId}
  467. />
  468. </div>
  469. )
  470. }
  471. }
  472. ]
  473. }
  474. },
  475. created() {
  476. // 获取详情
  477. if (this.type !== 0) {
  478. insureDetail({
  479. id: this.item.id
  480. }).then(res => {
  481. for (var key in res.data) {
  482. if (~this.monthKeys.indexOf(key)) {
  483. this.formData[key] = res.data[key] * 100
  484. } else if (key == 'policyRanges') {
  485. this.formData[key] = res?.data[key]?.length ? res.data[key] : [{ rangeName: '', rangeText: '' }]
  486. } else {
  487. this.formData[key] = res.data[key]
  488. }
  489. }
  490. })
  491. }
  492. },
  493. methods: {
  494. paginationCallback({ pageIndex, pageSize }) {
  495. return new Promise(resolve => {
  496. getWebsit({ ...this.formInline, attr: 'SELF' }).then(res => {
  497. resolve({
  498. total: res.data.filter(item => item.type !== 'B').length,
  499. data: res.data
  500. .filter(item => item.type !== 'B')
  501. .map(item => {
  502. return {
  503. ...item,
  504. websitName: item.name
  505. }
  506. })
  507. })
  508. })
  509. })
  510. },
  511. submit() {
  512. this.$refs['formRef'].validate(valid => {
  513. console.log(this.formData)
  514. if (valid) {
  515. ;(this.formData.id ? insureUpdate : insureAdd)({
  516. ...this.formData,
  517. startTime: dateFormat('YYYY-mm-dd HH:MM:SS', new Date(this.formData.startTime)),
  518. endTime: this.formData?.endTime
  519. ? `${dateFormat('YYYY-mm-dd HH:MM:SS', new Date(this.formData.endTime))?.split(' ')?.[0]} 23:59:59`
  520. : '',
  521. ...(() => {
  522. var obj = {}
  523. for (var key of this.monthKeys) {
  524. obj[key] = this.formData[key] / 100
  525. }
  526. return obj
  527. })()
  528. }).then(res => {
  529. this.$message({
  530. type: 'success',
  531. message: `保存成功!`
  532. })
  533. this.$emit('success')
  534. })
  535. } else {
  536. console.log('error submit!!')
  537. return false
  538. }
  539. })
  540. },
  541. reset() {
  542. Object.assign(this.$data, this.$options.data())
  543. }
  544. }
  545. }
  546. </script>
  547. <style lang="scss" scoped></style>