| @@ -5,10 +5,12 @@ from django_logit import logit | ||
| 5 | 5 | from django_response import response | 
| 6 | 6 | from TimeConvert import TimeConvert as tc | 
| 7 | 7 |  | 
| 8 | +from account.models import LensmanInfo | |
| 8 | 9 | from apps.contract.models import LensmanContributionContractInfo | 
| 9 | 10 | from apps.lensman.activity.models import LensmanContributionActivityIncomeExpensesInfo | 
| 10 | -from account.models import LensmanInfo | |
| 11 | 11 | from member.models import MemberActivityContributionInfo | 
| 12 | +from utils.tencentcloud.ess import (create_document, create_flow, create_scheme_url, start_flow, | |
| 13 | + test_upload_document_files, upload_document_files) | |
| 12 | 14 |  | 
| 13 | 15 |  | 
| 14 | 16 | @logit(res=True) | 
| @@ -25,7 +27,7 @@ def get_contribtion_contract_api(request): | ||
| 25 | 27 |  | 
| 26 | 28 | file_ids = upload_contribution_images(contribtuon_id) | 
| 27 | 29 |  | 
| 28 | -    operator =  { | |
| 30 | +    operator = { | |
| 29 | 31 | "UserId": settings.CONTRACT_LENSMAN_CONTRIBUTION_OPERATOR_ID | 
| 30 | 32 | } | 
| 31 | 33 |  | 
| @@ -38,8 +40,8 @@ def get_contribtion_contract_api(request): | ||
| 38 | 40 | contract.document_id = document_id | 
| 39 | 41 | contract.save() | 
| 40 | 42 |  | 
| 41 | - # TODO : 发起签署流程 | |
| 42 | - start_contribution_contract_flow(flow_id, operator) | |
| 43 | + # 发起签署流程 | |
| 44 | + flow_status = start_contribution_contract_flow(flow_id, operator) | |
| 43 | 45 |  | 
| 44 | 46 | scheme_url = get_contribtion_contract_sign_mppath(operator, lensman, flow_id) | 
| 45 | 47 |  | 
| @@ -50,35 +52,48 @@ def get_contribtion_contract_api(request): | ||
| 50 | 52 |  | 
| 51 | 53 |  | 
| 52 | 54 | def upload_contribution_images(contribtuon_id): | 
| 53 | - # TODO : 上传MemberActivityContributionInfo图片 https://qian.tencent.com/developers/companyApis/templatesAndFiles/UploadFiles | |
| 55 | + # 上传MemberActivityContributionInfo图片 https://qian.tencent.com/developers/companyApis/templatesAndFiles/UploadFiles | |
| 54 | 56 |  | 
| 55 | 57 | contribtuon = MemberActivityContributionInfo.objects.get(contribtuon_id=contribtuon_id) | 
| 56 | 58 |  | 
| 57 | - # 返回图片的 file_ids | |
| 58 | - return [] | |
| 59 | + # TODO: 从 MemberActivityContributionInfo 生成 files 对象 | |
| 60 | + files = [ | |
| 61 | +        { | |
| 62 | + "FileBody": "文件base64编码,不含逗号前字符,即data:image/png;base64,", | |
| 63 | + "FileName": "test.png" | |
| 64 | + } | |
| 65 | + ] | |
| 66 | + file_type = 'png' | |
| 67 | + # upload_files_result = upload_document_files(files, file_type=file_type) | |
| 68 | + upload_files_result = test_upload_document_files(files, file_type=file_type) | |
| 69 | +    file_ids = upload_files_result.get('FileIds', []) | |
| 70 | + | |
| 71 | + return file_ids | |
| 59 | 72 |  | 
| 60 | 73 |  | 
| 61 | 74 | def create_contribution_contract_flow(lensman, Operator): | 
| 62 | - # TODO : 创建签署流程 https://qian.tencent.com/developers/companyApis/startFlows/CreateFlow | |
| 75 | + # 创建签署流程 https://qian.tencent.com/developers/companyApis/startFlows/CreateFlow | |
| 63 | 76 |  | 
| 64 | 77 | # 创建签署流程参数 Operator | 
| 65 | 78 | FlowName = lensman.identity_card_name + "的投稿合同" + tc.local_string(format='%Y%m%d') | 
| 66 | 79 | FlowType = '活动投稿授权书' | 
| 67 | 80 |      Approvers = [{ | 
| 68 | - "ApproverType": "1", | |
| 69 | - "Required": "true", | |
| 70 | - "NotifyType": "none", | |
| 71 | - "ApproverMobile": lensman.phone, | |
| 72 | - "ApproverName": lensman.identity_card_name, | |
| 73 | - "ApproverIdCardNumber": lensman.identity_card_number, | |
| 74 | - }] | |
| 81 | + "ApproverType": 1, | |
| 82 | + "Required": True, | |
| 83 | + "NotifyType": None, | |
| 84 | + "ApproverMobile": lensman.phone, | |
| 85 | + "ApproverName": lensman.identity_card_name, | |
| 86 | + "ApproverIdCardType": "ID_CARD", | |
| 87 | + "ApproverIdCardNumber": lensman.identity_card_number, | |
| 88 | + }] | |
| 89 | + create_flow_result = create_flow(flow_name=FlowName, flow_type=FlowType, approvers=Approvers) | |
| 90 | +    flow_id = create_flow_result.get('FlowId') | |
| 75 | 91 |  | 
| 76 | - # 创建签署流程返回值 FlowId | |
| 77 | - return '' | |
| 92 | + return flow_id | |
| 78 | 93 |  | 
| 79 | 94 |  | 
| 80 | 95 | def create_contribution_contract_document(lensman, contribtuon_id, file_ids, FlowId, Operator): | 
| 81 | - # TODO : 创建电子签文档 https://qian.tencent.com/developers/companyApis/startFlows/CreateDocument | |
| 96 | + # 创建电子签文档 https://qian.tencent.com/developers/companyApis/startFlows/CreateDocument | |
| 82 | 97 |  | 
| 83 | 98 | income = LensmanContributionActivityIncomeExpensesInfo.objects.get(contribtuon_id=contribtuon_id, lensman_id=lensman.lensman_id) | 
| 84 | 99 |  | 
| @@ -86,51 +101,46 @@ def create_contribution_contract_document(lensman, contribtuon_id, file_ids, Flo | ||
| 86 | 101 | TemplateId = settings.CONTRACT_LENSMAN_CONTRIBUTION_TEMPLATE_ID | 
| 87 | 102 |  | 
| 88 | 103 |      FormFields = [{ | 
| 89 | - "ComponentName": "ComponentId_0", | |
| 104 | + "ComponentId": "ComponentId_0", | |
| 90 | 105 | "ComponentValue": lensman.identity_card_name | 
| 91 | 106 |      }, { | 
| 92 | - "ComponentName": "ComponentId_1", | |
| 107 | + "ComponentId": "ComponentId_1", | |
| 93 | 108 | "ComponentValue": lensman.identity_card_number, | 
| 94 | 109 |      }, { | 
| 95 | - "ComponentName": "ComponentId_2", | |
| 96 | - "ComponentValue": income.amount, | |
| 110 | + "ComponentId": "ComponentId_2", | |
| 111 | + "ComponentValue": str(income.amount), | |
| 97 | 112 |      }, { | 
| 98 | - "ComponentName": "ComponentId_3", | |
| 113 | + "ComponentId": "ComponentId_3", | |
| 99 | 114 | "ComponentValue": "", | 
| 100 | 115 | }] | 
| 101 | 116 |  | 
| 102 | 117 | for i, file_id in enumerate(file_ids): | 
| 103 | 118 |          FormFields.append({ | 
| 104 | - "ComponentName": "ComponentId_" + str(37 + i), | |
| 119 | + "ComponentId": "ComponentId_" + str(37 + i), | |
| 105 | 120 | "ComponentValue": file_id, | 
| 106 | 121 | }) | 
| 122 | + create_document_result = create_document(flow_id=FlowId, form_fields=FormFields) | |
| 123 | +    document_id = create_document_result.get('DocumentId') | |
| 107 | 124 |  | 
| 108 | - # 返回创建电子文档 DocumentId | |
| 109 | - return '', FormFields | |
| 125 | + return document_id, FormFields | |
| 110 | 126 |  | 
| 111 | 127 |  | 
| 112 | 128 | def start_contribution_contract_flow(FlowId, Operator): | 
| 113 | - # TODO : 发起签署流程 https://qian.tencent.com/developers/companyApis/startFlows/StartFlow | |
| 129 | + # 发起签署流程 https://qian.tencent.com/developers/companyApis/startFlows/StartFlow | |
| 114 | 130 |  | 
| 115 | - # 发起签署流程参数 Operator FlowId | |
| 131 | + start_flow_result = start_flow(flow_id=FlowId) | |
| 132 | +    flow_status = start_flow_result.get('Status') | |
| 116 | 133 |  | 
| 117 | - # | |
| 118 | - return '' | |
| 134 | + return flow_status | |
| 119 | 135 |  | 
| 120 | 136 |  | 
| 121 | 137 | def get_contribtion_contract_sign_mppath(Operator, lensman, FlowId): | 
| 122 | - # TODO : 获取签署链接 https://qian.tencent.com/developers/companyApis/startFlows/CreateSchemeUrl | |
| 123 | - | |
| 124 | - Name = lensman.identity_card_name | |
| 125 | - Mobile = lensman.phone | |
| 126 | - IdCardType = 'ID_CARD' | |
| 127 | - IdCardNumber = lensman.identity_card_number | |
| 128 | - EndPoint = 'APP' | |
| 129 | - PathType = '1' #腾讯电子签小程序流程合同的详情页 | |
| 130 | - AutoJumpBack = 'true' #签署完成会自动跳转回来 | |
| 131 | - | |
| 132 | - # 返回 SchemeUrl | |
| 133 | - return '' | |
| 138 | + # 获取签署链接 https://qian.tencent.com/developers/companyApis/startFlows/CreateSchemeUrl | |
| 139 | + | |
| 140 | + 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) | |
| 141 | +    scheme_url = create_scheme_url_result.get('SchemeUrl') | |
| 142 | + | |
| 143 | + return scheme_url | |
| 134 | 144 |  | 
| 135 | 145 |  | 
| 136 | 146 | @logit(res=True) | 
| @@ -237,12 +237,22 @@ MEMBER_CARD_ID_HANYUAN = '' | ||
| 237 | 237 |  | 
| 238 | 238 | # 腾讯云 | 
| 239 | 239 |  TENCENTCLOUD = { | 
| 240 | -    'default': { | |
| 240 | +    'faceid': { | |
| 241 | 241 | 'appid': '', | 
| 242 | 242 | 'secret_id': '', | 
| 243 | 243 | 'secret_key': '', | 
| 244 | 244 | 'merchant_id': '', | 
| 245 | 245 | }, | 
| 246 | +    'ess': { | |
| 247 | + 'operator_id': '', | |
| 248 | + 'template_id': '', | |
| 249 | + 'secret_id': '', | |
| 250 | + 'secret_key': '', | |
| 251 | + 'callback_secret_id': '', | |
| 252 | + 'callback_secret_key': '', | |
| 253 | + 'endpoint': 'ess.tencentcloudapi.com', | |
| 254 | + 'file_endpoint': 'file.ess.tencent.cn', | |
| 255 | + }, | |
| 246 | 256 | } | 
| 247 | 257 |  | 
| 248 | 258 | # 七牛设置 | 
| @@ -592,5 +602,9 @@ DEFAULT_START_DATE = '1970-01-02' | ||
| 592 | 602 | DEFAULT_END_DATE = '9999-12-03' | 
| 593 | 603 |  | 
| 594 | 604 | # 腾讯电子签配置 | 
| 605 | +CONTRACT_LENSMAN_CONTRIBUTION_OPERATOR_ID = 'yDCp3UU055m70lUx6jaTk1RVkiVkKenJ' | |
| 595 | 606 | CONTRACT_LENSMAN_CONTRIBUTION_TEMPLATE_ID = 'yDCp3UU05rgksnUXtZsEvdrK1tRGb7ax' | 
| 596 | -CONTRACT_LENSMAN_CONTRIBUTION_OPERATOR_ID = 'yDCp3UU055m70lUx6jaTk1RVkiVkKenJ' | |
| 607 | +CONTRACT_LENSMAN_CONTRIBUTION_SECRET_ID = 'AKIDAHh3WzlYvHqOoR69MI94329FIGEDA62x' | |
| 608 | +CONTRACT_LENSMAN_CONTRIBUTION_SECRET_KEY = 'tieio5Rn7PqARmJzcAcAh4gNE3rowEc3' | |
| 609 | +CONTRACT_LENSMAN_CONTRIBUTION_CALLBACK_SECRET_ID = 'F0C875BC8B9442AE8E4769155F812EC0' | |
| 610 | +CONTRACT_LENSMAN_CONTRIBUTION_CALLBACK_SECRET_KEY = '645CD7B0067B4FCEB6A9A6D589EC9DD6' | 
| @@ -0,0 +1,291 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | + | |
| 3 | +import json | |
| 4 | + | |
| 5 | +from django.conf import settings | |
| 6 | +from tencentcloud.common import credential | |
| 7 | +from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException | |
| 8 | +from tencentcloud.common.profile.client_profile import ClientProfile | |
| 9 | +from tencentcloud.common.profile.http_profile import HttpProfile | |
| 10 | +from tencentcloud.ess.v20201111 import ess_client, models | |
| 11 | +from TimeConvert import TimeConvert as tc | |
| 12 | + | |
| 13 | + | |
| 14 | +tencentcloud_cfg = settings.TENCENTCLOUD.get('ess', {}) | |
| 15 | +operator_id = tencentcloud_cfg.get('operator_id') | |
| 16 | +template_id = tencentcloud_cfg.get('template_id') | |
| 17 | +secret_id = tencentcloud_cfg.get('secret_id') | |
| 18 | +secret_key = tencentcloud_cfg.get('secret_key') | |
| 19 | +callback_secret_id = tencentcloud_cfg.get('callback_secret_id') | |
| 20 | +callback_secret_key = tencentcloud_cfg.get('callback_secret_key') | |
| 21 | +endpoint = tencentcloud_cfg.get('endpoint') | |
| 22 | +file_endpoint = tencentcloud_cfg.get('file_endpoint') | |
| 23 | + | |
| 24 | + | |
| 25 | +def test_upload_document_files(files, file_type='png'): | |
| 26 | + files = [ | |
| 27 | +        { |