package contract import ( "errors" "fmt" "hongze/hongze_mobile_admin/models/custom" contractCustom "hongze/hongze_mobile_admin/models/custom/contract" contractResp "hongze/hongze_mobile_admin/models/response/contract" "hongze/hongze_mobile_admin/models/tables/contract" "hongze/hongze_mobile_admin/models/tables/contract_approval" "hongze/hongze_mobile_admin/models/tables/contract_approval_record" "hongze/hongze_mobile_admin/models/tables/contract_operation_record" "hongze/hongze_mobile_admin/models/tables/contract_service_detail" "hongze/hongze_mobile_admin/utils" "strings" "time" ) //作废合同 func InvalidContract(contractId int, opUser *custom.AdminWx) (err error) { //查询当前合同信息 nowContract, err := contract.GetContractById(contractId) if err != nil { if err.Error() == utils.ErrNoRow() { err = errors.New(fmt.Sprint("根据合同编号:", contractId, " 找不到初始合同")) } return } if nowContract.SellerId != opUser.AdminId && opUser.RoleTypeCode != utils.ROLE_TYPE_CODE_COMPLIANCE { err = errors.New("当前账号无操作权限") return } if nowContract.Status != "已审批" { err = errors.New("合同状态异常,不允许作废,当前合同状态:" + nowContract.Status) return } //如果删除状态 >0,那么代表已经被删除了 if nowContract.IsDelete > 0 { err = errors.New("该合同已删除") return } //合同作废 err = contract.InvalidContract(nowContract) if err != nil { return } //添加操作日志 remark := "作废合同模板" _ = contract_operation_record.AddContractOperationRecord(nowContract.ContractId, opUser.AdminId, 0, "invalid", opUser.RealName, remark) return } //根据id获取合同详情(包含服务) func GetContractDetail(contractId int) (contractDetail *contract.ContractDetail, err error) { contractDetail, err = contract.GetContractDetailById(contractId) if err != nil { if err.Error() == utils.ErrNoRow() { err = errors.New("找不到该合同") } return } serviceList, err := contractCustom.GetContractServiceAndDetailList(contractId) if err != nil { err = errors.New(fmt.Sprint("查找合同服务异常", err)) return } for i := 0; len(serviceList) > i; i++ { if serviceList[i].HasDetail == "是" { list, detailErr := contract_service_detail.GetContractServiceDetailListByServiceId(serviceList[i].ContractServiceId) if detailErr != nil { err = errors.New(fmt.Sprint("查找合同服务详情异常", detailErr)) return } serviceList[i].DetailList = list } } contractDetail.Service = serviceList return } //上传签回合同附件 func UploadCheckBackFile(contractId int, fileUrl string, opUser *custom.AdminWx) (err error) { //获取合同信息 contractInfo, err := contract.GetContractById(contractId) if err != nil { return } //合同状态判断 if contractInfo.Status != "已审批" && contractInfo.Status != "已签回" { err = errors.New("合同状态异常,不允许上传签回合同附件,当前合同状态:" + contractInfo.Status) return } contractInfo.CheckBackFileUrl = fileUrl contractInfo.Status = "已签回" contractInfo.ModifyTime = time.Now() contractInfo.CheckBackFileTime = time.Now() err = contractInfo.Update([]string{"CheckBackFileUrl", "Status", "ModifyTime", "CheckBackFileTime"}) if err != nil { return } //添加操作日志 remark := "上传签回合同附件" _ = contract_operation_record.AddContractOperationRecord(contractInfo.ContractId, opUser.AdminId, 0, "upload", opUser.RealName, remark) return } //获取审批流和权限 func GetOpButton(contractInfo *contract.ContractDetail, contractApprovalInfo *contract_approval.ContractApproval, opUser *custom.AdminWx) (contractOpButton contractResp.OpButton, flowNodeListResp [][]contract_approval_record.ContractApprovalRecord, err error) { //审批流 approvalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractApprovalId(contractApprovalInfo.ContractApprovalId) if err != nil { err = errors.New("获取审批失败,Err:" + err.Error()) return } flowNodeMap := make(map[int][]contract_approval_record.ContractApprovalRecord, 0) keySort := make([]int, 0) for _, approvalRecord := range approvalRecordList { //如果当前节点正好是该节点,同时审批单状态是待审批状态,然后当前账号又有权限,该账号也正是审批人,那么允许审批操作 if contractApprovalInfo.CurrNodeId == approvalRecord.NodeId && contractApprovalInfo.Status == "待审批" { if opUser.AdminId == approvalRecord.ApproveUserId && approvalRecord.NodeType == "check" { contractOpButton.Approval = true } } if tmpFlowNodeList, ok := flowNodeMap[approvalRecord.NodeId]; ok { flowNodeMap[approvalRecord.NodeId] = append(tmpFlowNodeList, *approvalRecord) } else { tmpFlowNodeList := make([]contract_approval_record.ContractApprovalRecord, 1) tmpFlowNodeList[0] = *approvalRecord flowNodeMap[approvalRecord.NodeId] = tmpFlowNodeList keySort = append(keySort, approvalRecord.NodeId) } } for _, key := range keySort { flowNodeListResp = append(flowNodeListResp, flowNodeMap[key]) } //是否具有签回合同权限 uploadStatus := []string{"已审批", "已签回"} if opUser.RoleTypeCode == utils.ROLE_TYPE_CODE_COMPLIANCE && strings.Contains(strings.Join(uploadStatus, ","), contractInfo.Status) { contractOpButton.UploadFile = true } //作废权限 if (opUser.RoleTypeCode == utils.ROLE_TYPE_CODE_COMPLIANCE || opUser.AdminId == contractInfo.SellerId) && contractInfo.Status == "已审批" { contractOpButton.Invalid = true } return } //根据合同获取合同详情 func GetContractDetailByContractId(contractId int, opUser *custom.AdminWx) (contractInfo *contract.ContractDetail, flowNodeListResp [][]contract_approval_record.ContractApprovalRecord, opButton contractResp.OpButton, err error) { contractInfo, err = GetContractDetail(contractId) if err != nil { err = errors.New("获取合同详情失败,ERR:" + err.Error()) return } contractInfo.StartDateStr = contractInfo.StartDate.Format(utils.FormatDate) contractInfo.EndDateStr = contractInfo.EndDate.Format(utils.FormatDate) contractInfo.ModifyTimeStr = contractInfo.ModifyTime.Format(utils.FormatDateTime) contractInfo.CreateTimeStr = contractInfo.CreateTime.Format(utils.FormatDateTime) //查询最近一次审批单信息 lastApprovalInfo, err := contract_approval.GetLastContractApprovalByContractId(contractInfo.ContractId, "contract") if err != nil { if err.Error() != utils.ErrNoRow() { err = errors.New("获取最近一次审批单信息失败,ERR:" + err.Error()) } err = nil return } if lastApprovalInfo != nil { //审批操作权限,上传签回文件权限 tmpContractOpButton, tmpFlowNodeListResp, tmpErr := GetOpButton(contractInfo, lastApprovalInfo, opUser) if tmpErr != nil { err = errors.New("获取合同按钮权限、审批流程失败,ERR:" + tmpErr.Error()) return } opButton = tmpContractOpButton flowNodeListResp = tmpFlowNodeListResp } return }