No Description

contract_mp_views.py 7.3KB

    # -*- coding: utf-8 -*- import base64 import json import requests from django_logit import logit from django_response import response from TimeConvert import TimeConvert as tc from account.models import LensmanInfo from apps.contract.models import LensmanContributionContractInfo from apps.lensman.activity.models import LensmanContributionActivityIncomeExpensesInfo from member.models import MemberActivityContributionInfo from utils.redis.rimage import get_images_data from utils.tencentcloud.ess import (callback_decode, create_document, create_flow, create_scheme_url, start_flow, test_upload_document_files, upload_document_files) @logit(res=True) def get_contribtion_contract_status_api(request): user_id = request.POST.get('user_id', '') activity_id = request.POST.get('activity_id', '') contribution_id = request.POST.get('contribution_id', '') try: contract = LensmanContributionContractInfo.objects.get(user_id=user_id, activity_id=activity_id, contribution_id=contribution_id) except LensmanContributionContractInfo.DoesNotExist: return response(404, 'Contract Not Found', '合同不存在') return response(200, data={ 'contract_status': contract.contract_status, }) @logit(res=True) def get_contribtion_contract_api(request): user_id = request.POST.get('user_id', '') lensman_id = request.POST.get('lensman_id', '') activity_id = request.POST.get('activity_id', '') contribution_id = request.POST.get('contribution_id', '') lensman = LensmanInfo.objects.get(lensman_id=lensman_id) contract, _ = LensmanContributionContractInfo.objects.update_or_create( user_id=user_id, lensman_id=lensman_id, activity_id=activity_id, contribution_id=contribution_id) file_ids = upload_contribution_images(contribution_id) flow_id = create_contribution_contract_flow(lensman) contract.flow_id = flow_id contract.save() document_id, fields = create_contribution_contract_document(lensman, contribution_id, file_ids, flow_id) contract.contract_content_fields = fields contract.document_id = document_id contract.save() # 发起签署流程 flow_status = start_contribution_contract_flow(flow_id) scheme_url = get_contribtion_contract_sign_mppath(lensman, flow_id) return response(200, data={ 'scheme_url': scheme_url }) def generate_file_from_qiniu(file_url): try: data = requests.get(file_url).content data = base64.b64encode(data).decode('utf-8') except Exception: data = None return data def generate_files_from_qiniu(file_urls): files = [] for file_url in file_urls: file_b64str = generate_file_from_qiniu(file_url) if not file_b64str: continue files.append({ 'FileBody': file_b64str, 'FileName': file_url.split('/')[-1] }) return files def upload_contribution_images(contribution_id): # 上传MemberActivityContributionInfo图片 https://qian.tencent.com/developers/companyApis/templatesAndFiles/UploadFiles contribtuon = MemberActivityContributionInfo.objects.get(contribution_id=contribution_id) # TODO: 从 MemberActivityContributionInfo 生成 files 对象 file_urls = [image['image_url'] for image in contribtuon.images] file_names = [file_url.split('/')[-1] for file_url in file_urls] file_type = file_names[0].split('.')[-1] files = get_images_data(file_names) # Redis 已无缓存的数据 if len(files) != len(file_names): files = generate_files_from_qiniu(file_urls) # files = [ # { # "FileBody": "文件base64编码,不含逗号前字符,即data:image/png;base64,", # "FileName": "test.png" # } # ] # file_type = 'png' upload_files_result = upload_document_files(files, file_type=file_type) # upload_files_result = test_upload_document_files(files, file_type=file_type) return upload_files_result.FileIds def create_contribution_contract_flow(lensman): # 创建签署流程 https://qian.tencent.com/developers/companyApis/startFlows/CreateFlow # 创建签署流程参数 Operator FlowName = lensman.identity_card_name + u"的投稿合同" + tc.local_string(format='%Y%m%d') FlowType = u"活动投稿授权书" Approvers = [{ "ApproverType": 1, "Required": True, "NotifyType": None, "ApproverMobile": lensman.phone, "ApproverName": lensman.identity_card_name, "ApproverIdCardType": "ID_CARD", "ApproverIdCardNumber": lensman.identity_card_number, }] create_flow_result = create_flow(flow_name=FlowName, flow_type=FlowType, approvers=Approvers) return create_flow_result.FlowId def create_contribution_contract_document(lensman, contribution_id, file_ids, FlowId): # 创建电子签文档 https://qian.tencent.com/developers/companyApis/startFlows/CreateDocument income = LensmanContributionActivityIncomeExpensesInfo.objects.get(contribution_id=contribution_id, lensman_id=lensman.lensman_id) FormFields = [{ "ComponentId": "ComponentId_0", "ComponentValue": lensman.identity_card_name }, { "ComponentId": "ComponentId_1", "ComponentValue": lensman.identity_card_number, }, { "ComponentId": "ComponentId_2", "ComponentValue": str(income.amount), }, { "ComponentId": "ComponentId_3", "ComponentValue": "零", }] for i, file_id in enumerate(file_ids): FormFields.append({ "ComponentId": "ComponentId_" + str(37 + i), "ComponentValue": file_id, }) create_document_result = create_document(flow_id=FlowId, form_fields=FormFields) document_id = create_document_result.DocumentId return document_id, FormFields def start_contribution_contract_flow(FlowId): # 发起签署流程 https://qian.tencent.com/developers/companyApis/startFlows/StartFlow start_flow_result = start_flow(flow_id=FlowId) return start_flow_result.Status def get_contribtion_contract_sign_mppath(lensman, FlowId): # 获取签署链接 https://qian.tencent.com/developers/companyApis/startFlows/CreateSchemeUrl create_scheme_url_result = create_scheme_url(flow_id=FlowId, name=lensman.identity_card_name, mobile=lensman.phone, card_type='ID_CARD', card_number=lensman.identity_card_number) return create_scheme_url_result.SchemeUrl @logit(body=True, res=True) def ess_callback(request): # curl http://127.0.0.1:8888/api/mp/ess/callback -H 'Content-type: application/json' -X POST -d '{"encrypt":"62KE4r5Wz0yHzEpMOwVRbM1KV0"}' data = json.loads(request.body) data = callback_decode(data['encrypt']) # https://qian.tencent.com/developers/company/callback_types_contracts_sign MsgType = data.get('MsgType') if MsgType == 'FlowStatusChange': MsgData = data.get('MsgData', {}) FlowId = MsgData.get('FlowId') # DocumentId = MsgData.get('DocumentId') FlowCallbackStatus = MsgData.get('FlowCallbackStatus', -1) Approvers = MsgData.get('Approvers') or [{}] ApproveCallbackStatus = Approvers[-1].get('ApproveCallbackStatus', -1) LensmanContributionContractInfo.objects.filter(flow_id=FlowId).update(tencent_contract_status=FlowCallbackStatus, tencent_approve_status=ApproveCallbackStatus) return response()