company_contract.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. package services
  2. import (
  3. "errors"
  4. "fmt"
  5. "hongze/hz_crm_api/models"
  6. "hongze/hz_crm_api/models/company"
  7. "hongze/hz_crm_api/services/alarm_msg"
  8. "hongze/hz_crm_api/utils"
  9. "strconv"
  10. "strings"
  11. "time"
  12. )
  13. //func init() {
  14. // InitCompanyContractMerge()
  15. // //GetCompanyContractPermissionNameMapById(map[int]string{6513: "182,183", 6663: "435,542"})
  16. //}
  17. // 初始化合并合同之后的数据脚本
  18. func InitCompanyContractMerge() {
  19. var condition string
  20. var pars []interface{}
  21. condition = " AND status = 1 AND product_id = 2 ORDER BY company_contract_id ASC "
  22. companyContractList, err := company.GetCompanyContractList(condition, pars)
  23. if err != nil {
  24. fmt.Println(err)
  25. return
  26. }
  27. mapCompanyContractItems := make(map[int][]*company.CompanyContractResp)
  28. for _, v := range companyContractList {
  29. //fmt.Println(v)
  30. mapCompanyContractItems[v.CompanyId] = append(mapCompanyContractItems[v.CompanyId], v)
  31. }
  32. mapCompanyMoney := make(map[int]float64)
  33. var items []*company.CompanyContractMergeResp
  34. for _, ContractItems := range mapCompanyContractItems {
  35. item := new(company.CompanyContractMergeResp)
  36. for k, v := range ContractItems {
  37. item = new(company.CompanyContractMergeResp)
  38. item.ContractType = v.ContractType
  39. item.ProductId = v.ProductId
  40. item.ProductName = v.ProductName
  41. item.CompanyId = v.CompanyId
  42. item.CompanyProductId = v.CompanyProductId
  43. item.StartDate = v.StartDate
  44. item.EndDate = v.EndDate
  45. item.Money = v.Money
  46. item.CompanyContractIdGroup += strconv.Itoa(v.CompanyContractId) + ","
  47. if k == 0 {
  48. items = append(items, item)
  49. mapCompanyMoney[v.CompanyId] = item.Money
  50. } else {
  51. if v.CompanyId != items[len(items)-1].CompanyId {
  52. items = append(items, item)
  53. } else {
  54. //续约的合同开始时间是否<上一次合同记录的结束时间 且间隔>6个月(180)天,那么就对两个合同进行合并
  55. if item.StartDate.AddDate(0, 0, +180).Before(items[len(items)-1].EndDate) && item.StartDate.Before(items[len(items)-1].EndDate) {
  56. items[len(items)-1].Money += v.Money
  57. items[len(items)-1].EndDate = v.EndDate
  58. items[len(items)-1].CompanyContractIdGroup += strconv.Itoa(v.CompanyContractId) + ","
  59. } else {
  60. if item.ContractType == "续约合同" {
  61. if item.Money > mapCompanyMoney[v.CompanyId] {
  62. item.PackageDifference = "增加套餐"
  63. }
  64. if item.Money == mapCompanyMoney[v.CompanyId] {
  65. item.PackageDifference = "维持套餐"
  66. }
  67. if item.Money < mapCompanyMoney[v.CompanyId] {
  68. item.PackageDifference = "减少套餐"
  69. }
  70. }
  71. items = append(items, item)
  72. mapCompanyMoney[v.CompanyId] = item.Money
  73. }
  74. }
  75. }
  76. }
  77. }
  78. var contractMergeitems []*company.CompanyContractMerge
  79. var companyIds []int
  80. mapcompanyIds := make(map[int]bool)
  81. for _, v := range items {
  82. item := new(company.CompanyContractMerge)
  83. item.ContractType = v.ContractType
  84. item.ProductId = v.ProductId
  85. item.ProductName = v.ProductName
  86. item.CompanyId = v.CompanyId
  87. item.CompanyProductId = v.CompanyProductId
  88. item.StartDate = v.StartDate.Format(utils.FormatDate)
  89. item.EndDate = v.EndDate.Format(utils.FormatDate)
  90. item.Money = v.Money
  91. item.PackageDifference = v.PackageDifference
  92. item.CompanyContractIdGroup = strings.TrimRight(v.CompanyContractIdGroup, ",")
  93. item.CreateTime = time.Now()
  94. item.ModifyTime = time.Now()
  95. contractMergeitems = append(contractMergeitems, item)
  96. if !mapcompanyIds[v.CompanyId] {
  97. companyIds = append(companyIds, v.CompanyId)
  98. mapcompanyIds[v.CompanyId] = true
  99. }
  100. }
  101. err = company.MultiAddCompanyContractMerge(contractMergeitems)
  102. if err != nil {
  103. fmt.Println(err)
  104. return
  105. }
  106. for _, v := range companyIds {
  107. var condition string
  108. var pars []interface{}
  109. fmt.Println(v)
  110. condition = " AND company_id = ? ORDER BY start_date DESC LIMIT 1 "
  111. pars = append(pars, v)
  112. contractMergeInfo, err := company.GetCompanyContractMergeDetail(condition, pars)
  113. if err != nil {
  114. fmt.Println(err)
  115. return
  116. }
  117. err = company.UpdateCompanyContractMergeIsBestNewto1(contractMergeInfo.CompanyContractMergeId)
  118. if err != nil {
  119. fmt.Println(err)
  120. return
  121. }
  122. }
  123. }
  124. // GetCompanyContractPermissionNameMapById 获取合并之后的合同所对应的权限种类名称
  125. func GetCompanyContractPermissionNameMapById(mapCompamy map[int]string) (mapContractResp map[int]string, err error) {
  126. if len(mapCompamy) == 0 {
  127. return
  128. }
  129. var condition string
  130. var pars []interface{}
  131. mapContracIdCompanyId := make(map[string]int) //建立合同ID与公司ID的map对应关系
  132. var companyContractIdGroup string //多个合同ID
  133. for k, v := range mapCompamy {
  134. companyContractIdGroup += v + ","
  135. sliceContract := strings.Split(v, ",")
  136. for _, compamyContracId := range sliceContract {
  137. mapContracIdCompanyId[compamyContracId] = k
  138. }
  139. }
  140. companyContractIdGroup = strings.TrimRight(companyContractIdGroup, ",")
  141. condition += " AND company_contract_id IN (" + companyContractIdGroup + ")"
  142. companyContractList, e := company.GetCompanyContractList(condition, pars)
  143. if e != nil && e.Error() != utils.ErrNoRow() {
  144. err = errors.New("GetCompanyContractList, Err: " + e.Error())
  145. return
  146. }
  147. permissionList, e := models.GetChartPermissionList()
  148. if e != nil && e.Error() != utils.ErrNoRow() {
  149. err = errors.New("GetChartPermissionList, Err: " + e.Error())
  150. return
  151. }
  152. mappermissionName := make(map[int]string)
  153. for _, v := range permissionList {
  154. mappermissionName[v.ChartPermissionId] = v.Remark
  155. }
  156. mapContractIdPerssion := make(map[string]string) //单个合同ID所对应的套餐或者权限名称
  157. for _, v := range companyContractList {
  158. if v.RaiPackageType == 1 {
  159. mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] = "70w套餐"
  160. }
  161. if v.RaiPackageType == 2 {
  162. mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] = "45w套餐"
  163. }
  164. }
  165. companyContractPermissionList, e := company.GetCompanyContractPermissionList(condition, pars)
  166. if e != nil && e.Error() != utils.ErrNoRow() {
  167. err = errors.New("GetCompanyContractPermissionList, Err: " + e.Error())
  168. return
  169. }
  170. for _, v := range companyContractPermissionList {
  171. //如果开通的不是整个套餐,那么就做单独的子权限处理
  172. if strings.Count(mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)], "w套餐") == 0 {
  173. if v.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
  174. if v.ExpensiveYx == 1 {
  175. mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(5w),"
  176. } else {
  177. mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(3w),"
  178. }
  179. } else {
  180. mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] += mappermissionName[v.ChartPermissionId] + ","
  181. }
  182. }
  183. }
  184. //合并客观权限
  185. for k, v := range mapContractIdPerssion {
  186. perssionName := v
  187. if strings.Count(v, utils.YI_YAO_NAME) == 2 {
  188. perssionName = strings.Replace(perssionName, "医药(主观)", "医药", -1)
  189. perssionName = strings.Replace(perssionName, "医药(客观)", "", -1)
  190. }
  191. if strings.Count(v, utils.XIAO_FEI_NAME) == 2 {
  192. perssionName = strings.Replace(perssionName, "消费(主观)", "消费", -1)
  193. perssionName = strings.Replace(perssionName, "消费(客观)", "", -1)
  194. }
  195. if strings.Count(v, utils.KE_JI_NAME) == 2 {
  196. perssionName = strings.Replace(perssionName, "科技(主观)", "科技", -1)
  197. perssionName = strings.Replace(perssionName, "科技(客观)", "", -1)
  198. }
  199. if strings.Count(v, utils.ZHI_ZAO_NAME) == 2 {
  200. perssionName = strings.Replace(perssionName, "智造(主观)", "智造", -1)
  201. perssionName = strings.Replace(perssionName, "智造(客观)", "", -1)
  202. }
  203. perssionName = strings.TrimRight(perssionName, ",")
  204. mapContractIdPerssion[k] = perssionName
  205. }
  206. mapContractResp = make(map[int]string, 0)
  207. for k, v := range mapContractIdPerssion {
  208. mapContractResp[mapContracIdCompanyId[k]] += v + ","
  209. }
  210. //过滤多余的","
  211. for k, v := range mapContractResp {
  212. sliceName := strings.Split(v, ",")
  213. var nameArr []string
  214. for _, vName := range sliceName {
  215. if vName == "" {
  216. continue
  217. }
  218. nameArr = append(nameArr, vName)
  219. }
  220. mapContractResp[k] = strings.Join(nameArr, ",")
  221. }
  222. return
  223. }
  224. //
  225. //func init() {
  226. // AddCompanyContractMergeByCompanyContractId(1187)
  227. //}
  228. // AddCompanyContractMergeByCompanyContractId 通过合同ID对合同进行合并
  229. func AddCompanyContractMergeByCompanyContractId(companyContractId int) {
  230. var err error
  231. defer func() {
  232. if err != nil {
  233. fmt.Println(err)
  234. go alarm_msg.SendAlarmMsg("通过合同ID对合同进行合并,失败"+err.Error()+fmt.Sprint("companyContractId", companyContractId), 2)
  235. }
  236. }()
  237. contractInfo, e := company.GetCompanyContractDetailByCompanyContractId(companyContractId)
  238. if e != nil {
  239. err = errors.New("GetCompanyContractDetailByCompanyContractId, Err: " + e.Error())
  240. return
  241. }
  242. var condition string
  243. var pars []interface{}
  244. condition = " AND company_id = ? ORDER BY start_date DESC LIMIT 1 "
  245. pars = append(pars, contractInfo.CompanyId)
  246. contractMergeInfo, e := company.GetCompanyContractMergeDetail(condition, pars)
  247. if e != nil && e.Error() != utils.ErrNoRow() {
  248. err = errors.New("GetCompanyContractMergeDetail, Err: " + e.Error())
  249. return
  250. }
  251. fmt.Println(contractMergeInfo)
  252. e = company.UpdateCompanyContractMergeIsBestNew(0, contractInfo.CompanyId)
  253. if e != nil {
  254. err = errors.New("UpdateCompanyContractMergeIsBestNew, Err: " + e.Error())
  255. return
  256. }
  257. item := new(company.CompanyContractMerge)
  258. item.ContractType = contractInfo.ContractType
  259. item.ProductId = contractInfo.ProductId
  260. item.ProductName = contractInfo.ProductName
  261. item.CompanyId = contractInfo.CompanyId
  262. item.CompanyProductId = contractInfo.CompanyProductId
  263. item.IsBestNew = 1
  264. item.CreateTime = time.Now()
  265. item.ModifyTime = time.Now()
  266. //如果不存在就是新的数据
  267. if contractMergeInfo == nil {
  268. item.StartDate = contractInfo.StartDate
  269. item.EndDate = contractInfo.EndDate
  270. item.Money = contractInfo.Money
  271. item.CompanyContractIdGroup = strconv.Itoa(companyContractId)
  272. e = company.AddCompanyContractMerge(item)
  273. if e != nil {
  274. err = errors.New("AddCompanyContractMerge, Err: " + e.Error())
  275. return
  276. }
  277. } else {
  278. newStartDate := utils.StrDateToDate(contractInfo.StartDate)
  279. //newEndDate := utils.StrDateToDate(contractInfo.EndDate)
  280. oldEndDate := utils.StrDateToDate(contractMergeInfo.EndDate)
  281. //续约的合同开始时间是否<上一次合同记录的结束时间 且间隔>6个月(180)天,那么就对两个合同进行合并
  282. if newStartDate.AddDate(0, 0, +180).Before(oldEndDate) && newStartDate.Before(oldEndDate) {
  283. item.Money = contractInfo.Money + contractMergeInfo.Money
  284. item.EndDate = contractInfo.EndDate
  285. item.CompanyContractIdGroup = contractMergeInfo.CompanyContractIdGroup + "," + strconv.Itoa(companyContractId)
  286. //如果是续约合同就对比跟上一份合并之后的合同的差距
  287. if item.ContractType == "续约合同" {
  288. pars = make([]interface{}, 0)
  289. condition = " AND company_id = ? AND company_contract_merge_id != ? ORDER BY start_date DESC LIMIT 1 "
  290. pars = append(pars, contractMergeInfo.CompanyId, contractMergeInfo.CompanyContractMergeId)
  291. detailPrevious, e := company.GetCompanyContractMergeDetail(condition, pars)
  292. if e != nil {
  293. err = errors.New("GetCompanyContractMergeDetail, Err: " + e.Error())
  294. return
  295. }
  296. if item.Money > detailPrevious.Money {
  297. item.PackageDifference = "增加套餐"
  298. }
  299. if item.Money == detailPrevious.Money {
  300. item.PackageDifference = "维持套餐"
  301. }
  302. if item.Money < detailPrevious.Money {
  303. item.PackageDifference = "减少套餐"
  304. }
  305. }
  306. item.CompanyContractMergeId = contractMergeInfo.CompanyContractMergeId
  307. e = company.UpdateCompanyContractMerge(item)
  308. if e != nil {
  309. err = errors.New("AddCompanyContractMerge, Err: " + e.Error())
  310. return
  311. }
  312. } else {
  313. item.StartDate = contractInfo.StartDate
  314. item.EndDate = contractInfo.EndDate
  315. item.Money = contractInfo.Money
  316. item.CompanyContractIdGroup = strconv.Itoa(companyContractId)
  317. //如果是续约合同就对比跟上一份合并之后的合同的差距
  318. if item.ContractType == "续约合同" {
  319. pars = make([]interface{}, 0)
  320. condition = " AND company_id = ? AND company_contract_merge_id != ? ORDER BY start_date DESC LIMIT 1 "
  321. pars = append(pars, contractMergeInfo.CompanyId, contractMergeInfo.CompanyContractMergeId)
  322. detailPrevious, e := company.GetCompanyContractMergeDetail(condition, pars)
  323. if e != nil {
  324. err = errors.New("GetCompanyContractMergeDetail, Err: " + e.Error())
  325. return
  326. }
  327. if item.Money > detailPrevious.Money {
  328. item.PackageDifference = "增加套餐"
  329. }
  330. if item.Money == detailPrevious.Money {
  331. item.PackageDifference = "维持套餐"
  332. }
  333. if item.Money < detailPrevious.Money {
  334. item.PackageDifference = "减少套餐"
  335. }
  336. }
  337. e = company.AddCompanyContractMerge(item)
  338. if e != nil {
  339. err = errors.New("AddCompanyContractMerge, Err: " + e.Error())
  340. return
  341. }
  342. }
  343. }
  344. return
  345. }