package contract
import (
"encoding/json"
"fmt"
"github.com/rdlucklib/rdluck_tools/paging"
"github.com/shopspring/decimal"
"github.com/tealeg/xlsx"
"hongze/hz_crm_api/controllers"
"hongze/hz_crm_api/models"
"hongze/hz_crm_api/models/company"
"hongze/hz_crm_api/models/contract"
"hongze/hz_crm_api/models/contract/request"
"hongze/hz_crm_api/models/contract/response"
"hongze/hz_crm_api/services"
contractService "hongze/hz_crm_api/services/contract"
"hongze/hz_crm_api/utils"
"os"
"path/filepath"
"strconv"
"strings"
"time"
)
// 审批流管理
type ContractApprovalController struct {
controllers.BaseAuthController
}
// @Title 提交申请
// @Description 提交申请接口
// @Param ContractId query int true "合同id编号"
// @Success Ret=200 申请成功
// @router /approval/apply [get]
func (this *ContractApprovalController) Apply() {
br := new(models.BaseResponse).Init()
defer func() {
this.Data["json"] = br
this.ServeJSON()
}()
sysUser := this.SysUser
if sysUser == nil {
br.Msg = "请登录"
br.ErrMsg = "请登录,SysUser Is Empty"
br.Ret = 408
return
}
//合同id编号
contractId, err := this.GetInt("ContractId")
if err != nil {
br.Msg = "获取合同编号失败"
br.ErrMsg = "获取合同编号失败,err:" + err.Error()
return
}
if contractId <= 0 {
br.Msg = "请传入合同编号"
br.ErrMsg = "请传入合同编号"
return
}
err, errMsg := contractService.Apply(contractId)
if err != nil {
br.Msg = "发起审批失败!"
if errMsg != "" {
br.Msg = errMsg
}
br.ErrMsg = "发起审批失败,Err:" + err.Error()
return
}
br.Ret = 200
br.Success = true
br.Msg = "申请成功"
}
// List
// @Title 审批单列表
// @Description 审批单列表接口
// @Param ContractBusinessType query string false "合同业务类型,枚举值:'业务合同','代付合同',不传默认是全部"
// @Param ContractType query string false "合同类型,枚举值:'新签合同','续约合同','补充协议'"
// @Param Status query string false "合同状态,枚举值:'待审批','已审批','已驳回','已撤回'"
// @Param ProductId query int false "客户类型:传0或者不传为当前账号权限,1 代表是:ficc;2 代表是:权益"
// @Param SellerId query string false "选择的销售id"
// @Param Keyword query string false "搜索关键字"
// @Param ModifyStartTime query string false "服务更新时间的选择开始时间,格式:2021-05-23 00:00:00"
// @Param ModifyEndTime query string false "服务更新时间的选择结束时间,格式:2021-05-26 23:59:59"
// @Param IsExport query bool false "是否导出excel,默认是false"
// @Success 200 {object} response.ContractApprovalListResp
// @router /approval/list [get]
func (this *ContractApprovalController) List() {
br := new(models.BaseResponse).Init()
defer func() {
this.Data["json"] = br
this.ServeJSON()
}()
sysUser := this.SysUser
if sysUser == nil {
br.Msg = "请登录"
br.ErrMsg = "请登录,SysUser Is Empty"
br.Ret = 408
return
}
//合同类型、产品类型、合同状态、更新时间、所选销售
//关键字:合同编号、客户名称,社会信用码
contractBusinessType := this.GetString("ContractBusinessType") //合同业务类型
contractType := this.GetString("ContractType")
status := this.GetString("Status")
productId, _ := this.GetInt("ProductId")
sellerIds := this.GetString("SellerId")
keyword := this.GetString("Keyword")
modifyStartTime := this.GetString("ModifyStartTime")
modifyEndTime := this.GetString("ModifyEndTime")
childCondition := ""
condition := ""
childPars := make([]interface{}, 0)
pars := make([]interface{}, 0)
productSlice := make([]int, 0) //需要下载的 产品 切片
//如果不是超管或者合规,那么只能查看自己的合同
if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN { //权益管理员
condition += ` AND c.product_id = ? `
pars = append(pars, 2)
} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN { //ficc管理员
condition += ` AND c.product_id = ? `
pars = append(pars, 1)
} else {
if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_COMPLIANCE && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
condition += ` AND c.seller_id = ? `
pars = append(pars, sysUser.AdminId)
}
}
//合同类型、、更新时间、所选销售
//关键字:合同编号、客户名称,社会信用码
if contractType != "" {
condition += ` AND c.contract_type = ? `
pars = append(pars, contractType)
}
//合同业务类型
if contractBusinessType != "" {
condition += ` AND c.contract_business_type = ? `
pars = append(pars, contractBusinessType)
}
//审批状态
if status != "" {
//childCondition += ` AND status = ? `
//childPars = append(childPars, status)
if status == "已审批" {
condition += ` AND c.status in ("已审批","已驳回") `
} else {
condition += ` AND c.status = ? `
pars = append(pars, status)
}
} else {
//childCondition += ` AND status != "已撤回" `
condition += ` AND c.status not in ("已撤回","待提交") `
}
//产品类型
if productId > 0 {
condition += ` AND c.product_id = ? `
pars = append(pars, productId)
productSlice = append(productSlice, productId)
} else {
nowProductId := services.GetProductId(sysUser.RoleTypeCode)
if nowProductId > 0 {
productSlice = append(productSlice, nowProductId)
} else {
productSlice = append(productSlice, 1)
productSlice = append(productSlice, 2)
}
}
//所选销售
if sellerIds != "" {
condition += ` AND c.seller_id IN (` + sellerIds + `) `
}
//更新开始时间
//更新开始时间
if modifyStartTime != "" {
condition += ` AND a.modify_time >= ? `
pars = append(pars, modifyStartTime)
}
//更新结束时间
if modifyEndTime != "" {
condition += ` AND a.modify_time <= ? `
pars = append(pars, modifyEndTime)
}
//关键字
if keyword != "" {
condition += ` AND (c.contract_code LIKE '%` + keyword + `%' OR c.company_name LIKE '%` + keyword + `%' OR c.credit_code LIKE '%` + keyword + `%' ) `
}
pageSize, _ := this.GetInt("PageSize")
currentIndex, _ := this.GetInt("CurrentIndex")
var startSize int
if pageSize <= 0 {
pageSize = utils.PageSize20
}
if currentIndex <= 0 {
currentIndex = 1
}
startSize = paging.StartIndex(currentIndex, pageSize)
//是否导出报表
isExport, _ := this.GetBool("IsExport")
if isExport {
pageSize = 10000
currentIndex = 1
}
total, err := contract.GetContractApprovalListCount(condition, pars)
if err != nil {
br.Msg = "获取失败"
br.ErrMsg = "获取数据总数失败,Err:" + err.Error()
return
}
list, err := contract.GetContractApprovalList(childCondition, condition, childPars, pars, startSize, pageSize)
if err != nil {
br.Msg = "获取审批列表失败!"
br.ErrMsg = "获取审批列表失败,Err:" + err.Error()
return
}
if len(list) > 0 {
contractApprovalIdSlice := make([]string, 0)
for i := 0; i < len(list); i++ {
contractApprovalIdSlice = append(contractApprovalIdSlice, strconv.Itoa(list[i].ContractApprovalId))
}
contractApprovalIdStr := strings.Join(contractApprovalIdSlice, ",")
//获取审批流列表数据
contractApprovalRecordList, err := contract.GetContractApprovalRecordList(contractApprovalIdStr, sysUser.AdminId)
if err != nil {
br.Msg = "获取审批流列表失败!"
br.ErrMsg = "获取审批流列表失败,Err:" + err.Error()
return
}
contractApprovalRecordMap := make(map[int]*contract.ContractApprovalRecord)
for i := 0; i < len(contractApprovalRecordList); i++ {
contractApprovalRecordMap[contractApprovalRecordList[i].ContractApprovalId] = contractApprovalRecordList[i]
}
for i := 0; i < len(list); i++ {
item := list[i]
list[i].StartDateStr = item.StartDate.Format(utils.FormatDate)
list[i].EndDateStr = item.EndDate.Format(utils.FormatDate)
list[i].CreateTimeStr = item.CreateTime.Format(utils.FormatDateTime)
list[i].ModifyTimeStr = item.ModifyTime.Format(utils.FormatDateTime)
list[i].ApproveTimeStr = item.ApproveTime.Format(utils.FormatDateTime)
list[i].CheckBackFileTimeStr = item.CheckBackFileTime.Format(utils.FormatDateTime)
list[i].InvalidTimeStr = item.InvalidTime.Format(utils.FormatDateTime)
list[i].RescindTimeStr = item.RescindTime.Format(utils.FormatDateTime)
//合同操作权限
var opButton contract.ContractButton
var contractDetail contract.ContractDetail
jsonErr := json.Unmarshal([]byte(list[i].ContractDetail), &contractDetail)
if jsonErr != nil {
br.Msg = "审批合同数据转换失败!"
br.ErrMsg = "审批合同数据转换失败,Err:" + jsonErr.Error()
return
}
list[i].ContractInfo = contractDetail
//校验最新审批流数据
if contractApprovalRecord, has := contractApprovalRecordMap[item.ContractApprovalId]; has {
//审批流id
list[i].ContractApprovalRecordId = contractApprovalRecord.ContractApprovalRecordId
//审批时间
list[i].ApproveTime = contractApprovalRecord.ApproveTime
list[i].ApproveTimeStr = contractApprovalRecord.ApproveTime.Format(utils.FormatDateTime)
//判断是否有操作权限
list[i].Status = contractApprovalRecord.Status
//判断是否处于待审批状态
if contractApprovalRecord.Status == "待审批" {
//如果不是审批者,那么不能审批操作
if contractApprovalRecord.NodeType != "check" {
continue
}
//如果没有指定审批人的话
if contractApprovalRecord.ApproveUserId <= 0 {
//判断是否与审批角色一致,如果一致,那么允许操作审批
if contractApprovalRecord.ApproveRoleTypeCode == sysUser.RoleTypeCode {
opButton.Approval = true
}
} else if contractApprovalRecord.ApproveUserId == sysUser.AdminId {
//如果指定审批人就是自己的话,那么操作审批
opButton.Approval = true
}
}
}
if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_COMPLIANCE {
if item.ContractStatus == "已审批" {
opButton.CheckBackFile = true
}
if item.ContractStatus == "已签回" {
opButton.RescindFile = true
opButton.CheckBackFile = true
}
}
//合同状态(突然说要改成展示合同状态,那就根据业务需求,改成返回:合同状态咯)
list[i].Status = item.ContractStatus
//合同操作权限
list[i].OpButton = opButton
}
}
page := paging.GetPaging(currentIndex, pageSize, total)
//导出excel
if isExport {
contractApprovalListExport(this, list, productSlice, br)
return
}
br.Ret = 200
br.Success = true
br.Msg = "获取成功"
br.Data = response.ContractApprovalListResp{
List: list,
Paging: page,
}
}
// ContractApprovalListExport 导出审批列表
func contractApprovalListExport(this *ContractApprovalController, list []*contract.ContractApprovalList, productSlice []int, br *models.BaseResponse) {
sysUser := this.SysUser
if sysUser == nil {
br.Msg = "请登录"
br.ErrMsg = "请登录,SysUser Is Empty"
br.Ret = 408
return
}
fmt.Println("list len:", len(list))
//获取合同套餐服务列表
serviceTemplateList, err := contract.GetAllContractServiceTemplateList()
if err != nil {
br.Msg = "获取合同套餐服务列表失败!"
br.ErrMsg = "获取合同套餐服务列表失败,Err:" + err.Error()
return
}
templateTitleMap := make(map[int]string)
for _, serviceTemplate := range serviceTemplateList {
templateTitleMap[serviceTemplate.ServiceTemplateId] = serviceTemplate.Title
}
//业务合同的关联合同id集合
businessContractIdList := make([]string, 0)
//代付合同的关联合同id集合
paymentOnBehalfContractIdList := make([]string, 0)
//所有合同id集合(用于查询服务内容)
allServiceContractIdList := make([]string, 0)
//基础合同的关联合同数据
contractRelationMap := make(map[int][]*contract.RelationContractList)
for _, v := range list {
allServiceContractIdList = append(allServiceContractIdList, fmt.Sprint(v.ContractId))
switch v.ContractBusinessType {
case "业务合同":
businessContractIdList = append(businessContractIdList, fmt.Sprint(v.ContractId))
case "代付合同":
paymentOnBehalfContractIdList = append(paymentOnBehalfContractIdList, fmt.Sprint(v.ContractId))
}
}
//业务合同的关联合同
if len(businessContractIdList) > 0 {
contractIdStr := strings.Join(businessContractIdList, ",")
businessContractList, err := contract.GetContractRelationListByRelationContractIds(contractIdStr)
if err != nil {
br.Msg = "获取失败"
br.ErrMsg = "获取业务关联合同失败,Err:" + err.Error()
return
}
for _, v := range businessContractList {
//代付合同id
allServiceContractIdList = append(allServiceContractIdList, fmt.Sprint(v.PaymentOnBehalfContractId))
if _, ok := contractRelationMap[v.ContractId]; ok {
contractRelationMap[v.ContractId] = append(contractRelationMap[v.ContractId], v)
} else {
tmpList := make([]*contract.RelationContractList, 0)
contractRelationMap[v.ContractId] = append(tmpList, v)
}
}
}
//代付合同的关联合同
if len(paymentOnBehalfContractIdList) > 0 {
paymentOnBehalfContractIdStr := strings.Join(paymentOnBehalfContractIdList, ",")
paymentOnBehalfContractList, err := contract.GetContractRelationListByPaymentOnBehalfContractIds(paymentOnBehalfContractIdStr)
if err != nil {
br.Msg = "获取失败"
br.ErrMsg = "获取代付关联合同失败,Err:" + err.Error()
return
}
for _, v := range paymentOnBehalfContractList {
//业务合同id
allServiceContractIdList = append(allServiceContractIdList, fmt.Sprint(v.ContractId))
if _, ok := contractRelationMap[v.PaymentOnBehalfContractId]; ok {
contractRelationMap[v.PaymentOnBehalfContractId] = append(contractRelationMap[v.PaymentOnBehalfContractId], v)
} else {
tmpList := make([]*contract.RelationContractList, 0)
contractRelationMap[v.PaymentOnBehalfContractId] = append(tmpList, v)
}
}
}
//获取合同详情
serviceListMap := make(map[int][]*contract.ContractServiceAndDetail, 0)
if len(allServiceContractIdList) > 0 {
allRelationIdStr := strings.Join(allServiceContractIdList, ",")
tmpServiceList, err := contract.GetContractServiceAndDetailListByIds(allRelationIdStr)
if err != nil {
br.Msg = "获取失败"
br.ErrMsg = "获取关联合同服务详情失败,Err:" + err.Error()
return
}
allContractServiceIdList := make([]string, 0)
serviceDetailListMap := make(map[int][]*contract.ContractServiceDetail, 0)
for _, service := range tmpServiceList {
if service.HasDetail == "是" {
allContractServiceIdList = append(allContractServiceIdList, strconv.Itoa(service.ContractServiceId))
}
}
if len(allContractServiceIdList) > 0 {
allContractServiceIdStr := strings.Join(allContractServiceIdList, ",")
list, detailErr := contract.GetContractServiceDetailListByServiceIds(allContractServiceIdStr)
if detailErr != nil {
br.Msg = "获取失败"
br.ErrMsg = "查找合同服务详情异常,Err:" + err.Error()
return
}
for _, v := range list {
if _, ok := serviceDetailListMap[v.ContractServiceId]; ok {
serviceDetailListMap[v.ContractServiceId] = append(serviceDetailListMap[v.ContractServiceId], v)
} else {
tmpList := make([]*contract.ContractServiceDetail, 0)
serviceDetailListMap[v.ContractServiceId] = append(tmpList, v)
}
}
}
for _, service := range tmpServiceList {
if service.HasDetail == "是" {
if serviceDetailList, ok := serviceDetailListMap[service.ContractServiceId]; ok {
service.DetailList = serviceDetailList
}
//套餐名称
if title, ok := templateTitleMap[service.ServiceTemplateId]; ok {
service.Title = title
}
}
//服务列表
if _, ok := serviceListMap[service.ContractId]; ok {
serviceListMap[service.ContractId] = append(serviceListMap[service.ContractId], service)
} else {
tmpList := make([]*contract.ContractServiceAndDetail, 0)
serviceListMap[service.ContractId] = append(tmpList, service)
}
}
}
//生成excel文件
dir, err := os.Executable()
exPath := filepath.Dir(dir)
downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
xlsxFile := xlsx.NewFile()
if err != nil {
br.Msg = "生成文件失败"
br.ErrMsg = "生成文件失败"
return
}
//设置默认字体和文字大小
xlsx.SetDefaultFont(12, "宋体")
//定义边框样式
border := xlsx.NewBorder("thin", "thin", "thin", "thin")
//定义文字排版样式
alignment := xlsx.Alignment{
Horizontal: "center",
Vertical: "center",
WrapText: true,
}
//普通样式
style := xlsx.NewStyle()
style.Alignment = alignment
style.ApplyAlignment = true
style.Border = *border
//标红文字,便于查看哪些产品被勾选
redStyle := xlsx.NewStyle()
redStyle.Alignment = alignment
redStyle.ApplyAlignment = true
redStyle.Font.Color = "ff0000"
//定义底色需要标黄的 单元格颜色
redFill := xlsx.Fill{"solid", "ffff00", "ffff00"}
redStyle.Fill = redFill
redStyle.Border = *border
//标题样式
titleStyle := xlsx.NewStyle()
titleFont := xlsx.NewFont(14, "宋体")
titleFont.Bold = true
titleStyle.Font = *titleFont
titleStyle.Alignment = alignment
titleStyle.Border = *border
//titleStyle.ApplyAlignment = true
//表头
headerStyle := xlsx.NewStyle()
headerFont := xlsx.NewFont(12, "宋体")
headerFont.Bold = true
headerStyle.Font = *headerFont
headerStyle.Alignment = alignment
headerStyle.ApplyAlignment = true
headerStyle.Border = *border
defer func() {
os.Remove(downLoadnFilePath)
}()
//遍历所拥有的的产品权限,然后插入到对应的sheet表单中
for pidIndex := 0; pidIndex < len(productSlice); pidIndex++ {
productId := productSlice[pidIndex]
//表单名称
sheetName := "合同数据"
switch productId {
case 1:
sheetName = "ficc合同信息"
case 2:
sheetName = "权益合同信息"
}
//新增一个sheet表单
sheel, err := xlsxFile.AddSheet(sheetName)
if err != nil {
br.Msg = "新增Sheet失败"
br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
return
}
//设置列宽
sheel.SetColWidth(0, 0, 28)
sheel.SetColWidth(1, 1, 30)
sheel.SetColWidth(2, 2, 18)
sheel.SetColWidth(3, 3, 18)
sheel.SetColWidth(4, 4, 35)
sheel.SetColWidth(5, 6, 20)
sheel.SetColWidth(7, 7, 40)
//合同信息列
endContractInfoColIndex := 9
sheel.SetColWidth(8, 8, 40)
sheel.SetColWidth(9, 9, 40)
//权限列
sheel.SetColWidth(endContractInfoColIndex, endContractInfoColIndex+18, 30)
//标题行
titleRow := sheel.AddRow()
titleRow.SetHeight(30)
//合同信息列
titleCell := titleRow.AddCell()
titleCell.HMerge = 7 //向右合并列数,不包括自身列
//遍历去添加需要合并的列
for i := 0; i < 7; i++ {
titleRow.AddCell()
}
//报表标题名称
titleCell.SetValue("合同信息")
titleCell.SetStyle(titleStyle)
startI := 8
customStartCellI := 8
serviceSlice := make([]string, 0)
serviceCellMap := make(map[string]int)
//获取所有套餐列表
{
serviceList, err := getServiceTemplateList(productId)
if err != nil {
br.Msg = "查询套餐类型失败"
br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
return
}
for i := 0; i < len(serviceList); i++ {
//需要向右合并添加的列数
addCellNum := 0
item := serviceList[i]
//套餐服务列
servicesCell := titleRow.AddCell()
//套餐名称
servicesCell.SetValue(item.Title)
servicesCell.SetStyle(titleStyle)
//ficc小套餐
if item.ServiceTemplateId == 2 {
productPermission := make(map[int]string)
productPermission[1] = "每日宏观商品复盘"
productPermission[2] = "能化专栏《化里化外》"
productPermission[3] = "股债日评"
productPermission[4] = "黑色专栏《知白守黑》"
productPermission[5] = "有色专栏《有声有色》"
for id, name := range productPermission {
key := fmt.Sprint(item.ServiceTemplateId, "_product_permission_", id)
serviceCellMap[key] = startI
serviceSlice = append(serviceSlice, name)
startI++
addCellNum++
}
permissionList := make([]*company.PermissionSetItem, 0)
allPermissions, permissionMap, e := services.GetBaseFiccPermissionSetItem()
if e != nil {
br.Msg = "查询基础权限失败"
br.ErrMsg = "查询基础权限失败,Err:" + e.Error()
return
}
//遍历获取
for _, v := range allPermissions {
if v.ParentId == 0 {
items, ok := permissionMap[v.ChartPermissionId]
if ok {
permissionList = append(permissionList, items...)
}
}
}
/*for _, v := range utils.PermissionFiccClassifyArr {
items, err := company.GetPermissionSetItems(1, v)
if err != nil {
br.Msg = "获取失败"
br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
return
}
permissionList = append(permissionList, items...)
}*/
//权限列表
for j := 0; j < len(permissionList); j++ {
key := fmt.Sprint(item.ServiceTemplateId, "_permission_", permissionList[j].ChartPermissionId)
serviceCellMap[key] = startI
serviceSlice = append(serviceSlice, permissionList[j].PermissionName)
startI++
addCellNum++
}
//因为自己本身有一列了,所以在最后增加列的时候,需要减去自身列
addCellNum = addCellNum - 1
if addCellNum > 0 {
for tmpAddCellNum := 0; tmpAddCellNum < addCellNum; tmpAddCellNum++ {
titleRow.AddCell()
}
servicesCell.HMerge = addCellNum //向右合并列数,不包括自身列
}
continue
} else {
if item.Children != nil && len(item.Children) > 0 {
for j := 0; j < len(item.Children); j++ {
key := fmt.Sprint("service_template_", item.Children[j].ServiceTemplateId)
serviceCellMap[key] = startI
serviceSlice = append(serviceSlice, item.Children[j].Title)
startI++
addCellNum++
}
//因为自己本身有一列了,所以在最后增加列的时候,需要减去自身列
addCellNum = addCellNum - 1
if addCellNum > 0 {
for tmpAddCellNum := 0; tmpAddCellNum < addCellNum; tmpAddCellNum++ {
titleRow.AddCell()
}
servicesCell.HMerge = addCellNum //向右合并列数,不包括自身列
}
} else {
key := fmt.Sprint("service_template_", item.ServiceTemplateId)
serviceCellMap[key] = startI
serviceSlice = append(serviceSlice, item.Title)
startI++
}
}
}
}
//表头
headerRow := sheel.AddRow()
headerRow.SetHeight(24)
//合同基础信息
{
codeHeaderCell := headerRow.AddCell()
codeHeaderCell.SetValue("合同编号")
codeHeaderCell.SetStyle(headerStyle)
companyHeaderCell := headerRow.AddCell()
companyHeaderCell.SetValue("客户名称")
companyHeaderCell.SetStyle(headerStyle)
typeHeaderCell := headerRow.AddCell()
typeHeaderCell.SetValue("合同类型")
typeHeaderCell.SetStyle(headerStyle)
priceHeaderCell := headerRow.AddCell()
priceHeaderCell.SetValue("合同金额")
priceHeaderCell.SetStyle(headerStyle)
dateHeaderCell := headerRow.AddCell()
dateHeaderCell.SetValue("合同有效期")
dateHeaderCell.SetStyle(headerStyle)
sellerHeaderCell := headerRow.AddCell()
sellerHeaderCell.SetValue("销售")
sellerHeaderCell.SetStyle(headerStyle)
payHeaderCell := headerRow.AddCell()
payHeaderCell.SetValue("付款方")
payHeaderCell.SetStyle(headerStyle)
useHeaderCell := headerRow.AddCell()
useHeaderCell.SetValue("实际使用方")
useHeaderCell.SetStyle(headerStyle)
statusHeaderCell := headerRow.AddCell()
statusHeaderCell.SetValue("合同状态")
statusHeaderCell.SetStyle(headerStyle)
remarkHeaderCell := headerRow.AddCell()
remarkHeaderCell.SetValue("备注")
remarkHeaderCell.SetStyle(headerStyle)
}
//添加服务套餐名称
for _, service := range serviceSlice {
cell := headerRow.AddCell()
cell.SetValue(service)
cell.SetStyle(headerStyle)
}
for _, v := range list {
//如果当前合同不是该产品
if v.ProductId != productId {
continue
}
dataRow := sheel.AddRow()
dataRow.SetHeight(24)
//合同基础信息
{
codeCell := dataRow.AddCell()
codeCell.SetValue(v.ContractCode)
codeCell.SetStyle(style)
companyCell := dataRow.AddCell()
companyCell.SetValue(v.CompanyName)
companyCell.SetStyle(style)
typeCell := dataRow.AddCell()
typeCell.SetValue(v.ContractType)
typeCell.SetStyle(style)
priceCell := dataRow.AddCell()
priceCell.SetValue(v.Price)
priceCell.SetStyle(style)
dateCell := dataRow.AddCell()
dateCell.SetValue(fmt.Sprint(v.StartDate.Format(utils.FormatDate), " 至 ", v.EndDate.Format(utils.FormatDate)))
dateCell.SetStyle(style)
sellerCell := dataRow.AddCell()
sellerCell.SetValue(v.SellerName)
sellerCell.SetStyle(style)
//付款方
payStr := v.PayChannel
payCell := dataRow.AddCell()
if v.ContractBusinessType == "业务合同" {
if relationContractList, ok := contractRelationMap[v.ContractId]; ok {
payCompanyNameList := make([]string, 0)
for _, relationContract := range relationContractList {
payCompanyNameList = append(payCompanyNameList, relationContract.CompanyName)
}
payStr = strings.Join(payCompanyNameList, ",")
}
} else {
payStr = v.CompanyName
}
payCell.SetValue(payStr)
payCell.SetStyle(style)
//使用方
useStr := ``
useCell := dataRow.AddCell()
if v.ContractBusinessType == "代付合同" {
if relationContractList, ok := contractRelationMap[v.ContractId]; ok {
payCompanyNameList := make([]string, 0)
for _, relationContract := range relationContractList {
payCompanyNameList = append(payCompanyNameList, relationContract.CompanyName)
}
useStr = strings.Join(payCompanyNameList, ",")
}
} else {
useStr = v.CompanyName
}
useCell.SetValue(useStr)
useCell.SetStyle(style)
statusCell := dataRow.AddCell()
statusCell.SetValue(v.Status)
statusCell.SetStyle(style)
//备注:该字段由三部分拼接:服务内容中的补充内容+赠送时间+优惠金额
//补充内容直接取该字段内容;
//赠送时间以年为单位,超过整年的月份作为赠送月份,如14个月即为赠送2个月;
//优惠金额等于原价-优惠后价格=优惠价格
//补充内容
var remark string
if v.Remark != "" {
remark += "补充内容:" + v.Remark
}
//赠送时间
//合同结束日期与合同开始日期的时间差(小时差)
newDecimal := decimal.NewFromFloat(v.EndDate.Sub(v.StartDate).Hours())
//分母为365天 * 24 小时
newDecimal2 := decimal.NewFromInt(24 * 365)
//计算出来相差多少年,保留一位小数(四舍五入)
numYearDecimal := newDecimal.Div(newDecimal2).Round(1).Mul(decimal.NewFromInt(10))
//如果大于1年,那么才去判断是否赠送
numYear, _ := numYearDecimal.Float64()
if numYear > 10 {
//获取多出来的整数年数据
numYearDecimal = numYearDecimal.Mod(decimal.NewFromInt(10)).Div(decimal.NewFromInt(10))
//计算赠送出来的月份
numMonthDecimal := numYearDecimal.Mul(decimal.NewFromInt(12)).Round(0)
numMonth, _ := numMonthDecimal.Float64()
if numMonth > 0 {
if remark != "" {
remark += ";"
}
remark += "赠送时间为:" + numMonthDecimal.String() + "个月"
}
}
//优惠金额
if v.OriginalPrice > v.Price {
differencePrice := v.OriginalPrice - v.Price
differencePriceDecimal := decimal.NewFromFloat(differencePrice)
if remark != "" {
remark += ";"
}
remark += "优惠金额:" + differencePriceDecimal.String() + "元。"
}
remarkCell := dataRow.AddCell()
remarkCell.SetValue(remark)
remarkCell.SetStyle(style)
}
//服务套餐
{
cellServiceMap := make(map[int]string)
for _, cellI := range serviceCellMap {
cellServiceMap[cellI] = "否"
}
//如果没有服务那么就进入下一个循环
tmpService, ok := serviceListMap[v.ContractId]
if !ok {
continue
}
if tmpService != nil && len(tmpService) > 0 {
permissionValues := []string{
"FICC周报", "商品双周报+线上电话会讨论会
(由弘则的研究员主持线上讨论)", "数据点评", "深度月报:包括宏观经济月报和下游草根调研月报+电话会讨论会
(由弘则的研究员主持线上讨论)",
}
for _, item := range tmpService {
//ficc小套餐
if item.ServiceTemplateId == 2 {
for _, detail := range item.DetailList {
var tableCel request.AddContractServiceDetailReq
tmpErr := json.Unmarshal([]byte(detail.Col1), &tableCel)
if tmpErr != nil {
err = tmpErr
return
}
if tableCel.Value == "商品复盘" {
var tableCel2 request.AddContractServiceDetailReq
//获取品种列数据
tmpErr := contractService.GetProductCelData(*detail, &tableCel2)
if tmpErr != nil {
err = tmpErr
return
}
//tableCel2.Tag
for _, serviceId := range tableCel2.ValueId {
key := fmt.Sprint(item.ServiceTemplateId, "_product_permission_", serviceId)
if cellI, ok := serviceCellMap[key]; ok {
cellServiceMap[cellI] = "是"
}
}
} else if strings.Contains(strings.Join(permissionValues, ","), tableCel.Value) {
//获取品种列数据
var tableCel2 request.AddContractServiceDetailReq
tmpErr := contractService.GetProductCelData(*detail, &tableCel2)
if tmpErr != nil {
err = tmpErr
return
}
for _, serviceId := range tableCel2.ValueId {
key := fmt.Sprint(item.ServiceTemplateId, "_permission_", serviceId)
if cellI, ok := serviceCellMap[key]; ok {
cellServiceMap[cellI] = "是"
}
}
}
}
} else {
key := fmt.Sprint("service_template_", item.ServiceTemplateId)
if cellI, ok := serviceCellMap[key]; ok {
cellServiceMap[cellI] = "是"
}
}
}
}
//遍历所有套餐
for tmpStartCellI := customStartCellI; tmpStartCellI < startI; tmpStartCellI++ {
servicesCell := dataRow.AddCell()
cellValue, ok := cellServiceMap[tmpStartCellI]
if ok == false {
cellValue = "否"
}
servicesCell.SetValue(cellValue)
if cellValue == "是" { //勾选了话,标红处理
servicesCell.SetStyle(redStyle)
} else {
servicesCell.SetStyle(style)
}
}
}
}
}
err = xlsxFile.Save(downLoadnFilePath)
if err != nil {
br.Msg = "保存文件失败"
br.ErrMsg = "保存文件失败"
return
}
randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
downloadFileName := "合同列表" + randStr + ".xlsx"
this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
br.Ret = 200
br.Success = true
br.Msg = "导出成功"
}
// @Title 合同列表数据导出
// @Description 合同列表数据导出接口
// @Description 合同列表接口
// @Param ContractType query string false "合同类型,枚举值:'新签合同','续约合同','补充协议'"
// @Param ContractStatus query string false "合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废'"
// @Param ProductId query int false "客户类型:传0或者不传为当前账号权限,1 代表是:ficc;2 代表是:权益"
// @Param ModifyStartTime query string false "服务更新时间的选择开始时间,格式:2021-05-23 00:00:00"
// @Param ModifyEndTime query string false "服务更新时间的选择结束时间,格式:2021-05-26 23:59:59"
// @Param SellerId query string false "选择的销售id"
// @Param Keyword query string false "搜索关键字"
// @Success 200 {object} response.ContractListResp
// @router /approval/export [get]
func (this *ContractApprovalController) Export() {
br := new(models.BaseResponse).Init()
defer func() {
this.Data["json"] = br
this.ServeJSON()
}()
sysUser := this.SysUser
if sysUser == nil {
br.Msg = "请登录"
br.ErrMsg = "请登录,SysUser Is Empty"
br.Ret = 408
return
}
contractType := this.GetString("ContractType")
contractStatus := this.GetString("ContractStatus")
productId, _ := this.GetInt("ProductId")
modifyStartTime := this.GetString("ModifyStartTime")
modifyEndTime := this.GetString("ModifyEndTime")
sellerIds := this.GetString("SellerId")
keyword := this.GetString("Keyword")
condition := ""
pars := make([]interface{}, 0)
//如果不是超管或者合规,那么只能查看自己的合同
if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
condition += ` AND product_id = 1 AND status not in ("待提交","已撤回") `
} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
condition += ` AND product_id = 2 AND status not in ("待提交","已撤回") `
} else {
if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_COMPLIANCE && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
condition += ` AND seller_id = ? `
pars = append(pars, sysUser.AdminId)
}
}
//需要下载的 产品 切片
productSlice := make([]int, 0)
//合同类型、、更新时间、所选销售
//关键字:合同编号、客户名称,社会信用码
if contractType != "" {
condition += ` AND contract_type = ? `
pars = append(pars, contractType)
}
//合同状态
if contractStatus != "" {
if contractStatus == "已审批" {
condition += ` AND status in ("已审批","已驳回") `
} else {
condition += ` AND status = ? `
pars = append(pars, contractStatus)
}
} else {
//condition += ` AND status != "已撤回" `
condition += ` AND status not in ("已撤回","待提交") `
}
//产品类型
if productId > 0 {
condition += ` AND product_id = ? `
pars = append(pars, productId)
productSlice = append(productSlice, productId)
} else {
nowProductId := services.GetProductId(sysUser.RoleTypeCode)
if nowProductId > 0 {
productSlice = append(productSlice, nowProductId)
} else {
productSlice = append(productSlice, 1)
productSlice = append(productSlice, 2)
}
}
//所选销售
if sellerIds != "" {
condition += ` AND seller_id IN (` + sellerIds + `) `
}
//更新开始时间
if modifyStartTime != "" {
condition += ` AND modify_time >= ? `
pars = append(pars, modifyStartTime)
}
//更新结束时间
if modifyEndTime != "" {
condition += ` AND modify_time <= ? `
pars = append(pars, modifyEndTime)
}
//关键字
if keyword != "" {
condition += ` AND (contract_code LIKE '%` + keyword + `%' OR company_name LIKE '%` + keyword + `%' OR credit_code LIKE '%` + keyword + `%' ) `
}
//取 一万 条合同数据
list, err := contract.GetContractList(condition, "", pars, 0, 10000)
if err != nil {
br.Msg = "获取合同列表失败!"
br.ErrMsg = "获取合同列表失败,Err:" + err.Error()
return
}
//获取合同套餐服务列表
serviceTemplateList, err := contract.GetAllContractServiceTemplateList()
if err != nil {
br.Msg = "获取合同套餐服务列表失败!"
br.ErrMsg = "获取合同套餐服务列表失败,Err:" + err.Error()
return
}
templateTitleMap := make(map[int]string)
for _, serviceTemplate := range serviceTemplateList {
templateTitleMap[serviceTemplate.ServiceTemplateId] = serviceTemplate.Title
}
for i := 0; i < len(list); i++ {
item := list[i]
list[i].StartDateStr = item.StartDate.Format(utils.FormatDate)
list[i].EndDateStr = item.EndDate.Format(utils.FormatDate)
list[i].CreateTimeStr = item.CreateTime.Format(utils.FormatDateTime)
list[i].ModifyTimeStr = item.ModifyTime.Format(utils.FormatDateTime)
//服务列表
serviceList, err := contract.GetContractServiceAndDetailList(item.ContractId)
if err != nil {
br.Msg = "获取失败"
br.ErrMsg = "查找合同服务异常,Err:" + err.Error()
return
}
for i := 0; len(serviceList) > i; i++ {
if serviceList[i].HasDetail == "是" {
list, detailErr := contract.GetContractServiceDetailListByServiceId(serviceList[i].ContractServiceId)
if detailErr != nil {
br.Msg = "获取失败"
br.ErrMsg = "查找合同服务详情异常,Err:" + err.Error()
return
}
//套餐名称
serviceList[i].DetailList = list
if title, ok := templateTitleMap[serviceList[i].ServiceTemplateId]; ok {
serviceList[i].Title = title
}
}
}
list[i].Service = serviceList
}
//生成excel文件
dir, err := os.Executable()
exPath := filepath.Dir(dir)
downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
xlsxFile := xlsx.NewFile()
if err != nil {
br.Msg = "生成文件失败"
br.ErrMsg = "生成文件失败"
return
}
//设置默认字体和文字大小
xlsx.SetDefaultFont(12, "宋体")
//定义边框样式
border := xlsx.NewBorder("thin", "thin", "thin", "thin")
//定义文字排版样式
alignment := xlsx.Alignment{
Horizontal: "center",
Vertical: "center",
WrapText: true,
}
//普通样式
style := xlsx.NewStyle()
style.Alignment = alignment
style.ApplyAlignment = true
style.Border = *border
//标红文字,便于查看哪些产品被勾选
redStyle := xlsx.NewStyle()
redStyle.Alignment = alignment
redStyle.ApplyAlignment = true
redStyle.Font.Color = "ff0000"
//定义底色需要标黄的 单元格颜色
redFill := xlsx.Fill{"solid", "ffff00", "ffff00"}
redStyle.Fill = redFill
redStyle.Border = *border
//标题样式
titleStyle := xlsx.NewStyle()
titleFont := xlsx.NewFont(14, "宋体")
titleFont.Bold = true
titleStyle.Font = *titleFont
titleStyle.Alignment = alignment
titleStyle.Border = *border
//titleStyle.ApplyAlignment = true
//表头
headerStyle := xlsx.NewStyle()
headerFont := xlsx.NewFont(12, "宋体")
headerFont.Bold = true
headerStyle.Font = *headerFont
headerStyle.Alignment = alignment
headerStyle.ApplyAlignment = true
headerStyle.Border = *border
defer func() {
os.Remove(downLoadnFilePath)
}()
//遍历所拥有的的产品权限,然后插入到对应的sheet表单中
for pidIndex := 0; pidIndex < len(productSlice); pidIndex++ {
productId = productSlice[pidIndex]
//表单名称
sheetName := "合同数据"
switch productId {
case 1:
sheetName = "ficc合同信息"
case 2:
sheetName = "权益合同信息"
}
//新增一个sheet表单
sheel, err := xlsxFile.AddSheet(sheetName)
if err != nil {
br.Msg = "新增Sheet失败"
br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
return
}
//设置列宽
sheel.SetColWidth(0, 0, 28)
sheel.SetColWidth(1, 1, 30)
sheel.SetColWidth(2, 2, 18)
sheel.SetColWidth(3, 3, 18)
sheel.SetColWidth(4, 4, 35)
sheel.SetColWidth(5, 6, 20)
sheel.SetColWidth(7, 7, 40)
sheel.SetColWidth(7, 35, 30)
//标题行
titleRow := sheel.AddRow()
titleRow.SetHeight(30)
//合同信息列
titleCell := titleRow.AddCell()
titleCell.HMerge = 7 //向右合并列数,不包括自身列
//遍历去添加需要合并的列
for i := 0; i < 7; i++ {
titleRow.AddCell()
}
//报表标题名称
titleCell.SetValue("合同信息")
titleCell.SetStyle(titleStyle)
startI := 8
customStartCellI := 8
serviceSlice := make([]string, 0)
serviceCellMap := make(map[string]int)
//获取所有套餐列表
{
serviceList, err := getServiceTemplateList(productId)
if err != nil {
br.Msg = "查询套餐类型失败"
br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
return
}
for i := 0; i < len(serviceList); i++ {
//需要向右合并添加的列数
addCellNum := 0
item := serviceList[i]
//套餐服务列
servicesCell := titleRow.AddCell()
//套餐名称
servicesCell.SetValue(item.Title)
servicesCell.SetStyle(titleStyle)
//ficc小套餐
if item.ServiceTemplateId == 2 {
productPermission := make(map[int]string)
productPermission[1] = "每日宏观商品复盘"
productPermission[2] = "能化专栏《化里化外》"
productPermission[3] = "股债日评"
productPermission[4] = "黑色专栏《知白守黑》"
productPermission[5] = "有色专栏《有声有色》"
for id, name := range productPermission {
key := fmt.Sprint(item.ServiceTemplateId, "_product_permission_", id)
serviceCellMap[key] = startI
serviceSlice = append(serviceSlice, name)
startI++
addCellNum++
}
permissionList := make([]*company.PermissionSetItem, 0)
allPermissions, permissionMap, e := services.GetBaseFiccPermissionSetItem()
if e != nil {
br.Msg = "查询基础权限失败"
br.ErrMsg = "查询基础权限失败,Err:" + e.Error()
return
}
//遍历获取
for _, v := range allPermissions {
if v.ParentId == 0 {
items, ok := permissionMap[v.ChartPermissionId]
if ok {
permissionList = append(permissionList, items...)
}
}
}
/*for _, v := range utils.PermissionFiccClassifyArr {
items, err := company.GetPermissionSetItems(1, v)
if err != nil {
br.Msg = "获取失败"
br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
return
}
permissionList = append(permissionList, items...)
}
*/
//权限列表
for j := 0; j < len(permissionList); j++ {
key := fmt.Sprint(item.ServiceTemplateId, "_permission_", permissionList[j].ChartPermissionId)
serviceCellMap[key] = startI
serviceSlice = append(serviceSlice, permissionList[j].PermissionName)
startI++
addCellNum++
}
//因为自己本身有一列了,所以在最后增加列的时候,需要减去自身列
addCellNum = addCellNum - 1
if addCellNum > 0 {
for tmpAddCellNum := 0; tmpAddCellNum < addCellNum; tmpAddCellNum++ {
titleRow.AddCell()
}
servicesCell.HMerge = addCellNum //向右合并列数,不包括自身列
}
continue
} else {
if item.Children != nil && len(item.Children) > 0 {
for j := 0; j < len(item.Children); j++ {
key := fmt.Sprint("service_template_", item.Children[j].ServiceTemplateId)
serviceCellMap[key] = startI
serviceSlice = append(serviceSlice, item.Children[j].Title)
startI++
addCellNum++
}
//因为自己本身有一列了,所以在最后增加列的时候,需要减去自身列
addCellNum = addCellNum - 1
if addCellNum > 0 {
for tmpAddCellNum := 0; tmpAddCellNum < addCellNum; tmpAddCellNum++ {
titleRow.AddCell()
}
servicesCell.HMerge = addCellNum //向右合并列数,不包括自身列
}
} else {
key := fmt.Sprint("service_template_", item.ServiceTemplateId)
serviceCellMap[key] = startI
serviceSlice = append(serviceSlice, item.Title)
startI++
}
}
}
}
//表头
headerRow := sheel.AddRow()
headerRow.SetHeight(24)
//合同基础信息
{
codeHeaderCell := headerRow.AddCell()
codeHeaderCell.SetValue("合同编号")
codeHeaderCell.SetStyle(headerStyle)
companyHeaderCell := headerRow.AddCell()
companyHeaderCell.SetValue("客户名称")
companyHeaderCell.SetStyle(headerStyle)
typeHeaderCell := headerRow.AddCell()
typeHeaderCell.SetValue("合同类型")
typeHeaderCell.SetStyle(headerStyle)
priceHeaderCell := headerRow.AddCell()
priceHeaderCell.SetValue("合同金额")
priceHeaderCell.SetStyle(headerStyle)
dateHeaderCell := headerRow.AddCell()
dateHeaderCell.SetValue("合同有效期")
dateHeaderCell.SetStyle(headerStyle)
sellerHeaderCell := headerRow.AddCell()
sellerHeaderCell.SetValue("销售")
sellerHeaderCell.SetStyle(headerStyle)
statusHeaderCell := headerRow.AddCell()
statusHeaderCell.SetValue("合同状态")
statusHeaderCell.SetStyle(headerStyle)
remarkHeaderCell := headerRow.AddCell()
remarkHeaderCell.SetValue("备注")
remarkHeaderCell.SetStyle(headerStyle)
}
//添加服务套餐名称
for _, service := range serviceSlice {
cell := headerRow.AddCell()
cell.SetValue(service)
cell.SetStyle(headerStyle)
}
for _, v := range list {
//如果当前合同不是该产品
if v.ProductId != productId {
continue
}
dataRow := sheel.AddRow()
dataRow.SetHeight(24)
//合同基础信息
{
codeCell := dataRow.AddCell()
codeCell.SetValue(v.ContractCode)
codeCell.SetStyle(style)
companyCell := dataRow.AddCell()
companyCell.SetValue(v.CompanyName)
companyCell.SetStyle(style)
typeCell := dataRow.AddCell()
typeCell.SetValue(v.ContractType)
typeCell.SetStyle(style)
priceCell := dataRow.AddCell()
priceCell.SetValue(v.Price)
priceCell.SetStyle(style)
dateCell := dataRow.AddCell()
dateCell.SetValue(fmt.Sprint(v.StartDate.Format(utils.FormatDate), " 至 ", v.EndDate.Format(utils.FormatDate)))
dateCell.SetStyle(style)
sellerCell := dataRow.AddCell()
sellerCell.SetValue(v.SellerName)
sellerCell.SetStyle(style)
statusCell := dataRow.AddCell()
statusCell.SetValue(v.Status)
statusCell.SetStyle(style)
//备注:该字段由三部分拼接:服务内容中的补充内容+赠送时间+优惠金额
//补充内容直接取该字段内容;
//赠送时间以年为单位,超过整年的月份作为赠送月份,如14个月即为赠送2个月;
//优惠金额等于原价-优惠后价格=优惠价格
//补充内容
var remark string
if v.Remark != "" {
remark += "补充内容:" + v.Remark
}
//赠送时间
//合同结束日期与合同开始日期的时间差(小时差)
newDecimal := decimal.NewFromFloat(v.EndDate.Sub(v.StartDate).Hours())
//分母为365天 * 24 小时
newDecimal2 := decimal.NewFromInt(24 * 365)
//计算出来相差多少年,保留一位小数(四舍五入)
numYearDecimal := newDecimal.Div(newDecimal2).Round(1).Mul(decimal.NewFromInt(10))
//如果大于1年,那么才去判断是否赠送
numYear, _ := numYearDecimal.Float64()
if numYear > 10 {
//获取多出来的整数年数据
numYearDecimal = numYearDecimal.Mod(decimal.NewFromInt(10)).Div(decimal.NewFromInt(10))
//计算赠送出来的月份
numMonthDecimal := numYearDecimal.Mul(decimal.NewFromInt(12)).Round(0)
numMonth, _ := numMonthDecimal.Float64()
if numMonth > 0 {
if remark != "" {
remark += ";"
}
remark += "赠送时间为:" + numMonthDecimal.String() + "个月"
}
}
//优惠金额
if v.OriginalPrice > v.Price {
differencePrice := v.OriginalPrice - v.Price
differencePriceDecimal := decimal.NewFromFloat(differencePrice)
if remark != "" {
remark += ";"
}
remark += "优惠金额:" + differencePriceDecimal.String() + "元。"
}
remarkCell := dataRow.AddCell()
remarkCell.SetValue(remark)
remarkCell.SetStyle(style)
}
//服务套餐
{
cellServiceMap := make(map[int]string)
for _, cellI := range serviceCellMap {
cellServiceMap[cellI] = "否"
}
if v.Service != nil && len(v.Service) > 0 {
permissionValues := []string{
"FICC周报", "商品双周报+线上电话会讨论会
(由弘则的研究员主持线上讨论)", "数据点评", "深度月报:包括宏观经济月报和下游草根调研月报+电话会讨论会
(由弘则的研究员主持线上讨论)",
}
for _, item := range v.Service {
//ficc小套餐
if item.ServiceTemplateId == 2 {
for _, detail := range item.DetailList {
var tableCel request.AddContractServiceDetailReq
tmpErr := json.Unmarshal([]byte(detail.Col1), &tableCel)
if tmpErr != nil {
err = tmpErr
return
}
if tableCel.Value == "商品复盘" {
var tableCel2 request.AddContractServiceDetailReq
//获取品种列数据
tmpErr := contractService.GetProductCelData(*detail, &tableCel2)
if tmpErr != nil {
err = tmpErr
return
}
//tableCel2.Tag
for _, serviceId := range tableCel2.ValueId {
key := fmt.Sprint(item.ServiceTemplateId, "_product_permission_", serviceId)
if cellI, ok := serviceCellMap[key]; ok {
cellServiceMap[cellI] = "是"
}
}
} else if strings.Contains(strings.Join(permissionValues, ","), tableCel.Value) {
//获取品种列数据
var tableCel2 request.AddContractServiceDetailReq
tmpErr := contractService.GetProductCelData(*detail, &tableCel2)
if tmpErr != nil {
err = tmpErr
return
}
for _, serviceId := range tableCel2.ValueId {
key := fmt.Sprint(item.ServiceTemplateId, "_permission_", serviceId)
if cellI, ok := serviceCellMap[key]; ok {
cellServiceMap[cellI] = "是"
}
}
}
}
} else {
key := fmt.Sprint("service_template_", item.ServiceTemplateId)
if cellI, ok := serviceCellMap[key]; ok {
cellServiceMap[cellI] = "是"
}
}
}
}
//遍历所有套餐
for tmpStartCellI := customStartCellI; tmpStartCellI < startI; tmpStartCellI++ {
servicesCell := dataRow.AddCell()
cellValue, ok := cellServiceMap[tmpStartCellI]
if ok == false {
cellValue = "否"
}
servicesCell.SetValue(cellValue)
if cellValue == "是" { //勾选了话,标红处理
servicesCell.SetStyle(redStyle)
} else {
servicesCell.SetStyle(style)
}
}
}
}
}
err = xlsxFile.Save(downLoadnFilePath)
if err != nil {
br.Msg = "保存文件失败"
br.ErrMsg = "保存文件失败"
return
}
randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
downloadFileName := "合同列表" + randStr + ".xlsx"
this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
br.Ret = 200
br.Success = true
br.Msg = "导出成功"
}
// CancelApply
// @Title 撤回审批申请
// @Description 撤回审批申请接口
// @Param ContractApprovalRecordId query int true "审批流id编号"
// @Param ContractId query int true "合同id编号"
// @Success Ret=200 撤回申请成功
// @router /approval/cancelApply [get]
func (this *ContractApprovalController) CancelApply() {
br := new(models.BaseResponse).Init()
defer func() {
this.Data["json"] = br
this.ServeJSON()
}()
sysUser := this.SysUser
if sysUser == nil {
br.Msg = "请登录"
br.ErrMsg = "请登录,SysUser Is Empty"
br.Ret = 408
return
}
//合同id编号
contractId, err := this.GetInt("ContractId")
if err != nil {
br.Msg = "获取审批流编号失败"
br.ErrMsg = "获取审批流编号失败,err:" + err.Error()
return
}
//审批流id编号
contractApprovalRecordId, err := this.GetInt("ContractApprovalRecordId", 0)
if err != nil {
br.Msg = "获取审批流编号失败"
br.ErrMsg = "获取审批流编号失败,err:" + err.Error()
return
}
if contractApprovalRecordId <= 0 && contractId <= 0 {
br.Msg = "请传入审批流编号获取合同编号"
br.ErrMsg = "请传入审批流编号获取合同编号"
return
}
if contractApprovalRecordId > 0 {
//获取审批流信息
contractApprovalRecord, err := contract.GetContractApprovalRecordById(contractApprovalRecordId)
if err != nil {
br.Msg = "获取审批流信息失败!"
br.ErrMsg = "获取审批流信息失败,Err:" + err.Error()
return
}
err = contractService.CancelApply(contractApprovalRecord, sysUser.AdminId)
if err != nil {
br.Msg = "撤回申请失败!"
br.ErrMsg = "撤回申请失败,Err:" + err.Error()
return
}
} else if contractId > 0 {
//获取审批流信息
contractInfo, err := contract.GetContractById(contractId)
if err != nil {
br.Msg = "获取审批流信息失败!"
br.ErrMsg = "获取审批流信息失败,Err:" + err.Error()
return
}
err = contractService.CancelApplyByContract(contractInfo, sysUser.AdminId)
if err != nil {
br.Msg = "撤回申请失败!"
br.ErrMsg = "撤回申请失败,Err:" + err.Error()
return
}
} else {
br.Msg = "请传入审批流编号获取合同编号"
br.ErrMsg = "请传入审批流编号获取合同编号"
return
}
br.Ret = 200
br.Success = true
br.Msg = "撤回申请成功"
}
// @Title 驳回审批
// @Description 驳回审批接口
// @Param request body request.RejectReq true "type json string"
// @Success Ret=200 驳回成功
// @router /approval/reject [post]
func (this *ContractApprovalController) Reject() {
br := new(models.BaseResponse).Init()
defer func() {
this.Data["json"] = br
this.ServeJSON()
}()
sysUser := this.SysUser
if sysUser == nil {
br.Msg = "请登录"
br.ErrMsg = "请登录,SysUser Is Empty"
br.Ret = 408
return
}
var req request.RejectReq
err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
if err != nil {
br.Msg = "参数解析异常!"
br.ErrMsg = "参数解析失败,Err:" + err.Error()
return
}
//审批流id编号
contractApprovalRecordId := req.ContractApprovalRecordId
if contractApprovalRecordId <= 0 {
br.Msg = "请传入审批流编号"
br.ErrMsg = "请传入审批流编号"
return
}
//获取审批流信息
contractApprovalRecord, err := contract.GetContractApprovalRecordById(contractApprovalRecordId)
if err != nil {
br.Msg = "获取审批流信息失败!"
br.ErrMsg = "获取审批流信息失败,Err:" + err.Error()
return
}
err = contractService.Reject(contractApprovalRecord, sysUser, req.Remark)
if err != nil {
br.Msg = "驳回审批失败!"
br.ErrMsg = "驳回审批失败,Err:" + err.Error()
return
}
br.Ret = 200
br.Success = true
br.Msg = "驳回成功"
}
// @Title 处理审批单
// @Description 处理审批单
// @Param request body request.ApprovedReq true "type json string"
// @Success Ret=200 申请成功
// @router /approval/approved [post]
func (this *ContractApprovalController) Approved() {
br := new(models.BaseResponse).Init()
defer func() {
this.Data["json"] = br
this.ServeJSON()
}()
sysUser := this.SysUser
if sysUser == nil {
br.Msg = "请登录"
br.ErrMsg = "请登录,SysUser Is Empty"
br.Ret = 408
return
}
var req request.ApprovedReq
err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
if err != nil {
br.Msg = "参数解析异常!"
br.ErrMsg = "参数解析失败,Err:" + err.Error()
return
}
//审批流id编号
contractApprovalRecordId := req.ContractApprovalRecordId
if contractApprovalRecordId <= 0 {
br.Msg = "请传入审批流编号"
br.ErrMsg = "请传入审批流编号"
return
}
//获取审批流信息
contractApprovalRecord, err := contract.GetContractApprovalRecordById(contractApprovalRecordId)
if err != nil {
br.Msg = "获取审批流信息失败!"
br.ErrMsg = "获取审批流信息失败,Err:" + err.Error()
return
}
err = contractService.Approved(contractApprovalRecord, sysUser, req.Remark)
if err != nil {
br.Msg = "审核失败!"
br.ErrMsg = "审核失败,Err:" + err.Error()
return
}
br.Ret = 200
br.Success = true
br.Msg = "审核通过"
}