InsuranceContractForm.vue 18 KB

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