contract_allocation.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765
  1. package cygx
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/rdlucklib/rdluck_tools/paging"
  6. "hongze/hz_crm_api/controllers"
  7. "hongze/hz_crm_api/models"
  8. "hongze/hz_crm_api/models/company"
  9. "hongze/hz_crm_api/models/contract"
  10. "hongze/hz_crm_api/models/cygx"
  11. "hongze/hz_crm_api/models/system"
  12. "hongze/hz_crm_api/utils"
  13. "strconv"
  14. "strings"
  15. "time"
  16. )
  17. // ContractAllocationController 权益合同派单
  18. type ContractAllocationController struct {
  19. controllers.BaseAuthController
  20. }
  21. // getQueryParams 获取基础查询信息
  22. func getQueryParams(condition string, pars []interface{}, sysUser *system.Admin, tableAlias string) (newCondition string, newPars []interface{}) {
  23. if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
  24. condition += " AND " + tableAlias + "product_id=?"
  25. pars = append(pars, 1)
  26. } else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
  27. condition += " AND " + tableAlias + "product_id=?"
  28. pars = append(pars, 2)
  29. } else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FINANCE {
  30. //超级管理员账户,不做条件限制
  31. } else {
  32. //如果不是研究员,那么去找对应的 部门、小组、销售
  33. if sysUser.Authority == 0 {
  34. //普通用户
  35. condition += " AND " + tableAlias + "seller_id=?"
  36. pars = append(pars, sysUser.AdminId)
  37. } else if sysUser.Authority == 1 {
  38. //部门主管
  39. condition += " AND " + tableAlias + "department_id=?"
  40. pars = append(pars, sysUser.DepartmentId)
  41. } else if sysUser.Authority == 2 && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
  42. //权益小组负责人
  43. condition += " AND " + tableAlias + "group_id=?"
  44. pars = append(pars, sysUser.GroupId)
  45. } else if sysUser.Authority == 2 && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP {
  46. //ficc销售主管
  47. pid, err := company.GetParentIdFromGroup(sysUser.GroupId)
  48. if err != nil {
  49. fmt.Println(err.Error())
  50. return
  51. }
  52. var ids []*string
  53. if pid != nil && *pid != 0 {
  54. ids, err = company.GetGroupIdsByParentId(*pid)
  55. if err != nil {
  56. fmt.Println(err.Error())
  57. }
  58. } else {
  59. ids, err = company.GetGroupIdsByParentId(sysUser.GroupId)
  60. if err != nil {
  61. fmt.Println(err.Error())
  62. }
  63. }
  64. var idSlice []string
  65. var sid string
  66. for _, id := range ids {
  67. idSlice = append(idSlice, *id)
  68. }
  69. //加入父级groupId
  70. if *pid > 0 {
  71. idSlice = append(idSlice, strconv.Itoa(*pid))
  72. } else {
  73. idSlice = append(idSlice, strconv.Itoa(sysUser.GroupId))
  74. }
  75. sid = strings.Join(idSlice, ",")
  76. condition += " AND " + tableAlias + `group_id IN (` + sid + `) `
  77. fmt.Println("condition:", condition)
  78. //pars = append(pars, sysUser.GroupId)
  79. } else if sysUser.Authority == 4 {
  80. //ficc小组负责人
  81. condition += " AND " + tableAlias + "group_id=?"
  82. pars = append(pars, sysUser.GroupId)
  83. } else {
  84. //不知道什么类型的用户(后面新增的位置类型客户)
  85. condition += " AND " + tableAlias + "seller_id=?"
  86. pars = append(pars, sysUser.AdminId)
  87. }
  88. }
  89. newCondition = condition
  90. newPars = pars
  91. return
  92. }
  93. // @Title 合同列表
  94. // @Description 合同列表接口
  95. // @Param PageSize query int true "每页数据条数"
  96. // @Param CurrentIndex query int true "当前页页码,从1开始"
  97. // @Param Keyword query string true "客户名称"
  98. // @Param AdminId query string true "销售id,多个用英文逗号隔开,空字符串为全部"
  99. // @Param StartDate query string false "开始日期"
  100. // @Param EndDate query string false "结束日期"
  101. // @Param ContractType query string false "合同类型,枚举值:“,`新签合同`,`续约合同`,`补充协议`"
  102. // @Param FormalType query string false "转正类型,枚举值:“,`标准`,`非标`"
  103. // @Param IsExport query bool false "是否导出excel,默认是false"
  104. // @Param ResearcherRealName query string false "研究员姓名"
  105. // @Param IsAllocation query int false "派点状态: -1-默认全部; 0-未派点; 1-已派点"
  106. // @Success 200 {object} cygx.CompanyContractListResp
  107. // @router /allocation/company_contract_list [get]
  108. func (this *ContractAllocationController) CompanyContractList() {
  109. br := new(models.BaseResponse).Init()
  110. defer func() {
  111. this.Data["json"] = br
  112. this.ServeJSON()
  113. }()
  114. sysUser := this.SysUser
  115. if sysUser == nil {
  116. br.Msg = "请登录"
  117. br.ErrMsg = "请登录,SysUser Is Empty"
  118. br.Ret = 408
  119. return
  120. }
  121. pageSize, _ := this.GetInt("PageSize")
  122. currentIndex, _ := this.GetInt("CurrentIndex")
  123. adminId := this.GetString("AdminId")
  124. formalType := this.GetString("FormalType")
  125. contractType := this.GetString("ContractType")
  126. keyword := this.GetString("Keyword")
  127. startDate := this.GetString("StartDate")
  128. endDate := this.GetString("EndDate")
  129. researcherRealName := this.GetString("ResearcherRealName")
  130. isAllocation, _ := this.GetInt("IsAllocation", -1) // CRM 13.9
  131. if startDate == "" {
  132. startDate = "2015-01-01"
  133. }
  134. if endDate == "" {
  135. endDate = time.Now().Format(utils.FormatDate)
  136. }
  137. var startSize int
  138. if pageSize <= 0 {
  139. pageSize = utils.PageSize20
  140. }
  141. if currentIndex <= 0 {
  142. currentIndex = 1
  143. }
  144. startSize = utils.StartIndex(currentIndex, pageSize)
  145. //是否导出报表
  146. isExport, _ := this.GetBool("IsExport")
  147. if isExport {
  148. pageSize = 10000
  149. currentIndex = 1
  150. }
  151. var condition string
  152. var pars []interface{}
  153. //条件
  154. if adminId != "" {
  155. condition += ` AND c.seller_id in (` + adminId + `) `
  156. //pars = append(pars, adminId)
  157. } else {
  158. //根据当前角色来获取查询条件
  159. condition, pars = getQueryParams(condition, pars, sysUser, "c.")
  160. }
  161. //关键字搜索
  162. if keyword != "" {
  163. condition += ` and b.company_name like "%` + keyword + `%" `
  164. }
  165. //是否派点
  166. if isAllocation != -1 {
  167. condition += ` AND a.product_id = ? `
  168. pars = append(pars, isAllocation)
  169. }
  170. // 标准非标查询
  171. switch formalType {
  172. case "标准":
  173. condition += ` AND a.source = ? `
  174. pars = append(pars, "系统合同")
  175. case "非标":
  176. condition += ` AND a.source = ? `
  177. pars = append(pars, "上传附件")
  178. }
  179. if contractType != "" {
  180. condition += ` AND a.contract_type = ? `
  181. pars = append(pars, contractType)
  182. }
  183. //默认只查询权益 2023-06-01 之后的合同
  184. condition += ` AND c.product_id = ? AND a.start_date > ? `
  185. pars = append(pars, 2, "2023-01-01")
  186. mapMoneyPoint := make(map[int]float64)
  187. //研究员姓名查询
  188. if researcherRealName != "" {
  189. var conditionAllocation string
  190. var parsAllocation []interface{}
  191. conditionAllocation = " AND real_name = ? "
  192. parsAllocation = append(parsAllocation, researcherRealName)
  193. allocationCompanyContractList, err := cygx.GetCygxAllocationCompanyContractList(conditionAllocation, parsAllocation)
  194. if err != nil {
  195. br.Msg = "获取失败"
  196. br.ErrMsg = "获取失败,GetCygxAllocationCompanyContractListErr:" + err.Error()
  197. return
  198. }
  199. var companyContractIds []int
  200. for _, v := range allocationCompanyContractList {
  201. companyContractIds = append(companyContractIds, v.CompanyContractId)
  202. mapMoneyPoint[v.CompanyContractId] = v.Money
  203. }
  204. lenCon := len(companyContractIds)
  205. if lenCon == 0 {
  206. condition += ` AND a.company_contract_id = 0 `
  207. } else {
  208. condition += ` AND a.company_contract_id IN (` + utils.GetOrmInReplace(lenCon) + `)`
  209. pars = append(pars, companyContractIds)
  210. }
  211. }
  212. var list []*cygx.CompanyContractResp
  213. total, err := cygx.GetCompanyContractCountJoinCompany(condition, pars)
  214. if err != nil && err.Error() != utils.ErrNoRow() {
  215. br.Msg = "获取失败"
  216. br.ErrMsg = "获取失败,Err:" + err.Error()
  217. return
  218. }
  219. //列表页数据
  220. list, err = cygx.GetCompanyContractListJoinCompany(condition, pars, startSize, pageSize)
  221. if err != nil {
  222. br.Msg = "获取失败"
  223. br.ErrMsg = "获取失败,Err:" + err.Error()
  224. return
  225. }
  226. listLen := len(list)
  227. if listLen == 0 {
  228. list = make([]*cygx.CompanyContractResp, 0)
  229. } else {
  230. var contractCodes []string
  231. for _, v := range list {
  232. switch v.Source {
  233. case "系统合同":
  234. v.FormalType = "标准"
  235. case "上传附件":
  236. v.FormalType = "非标"
  237. }
  238. contractCodes = append(contractCodes, v.ContractCode)
  239. }
  240. lencontractCodes := len(contractCodes)
  241. if lencontractCodes > 0 {
  242. //获取标准合同的ID,这里上面的查询已经关联了三张表,拆分吧。。。
  243. condition = ""
  244. joinStr := ""
  245. pars = make([]interface{}, 0)
  246. condition = " AND a.contract_code IN (" + utils.GetOrmInReplace(lencontractCodes) + ") "
  247. pars = append(pars, contractCodes)
  248. listContract, err := contract.GetContractList(condition, joinStr, pars, 0, lencontractCodes)
  249. if err != nil {
  250. br.Msg = "获取合同列表失败!"
  251. br.ErrMsg = "获取合同列表失败,Err:" + err.Error()
  252. return
  253. }
  254. mapContractCode := make(map[string]int)
  255. for _, v := range listContract {
  256. mapContractCode[v.ContractCode] = v.ContractId
  257. }
  258. for _, v := range list {
  259. v.ContractId = mapContractCode[v.ContractCode]
  260. v.MoneyPoint = mapMoneyPoint[v.CompanyContractId]
  261. }
  262. }
  263. }
  264. page := paging.GetPaging(currentIndex, pageSize, total)
  265. resp := cygx.CompanyContractListResp{
  266. Paging: page,
  267. List: list,
  268. }
  269. //导出excel
  270. if isExport {
  271. //IncrementalCompanyListExport(this, dataType, resp, br)
  272. return
  273. }
  274. br.Ret = 200
  275. br.Success = true
  276. br.Msg = "获取成功"
  277. br.Data = resp
  278. }
  279. // @Title 详情
  280. // @Description 获取详情接口
  281. // @Param CompanyContractId query int true "ID"
  282. // @Param ShowDetail query bool false "是否是派点详情展示"
  283. // @Success Ret=200 {object} cygx.CygxAllocationCompanyContractDetailResp
  284. // @router /allocation/detail [get]
  285. func (this *ContractAllocationController) CompanyContracDetail() {
  286. br := new(models.BaseResponse).Init()
  287. defer func() {
  288. this.Data["json"] = br
  289. this.ServeJSON()
  290. }()
  291. AdminUser := this.SysUser
  292. if AdminUser == nil {
  293. br.Msg = "请登录"
  294. br.ErrMsg = "请登录,用户信息为空"
  295. br.Ret = 408
  296. return
  297. }
  298. resp := new(cygx.CygxAllocationCompanyContractDetailResp)
  299. companyContractId, _ := this.GetInt("CompanyContractId")
  300. if companyContractId < 1 {
  301. br.Msg = "请输入详情ID"
  302. return
  303. }
  304. showDetail, _ := this.GetBool("ShowDetail", false)
  305. contractItem, err := company.GetCompanyContractById(companyContractId)
  306. if err != nil {
  307. br.Msg = "获取信息失败"
  308. br.ErrMsg = "获取合同信息失败,Err:" + err.Error()
  309. return
  310. }
  311. total, err := cygx.GetCygxAllocationCompanyContractCountByCompanyContractId(companyContractId)
  312. if err != nil {
  313. br.Msg = "获取信息失败"
  314. br.ErrMsg = "获取合同信息失败,GetCygxAllocationCompanyContractCountByCompanyContractId Err:" + err.Error()
  315. return
  316. }
  317. //var contractPermissionList []*company.ContractPermissionList
  318. expMap := map[int]string{0: "(3w)", 1: "(5w)"} // 买方研选价格
  319. //classifyName := "权益"
  320. //plist := new(company.ContractPermissionList)
  321. hasPermissions, e := company.GetCompanyContractPermissionByCompanyContractId(companyContractId)
  322. if e != nil {
  323. br.Msg = "获取失败"
  324. br.ErrMsg = "获取合同权限信息失败,Err:" + e.Error()
  325. return
  326. }
  327. hasMap := make(map[int]*company.CompanyContractPermission)
  328. for _, p := range hasPermissions {
  329. hasMap[p.ChartPermissionId] = p
  330. }
  331. checkItems := make([]*company.PermissionLookItem, 0)
  332. // PS:本来想把这个移到循环外面去优化一下...但是发现有指针引用变量被改掉的问题, BUG太多了改不完了先这样吧=_=!
  333. raiPermissions, e := company.GetPermissionLookItemsExt("2", utils.COMPANY_PRODUCT_RAI_NAME)
  334. if e != nil {
  335. br.Msg = "获取失败"
  336. br.ErrMsg = "获取权益权限列表失败, Err: " + e.Error()
  337. return
  338. }
  339. mapPermissionNameHave := make(map[string]bool) // 判断合同是否存在某一行业权限种类
  340. var expensiveYx int
  341. for _, n := range raiPermissions {
  342. match := hasMap[n.ChartPermissionId]
  343. if match == nil {
  344. continue
  345. }
  346. // 升级
  347. if match.IsUpgrade == 1 {
  348. n.IsUpgrade = 1
  349. checkItems = append(checkItems, n)
  350. continue
  351. }
  352. mapPermissionNameHave[n.PermissionName] = true
  353. // 买方研选(3w/5w)
  354. if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
  355. expensiveYx = match.ExpensiveYx
  356. n.PermissionName += expMap[match.ExpensiveYx]
  357. checkItems = append(checkItems, n)
  358. continue
  359. }
  360. checkItems = append(checkItems, n)
  361. }
  362. //plist.Items = checkItems
  363. //plist.ClassifyName = utils.COMPANY_PRODUCT_RAI_NAME
  364. //contractPermissionList = append(contractPermissionList, plist)
  365. //// CRM8.8-权限主客观合并
  366. //newPermissionLookList := contractService.HandleEquityContractPermissionList(contractPermissionList)
  367. //for _, v := range newPermissionLookList {
  368. // for _, v2 := range v.Items {
  369. // fmt.Println(v2.PermissionName)
  370. // }
  371. //}
  372. resp.Money = contractItem.Money / 10000
  373. //有研选时,对研选套餐类型做文案处理
  374. respItemYx := new(cygx.AllocationPermissionListResp)
  375. if mapPermissionNameHave[utils.CHART_PERMISSION_NAME_MF_YANXUAN] {
  376. var moneyYx float64
  377. if expensiveYx == 0 {
  378. moneyYx = 3
  379. }
  380. if expensiveYx == 1 {
  381. moneyYx = 5
  382. }
  383. resp.TotalPointsContent = fmt.Sprint(resp.Money, "W,", "其中", moneyYx, "w默认归属买方研选,请对剩余", resp.Money-moneyYx, "w按照100%进行比值分配")
  384. resp.Money = resp.Money - moneyYx
  385. respItemYx.Proportion = moneyYx
  386. respItemYx.ChartPermissionName = utils.CHART_PERMISSION_NAME_MF_YANXUAN
  387. respItemYx.List = append(respItemYx.List, &cygx.AllocationRealNameListResp{utils.CHART_PERMISSION_NAME_MF_YANXUAN, 0, 0})
  388. } else {
  389. resp.TotalPointsContent = fmt.Sprint(resp.Money, "W")
  390. }
  391. sysUserList, err := cygx.GetAskEmailList()
  392. if err != nil {
  393. br.Msg = "获取失败"
  394. br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
  395. return
  396. }
  397. mapPermissionUser := make(map[string][]*cygx.AllocationRealNameListResp)
  398. var respList []*cygx.AllocationPermissionListResp
  399. if total == 0 {
  400. for _, v := range sysUserList {
  401. if !mapPermissionNameHave[v.ChartPermissionName] {
  402. continue
  403. }
  404. item := new(cygx.AllocationRealNameListResp)
  405. item.RealName = v.Name
  406. mapPermissionUser[v.ChartPermissionName] = append(mapPermissionUser[v.ChartPermissionName], item)
  407. }
  408. for k, v := range mapPermissionUser {
  409. respItem := new(cygx.AllocationPermissionListResp)
  410. respItem.ChartPermissionName = k
  411. respItem.List = v
  412. respList = append(respList, respItem)
  413. }
  414. if respItemYx.ChartPermissionName != "" {
  415. respList = append(respList, respItemYx)
  416. }
  417. } else {
  418. listUser, err := cygx.GetCygxAllocationCompanyContractListById(companyContractId)
  419. if err != nil {
  420. br.Msg = "获取失败"
  421. br.ErrMsg = "获取失败,GetCygxAllocationCompanyContractListById Err: " + err.Error()
  422. return
  423. }
  424. for _, v := range listUser {
  425. if showDetail && v.Proportion == 0 {
  426. continue
  427. }
  428. item := new(cygx.AllocationRealNameListResp)
  429. item.RealName = v.RealName
  430. item.Money = v.Money
  431. item.Proportion = v.Proportion
  432. mapPermissionUser[v.ChartPermissionName] = append(mapPermissionUser[v.ChartPermissionName], item)
  433. }
  434. listPermission, err := cygx.GetCygxAllocationCompanyContractPermissionListById(companyContractId)
  435. if err != nil {
  436. br.Msg = "获取失败"
  437. br.ErrMsg = "获取失败,GetCygxAllocationCompanyContractPermissionListById Err: " + err.Error()
  438. return
  439. }
  440. for _, v := range listPermission {
  441. if showDetail && v.Proportion == 0 {
  442. continue
  443. }
  444. respItem := new(cygx.AllocationPermissionListResp)
  445. respItem.ChartPermissionName = v.ChartPermissionName
  446. respItem.Money = v.Money
  447. respItem.Proportion = v.Proportion
  448. respItem.List = mapPermissionUser[v.ChartPermissionName]
  449. respList = append(respList, respItem)
  450. }
  451. }
  452. resp.List = respList
  453. resp.CompanyContractId = companyContractId
  454. br.Ret = 200
  455. br.Success = true
  456. br.Msg = "获取成功"
  457. br.Data = resp
  458. }
  459. // @Title 更新派点
  460. // @Description 更新派点接口
  461. // @Param request body cygx.AddProductInteriorReq true "type json string"
  462. // @Success 200 {object} "保存成功"
  463. // @router /allocation/update [post]
  464. func (this *ContractAllocationController) CompanyContracUpdate() {
  465. br := new(models.BaseResponse).Init()
  466. defer func() {
  467. this.Data["json"] = br
  468. this.ServeJSON()
  469. }()
  470. sysUser := this.SysUser
  471. if sysUser == nil {
  472. br.Msg = "请登录"
  473. br.ErrMsg = "请登录,SysUser Is Empty"
  474. br.Ret = 408
  475. return
  476. }
  477. var req cygx.UpdateAllocationCompanyContractReq
  478. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  479. if err != nil {
  480. br.Msg = "参数解析异常!"
  481. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  482. return
  483. }
  484. companyContractId := req.CompanyContractId
  485. if companyContractId == 0 {
  486. br.Msg = "参数错误"
  487. br.ErrMsg = "参数错误,id不可为空"
  488. return
  489. }
  490. list := req.List
  491. var items []*cygx.CygxAllocationCompanyContract
  492. var itemsPermission []*cygx.CygxAllocationCompanyContractPermission
  493. for _, v := range list {
  494. itemPermission := new(cygx.CygxAllocationCompanyContractPermission)
  495. itemPermission.CompanyContractId = companyContractId
  496. itemPermission.AdminId = sysUser.AdminId
  497. itemPermission.AdminName = sysUser.RealName
  498. itemPermission.Proportion = v.Proportion
  499. itemPermission.Money = v.Money
  500. itemPermission.ChartPermissionName = v.ChartPermissionName
  501. itemPermission.CreateTime = time.Now()
  502. itemPermission.ModifyTime = time.Now()
  503. itemsPermission = append(itemsPermission, itemPermission)
  504. for _, v2 := range v.List {
  505. item := new(cygx.CygxAllocationCompanyContract)
  506. item.CompanyContractId = companyContractId
  507. item.AdminId = sysUser.AdminId
  508. item.AdminName = sysUser.RealName
  509. item.Proportion = v2.Proportion
  510. item.Money = v2.Money
  511. item.RealName = v2.RealName
  512. item.ChartPermissionName = v.ChartPermissionName
  513. item.CreateTime = time.Now()
  514. item.ModifyTime = time.Now()
  515. items = append(items, item)
  516. }
  517. }
  518. err = cygx.AddAndUpdateCygxAllocationCompanyContract(items, itemsPermission, companyContractId)
  519. if err != nil {
  520. br.Msg = "操作失败"
  521. br.ErrMsg = "操作失败,AddAndUpdateCygxAllocationCompanyContract Err:" + err.Error()
  522. return
  523. }
  524. br.Ret = 200
  525. br.Success = true
  526. br.IsAddLog = true
  527. br.Msg = "操作成功"
  528. }
  529. // @Title 研究员派点统计
  530. // @Description 研究员派点统计接口
  531. // @Param PageSize query int true "每页数据条数"
  532. // @Param CurrentIndex query int true "当前页页码,从1开始"
  533. // @Param Keyword query string true "客户名称"
  534. // @Param StartDate query string false "开始日期"
  535. // @Param EndDate query string false "结束日期"
  536. // @Param IsExport query bool false "是否导出excel,默认是false"
  537. // @Success 200 {object} cygx.CompanyContractListResp
  538. // @router /allocation/statistics [get]
  539. func (this *ContractAllocationController) CompanyContractStatistics() {
  540. br := new(models.BaseResponse).Init()
  541. defer func() {
  542. this.Data["json"] = br
  543. this.ServeJSON()
  544. }()
  545. sysUser := this.SysUser
  546. if sysUser == nil {
  547. br.Msg = "请登录"
  548. br.ErrMsg = "请登录,SysUser Is Empty"
  549. br.Ret = 408
  550. return
  551. }
  552. keyword := this.GetString("Keyword")
  553. startDate := this.GetString("StartDate")
  554. endDate := this.GetString("EndDate")
  555. if startDate == "" {
  556. startDate = "2015-01-01"
  557. }
  558. if endDate == "" {
  559. endDate = time.Now().Format(utils.FormatDate)
  560. }
  561. //是否导出报表
  562. isExport, _ := this.GetBool("IsExport")
  563. var condition string
  564. var pars []interface{}
  565. //根据当前角色来获取查询条件
  566. condition, pars = getQueryParams(condition, pars, sysUser, "c.")
  567. //关键字搜索
  568. if keyword != "" {
  569. condition += ` and b.company_name like "%` + keyword + `%" `
  570. }
  571. //默认只查询权益 2023-06-01 之后的合同
  572. condition += ` AND c.product_id = ? AND a.start_date > ? `
  573. pars = append(pars, 2, "2023-06-01")
  574. //列表页数据
  575. listContract, err := cygx.GetCompanyContractListJoinCompany(condition, pars, 0, 1000)
  576. if err != nil {
  577. br.Msg = "获取失败"
  578. br.ErrMsg = "获取失败,Err:" + err.Error()
  579. return
  580. }
  581. var companyContractIds []int
  582. for _, v := range listContract {
  583. companyContractIds = append(companyContractIds, v.CompanyContractId)
  584. }
  585. lenArr := len(companyContractIds)
  586. mapUserAllocation := make(map[string]float64) // 关联合同
  587. mapUserMoney := make(map[string]float64) // 派点金额
  588. mapPermissionAllocation := make(map[string]float64)
  589. mapPermissionMoney := make(map[string]float64)
  590. totalContract := lenArr //所有的关联合同
  591. var totalMoney float64 //所有的关联合同的金额 单位万
  592. if lenArr > 0 {
  593. var conditionAllocation string
  594. var parsAllocation []interface{}
  595. allocationCompanyContractList, err := cygx.GetCygxAllocationCompanyContractList(conditionAllocation, parsAllocation)
  596. if err != nil {
  597. br.Msg = "获取失败"
  598. br.ErrMsg = "获取失败,Err:" + err.Error()
  599. return
  600. }
  601. for _, v := range allocationCompanyContractList {
  602. if v.Proportion != 0 {
  603. mapUserAllocation[v.RealName] += 1
  604. mapUserMoney[v.RealName] += v.Money
  605. mapPermissionAllocation[v.ChartPermissionName] += 1
  606. mapPermissionMoney[v.ChartPermissionName] += v.Money
  607. totalMoney += v.Money
  608. }
  609. }
  610. }
  611. sysUserList, err := cygx.GetAskEmailList()
  612. if err != nil {
  613. br.Msg = "获取失败"
  614. br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
  615. return
  616. }
  617. mapPermissionUser := make(map[string][]*cygx.AllocationRealNameStatisticsListResp)
  618. for _, v := range sysUserList {
  619. item := new(cygx.AllocationRealNameStatisticsListResp)
  620. item.RealName = v.Name
  621. item.TotalRelatedContract = mapUserAllocation[v.Name]
  622. item.TotalDispatchPoint = fmt.Sprint(mapUserMoney[v.Name])
  623. if item.TotalDispatchPoint == "" {
  624. item.TotalDispatchPoint = "0"
  625. }
  626. //组内占比
  627. item.GroupProportion = fmt.Sprint(mapUserMoney[v.Name] / mapPermissionMoney[v.ChartPermissionName] * 100)
  628. if item.GroupProportion == "" {
  629. item.GroupProportion = "0"
  630. }
  631. item.GroupProportion += "%"
  632. //部门占比
  633. item.DepartmentProportion = fmt.Sprint(mapUserMoney[v.Name] / totalMoney * 100)
  634. if item.DepartmentProportion == "" {
  635. item.DepartmentProportion = "0"
  636. }
  637. item.DepartmentProportion += "%"
  638. mapPermissionUser[v.ChartPermissionName] = append(mapPermissionUser[v.ChartPermissionName], item)
  639. }
  640. for k, v := range mapPermissionUser {
  641. lenUser := len(v)
  642. item := new(cygx.AllocationRealNameStatisticsListResp)
  643. item.RealName = "合计"
  644. item.TotalRelatedContract = mapPermissionAllocation[k]
  645. item.TotalDispatchPoint = fmt.Sprint(mapPermissionMoney[k], "/", "300")
  646. item.GroupProportion = "100%"
  647. // 部门占比
  648. item.DepartmentProportion = fmt.Sprint(mapPermissionMoney[k] / totalMoney * 100)
  649. if item.DepartmentProportion == "" {
  650. item.DepartmentProportion = "0"
  651. }
  652. item.DepartmentProportion += "%"
  653. mapPermissionUser[k] = append(mapPermissionUser[k], item)
  654. item = new(cygx.AllocationRealNameStatisticsListResp)
  655. item.RealName = "平均"
  656. item.TotalRelatedContract = mapPermissionAllocation[k] / float64(lenUser)
  657. item.TotalDispatchPoint = fmt.Sprint(mapPermissionMoney[k] / float64(lenUser))
  658. //组内占比
  659. item.GroupProportion = fmt.Sprint(float64(lenUser) / mapPermissionMoney[k] * 100)
  660. if item.GroupProportion == "" {
  661. item.GroupProportion = "0"
  662. }
  663. item.GroupProportion += "%"
  664. // 部门占比
  665. item.DepartmentProportion = fmt.Sprint(mapPermissionMoney[k] / totalMoney * 100 / float64(len(mapPermissionUser[k])))
  666. if item.DepartmentProportion == "" {
  667. item.DepartmentProportion = "0"
  668. }
  669. item.DepartmentProportion += "%"
  670. mapPermissionUser[k] = append(mapPermissionUser[k], item)
  671. }
  672. var list []*cygx.AllocationPermissionStatisticsListResp
  673. permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略"}
  674. for _, v := range permissionNameArr {
  675. item := new(cygx.AllocationPermissionStatisticsListResp)
  676. item.ChartPermissionName = v
  677. item.List = mapPermissionUser[v]
  678. list = append(list, item)
  679. }
  680. resp := cygx.CygxAllocationCompanyContractDetailStatisticsResp{
  681. List: list,
  682. }
  683. resp.TotalContract = totalContract
  684. resp.TotalMoney = totalMoney
  685. //导出excel
  686. if isExport {
  687. //IncrementalCompanyListExport(this, dataType, resp, br)
  688. return
  689. }
  690. br.Ret = 200
  691. br.Success = true
  692. br.Msg = "获取成功"
  693. br.Data = resp
  694. }