| 
              # -*- 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)
    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)
    if not upload_files_result:
        return []
    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)
    if not create_flow_result:
        return ''
    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 idx, file_id in enumerate(file_ids):
        FormFields.append({
            "ComponentId": "ComponentId_" + str(37 + idx),
            "ComponentValue": file_id,
        })
    create_document_result = create_document(flow_id=FlowId, form_fields=FormFields)
    if not create_document_result:
        return '', FormFields
    return create_document_result.DocumentId, FormFields
def start_contribution_contract_flow(FlowId):
    # 发起签署流程 https://qian.tencent.com/developers/companyApis/startFlows/StartFlow
    start_flow_result = start_flow(flow_id=FlowId)
    if not start_flow_result:
        return ''
    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)
    if not create_scheme_url_result:
        return ''
    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()
 
  |