InsuranceContractForm.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  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: 'date', style: { width: '100%' } },
  129. formItemAttributes: { label: '生效时间', prop: 'startTime' }
  130. },
  131. {
  132. name: 'el-date-picker',
  133. attributes: { disabled: this.disabled, type: 'date', 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 prop={keys[i]} label-width="0px" style="margin:0">
  192. {Math.ceil((formData[keys[i]] || 0) * (formData.policyPrice || 0)) / 100}
  193. </el-form-item>
  194. )
  195. } else {
  196. return (
  197. <el-form-item
  198. prop={keys[i]}
  199. rules={this.formRules.month1}
  200. label-width="0px"
  201. style="margin:0"
  202. >
  203. <el-input
  204. disabled={this.disabled}
  205. type="number"
  206. min={0}
  207. max={100}
  208. value={formData[keys[i]]}
  209. onInput={val => {
  210. formData[keys[i]] = val
  211. this.$refs?.formRef?.validateField([keys[i]], () => {})
  212. }}
  213. >
  214. <span slot="suffix">%</span>
  215. </el-input>
  216. </el-form-item>
  217. )
  218. }
  219. }
  220. })
  221. }
  222. return list
  223. })(this.monthKeys)
  224. ]}
  225. tableData={[{}, {}]}
  226. ></zj-table>
  227. </div>
  228. )
  229. }
  230. },
  231. {
  232. name: 'slot-component',
  233. md: 24,
  234. attributes: { disabled: this.disabled },
  235. formItemAttributes: {
  236. label: '保障范围',
  237. prop: 'policyRanges'
  238. },
  239. render: (h, { props }) => {
  240. var { formData } = props
  241. return (
  242. <zj-table
  243. columns={[
  244. ...(list => {
  245. return list.map(item => {
  246. return {
  247. columnAttributes: {
  248. label: item.name,
  249. prop: item.prop,
  250. width: item.prop === 'options' ? '80px' : ''
  251. },
  252. render: (h, { row, column, index }) => {
  253. return column.columnAttributes.prop === 'options' ? (
  254. this.type == 1 || this.type == 0 ? (
  255. <div style="box-sizing: border-box;padding: 0 6px;">
  256. <el-button
  257. type="text"
  258. onClick={() => {
  259. formData.policyRanges.push({ rangeName: '', rangeText: '' })
  260. }}
  261. >
  262. 添加
  263. </el-button>
  264. {formData.policyRanges.length > 1 ? (
  265. <el-button
  266. type="text"
  267. onClick={() => {
  268. formData.policyRanges.splice(index, 1)
  269. }}
  270. >
  271. 删除
  272. </el-button>
  273. ) : null}
  274. </div>
  275. ) : null
  276. ) : (
  277. <el-form-item
  278. label-width="0px"
  279. style="margin:0"
  280. prop={`policyRanges.${index}.${item.prop}`}
  281. rules={[{ required: true, message: '请输入', trigger: 'blur' }]}
  282. >
  283. <el-input
  284. disabled={this.disabled}
  285. value={row[item.prop]}
  286. onInput={val => {
  287. row[item.prop] = val
  288. this.$refs?.formRef?.validateField([`policyRanges.${index}.${item.prop}`], () => {})
  289. }}
  290. ></el-input>
  291. </el-form-item>
  292. )
  293. }
  294. }
  295. })
  296. })([
  297. { name: '名称', prop: 'rangeName' },
  298. { name: '内容', prop: 'rangeText' },
  299. { name: '操作', prop: 'options' }
  300. ])
  301. ]}
  302. tableData={formData.policyRanges}
  303. ></zj-table>
  304. )
  305. }
  306. },
  307. {
  308. name: 'el-input',
  309. attributes: { disabled: true },
  310. formItemAttributes: { label: '创建人', prop: 'createBy' }
  311. },
  312. {
  313. name: 'el-input',
  314. attributes: { disabled: true },
  315. formItemAttributes: { label: '创建时间', prop: 'createTime' }
  316. },
  317. {
  318. name: 'el-input',
  319. attributes: { disabled: true },
  320. formItemAttributes: { label: '修改人', prop: 'updateBy' }
  321. },
  322. {
  323. name: 'el-input',
  324. attributes: { disabled: true },
  325. formItemAttributes: { label: '修改时间', prop: 'updateTime' }
  326. }
  327. ]
  328. },
  329. formItems2() {
  330. return [
  331. {
  332. name: 'el-input',
  333. md: 24,
  334. attributes: { disabled: this.disabled },
  335. formItemAttributes: { label: '承保公司', prop: 'company' }
  336. },
  337. {
  338. name: 'slot-component',
  339. md: 24,
  340. attributes: { disabled: this.disabled },
  341. formItemAttributes: { label: '保单内容', prop: 'text' },
  342. render: (h, { props }) => {
  343. var { formData } = props
  344. return (
  345. <v-quill-editor
  346. disabled={this.disabled}
  347. value={formData.text}
  348. onInput={val => {
  349. formData.text = val
  350. }}
  351. ></v-quill-editor>
  352. )
  353. }
  354. }
  355. ]
  356. },
  357. items2() {
  358. return [
  359. {
  360. name: 'slot-component',
  361. md: 24,
  362. attributes: {},
  363. formItemAttributes: { label: '', 'label-width': '0px', prop: 'policyWebsits', rules: [] },
  364. render: (h, { props, onInput }) => {
  365. var { formData } = props
  366. return (
  367. <div>
  368. <div>
  369. <el-form
  370. size="mini"
  371. inline={true}
  372. value={this.formInline}
  373. onInput={v => {
  374. this.formInline = v
  375. }}
  376. label-width="0px"
  377. >
  378. <el-form-item label="">
  379. <el-input
  380. value={this.formInline.websitId}
  381. onInput={v => {
  382. this.formInline.websitId = v
  383. }}
  384. placeholder="网点编号"
  385. ></el-input>
  386. </el-form-item>
  387. <el-form-item label="">
  388. <el-input
  389. value={this.formInline.websitName}
  390. onInput={v => {
  391. this.formInline.websitName = v
  392. }}
  393. placeholder="网点名称"
  394. ></el-input>
  395. </el-form-item>
  396. <el-form-item>
  397. <el-button
  398. type="primary"
  399. onClick={() => {
  400. EventBus.$emit('handlePaginationCallBack22')
  401. }}
  402. >
  403. 查询
  404. </el-button>
  405. <el-button
  406. onClick={() => {
  407. this.formInline.websitId = ''
  408. this.formInline.websitName = ''
  409. this.$nextTick(() => {
  410. EventBus.$emit('handlePaginationCallBack22')
  411. })
  412. }}
  413. >
  414. 重置
  415. </el-button>
  416. </el-form-item>
  417. </el-form>
  418. </div>
  419. <pagingTransfer
  420. handlePaginationCallBackKey="handlePaginationCallBack22"
  421. value={this.formData.policyWebsits}
  422. onInput={v => {
  423. this.formData.policyWebsits = v
  424. }}
  425. left-columns={[
  426. { id: 'belongCompanyCode', label: '所属公司编号', width: '160' },
  427. { id: 'websitId', label: '网点编号', width: '120' },
  428. { id: 'websitName', label: '网点名称', width: '' }
  429. ]}
  430. right-columns={[
  431. { id: 'belongCompanyCode', label: '所属公司编号', width: '160' },
  432. { id: 'websitId', label: '网点编号', width: '120' },
  433. { id: 'websitName', label: '网点名称', width: '' }
  434. ]}
  435. show-pagination={false}
  436. pagination-call-back={this.paginationCallback}
  437. title-texts={['待选项', '已选项']}
  438. min-height="300px"
  439. table-row-key={row => row.websitId}
  440. />
  441. </div>
  442. )
  443. }
  444. }
  445. ]
  446. }
  447. },
  448. created() {
  449. // 获取详情
  450. if (this.type !== 0) {
  451. insureDetail({
  452. id: this.item.id
  453. }).then(res => {
  454. for (var key in res.data) {
  455. if (~this.monthKeys.indexOf(key)) {
  456. this.formData[key] = res.data[key] * 100
  457. } else if (key == 'policyRanges') {
  458. this.formData[key] = res?.data[key]?.length ? res.data[key] : [{ rangeName: '', rangeText: '' }]
  459. } else {
  460. this.formData[key] = res.data[key]
  461. }
  462. }
  463. })
  464. }
  465. },
  466. methods: {
  467. paginationCallback({ pageIndex, pageSize }) {
  468. return new Promise(resolve => {
  469. getWebsit({ ...this.formInline, attr: 'SELF' }).then(res => {
  470. resolve({
  471. total: res.data.filter(item => item.type !== 'B').length,
  472. data: res.data
  473. .filter(item => item.type !== 'B')
  474. .map(item => {
  475. return {
  476. ...item,
  477. websitName: item.name
  478. }
  479. })
  480. })
  481. })
  482. })
  483. },
  484. submit() {
  485. this.$refs['formRef'].validate(valid => {
  486. console.log(this.formData)
  487. if (valid) {
  488. ;(this.formData.id ? insureUpdate : insureAdd)({
  489. ...this.formData,
  490. startTime: dateFormat('YYYY-mm-dd HH:MM:SS', new Date(this.formData.startTime)),
  491. endTime: this.formData?.endTime
  492. ? `${dateFormat('YYYY-mm-dd HH:MM:SS', new Date(this.formData.endTime))?.split(' ')?.[0]} 23:59:59`
  493. : '',
  494. ...(() => {
  495. var obj = {}
  496. for (var key of this.monthKeys) {
  497. obj[key] = this.formData[key] / 100
  498. }
  499. return obj
  500. })()
  501. }).then(res => {
  502. this.$message({
  503. type: 'success',
  504. message: `保存成功!`
  505. })
  506. this.$emit('success')
  507. })
  508. } else {
  509. console.log('error submit!!')
  510. return false
  511. }
  512. })
  513. },
  514. reset() {
  515. Object.assign(this.$data, this.$options.data())
  516. }
  517. }
  518. }
  519. </script>
  520. <style lang="scss" scoped></style>