contract_register.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. package fms
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/shopspring/decimal"
  6. "hongze/fms_api/models/crm"
  7. "hongze/fms_api/models/fms"
  8. "hongze/fms_api/services/alarm_msg"
  9. crmService "hongze/fms_api/services/crm"
  10. "hongze/fms_api/services/resource"
  11. "hongze/fms_api/utils"
  12. "os"
  13. "regexp"
  14. "strings"
  15. "time"
  16. )
  17. // CheckContractRegisterAmount 校验合同登记金额-判断是否需要更新合同登记状态
  18. func CheckContractRegisterAmount(registerId int) {
  19. var err error
  20. defer func() {
  21. if err != nil {
  22. alarm_msg.SendAlarmMsg("校验合同登记金额失败, ErrMsg: "+err.Error(), 3)
  23. }
  24. }()
  25. // 获取合同登记信息
  26. cr := new(fms.ContractRegister)
  27. item, e := cr.Fetch(registerId)
  28. if e != nil {
  29. err = errors.New("获取合同登记信息失败, Err: " + e.Error())
  30. return
  31. }
  32. amount := decimal.NewFromFloat(item.ContractAmount).Round(2)
  33. // 获取开票/到款信息
  34. invoiceCond := `contract_register_id = ?`
  35. invoicePars := make([]interface{}, 0)
  36. invoicePars = append(invoicePars, registerId)
  37. ci := new(fms.ContractInvoice)
  38. invoiceList, e := ci.List(invoiceCond, invoicePars, "")
  39. if e != nil {
  40. err = errors.New("获取开票到款信息失败, Err: " + e.Error())
  41. return
  42. }
  43. invoiceAmount := decimal.NewFromFloat(0).Round(2)
  44. paymentAmount := decimal.NewFromFloat(0).Round(2)
  45. for i := range invoiceList {
  46. a := decimal.NewFromFloat(invoiceList[i].OriginAmount).Round(2)
  47. if invoiceList[i].InvoiceType == fms.ContractInvoiceTypeMake {
  48. invoiceAmount = invoiceAmount.Add(a)
  49. }
  50. if invoiceList[i].InvoiceType == fms.ContractInvoiceTypePay {
  51. paymentAmount = paymentAmount.Add(a)
  52. }
  53. }
  54. status := fms.ContractRegisterStatusIng
  55. // 以下情况更新合同登记状态为已完成
  56. // 1.合同存在代付; 2.合同状态为已签回且合同金额=开票金额=到款金额; 3合同状态为已终止
  57. if item.HasPayment == 1 || (amount.Equal(invoiceAmount) && invoiceAmount.Equal(paymentAmount) && item.ContractStatus == fms.ContractStatusCheckedBack) || item.ContractStatus == fms.ContractStatusEnd {
  58. status = fms.ContractRegisterStatusComplete
  59. }
  60. updateCols := []string{"InvoicedAmount", "PaymentAmount", "RegisterStatus", "ModifyTime"}
  61. ia, _ := invoiceAmount.Round(2).Float64()
  62. pa, _ := paymentAmount.Round(2).Float64()
  63. item.InvoicedAmount = ia
  64. item.PaymentAmount = pa
  65. item.RegisterStatus = status
  66. item.ModifyTime = time.Now().Local()
  67. if e = item.Update(updateCols); e != nil {
  68. err = errors.New("更新合同登记金额及状态失败, Err: " + e.Error())
  69. return
  70. }
  71. return
  72. }
  73. // HandleContractServiceAndDetail 根据请求数据获取套餐服务详情信息
  74. func HandleContractServiceAndDetail(productId int, serviceList []fms.ContractServiceAddReq, base642Image bool) (serviceDetailList []*fms.ContractServiceAndDetail, err error) {
  75. serviceDetailList = make([]*fms.ContractServiceAndDetail, 0)
  76. if len(serviceList) < 0 {
  77. err = errors.New("请至少选择一种套餐")
  78. return
  79. }
  80. for i := 0; i < len(serviceList); i++ {
  81. item := serviceList[i]
  82. //detail := item.Detail
  83. //
  84. //detailList := make([]*fms.ContractServiceDetail, 0)
  85. //if len(detail) > 0 {
  86. // for j := 0; j < len(detail); j++ {
  87. // detailItem := detail[j]
  88. // cellMap := make(map[string]string)
  89. // for k := 0; k < len(detailItem); k++ {
  90. // key := fmt.Sprint("cell_", k+1)
  91. // v, e := json.Marshal(detailItem[k])
  92. // if e != nil {
  93. // err = errors.New(fmt.Sprint("json转换失败:", e))
  94. // return
  95. // }
  96. // cellMap[key] = string(v)
  97. // }
  98. // contractServiceDetail := &fms.ContractServiceDetail{
  99. // Col1: func(cellMap map[string]string) string {
  100. // v, ok := cellMap["cell_1"]
  101. // if ok {
  102. // return v
  103. // } else {
  104. // return ""
  105. // }
  106. // }(cellMap),
  107. // Col2: func(cellMap map[string]string) string {
  108. // v, ok := cellMap["cell_2"]
  109. // if ok {
  110. // return v
  111. // } else {
  112. // return ""
  113. // }
  114. // }(cellMap),
  115. // Col3: func(cellMap map[string]string) string {
  116. // v, ok := cellMap["cell_3"]
  117. // if ok {
  118. // return v
  119. // } else {
  120. // return ""
  121. // }
  122. // }(cellMap),
  123. // Col4: func(cellMap map[string]string) string {
  124. // v, ok := cellMap["cell_4"]
  125. // if ok {
  126. // return v
  127. // } else {
  128. // return ""
  129. // }
  130. // }(cellMap),
  131. // Col5: func(cellMap map[string]string) string {
  132. // v, ok := cellMap["cell_5"]
  133. // if ok {
  134. // return v
  135. // } else {
  136. // return ""
  137. // }
  138. // }(cellMap),
  139. // Col6: func(cellMap map[string]string) string {
  140. // v, ok := cellMap["cell_6"]
  141. // if ok {
  142. // return v
  143. // } else {
  144. // return ""
  145. // }
  146. // }(cellMap),
  147. // Col7: func(cellMap map[string]string) string {
  148. // v, ok := cellMap["cell_7"]
  149. // if ok {
  150. // return v
  151. // } else {
  152. // return ""
  153. // }
  154. // }(cellMap),
  155. // ServiceTemplateId: item.ServiceTemplateId,
  156. // CreateTime: time.Now(),
  157. // }
  158. // detailList = append(detailList, contractServiceDetail)
  159. // }
  160. //}
  161. hasDetail := "否"
  162. //if len(detailList) > 0 {
  163. // hasDetail = "是"
  164. //}
  165. //// 报价单图片地址
  166. //newValue := item.Value
  167. //if base642Image {
  168. // b, _ := regexp.MatchString(`^data:\s*image\/(\w+);base64,`, newValue)
  169. // if b {
  170. // imageUrl, e := UploadImageBase64(newValue)
  171. // if e != nil {
  172. // err = errors.New(fmt.Sprint("base64图片上传失败:", e))
  173. // return
  174. // }
  175. // newValue = imageUrl
  176. // }
  177. //}
  178. // 合同模板
  179. serviceTemp, e := fms.GetContractServiceTemplateById(item.ServiceTemplateId)
  180. if e != nil {
  181. err = errors.New("找不到该模板")
  182. return
  183. }
  184. serviceDetail := &fms.ContractServiceAndDetail{
  185. ServiceTemplateId: item.ServiceTemplateId,
  186. Title: item.Title,
  187. Value: item.Value,
  188. ProductId: productId,
  189. HasDetail: hasDetail,
  190. TableValue: serviceTemp.TableValue,
  191. ChartPermissionId: serviceTemp.ChartPermissionId,
  192. ChartPermissionIds: item.ChartPermissionIds,
  193. //Detail: detailList,
  194. }
  195. serviceDetailList = append(serviceDetailList, serviceDetail)
  196. }
  197. return
  198. }
  199. // GetContractServiceAndDetail 根据合同登记ID获取服务详情
  200. func GetContractServiceAndDetail(contractRegisterId int) (serviceList []*fms.ContractServiceAndDetail, err error) {
  201. list, e := fms.GetContractServiceAndDetailList(contractRegisterId)
  202. if e != nil {
  203. err = errors.New(fmt.Sprint("查找合同服务异常", e))
  204. return
  205. }
  206. serviceList = list
  207. //newLen := len(serviceList)
  208. //for i := 0; newLen > i; i++ {
  209. // if serviceList[i].HasDetail == "是" {
  210. // detail, e := fms.GetContractServiceDetailByServiceId(serviceList[i].ContractServiceId)
  211. // if e != nil {
  212. // err = errors.New(fmt.Sprint("查找合同服务详情异常", e))
  213. // return
  214. // }
  215. // serviceList[i].Detail = detail
  216. // }
  217. //}
  218. return
  219. }
  220. // UploadImageBase64 将base64的图片上传至oss
  221. func UploadImageBase64(base64Str string) (resourceUrl string, err error) {
  222. ext := ".png"
  223. uploadDir := "./static"
  224. randStr := utils.GetRandStringNoSpecialChar(28)
  225. fileName := randStr + ext
  226. fpath := uploadDir + "/" + fileName
  227. b, _ := regexp.MatchString(`^data:\s*image\/(\w+);base64,`, base64Str)
  228. if !b {
  229. err = errors.New("图片格式不正确")
  230. return
  231. }
  232. re, _ := regexp.Compile(`^data:\s*image\/(\w+);base64,`)
  233. base64Str = re.ReplaceAllString(base64Str, "")
  234. base64Str = strings.Replace(base64Str, " ", "", -1)
  235. base64Str = strings.Replace(base64Str, " ", "", -1)
  236. err = utils.SaveBase64ToFile(base64Str, fpath)
  237. if err != nil {
  238. return
  239. }
  240. defer os.Remove(fpath)
  241. savePath := utils.OssUploadImgDir + time.Now().Format("200601/20060102/")
  242. savePath += fileName
  243. // 上传到阿里云
  244. err = resource.UploadVideoAliyun(fileName, fpath, savePath)
  245. if err != nil {
  246. return
  247. }
  248. resourceUrl = utils.OssHost + savePath
  249. return
  250. }
  251. // FixContractInvoiceSellerInfo 修复开票登记销售相关信息(一次性)
  252. func FixContractInvoiceSellerInfo() {
  253. sellerList, e := crmService.GetSellerDepartmentListWithGroupAndTeam()
  254. if e != nil {
  255. fmt.Println("获取销售列表失败, Err: " + e.Error())
  256. return
  257. }
  258. sellerMap := make(map[int]*crm.SellerAdminWithGroupTeam)
  259. for i := range sellerList {
  260. sellerMap[sellerList[i].SellerId] = sellerList[i]
  261. }
  262. registerCond := ``
  263. registerPars := make([]interface{}, 0)
  264. registerOB := new(fms.ContractRegister)
  265. registerList, e := registerOB.List(registerCond, registerPars)
  266. if e != nil {
  267. fmt.Println("获取合同登记列表失败, Err: " + e.Error())
  268. return
  269. }
  270. invUpCols := []string{"SellerId", "SellerName", "SellerGroupId", "SellerGroupName", "SellerTeamId", "SellerTeamName"}
  271. fmt.Println("start 修复")
  272. for i := range registerList {
  273. registerId := registerList[i].ContractRegisterId
  274. sellerId := registerList[i].SellerId
  275. sellerItem := sellerMap[sellerId]
  276. if sellerItem == nil {
  277. fmt.Printf("ID-%d 无销售信息\n", registerId)
  278. continue
  279. }
  280. invOB := new(fms.ContractInvoice)
  281. invCond := `invoice_type = 1 AND contract_register_id = ?`
  282. invPars := make([]interface{}, 0)
  283. invPars = append(invPars, registerId)
  284. invList, e := invOB.List(invCond, invPars, "")
  285. if e != nil {
  286. fmt.Println("获取开票登记列表失败, Err: " + e.Error())
  287. return
  288. }
  289. for _, v := range invList {
  290. v.SellerId = sellerItem.SellerId
  291. v.SellerName = sellerItem.SellerName
  292. v.SellerGroupId = sellerItem.GroupId
  293. v.SellerGroupName = sellerItem.GroupName
  294. v.SellerTeamId = sellerItem.TeamId
  295. v.SellerTeamName = sellerItem.TeamName
  296. if e = v.Update(invUpCols); e != nil {
  297. fmt.Println("更新开票登记失败, Err: " + e.Error())
  298. return
  299. }
  300. fmt.Printf("ID-%d 修复成功\n", v.ContractInvoiceId)
  301. }
  302. }
  303. fmt.Println("end 修复")
  304. return
  305. }
  306. // FixContractInvoicePaymentType 修复历史到款登记付款方式(一次性)
  307. func FixContractInvoicePaymentType() {
  308. registerCond := ``
  309. registerPars := make([]interface{}, 0)
  310. registerOB := new(fms.ContractRegister)
  311. registerList, e := registerOB.List(registerCond, registerPars)
  312. if e != nil {
  313. fmt.Println("获取合同登记列表失败, Err: " + e.Error())
  314. return
  315. }
  316. invUpCols := []string{"PayType"}
  317. fmt.Println("start 修复")
  318. for i := range registerList {
  319. registerId := registerList[i].ContractRegisterId
  320. invOB := new(fms.ContractInvoice)
  321. invCond := `invoice_type = 2 AND contract_register_id = ?`
  322. invPars := make([]interface{}, 0)
  323. invPars = append(invPars, registerId)
  324. invList, e := invOB.List(invCond, invPars, "")
  325. if e != nil {
  326. fmt.Println("获取到款登记列表失败, Err: " + e.Error())
  327. return
  328. }
  329. dayDiff := registerList[i].EndDate.Sub(registerList[i].StartDate).Hours() / 24
  330. for _, v := range invList {
  331. v.PayType = CalculateContractPaymentType(v.Amount, registerList[i].ContractAmount, dayDiff)
  332. if e = v.Update(invUpCols); e != nil {
  333. fmt.Println("更新到款登记付款方式失败, Err: " + e.Error())
  334. return
  335. }
  336. fmt.Printf("ID-%d 修复成功\n", v.ContractInvoiceId)
  337. }
  338. }
  339. fmt.Println("end 修复")
  340. return
  341. }
  342. // FixContractSummaryData 修复开票到款汇总数据(一次性)
  343. func FixContractSummaryData() {
  344. registerCond := ``
  345. registerPars := make([]interface{}, 0)
  346. registerOB := new(fms.ContractRegister)
  347. registerList, e := registerOB.List(registerCond, registerPars)
  348. if e != nil {
  349. fmt.Println("获取合同登记列表失败, Err: " + e.Error())
  350. return
  351. }
  352. fmt.Println("start 修复")
  353. for i := range registerList {
  354. fmt.Printf("正在修复-%d", registerList[i].ContractRegisterId)
  355. SummaryInvoicePaymentByContractRegisterId(registerList[i].ContractRegisterId)
  356. }
  357. fmt.Println("end 修复")
  358. return
  359. }