contract_service.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  1. /*
  2. * @description: 合同数据相关操作
  3. * @Author: CP
  4. * @Date: 2020-10-27 11:28:24
  5. * @FilePath: \construction_management\services\contract_service.go
  6. */
  7. package services
  8. import (
  9. "errors"
  10. "fmt"
  11. "html"
  12. "log"
  13. "strconv"
  14. "time"
  15. "github.com/kataras/iris/v12"
  16. "github.com/leekchan/accounting"
  17. "go.mod/comm"
  18. "go.mod/conf"
  19. "go.mod/dao"
  20. "go.mod/datasource"
  21. "go.mod/models"
  22. "go.mod/web/viewmodels"
  23. )
  24. //定义项目用户Service接口
  25. type ContractService interface {
  26. ValidRuleDepth(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  27. ValidRuleTemplate(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  28. ValidRuleSectionAdd(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  29. ValidRuleSectionDelete(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  30. ValidRuleGet(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  31. ValidRuleSerial(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  32. ValidRuleContractAdd(ctx iris.Context) (*viewmodels.Contracts, error)
  33. ValidRuleContractEdi(ctx iris.Context) (*viewmodels.Contracts, error)
  34. ValidRuleContractDel(ctx iris.Context) (*viewmodels.Contracts, error)
  35. ValidRuleContractRetrunAdd(ctx iris.Context) (*viewmodels.ContractsReturn, error)
  36. ValidRuleContractRetrun(ctx iris.Context) (*viewmodels.ContractsReturn, error)
  37. ValidRuleContractRetrunDel(ctx iris.Context) (*viewmodels.ContractsReturn, error)
  38. ValidRuleContractPaidAdd(ctx iris.Context) (*viewmodels.ContractsPaid, error)
  39. ValidRuleContractPaid(ctx iris.Context) (*viewmodels.ContractsPaid, error)
  40. ValidRuleContractPaidDel(ctx iris.Context) (*viewmodels.ContractsPaid, error)
  41. Get(treeId int, bidsectionId int, projectId int) *viewmodels.TreeSectionContract
  42. GetSectionTreeContract(attribution string, bidsectionId int, projectId int, treeType int) []*viewmodels.Contracts
  43. GetSecionTree(bidsectionId int, projectId int, treeType int) *viewmodels.TreeSectionContract
  44. SetSection(templateNumber int, bidsectionId int, projectIdInt int, treeType int) error
  45. SectionAdd(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
  46. SectionSave(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
  47. UpdateSerial(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
  48. SectionDelete(treeId int, bidsectionId int, projectId int, treeType int) error
  49. MoveDepth(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
  50. MoveSerial(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
  51. GetContract(contractId int) *viewmodels.Contracts
  52. Add(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
  53. Update(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
  54. Delete(projectId int, bidsectionId int, treeId int, id int) error
  55. Close(projectId int, bidsectionId int, treeId int, id int) error
  56. Unlock(projectId int, bidsectionId int, treeId int, id int) error
  57. GetIncomeSurvey(bidsectionId int, projectId int) map[string]interface{}
  58. ReturnCreate(returnData *viewmodels.ContractsReturn, projectId int, bidsectionId int, contractsId int, projectAccountId int) error
  59. ReturnUpdate(returnData *viewmodels.ContractsReturn, projectId int, bidsectionId int, contractsId int, id int) error
  60. ReturnAll(projectId int, bidsectionId int, contractsId int, page int) []*viewmodels.ContractsReturn
  61. ReturnDelete(projectId int, bidsectionId int, contractsId int, id int) error
  62. //支出合同
  63. AddExpenditure(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
  64. UpdateExpenditure(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
  65. DeleteExpenditure(projectId int, bidsectionId int, treeId int, id int) error
  66. // 已支付
  67. PaidAll(projectId int, bidsectionId int, contractsId int, page int) []*viewmodels.ContractsPaid
  68. PaidCreate(returnData *viewmodels.ContractsPaid, projectId int, bidsectionId int, contractsId int, projectAccountId int) error
  69. PaidUpdate(returnData *viewmodels.ContractsPaid, projectId int, bidsectionId int, contractsId int, id int) error
  70. PaidDelete(projectId int, bidsectionId int, contractsId int, id int) error
  71. }
  72. //返回service操作类
  73. type contractService struct {
  74. treeContractDao *dao.TreeContractDao
  75. contractDao *dao.ContractDao
  76. contractReturnDao *dao.ContractReturnDao
  77. contractPaidDao *dao.ContractPaidDao
  78. treeDao *dao.TreeDao
  79. annexDao *dao.AnnexDao
  80. }
  81. //创建项目用户service
  82. func NewContractService() ContractService {
  83. return &contractService{
  84. treeContractDao: dao.NewTreeContractDao(datasource.InstanceDbMaster()),
  85. contractDao: dao.NewContractDao(datasource.InstanceDbMaster()),
  86. contractReturnDao: dao.NewContractReturnDao(datasource.InstanceDbMaster()),
  87. contractPaidDao: dao.NewContractPaidDao(datasource.InstanceDbMaster()),
  88. treeDao: dao.NewTreeDao(datasource.InstanceDbMaster()),
  89. annexDao: dao.NewAnnexDao(datasource.InstanceDbMaster()),
  90. }
  91. }
  92. // 升级降级规则验证
  93. func (s *contractService) ValidRuleDepth(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  94. treeSectionVaild := &viewmodels.TreeSectionContract{}
  95. err := ctx.ReadJSON(treeSectionVaild)
  96. if err != nil {
  97. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  98. return treeSectionVaild, err
  99. }
  100. err = treeSectionVaild.ValidateDepth()
  101. if err != nil {
  102. log.Println("参数验证错误, error=", err)
  103. return treeSectionVaild, err
  104. }
  105. return treeSectionVaild, nil
  106. }
  107. // 模板规则验证
  108. func (s *contractService) ValidRuleTemplate(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  109. treeSectionVaild := &viewmodels.TreeSectionContract{}
  110. err := ctx.ReadJSON(treeSectionVaild)
  111. if err != nil {
  112. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  113. return treeSectionVaild, err
  114. }
  115. err = treeSectionVaild.ValidateTemplate()
  116. if err != nil {
  117. log.Println("参数验证错误, error=", err)
  118. return treeSectionVaild, err
  119. }
  120. return treeSectionVaild, nil
  121. }
  122. // 模板规则新增项目节
  123. func (s *contractService) ValidRuleSectionAdd(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  124. treeSectionVaild := &viewmodels.TreeSectionContract{}
  125. err := ctx.ReadJSON(treeSectionVaild)
  126. if err != nil {
  127. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  128. return treeSectionVaild, err
  129. }
  130. err = treeSectionVaild.ValidateSectionAdd()
  131. if err != nil {
  132. log.Println("参数验证错误, error=", err)
  133. return treeSectionVaild, err
  134. }
  135. return treeSectionVaild, nil
  136. }
  137. // 模板规则新增项目节
  138. func (s *contractService) ValidRuleSectionDelete(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  139. treeSectionVaild := &viewmodels.TreeSectionContract{}
  140. err := ctx.ReadForm(treeSectionVaild)
  141. if err != nil {
  142. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  143. return treeSectionVaild, err
  144. }
  145. err = treeSectionVaild.ValidateSectionDelete()
  146. if err != nil {
  147. log.Println("参数验证错误, error=", err)
  148. return treeSectionVaild, err
  149. }
  150. return treeSectionVaild, nil
  151. }
  152. func (s *contractService) ValidRuleGet(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  153. treeSectionVaild := &viewmodels.TreeSectionContract{}
  154. err := ctx.ReadForm(treeSectionVaild)
  155. if err != nil {
  156. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  157. return treeSectionVaild, err
  158. }
  159. err = treeSectionVaild.ValidateSectionDelete()
  160. if err != nil {
  161. log.Println("参数验证错误, error=", err)
  162. return treeSectionVaild, err
  163. }
  164. return treeSectionVaild, nil
  165. }
  166. // 验证序号相关
  167. func (s *contractService) ValidRuleSerial(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  168. treeSectionVaild := &viewmodels.TreeSectionContract{}
  169. err := ctx.ReadJSON(treeSectionVaild)
  170. if err != nil {
  171. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  172. return treeSectionVaild, err
  173. }
  174. err = treeSectionVaild.ValidateSectionSerial()
  175. if err != nil {
  176. log.Println("参数验证错误, error=", err)
  177. return treeSectionVaild, err
  178. }
  179. return treeSectionVaild, nil
  180. }
  181. // 新增合同参数验证
  182. func (s *contractService) ValidRuleContractAdd(ctx iris.Context) (*viewmodels.Contracts, error) {
  183. // 创建一个存放前端传过来参数
  184. contractsVaild := &viewmodels.Contracts{}
  185. // 存放raw的值,放入到contractsVaild
  186. err := ctx.ReadJSON(contractsVaild)
  187. if err != nil {
  188. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  189. return contractsVaild, err
  190. }
  191. // 验证合同传参
  192. err = contractsVaild.ValidateAdd()
  193. if err != nil {
  194. log.Println("参数验证错误, error=", err)
  195. return contractsVaild, err
  196. }
  197. // xss
  198. contractsVaild.Code = html.EscapeString(contractsVaild.Code)
  199. contractsVaild.Name = html.EscapeString(contractsVaild.Name)
  200. contractsVaild.Price = html.EscapeString(contractsVaild.Price)
  201. return contractsVaild, nil
  202. }
  203. // 校验编辑接口
  204. func (s *contractService) ValidRuleContractEdi(ctx iris.Context) (*viewmodels.Contracts, error) {
  205. // 创建一个存放前端传过来参数
  206. contractsVaild := &viewmodels.Contracts{}
  207. // 存放raw的值,放入到contractsVaild
  208. err := ctx.ReadJSON(contractsVaild)
  209. if err != nil {
  210. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  211. return contractsVaild, err
  212. }
  213. // 验证合同传参
  214. err = contractsVaild.ValidateEdi()
  215. if err != nil {
  216. log.Println("参数验证错误, error=", err)
  217. return contractsVaild, err
  218. }
  219. contractsVaild.Content = html.EscapeString(contractsVaild.Content)
  220. contractsVaild.Name = html.EscapeString(contractsVaild.Name)
  221. contractsVaild.Price = html.EscapeString(contractsVaild.Price)
  222. contractsVaild.PartyA = html.EscapeString(contractsVaild.PartyA)
  223. contractsVaild.PartyASigner = html.EscapeString(contractsVaild.PartyASigner)
  224. contractsVaild.PartyB = html.EscapeString(contractsVaild.PartyB)
  225. contractsVaild.PartyBSigner = html.EscapeString(contractsVaild.PartyBSigner)
  226. return contractsVaild, nil
  227. }
  228. // 校验删除合同参数
  229. func (s *contractService) ValidRuleContractDel(ctx iris.Context) (*viewmodels.Contracts, error) {
  230. // 创建一个存放前端传过来参数
  231. contractsVaild := &viewmodels.Contracts{}
  232. // 存放raw的值,放入到contractsVaild
  233. err := ctx.ReadForm(contractsVaild)
  234. if err != nil {
  235. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  236. return contractsVaild, err
  237. }
  238. // 验证合同传参
  239. err = contractsVaild.ValidateDel()
  240. if err != nil {
  241. log.Println("参数验证错误, error=", err)
  242. return contractsVaild, err
  243. }
  244. return contractsVaild, nil
  245. }
  246. //------------------------------------------------------------
  247. // 获得项目节
  248. func (s *contractService) Get(treeId int, bidsectionId int, projectId int) *viewmodels.TreeSectionContract {
  249. // 1.获得项目节
  250. section := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
  251. // 2.构造数据
  252. sectionVM := s.makeSectionView(section)
  253. // 3.更新 上移和下一的限制
  254. youngerBrotherList := s.treeContractDao.GetYoungerBrother(section.Serial, section.Depth, section.ParentId, bidsectionId, projectId, 0)
  255. if len(youngerBrotherList) == 0 {
  256. sectionVM.IsEnd = true
  257. }
  258. sectionVM.ElderBrother = true
  259. elderBrotherList := s.treeContractDao.GetElderBrother(section.Serial, section.Depth, section.ParentId, bidsectionId, projectId, 0)
  260. if len(elderBrotherList) == 0 {
  261. sectionVM.ElderBrother = false
  262. }
  263. return sectionVM
  264. }
  265. // 获得合同详情
  266. func (s *contractService) GetContract(contractId int) *viewmodels.Contracts {
  267. contract := s.contractDao.Get(contractId)
  268. contractsVM := &viewmodels.Contracts{}
  269. id, _ := comm.AesEncrypt(strconv.Itoa(contract.Id), conf.SignSecret)
  270. treeId, _ := comm.AesEncrypt(strconv.Itoa(contract.TreeId), conf.SignSecret)
  271. bidsectionId, _ := comm.AesEncrypt(strconv.Itoa(contract.BidsectionId), conf.SignSecret)
  272. contractsVM.Id = id
  273. contractsVM.TreeId = treeId
  274. contractsVM.ContractsType = contract.ContractsType
  275. contractsVM.BidsectionId = bidsectionId
  276. contractsVM.Name = contract.Name
  277. contractsVM.Content = contract.Content
  278. contractsVM.Code = contract.Code
  279. contractsVM.PartyA = contract.PartyA
  280. contractsVM.PartyASigner = contract.PartyASigner
  281. contractsVM.PartyB = contract.PartyB
  282. contractsVM.PartyBSigner = contract.PartyBSigner
  283. contractsVM.Remarks = contract.Remarks
  284. contractsVM.Price = contract.Price
  285. contractsVM.Returned = contract.Returned
  286. contractsVM.Paid = contract.Paid
  287. contractsVM.Status = contract.Status
  288. contractsVM.Locking = contract.Locking
  289. contractsVM.CreateTime = contract.CreateTime.Format(conf.SysTimeform)
  290. contractsVM.UpdateTime = contract.UpdateTime.Format(conf.SysTimeform)
  291. contractsVM.SignerTime = contract.SignerTime.Format(conf.SysTimeform)
  292. return contractsVM
  293. }
  294. // 新增合同
  295. func (s *contractService) Add(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error {
  296. // 1. 项目节存在
  297. contracts := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
  298. if contracts.Id == 0 {
  299. return errors.New("未找到项目节")
  300. }
  301. // k := int32(projectId)
  302. // 2.项目节是没有合同
  303. if contracts.ContractId != 0 {
  304. return errors.New("该项目节上已经存在合同")
  305. }
  306. // 3.新增合同 --合计标段上的金额
  307. contractsCm := &models.CmContracts{}
  308. contractsCm.Code = contractData.Code
  309. contractsCm.Name = contractData.Name
  310. contractsCm.ContractsType = 1
  311. contractsCm.Price = contractData.Price
  312. contractsCm.Returned = "0"
  313. contractsCm.Paid = "0"
  314. contractsCm.TreeId = treeId
  315. contractsCm.ProjectId = projectId
  316. contractsCm.BidsectionId = bidsectionId
  317. contractsCm.Status = 0
  318. contractsCm.CreateTime = time.Now()
  319. contractsCm.UpdateTime = time.Now()
  320. err := s.contractDao.Add(contractsCm)
  321. if err != nil {
  322. return err
  323. }
  324. // 3.获得该标段下合同总数 - 总收入金额
  325. contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId, 0)
  326. // 更新标段目录上合同金额和总数
  327. err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
  328. if err != nil {
  329. return err
  330. }
  331. return nil
  332. }
  333. // 更新合同
  334. func (s *contractService) Update(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error {
  335. // 1. 项目节存在
  336. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
  337. if contractsTree.Id == 0 {
  338. return errors.New("未找到项目节")
  339. }
  340. // 2.项目节是没有合同
  341. if contractsTree.ContractId == 0 {
  342. return errors.New("该项目节上没有找到合同")
  343. }
  344. // 3.合同锁定 不能删除
  345. if contractsTree.ContractLocking == 1 {
  346. return errors.New("该合同已锁定")
  347. }
  348. contractsCm := &models.CmContracts{}
  349. contractsCm.Id = contractsTree.ContractId
  350. contractsCm.Content = contractData.Content
  351. contractsCm.Name = contractData.Name
  352. contractsCm.Price = contractData.Price
  353. contractsCm.PartyA = contractData.PartyA
  354. contractsCm.PartyASigner = contractData.PartyASigner
  355. contractsCm.PartyB = contractData.PartyB
  356. contractsCm.PartyBSigner = contractData.PartyBSigner
  357. loc, _ := time.LoadLocation("Local")
  358. SignerTime, err := time.ParseInLocation(conf.SysTimeform, contractData.SignerTime, loc)
  359. if err != nil {
  360. return errors.New("签约时间填写异常")
  361. }
  362. contractsCm.SignerTime = SignerTime
  363. contractsCm.Remarks = contractData.Remarks
  364. columns := []string{"Content", "Name", "Price", "PartyA", "PartyASigner", "PartyB", "PartyBSigner"}
  365. err = s.contractDao.Update(contractsCm, columns, projectId, bidsectionId, treeId)
  366. if err != nil {
  367. return err
  368. }
  369. // 3.获得该标段下合同总数 - 总收入金额
  370. contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId, 0)
  371. // 更新标段目录上合同金额和总数
  372. err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
  373. if err != nil {
  374. return err
  375. }
  376. return nil
  377. }
  378. // 删除合同
  379. func (s *contractService) Delete(projectId int, bidsectionId int, treeId int, id int) error {
  380. // 1. 项目节存在
  381. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
  382. if contractsTree.Id == 0 {
  383. return errors.New("未找到项目节")
  384. }
  385. // 2.项目节是没有合同
  386. if contractsTree.ContractId == 0 {
  387. return errors.New("该项目节上没有找到合同")
  388. }
  389. // 3.合同锁定 不能删除
  390. if contractsTree.ContractLocking == 1 {
  391. return errors.New("该合同已锁定")
  392. }
  393. // 删除合同
  394. err := s.contractDao.Delete(projectId, bidsectionId, treeId, id)
  395. if err != nil {
  396. return err
  397. }
  398. // 3.获得该标段下合同总数 - 总收入金额
  399. contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId, 0)
  400. // 更新标段目录上合同金额和总数
  401. err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
  402. if err != nil {
  403. return err
  404. }
  405. // 4.更新回款总金额
  406. err = s.contractReturnDao.UpdateTotalPrice(projectId, bidsectionId, id)
  407. if err != nil {
  408. return err
  409. }
  410. return nil
  411. }
  412. // 关闭合同
  413. func (s *contractService) Close(projectId int, bidsectionId int, treeId int, id int) error {
  414. // 1. 项目节存在
  415. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
  416. if contractsTree.Id == 0 {
  417. return errors.New("未找到项目节")
  418. }
  419. // 2.项目节是没有合同
  420. if contractsTree.ContractId == 0 {
  421. return errors.New("该项目节上没有找到合同")
  422. }
  423. // 3.合同锁定 不能删除
  424. if contractsTree.ContractLocking == 1 {
  425. return errors.New("该合同已锁定")
  426. }
  427. // 关闭合同
  428. err := s.contractDao.Close(projectId, bidsectionId, treeId, id)
  429. if err != nil {
  430. return err
  431. }
  432. return nil
  433. }
  434. // 解锁合同
  435. func (s *contractService) Unlock(projectId int, bidsectionId int, treeId int, id int) error {
  436. // 1. 项目节存在
  437. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
  438. if contractsTree.Id == 0 {
  439. return errors.New("未找到项目节")
  440. }
  441. // 2.项目节是没有合同
  442. if contractsTree.ContractId == 0 {
  443. return errors.New("该项目节上没有找到合同")
  444. }
  445. // 解锁合同
  446. err := s.contractDao.Unlock(projectId, bidsectionId, treeId, id)
  447. if err != nil {
  448. return err
  449. }
  450. return nil
  451. }
  452. //获得合同收入概况
  453. func (s *contractService) GetIncomeSurvey(bidsectionId int, projectId int) map[string]interface{} {
  454. // 1.获得收入合同
  455. incomeList := s.contractDao.GetType(bidsectionId, projectId, 1)
  456. totalContractPrice := 0.00
  457. totalReturnPrice := 0.00
  458. performNumber := 0
  459. closeNumber := 0
  460. uncloseNumber := 0
  461. for _, item := range incomeList {
  462. contractPrice, _ := strconv.ParseFloat(item.Price, 64)
  463. totalContractPrice = totalContractPrice + contractPrice
  464. returnPrice, _ := strconv.ParseFloat(item.Returned, 64)
  465. totalReturnPrice = totalReturnPrice + returnPrice
  466. if item.Status == 0 {
  467. performNumber = performNumber + 1
  468. } else if item.Status == 1 {
  469. uncloseNumber = uncloseNumber + 1
  470. } else if item.Status == 2 {
  471. closeNumber = closeNumber + 1
  472. }
  473. }
  474. totalContractPrice, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", totalContractPrice), 64)
  475. fmt.Println(totalContractPrice)
  476. // surveryData := make(map[string]interface{},0)
  477. ac := accounting.Accounting{Symbol: "", Precision: 2}
  478. surveryData := map[string]interface{}{
  479. "totalContractPrice": ac.FormatMoney(totalContractPrice),
  480. }
  481. return surveryData
  482. }
  483. // 获得合同总数量和总金额
  484. func (s *contractService) getContractTotalAndPrice(bidsectionId int, projectId int, treeType int) (contractTotal int, priceTotal float64) {
  485. contractListAll := s.treeContractDao.GetContractAll(bidsectionId, projectId)
  486. // 获得收入合同
  487. contractList := s.treeContractDao.GetContract(bidsectionId, projectId, treeType)
  488. priceTotal = 0.00
  489. for _, item := range contractList {
  490. contractPrice, _ := strconv.ParseFloat(item.ContractPrice, 64)
  491. priceTotal = priceTotal + contractPrice
  492. }
  493. // 合同总数
  494. // contractTotal = len(contractList) + 1
  495. contractTotal = len(contractListAll)
  496. // 合同收入总金额
  497. // price, _ := strconv.ParseFloat(priceString, 64)
  498. // priceTotal = priceTotal + price
  499. // 保留2位小数
  500. priceTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", priceTotal), 64)
  501. return contractTotal, priceTotal
  502. }