contract_service.go 22 KB

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