index.js 4.42 KB
const EventEmitter = require('events')
const config = require('config-lite')({
  config_basedir: __dirname,
  config_dir: 'config'
})
// const fs = require('fs')
const PDFGenerator = require('./pdfGenerator')
const moment = require('moment')
const FormData = require('form-data')
const axios = require('axios')
const BorrowList = require('../models').BorrowList
const User = require('../models').User

class AgreementCenter {
  constructor() {
    this.listener = new EventEmitter()
    this.init()
  }
  init() {
    this.listener.on('new', async (item) => {
      try {
        const listId = item.id
        if (!listId)throw new Error('need borrow list id')
        const list = await BorrowList.findOne({
          where: {id: listId, status: '已生效'},
          attributes: ['id', 'listNo', 'amount', 'startDate', 'endDate', 'rate', 'usage', 'status'],
          include: [{
            model: User,
            as: 'Borrower',
            attributes: ['id', 'name', 'phone', 'idNo']
          }, {
            model: User,
            as: 'Creditor',
            attributes: ['id', 'name', 'phone', 'idNo']
          }]
        })
        if (!list) throw new Error('符合条件的借条不存在')
        const data = this.buildLoanData(list)
        const loanGenerator = new PDFGenerator('loan', data)
        const serviceGenerator = new PDFGenerator('service', data)
        const [loanFile, serviceFile] = await Promise.all([
          loanGenerator.generate(),
          serviceGenerator.generate()          
        ])
        // console.log(loanFile)
        const submitLoan = await this.submit('loan', loanFile, data)
        const submitService = await this.submit('service', serviceFile, data)
        console.log(submitLoan.data)
        console.log(submitService.data)
        if (submitLoan.data.success) {
          await list.update({agreementSaveStatus: '成功'})          
        } else {
          await list.update({agreementSaveStatus: '失败'})                    
        }
      } catch (e) {
        console.log(e)
      }
    })
  }
  buildLoanData(list) {
    return {
      listId: list.listNo,
      creditName: list.Creditor.name,
      creditId: list.Creditor.idNo,
      creditPhone: list.Creditor.phone,
      borrowName: list.Borrower.name,
      borrowId: list.Borrower.idNo,
      borrowPhone: list.Borrower.phone,
      listAmount: list.amount,
      listStartDay: moment(list.startDate).format('YYYY-MM-DD'),
      listEndDay: moment(list.endDate).format('YYYY-MM-DD'),
      listRate: Math.floor(list.rate * 100),
      listUsage: list.usage,
      listTotal: Math.floor((list.amount + (list.amount * list.rate) * moment(list.endDate).diff(moment(list.startDate), 'days') / 365) * 100) / 100,
      listDate: moment().format('YYYY-MM-DD')
    }
  }
  emit(eventName, ...args) {
    this.listener.emit(eventName, ...args)
  }
  newList(id) {
    this.emit('new', {id: id})
  }
  async submit(type, buffer, data) {
    let json = {
      agreementName: type === 'loan' ? '借款协议' : '居间合作协议',
      agreementAmount: data.listTotal.toString(),
      data: [{
        name: data.creditName,
        idNo: data.creditId,
        type: 'person',
        mobile: data.creditPhone,
        page: type === 'loan' ? '3' : '2',
        offsetX: '0.2',
        offsetY: type === 'loan' ? '0.37' : '0.87'
      }, {
        name: data.borrowName,
        idNo: data.borrowId,
        type: 'person',
        mobile: data.borrowPhone,
        page: type === 'loan' ? '3' : '2',
        offsetX: '0.2',
        offsetY: type === 'loan' ? '0.43' : '0.93'
      }]
    }
    if (type === 'service') {
      json.data.push({
        type: 'company',
        page: '2',
        offsetX: '0.4',
        offsetY: '0.95'
      })
    }
    json = JSON.stringify(json)
    let form = new FormData()
    form.append('json', json)
    console.log(buffer.length)
    form.append('file', buffer, {
      filename: 'loanAgreement.pdf', // ... or:
      filepath: './loanAgreement.pdf',
      contentType: 'application/pdf',
      knownLength: buffer.length
    })
    let formHead = form.getHeaders()
    let result = await axios.post(`http://${config.agreementHelper}:7111/sign/contractSign`, form, {headers: formHead})
    // let result = await axios.post('http://10.168.169.151:7111/sign/contractSign', form, {headers: formHead})
    return result
  }
}
const center = new AgreementCenter()
center.emit('new', {id:'ee8aec3a-7d60-4dcf-9f4c-d3ebf85429ab'})
module.exports = center