contract.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  1. package contract
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "github.com/beego/beego/v2/client/orm"
  7. "hongze/hongze_mobile_admin/models/custom"
  8. contractCustom "hongze/hongze_mobile_admin/models/custom/contract"
  9. contractReq "hongze/hongze_mobile_admin/models/request/contract"
  10. contractResp "hongze/hongze_mobile_admin/models/response/contract"
  11. "hongze/hongze_mobile_admin/models/tables/company_report_permission"
  12. "hongze/hongze_mobile_admin/models/tables/contract"
  13. "hongze/hongze_mobile_admin/models/tables/contract_approval"
  14. "hongze/hongze_mobile_admin/models/tables/contract_approval_record"
  15. "hongze/hongze_mobile_admin/models/tables/contract_operation_record"
  16. "hongze/hongze_mobile_admin/models/tables/contract_relation"
  17. "hongze/hongze_mobile_admin/models/tables/contract_service_detail"
  18. "hongze/hongze_mobile_admin/models/tables/contract_service_template"
  19. "hongze/hongze_mobile_admin/services"
  20. "hongze/hongze_mobile_admin/utils"
  21. "mime/multipart"
  22. "reflect"
  23. "strings"
  24. "time"
  25. )
  26. // InvalidContract 作废合同
  27. func InvalidContract(contractId int, opUser *custom.AdminWx) (err error) {
  28. //查询当前合同信息
  29. nowContract, err := contract.GetContractById(contractId)
  30. if err != nil {
  31. if err.Error() == utils.ErrNoRow() {
  32. err = errors.New(fmt.Sprint("根据合同编号:", contractId, " 找不到初始合同"))
  33. }
  34. return
  35. }
  36. if nowContract.SellerId != opUser.AdminId && opUser.RoleTypeCode != utils.ROLE_TYPE_CODE_COMPLIANCE {
  37. err = errors.New("当前账号无操作权限")
  38. return
  39. }
  40. if nowContract.Status != "已审批" {
  41. err = errors.New("合同状态异常,不允许作废,当前合同状态:" + nowContract.Status)
  42. return
  43. }
  44. //如果删除状态 >0,那么代表已经被删除了
  45. if nowContract.IsDelete > 0 {
  46. err = errors.New("该合同已删除")
  47. return
  48. }
  49. //合同作废
  50. err = contract.InvalidContract(nowContract)
  51. if err != nil {
  52. return
  53. }
  54. //添加操作日志
  55. remark := "作废合同模板"
  56. _ = contract_operation_record.AddContractOperationRecord(nowContract.ContractId, opUser.AdminId, 0, "invalid", opUser.RealName, remark)
  57. //修改业务合同的已支付金额
  58. if nowContract.ContractBusinessType == "代付合同" {
  59. go updateContractPaidPriceByPaymentOnBehalfContractId(nowContract.ContractId, -nowContract.Price)
  60. }
  61. return
  62. }
  63. // GetContractDetail 根据id获取合同详情(包含服务)
  64. func GetContractDetail(contractId int) (contractDetail *contract.ContractDetail, err error) {
  65. contractDetail, err = getContractDetail(contractId)
  66. if err != nil {
  67. if err.Error() == utils.ErrNoRow() {
  68. err = errors.New("找不到该合同")
  69. }
  70. return
  71. }
  72. relationContractDetailList := make([]*contract.ContractDetail, 0)
  73. switch contractDetail.ContractBusinessType {
  74. case "业务合同":
  75. tmpList, tmpErr := contract_relation.GetContractRelationListByRelationContractId(contractDetail.ContractId)
  76. if tmpErr != nil {
  77. err = errors.New("查询业务关联合同异常:" + tmpErr.Error())
  78. return
  79. }
  80. //获取所有关联合同详情
  81. for _, relationContract := range tmpList {
  82. tmpContractDetail, tmpErr := getContractDetail(relationContract.PaymentOnBehalfContractId)
  83. if tmpErr != nil {
  84. err = errors.New("查询业务关联合同详情异常:" + tmpErr.Error())
  85. return
  86. }
  87. relationContractDetailList = append(relationContractDetailList, tmpContractDetail)
  88. }
  89. case "代付合同":
  90. tmpList, tmpErr := contract_relation.GetContractRelationListByPaymentOnBehalfContractId(contractDetail.ContractId)
  91. if tmpErr != nil {
  92. err = errors.New("查询代付关联合同异常:" + tmpErr.Error())
  93. return
  94. }
  95. //获取所有关联合同详情
  96. for _, relationContract := range tmpList {
  97. tmpContractDetail, tmpErr := getContractDetail(relationContract.ContractId)
  98. if tmpErr != nil {
  99. err = errors.New("查询业务关联合同详情异常:" + tmpErr.Error())
  100. return
  101. }
  102. relationContractDetailList = append(relationContractDetailList, tmpContractDetail)
  103. }
  104. }
  105. contractDetail.RelationContractDetailList = relationContractDetailList
  106. return
  107. }
  108. // getContractDetail 根据id获取合同详情(包含服务)
  109. func getContractDetail(contractId int) (contractDetail *contract.ContractDetail, err error) {
  110. contractDetail, err = contract.GetContractDetailById(contractId)
  111. if err != nil {
  112. if err.Error() == utils.ErrNoRow() {
  113. err = errors.New("找不到该合同")
  114. }
  115. return
  116. }
  117. //获取合同服务内容详情
  118. serviceList, err := contractCustom.GetContractServiceAndDetailList(contractId)
  119. if err != nil {
  120. err = errors.New(fmt.Sprint("查找合同服务异常", err))
  121. return
  122. }
  123. // 权益合同主客观合并
  124. if len(serviceList) > 0 && serviceList[0].ProductId == 2 {
  125. mergeList := EquityMergeSubjectAndObject(serviceList)
  126. serviceList = mergeList
  127. }
  128. newLen := len(serviceList)
  129. for i := 0; newLen > i; i++ {
  130. if serviceList[i].HasDetail == "是" {
  131. list, detailErr := contract_service_detail.GetContractServiceDetailListByServiceId(serviceList[i].ContractServiceId)
  132. if detailErr != nil {
  133. err = errors.New(fmt.Sprint("查找合同服务详情异常", detailErr))
  134. return
  135. }
  136. serviceList[i].DetailList = list
  137. }
  138. }
  139. contractDetail.Service = serviceList
  140. return
  141. }
  142. // UploadCheckBackFileByFile 上传签回合同附件
  143. func UploadCheckBackFileByFile(contractId int, ext string, fileMulti multipart.File, opUser *custom.AdminWx) (resourceUrl string, err error) {
  144. //获取合同信息
  145. contractInfo, err := contract.GetContractById(contractId)
  146. if err != nil {
  147. return
  148. }
  149. //合同状态判断
  150. if contractInfo.Status != "已审批" && contractInfo.Status != "已签回" {
  151. err = errors.New("合同状态异常,不允许上传签回合同附件,当前合同状态:" + contractInfo.Status)
  152. return
  153. }
  154. //保存的文件名
  155. fileName := contractInfo.CompanyName + "_" + contractInfo.ContractCode + "(签回)"
  156. //非正式环境下,文件名上面还是加上随机数
  157. if utils.RunMode != "release" {
  158. fileName += "_" + utils.GetRandStringNoSpecialChar(10)
  159. }
  160. fileName += ext
  161. //上传到阿里云
  162. resourceUrl, err = services.UploadToOssAndFileName(fileMulti, fileName)
  163. if err != nil {
  164. err = errors.New("文件保存失败,Err:" + err.Error())
  165. return
  166. }
  167. contractInfo.CheckBackFileUrl = resourceUrl
  168. contractInfo.Status = "已签回"
  169. contractInfo.ModifyTime = time.Now()
  170. contractInfo.CheckBackFileTime = time.Now()
  171. err = contractInfo.Update([]string{"CheckBackFileUrl", "Status", "ModifyTime", "CheckBackFileTime"})
  172. if err != nil {
  173. return
  174. }
  175. //同步更新客户那边提交审批的合同
  176. o := orm.NewOrm()
  177. sql := `update company_contract set img_url = ? where contract_code=? and source="系统合同" `
  178. _, err = o.Raw(sql, contractInfo.CheckBackFileUrl, contractInfo.ContractCode).Exec()
  179. //添加操作日志
  180. remark := "上传签回合同附件"
  181. _ = contract_operation_record.AddContractOperationRecord(contractInfo.ContractId, opUser.AdminId, 0, "upload", opUser.RealName, remark)
  182. return
  183. }
  184. // UploadCheckBackFile 更新上传签回合同附件
  185. func UploadCheckBackFile(contractId int, fileUrl string, opUser *custom.AdminWx) (err error) {
  186. //获取合同信息
  187. contractInfo, err := contract.GetContractById(contractId)
  188. if err != nil {
  189. return
  190. }
  191. //合同状态判断
  192. if contractInfo.Status != "已审批" && contractInfo.Status != "已签回" {
  193. err = errors.New("合同状态异常,不允许上传签回合同附件,当前合同状态:" + contractInfo.Status)
  194. return
  195. }
  196. contractInfo.CheckBackFileUrl = fileUrl
  197. contractInfo.Status = "已签回"
  198. contractInfo.ModifyTime = time.Now()
  199. contractInfo.CheckBackFileTime = time.Now()
  200. err = contractInfo.Update([]string{"CheckBackFileUrl", "Status", "ModifyTime", "CheckBackFileTime"})
  201. if err != nil {
  202. return
  203. }
  204. //同步更新客户那边提交审批的合同
  205. o := orm.NewOrm()
  206. sql := `update company_contract set img_url = ? where contract_code=? and source="系统合同" `
  207. _, err = o.Raw(sql, contractInfo.CheckBackFileUrl, contractInfo.ContractCode).Exec()
  208. //添加操作日志
  209. remark := "上传签回合同附件"
  210. _ = contract_operation_record.AddContractOperationRecord(contractInfo.ContractId, opUser.AdminId, 0, "upload", opUser.RealName, remark)
  211. return
  212. }
  213. // GetOpButton 获取审批流和权限
  214. func GetOpButton(contractInfo *contract.ContractDetail, contractApprovalInfo *contract_approval.ContractApproval, opUser *custom.AdminWx) (contractOpButton contractResp.OpButton, flowNodeListResp [][]contract_approval_record.ContractApprovalRecord, err error) {
  215. //审批流
  216. approvalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractApprovalId(contractApprovalInfo.ContractApprovalId)
  217. if err != nil {
  218. err = errors.New("获取审批失败,Err:" + err.Error())
  219. return
  220. }
  221. flowNodeMap := make(map[int][]contract_approval_record.ContractApprovalRecord, 0)
  222. keySort := make([]int, 0)
  223. for _, approvalRecord := range approvalRecordList {
  224. //如果当前节点正好是该节点,同时审批单状态是待审批状态,然后当前账号又有权限,该账号也正是审批人,那么允许审批操作
  225. if contractApprovalInfo.CurrNodeId == approvalRecord.NodeId && contractApprovalInfo.Status == "待审批" {
  226. if opUser.AdminId == approvalRecord.ApproveUserId && approvalRecord.NodeType == "check" {
  227. contractOpButton.Approval = true
  228. }
  229. }
  230. if tmpFlowNodeList, ok := flowNodeMap[approvalRecord.NodeId]; ok {
  231. flowNodeMap[approvalRecord.NodeId] = append(tmpFlowNodeList, *approvalRecord)
  232. } else {
  233. tmpFlowNodeList := make([]contract_approval_record.ContractApprovalRecord, 1)
  234. tmpFlowNodeList[0] = *approvalRecord
  235. flowNodeMap[approvalRecord.NodeId] = tmpFlowNodeList
  236. keySort = append(keySort, approvalRecord.NodeId)
  237. }
  238. }
  239. for _, key := range keySort {
  240. flowNodeListResp = append(flowNodeListResp, flowNodeMap[key])
  241. }
  242. //是否具有签回合同权限
  243. uploadStatus := []string{"已审批", "已签回"}
  244. if opUser.RoleTypeCode == utils.ROLE_TYPE_CODE_COMPLIANCE && strings.Contains(strings.Join(uploadStatus, ","), contractInfo.Status) {
  245. contractOpButton.UploadFile = true
  246. }
  247. //作废权限
  248. if (opUser.RoleTypeCode == utils.ROLE_TYPE_CODE_COMPLIANCE || opUser.AdminId == contractInfo.SellerId) && contractInfo.Status == "已审批" {
  249. contractOpButton.Invalid = true
  250. }
  251. return
  252. }
  253. // GetContractDetailByContractId 根据合同获取合同详情
  254. func GetContractDetailByContractId(contractId int, opUser *custom.AdminWx) (contractInfo *contract.ContractDetail, flowNodeListResp [][]contract_approval_record.ContractApprovalRecord, opButton contractResp.OpButton, err error) {
  255. contractInfo, err = GetContractDetail(contractId)
  256. if err != nil {
  257. err = errors.New("获取合同详情失败,ERR:" + err.Error())
  258. return
  259. }
  260. contractInfo.StartDateStr = contractInfo.StartDate.Format(utils.FormatDate)
  261. contractInfo.EndDateStr = contractInfo.EndDate.Format(utils.FormatDate)
  262. contractInfo.ModifyTimeStr = contractInfo.ModifyTime.Format(utils.FormatDateTime)
  263. contractInfo.CreateTimeStr = contractInfo.CreateTime.Format(utils.FormatDateTime)
  264. //合同中包含的产品权限
  265. isNeedPermission := false //是否需要列出来套餐中的详细权限
  266. for _, service := range contractInfo.Service {
  267. if service.ServiceTemplateId == 2 { //小套餐才需要列出来详细的权限
  268. isNeedPermission = true
  269. }
  270. }
  271. if isNeedPermission {
  272. permissionLookList, _ := GetPermissionByContractService(contractInfo.ProductId, contractInfo.Service)
  273. contractInfo.PermissionLookList = permissionLookList
  274. }
  275. //查询最近一次审批单信息
  276. lastApprovalInfo, err := contract_approval.GetLastContractApprovalByContractId(contractInfo.ContractId, "contract")
  277. if err != nil {
  278. if err.Error() != utils.ErrNoRow() {
  279. err = errors.New("获取最近一次审批单信息失败,ERR:" + err.Error())
  280. }
  281. err = nil
  282. return
  283. }
  284. if lastApprovalInfo != nil {
  285. //审批操作权限,上传签回文件权限
  286. tmpContractOpButton, tmpFlowNodeListResp, tmpErr := GetOpButton(contractInfo, lastApprovalInfo, opUser)
  287. if tmpErr != nil {
  288. err = errors.New("获取合同按钮权限、审批流程失败,ERR:" + tmpErr.Error())
  289. return
  290. }
  291. opButton = tmpContractOpButton
  292. flowNodeListResp = tmpFlowNodeListResp
  293. }
  294. return
  295. }
  296. // GetProductCelData 获取品种列数据(因为前端可以随意插入列数据,所以需要根据列名来搜索对应的品种列)
  297. func GetProductCelData(detail contract_service_detail.ContractServiceDetail, tableCel *contractReq.AddContractServiceDetailReq) (err error) {
  298. t := reflect.TypeOf(detail)
  299. v := reflect.ValueOf(detail)
  300. for k := 0; k < t.NumField(); k++ {
  301. //获取结构体的参数名
  302. tmpName := t.Field(k).Name
  303. if strings.Contains(tmpName, "Col") {
  304. //获取结构体该参数名的值
  305. tmpValue := v.Field(k).String()
  306. //如果值不为空的话,那么做下json转换
  307. if tmpValue != "" {
  308. tmpErr := json.Unmarshal([]byte(tmpValue), tableCel)
  309. if tmpErr != nil {
  310. err = tmpErr
  311. continue
  312. }
  313. if tableCel.HeadName == "品种" {
  314. err = nil
  315. return
  316. }
  317. }
  318. }
  319. }
  320. return
  321. }
  322. // GetPermissionByContractService 通过合同服务,获取权限集合列表
  323. func GetPermissionByContractService(productId int, serviceList []*contractCustom.ContractServiceAndDetail) (permissionList []*company_report_permission.PermissionLookList, err error) {
  324. //子权限切片集合
  325. var permissionClassifyArr []string
  326. if productId == 1 {
  327. for _, v := range utils.PermissionFiccClassifyArr {
  328. permissionClassifyArr = append(permissionClassifyArr, v)
  329. }
  330. } else {
  331. permissionClassifyArr = append(permissionClassifyArr, "权益")
  332. }
  333. //获取已经勾选的的权限
  334. checkPermissionIdMap, err := GetServicePermissionMap(serviceList)
  335. if err != nil {
  336. return
  337. }
  338. //遍历获取
  339. for _, v := range permissionClassifyArr {
  340. checkList := make([]int, 0)
  341. plist := new(company_report_permission.PermissionLookList)
  342. items, tmpErr := company_report_permission.GetPermissionLookItems(productId, v)
  343. if tmpErr != nil {
  344. err = tmpErr
  345. return
  346. }
  347. for _, n := range items {
  348. if _, ok := checkPermissionIdMap[n.ChartPermissionId]; ok {
  349. checkList = append(checkList, n.ChartPermissionId)
  350. }
  351. }
  352. plist.Items = items
  353. plist.ClassifyName = v
  354. plist.CheckList = checkList
  355. permissionList = append(permissionList, plist)
  356. }
  357. return
  358. }
  359. // GetServicePermissionMap 获取合同服务中的权限id map
  360. func GetServicePermissionMap(serviceList []*contractCustom.ContractServiceAndDetail) (checkPermissionIdMap map[int]int, err error) {
  361. checkPermissionIdMap = make(map[int]int)
  362. //获取已经勾选的的权限
  363. for _, contractService := range serviceList {
  364. //如果是权益,那么研选必要
  365. if contractService.ProductId == 2 {
  366. chartPermissionId := 31 //研 选服务
  367. checkPermissionIdMap[chartPermissionId] = chartPermissionId
  368. }
  369. //看看系统中有没有映射对应的权限,如果有的话,那么直接返回,没有那么可能是特殊服务,需要去遍历
  370. if contractService.ChartPermissionId > 0 {
  371. checkPermissionIdMap[contractService.ChartPermissionId] = contractService.ChartPermissionId
  372. continue
  373. }
  374. switch contractService.ServiceTemplateId {
  375. case 1: //ficc 大套餐
  376. for _, v := range utils.PermissionFiccClassifyArr {
  377. //大套餐中 市场策略暂时不作为勾选项
  378. if v == "市场策略" {
  379. continue
  380. }
  381. items, tmpErr := company_report_permission.GetPermissionLookItems(1, v)
  382. if tmpErr != nil {
  383. err = tmpErr
  384. return
  385. }
  386. for _, n := range items {
  387. checkPermissionIdMap[n.ChartPermissionId] = n.ChartPermissionId
  388. }
  389. }
  390. case 2: //ficc小套餐
  391. permissionValues := []string{
  392. "FICC周报", "商品双周报+线上电话会讨论会<br/>(由弘则的研究员主持线上讨论)", "数据点评",
  393. }
  394. for _, detail := range contractService.DetailList {
  395. var tableCel contractReq.AddContractServiceDetailReq
  396. tmpErr := json.Unmarshal([]byte(detail.Col1), &tableCel)
  397. if tmpErr != nil {
  398. err = tmpErr
  399. return
  400. }
  401. if strings.Contains(strings.Join(permissionValues, ","), tableCel.Value) {
  402. //获取品种列数据
  403. var tableCel2 contractReq.AddContractServiceDetailReq
  404. tmpErr := GetProductCelData(*detail, &tableCel2)
  405. if tmpErr != nil {
  406. err = tmpErr
  407. return
  408. }
  409. for _, serviceId := range tableCel2.ValueId {
  410. checkPermissionIdMap[serviceId] = serviceId
  411. }
  412. }
  413. }
  414. case 4, 5, 6: //权益大套餐
  415. permissionFiccClassifyArr := []string{"权益"}
  416. for _, v := range permissionFiccClassifyArr {
  417. items, tmpErr := company_report_permission.GetPermissionLookItems(2, v)
  418. if tmpErr != nil {
  419. err = tmpErr
  420. return
  421. }
  422. for _, n := range items {
  423. //如果是专家行业,那么 结束当前循环,进入下一循环(产品需求:专家行业不在里面)
  424. if n.ChartPermissionId == 29 {
  425. continue
  426. }
  427. checkPermissionIdMap[n.ChartPermissionId] = n.ChartPermissionId
  428. }
  429. }
  430. }
  431. }
  432. return
  433. }
  434. // CRM8.8-权益合同主客观套餐合并
  435. func EquityMergeSubjectAndObject(serviceList []*contractCustom.ContractServiceAndDetail) (mergeList []*contractCustom.ContractServiceAndDetail) {
  436. serviceLen := len(serviceList)
  437. if serviceLen == 0 {
  438. return serviceList
  439. }
  440. mergeArr := []string{"医药", "消费", "科技", "智造"}
  441. // 获取模板列表
  442. templateList, e := contract_service_template.GetAllContractServiceTemplateList()
  443. if e != nil {
  444. return serviceList
  445. }
  446. parentTempMap := make(map[string]int, 0)
  447. templateMap := make(map[int]*contract_service_template.ContractServiceTemplate, 0)
  448. for _, v := range templateList {
  449. if utils.InArrayByStr(mergeArr, v.Title) {
  450. parentTempMap[v.Title] = v.ServiceTemplateId
  451. }
  452. templateMap[v.ServiceTemplateId] = v
  453. }
  454. // 计算每个行业的子套餐数, 并判断所有套餐所属行业
  455. countIndustryMap := make(map[string]int, 0)
  456. serviceIndustryMap := make(map[int]string, 0)
  457. industryServiceMap := make(map[string]*contractCustom.ContractServiceAndDetail, 0)
  458. childrenServiceMap := make(map[string]*contractCustom.ContractServiceAndDetail, 0)
  459. for i := 0; i < serviceLen; i++ {
  460. temp := templateMap[serviceList[i].ServiceTemplateId]
  461. if temp == nil {
  462. continue
  463. }
  464. // 行业套餐
  465. if utils.InArrayByStr(mergeArr, temp.Title) {
  466. serviceIndustryMap[serviceList[i].ContractServiceId] = temp.Title
  467. industryServiceMap[temp.Title] = serviceList[i]
  468. continue
  469. }
  470. // 主/客观
  471. parentTemp := templateMap[temp.Pid]
  472. if parentTemp != nil && utils.InArrayByStr(mergeArr, parentTemp.Title) {
  473. countIndustryMap[parentTemp.Title] += 1
  474. serviceIndustryMap[serviceList[i].ContractServiceId] = parentTemp.Title
  475. childrenServiceMap[parentTemp.Title] = serviceList[i]
  476. }
  477. }
  478. mergeList = make([]*contractCustom.ContractServiceAndDetail, 0)
  479. // 遍历每一个套餐, 取出所属的行业, 不属于合并的行业则直接加入数组
  480. // 属于合并的行业, 则校验行业子套餐数, 若子套餐数为1, 则取取主/客观套餐, 否则取行业套餐
  481. mergeIndustryMap := make(map[string]int, 0)
  482. for i := 0; i < serviceLen; i++ {
  483. industryName := serviceIndustryMap[serviceList[i].ContractServiceId]
  484. // 不需要合并的行业
  485. if industryName == "" {
  486. fmt.Println("1:", serviceList[i])
  487. mergeList = append(mergeList, serviceList[i])
  488. continue
  489. }
  490. // 未合并则进行合并
  491. if mergeIndustryMap[industryName] > 0 {
  492. continue
  493. }
  494. count := countIndustryMap[industryName]
  495. if count == 1 {
  496. // 取主/客观套餐
  497. mergeList = append(mergeList, childrenServiceMap[industryName])
  498. } else {
  499. // 0或者2都取行业套餐
  500. mergeList = append(mergeList, industryServiceMap[industryName])
  501. }
  502. mergeIndustryMap[industryName] += 1
  503. }
  504. return
  505. }
  506. // CRM8.8-HandleEquityPermissionLookList 权益-权限展示的主客观合并处理
  507. func HandleEquityPermissionLookList(permissionLookList []*company_report_permission.PermissionLookList) []*company_report_permission.PermissionLookList {
  508. if len(permissionLookList) <= 0 {
  509. return permissionLookList
  510. }
  511. checkList := permissionLookList[0].CheckList
  512. //fmt.Println(checkList)
  513. permissionList := permissionLookList[0].Items
  514. permissionLen := len(permissionList)
  515. if len(checkList) <= 0 || permissionLen <= 0 {
  516. return permissionLookList
  517. }
  518. // 若某个行业的主客观权限均被满足,则只留其中一个权限
  519. // 1.取出每个行业对应的其中一个权限
  520. industryName := []string{"医药", "消费", "科技", "智造"}
  521. namePermissionMap := make(map[string]*company_report_permission.PermissionLookItem)
  522. for i := 0; i < permissionLen; i++ {
  523. pName := permissionList[i].PermissionName
  524. if utils.InArrayByStr(industryName, pName) && namePermissionMap[pName] != nil {
  525. namePermissionMap[pName] = permissionList[i]
  526. }
  527. }
  528. // 2.计算哪些行业主客观权限都有
  529. countIndustryMap := make(map[string]int, 0)
  530. for i := 0; i < permissionLen; i++ {
  531. p := permissionList[i]
  532. if utils.InArrayByStr(industryName, p.PermissionName) && utils.InArrayByInt(checkList, p.ChartPermissionId) {
  533. countIndustryMap[p.PermissionName] += 1
  534. }
  535. }
  536. //fmt.Println(countIndustryMap)
  537. // 3.重新组成一个权限列表
  538. mergeIndustryMap := make(map[string]int, 0)
  539. newPermissionList := make([]*company_report_permission.PermissionLookItem, 0)
  540. for i := 0; i < permissionLen; i++ {
  541. item := permissionList[i]
  542. if utils.InArrayByStr(industryName, item.PermissionName) {
  543. // 只有主客观之一, permissionName取remark
  544. if countIndustryMap[item.PermissionName] == 1 {
  545. item.PermissionName = item.Remark
  546. newPermissionList = append(newPermissionList, item)
  547. continue
  548. }
  549. // 主客观都有
  550. if countIndustryMap[item.PermissionName] > 1 && mergeIndustryMap[item.PermissionName] == 0 {
  551. mergeIndustryMap[item.PermissionName] += 1
  552. newPermissionList = append(newPermissionList, item)
  553. }
  554. } else {
  555. newPermissionList = append(newPermissionList, item)
  556. }
  557. }
  558. permissionLookList[0].Items = newPermissionList
  559. return permissionLookList
  560. }