Odoo开发之接口实现

Posted by Ethan on 2019-09-21

接口实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# -*- coding: utf-8 -*-
import json
import logging
from odoo.http import Controller, route, request

logger = logging.getLogger(__name__)
import sys

reload(sys)
sys.setdefaultencoding('utf-8')


class OaInterfaceController(Controller):
"""
OA向外部提供的接口
包括修改付款单的单据状态
"""
@route('/oa/interface/payment/update/state', type='json', auth='none', methods=['get', 'post'], csrf=False)
def oa_interface_payment_update_state(self):
"""
本接口用于外部系统调用时根据传递的单据编号修改付款单的状态
数据传递格式:json
json_data = {
"source_number": "单据编号",
"payment_state": "单据状态",
}
返回数据格式:
{"code": 返回编号, "message": "消息"}
:return:
"""
logging.info(u"-----检测到外部系统正在请求修改付款单状态-----")
json_str = request.jsonrequest
if not json_str:
return json.dumps({"state": '1001', "message": u"未接收到任何JSON数据"}, ensure_ascii=False)
try:
source_number = json_str['source_number']
payment_state = json_str['state']
paied_money = json_str['paied_money']
except KeyError:
return json.dumps(({"state": '1002', "message": u"没有正确传递参数"}), ensure_ascii=False)
payment = request.env['oa.interface.bank'].sudo().search([('source_number', '=', source_number)], limit=1)
if not payment:
return json.dumps({"state": '1003', "message": u"没有找到编号{}的付款单".format(source_number)}, ensure_ascii=False)
# 如果全部支付完,则将OA付款单状态更新为02交易成功
# 每一次支付成功后,反写OA付款单的“已付款金额”字段
# 每一次操作以后,反写OA付款单的每条明细的状态
# @author: fengjiqiang@inspur.com
if "payment_state" in json_str:
payment.write({'state': '02'})
payment.write({"paied_money": paied_money})
for line in range(len(payment_state)):
payment.payment_line_ids[line].write({'state': payment_state[line]})
# end
return json.dumps({"code": '0000', "message": u"执行成功!"})

使用接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@api.multi
def update_payment(self):
"""反写OA付款单"""
update_payment_state_url = self.env['ir.values'].get_default('interface.bank.settings', 'update_payment_state')
if not update_payment_state_url:
raise UserError(u"请先配置银企直连付款状态反写OA付款单!")
for res in self:
payment_line_sets = []
for line in res.payment_line_ids:
if line.state == 'unpaied':
payment_line_sets.append("submitted")
else:
payment_line_sets.append(line.state)
# 封装请求数据
pay_data = {
"source_number": res.source_number if res.source_number else '',
"paied_money": res.paied_money,
"state": payment_line_sets
}
if res.state == '02':
pay_data['payment_state'] = '02'
try:
logging.info(pay_data)
headers = {'Content-Type': 'application/json'}
result = requests.post(url=update_payment_state_url, headers=headers, data=json.dumps(pay_data))
except TypeError as e:
raise UserError(u"TypeError异常错误,可能原因是付款状态更新地址不正确!返回信息:{}".format(e.message))
except Exception as e:
raise UserError(u'付款状态更新失败: 失败原因:'.format(e.message))
try:
result = json.loads(result.text)
result = json.loads(result.get('result'))
logging.info("result:{}".format(result))
res.message_post(body=result['message'], message_type='notification')
if result.get('code') != '0000':
raise UserError(u"付款状态反写失败,错误详情:{}".format(result.get('message')))
except KeyError as e:
raise UserError(u"KeyError异常错误:{}".format(e.message))
except TypeError as e:
raise UserError(u"TypeError OA系统返回了错误信息!返回信息:{}".format(e.message))
self._compute_paied_money()