@@ -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 | 
                +        {
               |